From a75ce4027b11200e9968ca41868748776af16930 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 14 Apr 2016 21:45:28 -0400 Subject: [PATCH] Bug 491747 - Reference to scoped enumerator declared later in class Change-Id: If55f0a92c5e3723a306f6ec22a7363c90ef467a8 --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 11 +++++++++++ .../cdt/internal/core/dom/parser/cpp/CPPScope.java | 13 ++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) 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 f3542d29009..4efad870798 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 @@ -11909,4 +11909,15 @@ public class AST2CPPTests extends AST2TestBase { public void testShadowingAliasDeclaration_484200() throws Exception { parseAndCheckBindings(); } + + // struct S { + // void foo() { + // bar(E::A); // ERROR: Symbol 'A' could not be resolved + // } + // enum class E { A }; + // void bar(E); + // }; + public void testEnumDeclaredLaterInClass_491747() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java index 6d0a0e3c5b0..b13d607cc08 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java @@ -17,6 +17,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IName; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; @@ -27,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; 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.ICPPClassScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; @@ -260,13 +262,22 @@ abstract public class CPPScope implements ICPPASTInternalScope { } return ArrayUtil.trim(result); } + + private boolean isInsideClassScope(IScope scope) { + try { + return scope instanceof ICPPClassScope + || (scope instanceof ICPPEnumScope && scope.getParent() instanceof ICPPClassScope); + } catch (DOMException e) { + return false; + } + } private IBinding[] addCandidate(Object candidate, ScopeLookupData lookup, IBinding[] result) { final IASTNode point = lookup.getLookupPoint(); if (!lookup.isIgnorePointOfDeclaration()) { IASTTranslationUnit tu= point.getTranslationUnit(); if (!CPPSemantics.declaredBefore(candidate, point, tu != null && tu.getIndex() != null)) { - if (!(this instanceof ICPPClassScope) || !LookupData.checkWholeClassScope(lookup.getLookupName())) + if (!isInsideClassScope(this) || !LookupData.checkWholeClassScope(lookup.getLookupName())) return result; } }