1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 17:56:01 +02:00

Name resolution for dependent names, bug 257194.

This commit is contained in:
Markus Schorn 2008-12-04 14:50:19 +00:00
parent b0c1b22007
commit d10ad69f49
3 changed files with 55 additions and 6 deletions

View file

@ -69,6 +69,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
@ -283,8 +284,8 @@ public class AST2TemplateTests extends AST2BaseTest {
} }
// template < class T > class A { typedef int TYPE; }; // template < class T > class A { typedef int TYPE; };
// template < class T > A<T>::TYPE foo(T); // template < class T > typename A<T>::TYPE foo(T);
// template < class T > A<T>::TYPE foo(T); // template < class T > typename A<T>::TYPE foo(T);
public void testStackOverflow_2() throws Exception { public void testStackOverflow_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP); IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
@ -3481,4 +3482,36 @@ public class AST2TemplateTests extends AST2BaseTest {
bh.assertNonProblem("f1();", 2, ICPPUnknownBinding.class, IFunction.class); bh.assertNonProblem("f1();", 2, ICPPUnknownBinding.class, IFunction.class);
} }
// template<typename T> class XT {
// typename T::template type<T::a> x;
// typename T::template type<typename T::A> y;
// using T::b;
// using typename T::B;
// void m() {
// T::f();
// typename T::F();
// }
// };
public void testTypeVsExpressionInArgsOfDependentTemplateID_257194() throws Exception {
final String code = getAboveComment();
parseAndCheckBindings(code, ParserLanguage.CPP);
BindingAssertionHelper bh= new BindingAssertionHelper(code, true);
ICPPUnknownBinding b= bh.assertNonProblem("a>", 1);
assertFalse(b instanceof IType);
b= bh.assertNonProblem("A>", 1);
assertTrue(b instanceof IType);
ICPPUsingDeclaration ud= bh.assertNonProblem("b;", 1);
b= (ICPPUnknownBinding) ud.getDelegates()[0];
assertFalse(b instanceof IType);
ud= bh.assertNonProblem("B;", 1);
b= (ICPPUnknownBinding) ud.getDelegates()[0];
assertTrue(b instanceof IType);
b= bh.assertNonProblem("f();", 1);
assertFalse(b instanceof IType);
b= bh.assertNonProblem("F();", 1);
assertTrue(b instanceof IType);
}
} }

View file

@ -22,12 +22,14 @@ import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator; import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator;
import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator.EvalException; import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator.EvalException;
@ -213,6 +215,10 @@ public class Value implements IValue {
cv= ((IVariable) b).getInitialValue(); cv= ((IVariable) b).getInitialValue();
} else if (b instanceof IEnumerator) { } else if (b instanceof IEnumerator) {
cv= ((IEnumerator) b).getValue(); cv= ((IEnumerator) b).getValue();
} else if (b instanceof ICPPUnknownBinding && !(b instanceof IType)) {
return "#0x0fffffff";
// mstodo unknown bindings must be stored with the value, such that they can
// be instantiated lated on, bug 245027
} }
if (cv != null) if (cv != null)
return toObject(cv); return toObject(cv);

View file

@ -25,6 +25,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTypenameExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
@ -124,11 +126,19 @@ public class CPPUnknownScope implements ICPPScope, ICPPInternalUnknownScope {
} }
} }
if (!type) { if (!type) {
if (parent instanceof ICPPASTNamedTypeSpecifier || if (parent instanceof ICPPASTBaseSpecifier ||
parent instanceof ICPPASTBaseSpecifier || parent instanceof ICPPASTConstructorChainInitializer ||
parent instanceof ICPPASTConstructorChainInitializer) { parent instanceof ICPPASTTypenameExpression) {
type= true; type= true;
} else if (parent.getPropertyInParent() == IASTFunctionCallExpression.FUNCTION_NAME) { } else if (parent instanceof ICPPASTNamedTypeSpecifier) {
ICPPASTNamedTypeSpecifier nts= (ICPPASTNamedTypeSpecifier) parent;
type= nts.isTypename();
} else if (parent instanceof ICPPASTUsingDeclaration) {
ICPPASTUsingDeclaration ud= (ICPPASTUsingDeclaration) parent;
type= ud.isTypename();
}
if (!type && parent.getPropertyInParent() == IASTFunctionCallExpression.FUNCTION_NAME) {
function= true; function= true;
} }
} }