From d10ad69f49b67149050288da698b21172a19640b Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 4 Dec 2008 14:50:19 +0000 Subject: [PATCH] Name resolution for dependent names, bug 257194. --- .../parser/tests/ast2/AST2TemplateTests.java | 37 ++++++++++++++++++- .../cdt/internal/core/dom/parser/Value.java | 6 +++ .../core/dom/parser/cpp/CPPUnknownScope.java | 18 +++++++-- 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index a04cc646121..57ca92baa53 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -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.ICPPTemplateTemplateParameter; 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.parser.ParserLanguage; 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 > A::TYPE foo(T); - // template < class T > A::TYPE foo(T); + // template < class T > typename A::TYPE foo(T); + // template < class T > typename A::TYPE foo(T); public void testStackOverflow_2() throws Exception { IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP); CPPNameCollector col = new CPPNameCollector(); @@ -3481,4 +3482,36 @@ public class AST2TemplateTests extends AST2BaseTest { bh.assertNonProblem("f1();", 2, ICPPUnknownBinding.class, IFunction.class); } + // template class XT { + // typename T::template type x; + // typename T::template type 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); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java index d4e7a38702a..e2e81d9d495 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java @@ -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.IBinding; 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.IVariable; 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.ICPPTemplateParameter; 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.EvalException; @@ -213,6 +215,10 @@ public class Value implements IValue { cv= ((IVariable) b).getInitialValue(); } else if (b instanceof IEnumerator) { 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) return toObject(cv); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java index e08eebf7bfc..ca8b0f5056f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java @@ -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.ICPPASTQualifiedName; 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.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; @@ -124,11 +126,19 @@ public class CPPUnknownScope implements ICPPScope, ICPPInternalUnknownScope { } } if (!type) { - if (parent instanceof ICPPASTNamedTypeSpecifier || - parent instanceof ICPPASTBaseSpecifier || - parent instanceof ICPPASTConstructorChainInitializer) { + if (parent instanceof ICPPASTBaseSpecifier || + parent instanceof ICPPASTConstructorChainInitializer || + parent instanceof ICPPASTTypenameExpression) { 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; } }