From 9f9ed938d2711d11d6578e73b985817c53c6989b Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Tue, 4 Mar 2014 03:38:34 -0500 Subject: [PATCH] Bug 425033 - Restrict name lookup to types when elaborated-type-specifier is present Change-Id: Ib4e681056edfab92d19072ccc74a54ffd7cec418 Signed-off-by: Nathan Ridge Reviewed-on: https://git.eclipse.org/r/22835 Reviewed-by: Sergey Prigogin IP-Clean: Sergey Prigogin Tested-by: Sergey Prigogin --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 14 ++++++++++++++ .../core/dom/parser/cpp/semantics/LookupData.java | 12 ++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) 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 de73ada1fa2..8646f697ac1 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 @@ -10553,4 +10553,18 @@ public class AST2CPPTests extends AST2TestBase { assertEquals(',', argumentTokens[1].getTokenCharImage()[0]); assertEquals('2', argumentTokens[2].getTokenCharImage()[0]); } + + // struct MyStruct { + // struct Inner { + // int waldo; + // } Inner; + // }; + // + // void foo() { + // struct MyStruct::Inner in; + // in.waldo; + // } + public void testFieldAndNestedTypeWithSameName_425033() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java index a33756d8b07..c8e013ae562 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java @@ -149,11 +149,7 @@ public class LookupData extends ScopeLookupData { IASTNode parent = tn.getParent(); IASTNode nameParent= parent; - if (parent instanceof ICPPASTBaseSpecifier - || parent instanceof ICPPASTElaboratedTypeSpecifier - || parent instanceof ICPPASTCompositeTypeSpecifier) { - typesOnly= true; - } else if (parent instanceof ICPPASTQualifiedName) { + if (parent instanceof ICPPASTQualifiedName) { final ICPPASTQualifiedName qn = (ICPPASTQualifiedName) parent; if (qn.getLastName() != tn) { // For resolving template id ambiguities we need to consider non-types. @@ -173,7 +169,11 @@ public class LookupData extends ScopeLookupData { } } - if (nameParent instanceof ICPPASTUsingDeclaration) { + if (nameParent instanceof ICPPASTBaseSpecifier + || nameParent instanceof ICPPASTElaboratedTypeSpecifier + || nameParent instanceof ICPPASTCompositeTypeSpecifier) { + typesOnly= true; + } else if (nameParent instanceof ICPPASTUsingDeclaration) { forUsingDeclaration= true; } else if (nameParent instanceof IASTDeclarator) { fDeclarator= (IASTDeclarator) nameParent;