mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-09-10 03:53:21 +02:00
Fixed stack overflow while processing invalid self-referring auto-type declarations. Bug 305970.
This commit is contained in:
parent
3ed12a5fb2
commit
0a634c54fe
2 changed files with 48 additions and 20 deletions
|
@ -8320,7 +8320,15 @@ public class AST2CPPTests extends AST2BaseTest {
|
||||||
ICPPVariable y= bh.assertNonProblem("y =", 1);
|
ICPPVariable y= bh.assertNonProblem("y =", 1);
|
||||||
assertNull(y.getType());
|
assertNull(y.getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// auto x = x; // Self referring type.
|
||||||
|
public void testAutoType_305970() throws Exception {
|
||||||
|
String code= getAboveComment();
|
||||||
|
BindingAssertionHelper bh= new BindingAssertionHelper(code, true);
|
||||||
|
ICPPVariable x= bh.assertNonProblem("x =", 1);
|
||||||
|
assertNull(x.getType());
|
||||||
|
}
|
||||||
|
|
||||||
// auto fpif1(int)->int(*)(int)
|
// auto fpif1(int)->int(*)(int)
|
||||||
// auto fpif2(int)->int(*)(int) {}
|
// auto fpif2(int)->int(*)(int) {}
|
||||||
public void testNewFunctionDeclaratorSyntax_305972() throws Exception {
|
public void testNewFunctionDeclaratorSyntax_305972() throws Exception {
|
||||||
|
|
|
@ -16,6 +16,8 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics;
|
||||||
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.*;
|
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.*;
|
||||||
|
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
|
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
|
||||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||||
|
@ -188,6 +190,16 @@ public class CPPVisitor extends ASTQueries {
|
||||||
public static final String STD = "std"; //$NON-NLS-1$
|
public static final String STD = "std"; //$NON-NLS-1$
|
||||||
public static final String TYPE_INFO= "type_info"; //$NON-NLS-1$
|
public static final String TYPE_INFO= "type_info"; //$NON-NLS-1$
|
||||||
private static final String INITIALIZER_LIST = "initializer_list"; //$NON-NLS-1$
|
private static final String INITIALIZER_LIST = "initializer_list"; //$NON-NLS-1$
|
||||||
|
// Thread-local set of DeclSpecifiers for which auto types are being created.
|
||||||
|
// Used for preventing infinite recursion while processing invalid self-referring
|
||||||
|
// auto-type declarations.
|
||||||
|
private static final ThreadLocal<Set<IASTDeclSpecifier>> autoTypeDeclSpecs =
|
||||||
|
new ThreadLocal<Set<IASTDeclSpecifier>>() {
|
||||||
|
@Override
|
||||||
|
protected Set<IASTDeclSpecifier> initialValue() {
|
||||||
|
return new HashSet<IASTDeclSpecifier>();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public static IBinding createBinding(IASTName name) {
|
public static IBinding createBinding(IASTName name) {
|
||||||
IASTNode parent = name.getParent();
|
IASTNode parent = name.getParent();
|
||||||
|
@ -1476,8 +1488,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
private static final int KIND_TYPE = 3;
|
private static final int KIND_TYPE = 3;
|
||||||
private static final int KIND_NAMESPACE = 4;
|
private static final int KIND_NAMESPACE = 4;
|
||||||
private static final int KIND_COMPOSITE = 5;
|
private static final int KIND_COMPOSITE = 5;
|
||||||
|
|
||||||
|
|
||||||
public CollectReferencesAction(IBinding binding) {
|
public CollectReferencesAction(IBinding binding) {
|
||||||
shouldVisitNames = true;
|
shouldVisitNames = true;
|
||||||
this.refs = new IASTName[DEFAULT_LIST_SIZE];
|
this.refs = new IASTName[DEFAULT_LIST_SIZE];
|
||||||
|
@ -1817,27 +1828,36 @@ public class CPPVisitor extends ASTQueries {
|
||||||
if (declarator instanceof ICPPASTFunctionDeclarator) {
|
if (declarator instanceof ICPPASTFunctionDeclarator) {
|
||||||
return createAutoFunctionType(declSpec, (ICPPASTFunctionDeclarator) declarator);
|
return createAutoFunctionType(declSpec, (ICPPASTFunctionDeclarator) declarator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!autoTypeDeclSpecs.get().add(declSpec)) {
|
||||||
|
// Detected a self referring auto type, e.g.: auto x = x;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
IType type = AutoTypeResolver.AUTO_TYPE;
|
IType type = AutoTypeResolver.AUTO_TYPE;
|
||||||
|
IType initType = null;
|
||||||
ICPPClassTemplate initializer_list_template = null;
|
ICPPClassTemplate initializer_list_template = null;
|
||||||
if (initClause instanceof ICPPASTInitializerList) {
|
try {
|
||||||
initializer_list_template = get_initializer_list(declSpec);
|
if (initClause instanceof ICPPASTInitializerList) {
|
||||||
if (initializer_list_template == null) {
|
initializer_list_template = get_initializer_list(declSpec);
|
||||||
|
if (initializer_list_template == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
type = (IType) CPPTemplates.instantiate(initializer_list_template,
|
||||||
|
new ICPPTemplateArgument[] { new CPPTemplateArgument(type) }, true);
|
||||||
|
}
|
||||||
|
type = decorateType(type, declSpec, declarator);
|
||||||
|
|
||||||
|
if (initClause instanceof IASTExpression) {
|
||||||
|
initType = ((IASTExpression) initClause).getExpressionType();
|
||||||
|
} else if (initClause instanceof ICPPASTInitializerList) {
|
||||||
|
initType = new InitializerListType((ICPPASTInitializerList) initClause);
|
||||||
|
}
|
||||||
|
if (initType == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
type = (IType) CPPTemplates.instantiate(initializer_list_template,
|
} finally {
|
||||||
new ICPPTemplateArgument[] { new CPPTemplateArgument(type) }, true);
|
autoTypeDeclSpecs.get().remove(declSpec);
|
||||||
}
|
|
||||||
type = decorateType(type, declSpec, declarator);
|
|
||||||
|
|
||||||
IType initType = null;
|
|
||||||
if (initClause instanceof IASTExpression) {
|
|
||||||
initType = ((IASTExpression) initClause).getExpressionType();
|
|
||||||
} else if (initClause instanceof ICPPASTInitializerList) {
|
|
||||||
initType = new InitializerListType((ICPPASTInitializerList) initClause);
|
|
||||||
}
|
|
||||||
if (initType == null) {
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
ICPPFunctionTemplate template = new AutoTypeResolver(type);
|
ICPPFunctionTemplate template = new AutoTypeResolver(type);
|
||||||
CPPTemplateParameterMap paramMap = new CPPTemplateParameterMap(1);
|
CPPTemplateParameterMap paramMap = new CPPTemplateParameterMap(1);
|
||||||
|
|
Loading…
Add table
Reference in a new issue