mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-31 21:05:37 +02:00
Bug 502016 - Enumeration defined in alias-declaration
Change-Id: I4552b3117008bff7f1269aa3a12e9711e0c8681f
This commit is contained in:
parent
29ae1df652
commit
4470a7a5bb
2 changed files with 30 additions and 7 deletions
|
@ -11982,6 +11982,17 @@ public class AST2CPPTests extends AST2TestBase {
|
||||||
parseAndCheckBindings();
|
parseAndCheckBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// struct foo {
|
||||||
|
// using E = enum { Zero, One, Two };
|
||||||
|
//
|
||||||
|
// bool f() {
|
||||||
|
// return Zero == 0; // "Symbol 'Zero' could not be resolved"
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
public void testAnonymousEnumInAliasDeclaration_502016() throws Exception {
|
||||||
|
parseAndCheckBindings();
|
||||||
|
}
|
||||||
|
|
||||||
// struct S {
|
// struct S {
|
||||||
// void foo() {
|
// void foo() {
|
||||||
// bar(E::A); // ERROR: Symbol 'A' could not be resolved
|
// bar(E::A); // ERROR: Symbol 'A' could not be resolved
|
||||||
|
|
|
@ -1742,12 +1742,7 @@ public class CPPSemantics {
|
||||||
ICPPASTEnumerationSpecifier enumeration = (ICPPASTEnumerationSpecifier) declSpec;
|
ICPPASTEnumerationSpecifier enumeration = (ICPPASTEnumerationSpecifier) declSpec;
|
||||||
specName = enumeration.getName();
|
specName = enumeration.getName();
|
||||||
|
|
||||||
// Add unscoped enumerators to the enclosing scope
|
handleEnumeration(enumeration, scope);
|
||||||
if (!enumeration.isScoped()) {
|
|
||||||
for (IASTEnumerator enumerator : enumeration.getEnumerators()) {
|
|
||||||
ASTInternal.addName(scope, enumerator.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (specName != null) {
|
if (specName != null) {
|
||||||
if (!(specName instanceof ICPPASTQualifiedName)) {
|
if (!(specName instanceof ICPPASTQualifiedName)) {
|
||||||
|
@ -1785,8 +1780,15 @@ public class CPPSemantics {
|
||||||
IASTName alias = ((ICPPASTNamespaceAlias) declaration).getAlias();
|
IASTName alias = ((ICPPASTNamespaceAlias) declaration).getAlias();
|
||||||
ASTInternal.addName(scope, alias);
|
ASTInternal.addName(scope, alias);
|
||||||
} else if (declaration instanceof ICPPASTAliasDeclaration) {
|
} else if (declaration instanceof ICPPASTAliasDeclaration) {
|
||||||
IASTName alias = ((ICPPASTAliasDeclaration) declaration).getAlias();
|
ICPPASTAliasDeclaration aliasDecl = (ICPPASTAliasDeclaration) declaration;
|
||||||
|
IASTName alias = aliasDecl.getAlias();
|
||||||
ASTInternal.addName(scope, alias);
|
ASTInternal.addName(scope, alias);
|
||||||
|
|
||||||
|
// The mapping-type-id could declare an enumeration.
|
||||||
|
IASTDeclSpecifier declSpec = aliasDecl.getMappingTypeId().getDeclSpecifier();
|
||||||
|
if (declSpec instanceof ICPPASTEnumerationSpecifier) {
|
||||||
|
handleEnumeration((ICPPASTEnumerationSpecifier) declSpec, scope);
|
||||||
|
}
|
||||||
} else if (declaration instanceof IASTFunctionDefinition) {
|
} else if (declaration instanceof IASTFunctionDefinition) {
|
||||||
IASTFunctionDefinition functionDef = (IASTFunctionDefinition) declaration;
|
IASTFunctionDefinition functionDef = (IASTFunctionDefinition) declaration;
|
||||||
final IASTDeclSpecifier declSpec = functionDef.getDeclSpecifier();
|
final IASTDeclSpecifier declSpec = functionDef.getDeclSpecifier();
|
||||||
|
@ -1813,6 +1815,16 @@ public class CPPSemantics {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void handleEnumeration(ICPPASTEnumerationSpecifier enumSpec,
|
||||||
|
IScope enclosingScope) {
|
||||||
|
// Add unscoped enumerators to the enclosing scope
|
||||||
|
if (!enumSpec.isScoped()) {
|
||||||
|
for (IASTEnumerator enumerator : enumSpec.getEnumerators()) {
|
||||||
|
ASTInternal.addName(enclosingScope, enumerator.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Perform lookup in nominated namespaces that appear in the given scope. For unqualified
|
* Perform lookup in nominated namespaces that appear in the given scope. For unqualified
|
||||||
|
|
Loading…
Add table
Reference in a new issue