diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index e0cb9b1cd3e..a7e86a86bba 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -7589,5 +7589,24 @@ public class AST2CPPTests extends AST2BaseTest { final String code = getAboveComment(); parseAndCheckBindings(code, ParserLanguage.CPP); } + + // template struct CT { + // CT(int) {} + // }; + // namespace ns { + // typedef int B; + // struct A : CT{ + // A(); + // }; + // } + // + // ns::A::A() : CT(1) { + // } + public void testLookupInConstructorChainInitializer_293566() throws Exception { + final String code = getAboveComment(); + BindingAssertionHelper bh= new BindingAssertionHelper(code, true); + bh.assertNonProblem("B>(1)", 1); + parseAndCheckBindings(code, ParserLanguage.CPP); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index f9947db6dc9..67e0be61b46 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -651,12 +651,6 @@ public class CPPSemantics { n = ((ICPPASTQualifiedName) n).getLastName(); } scope = CPPVisitor.getContainingScope(n); - } else if (parent instanceof ICPPASTConstructorChainInitializer) { - ICPPASTConstructorChainInitializer initializer = (ICPPASTConstructorChainInitializer) parent; - IASTFunctionDefinition fdef= (IASTFunctionDefinition) initializer.getParent(); - IBinding binding = fdef.getDeclarator().getName().resolveBinding(); - if (!(binding instanceof IProblemBinding)) - scope = binding.getScope(); } else { scope = CPPVisitor.getContainingScope(name, data); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 65878a0d261..a9b72d91a6f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -60,6 +60,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTTypeIdInitializerExpression; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IArrayType; +import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IEnumeration; @@ -108,7 +109,6 @@ 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.ICPPASTUsingDirective; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; @@ -812,7 +812,15 @@ public class CPPVisitor extends ASTQueries { return getContainingScope(ns[ns.length - 1]); } } - } else if (node instanceof IASTExpression) { + } else if (node instanceof ICPPASTConstructorChainInitializer) { + ICPPASTConstructorChainInitializer initializer = (ICPPASTConstructorChainInitializer) node; + IASTFunctionDefinition fdef= (IASTFunctionDefinition) initializer.getParent(); + IBinding binding = fdef.getDeclarator().getName().resolveBinding(); + try { + return binding.getScope(); + } catch (DOMException e) { + } + } else if (node instanceof IASTExpression) { IASTNode parent = node.getParent(); if (parent instanceof IASTForStatement) { return ((IASTForStatement) parent).getScope(); @@ -1763,7 +1771,7 @@ public class CPPVisitor extends ASTQueries { } } catch (DOMException e) { } - basicType= new CPPBasicType(Kind.eInt, ICPPBasicType.IS_LONG | ICPPBasicType.IS_UNSIGNED); + basicType= new CPPBasicType(Kind.eInt, IBasicType.IS_LONG | IBasicType.IS_UNSIGNED); basicType.setFromExpression(binary); return basicType; } @@ -1795,7 +1803,7 @@ public class CPPVisitor extends ASTQueries { } } catch (DOMException e) { } - return new CPPBasicType(Kind.eInt, ICPPBasicType.IS_LONG | ICPPBasicType.IS_UNSIGNED); + return new CPPBasicType(Kind.eInt, IBasicType.IS_LONG | IBasicType.IS_UNSIGNED); } public static IASTProblem[] getProblems(IASTTranslationUnit tu) {