mirror of https://github.com/microsoft/clang.git
[AST] Fix loss of enum forward decl from decl context
For example, given: enum __attribute__((deprecated)) T *p; -ast-print produced: enum T *p; The attribute was lost because the enum forward decl was lost. Another example is the loss of enum forward decls from C++ namespaces (in MS compatibility mode). The trouble was that the EnumDecl node was suppressed, as revealed by -ast-dump. The suppression of the EnumDecl was intentional in r116122, but I don't understand why. The suppression isn't needed for the test suite to behave. Reviewed by: rsmith Differential Revision: https://reviews.llvm.org/D46846 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@333574 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9107c536df
commit
054da0bc4f
|
@ -14287,7 +14287,6 @@ CreateNewDecl:
|
|||
// PrevDecl.
|
||||
TagDecl *New;
|
||||
|
||||
bool IsForwardReference = false;
|
||||
if (Kind == TTK_Enum) {
|
||||
// FIXME: Tag decls should be chained to any simultaneous vardecls, e.g.:
|
||||
// enum X { A, B, C } D; D should chain to X.
|
||||
|
@ -14317,12 +14316,6 @@ CreateNewDecl:
|
|||
else if (getLangOpts().CPlusPlus)
|
||||
DiagID = diag::err_forward_ref_enum;
|
||||
Diag(Loc, DiagID);
|
||||
|
||||
// If this is a forward-declared reference to an enumeration, make a
|
||||
// note of it; we won't actually be introducing the declaration into
|
||||
// the declaration context.
|
||||
if (TUK == TUK_Reference)
|
||||
IsForwardReference = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -14480,9 +14473,7 @@ CreateNewDecl:
|
|||
PushOnScopeChains(New, EnclosingScope, /* AddToContext = */ false);
|
||||
} else if (Name) {
|
||||
S = getNonFieldDeclScope(S);
|
||||
PushOnScopeChains(New, S, !IsForwardReference);
|
||||
if (IsForwardReference)
|
||||
SearchDC->makeDeclVisibleInContext(New);
|
||||
PushOnScopeChains(New, S, true);
|
||||
} else {
|
||||
CurContext->addDecl(New);
|
||||
}
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
// RUN: echo >> %t.c "// expected""-warning@* {{use of GNU old-style field designator extension}}"
|
||||
// RUN: echo >> %t.c "// expected""-warning@* {{'EnumWithAttributes' is deprecated}}"
|
||||
// RUN: echo >> %t.c "// expected""-note@* {{'EnumWithAttributes' has been explicitly marked deprecated here}}"
|
||||
// RUN: echo >> %t.c "// expected""-warning@* {{'EnumWithAttributes2' is deprecated}}"
|
||||
// RUN: echo >> %t.c "// expected""-note@* {{'EnumWithAttributes2' has been explicitly marked deprecated here}}"
|
||||
// RUN: echo >> %t.c "// expected""-warning@* {{'EnumWithAttributes3' is deprecated}}"
|
||||
// RUN: echo >> %t.c "// expected""-note@* {{'EnumWithAttributes3' has been explicitly marked deprecated here}}"
|
||||
// RUN: %clang_cc1 -fsyntax-only %t.c -verify
|
||||
|
@ -86,8 +88,7 @@ enum EnumWithAttributes { // expected-warning {{'EnumWithAttributes' is deprecat
|
|||
// CHECK-NEXT: } *EnumWithAttributesPtr;
|
||||
} __attribute__((deprecated)) *EnumWithAttributesPtr; // expected-note {{'EnumWithAttributes' has been explicitly marked deprecated here}}
|
||||
|
||||
// FIXME: If enum is forward-declared at file scope, attributes are lost.
|
||||
// CHECK-LABEL: enum EnumWithAttributes2 *EnumWithAttributes2Ptr;
|
||||
// CHECK-LABEL: enum __attribute__((deprecated(""))) EnumWithAttributes2 *EnumWithAttributes2Ptr;
|
||||
// expected-warning@+2 {{'EnumWithAttributes2' is deprecated}}
|
||||
// expected-note@+1 {{'EnumWithAttributes2' has been explicitly marked deprecated here}}
|
||||
enum __attribute__((deprecated)) EnumWithAttributes2 *EnumWithAttributes2Ptr;
|
||||
|
|
|
@ -239,6 +239,15 @@ enum ENUM2 {
|
|||
ENUM2_c = 0x100000000 // expected-warning {{enumerator value is not representable in the underlying type 'int'}}
|
||||
};
|
||||
|
||||
namespace NsEnumForwardDecl {
|
||||
enum E *p; // expected-warning {{forward references to 'enum' types are a Microsoft extension}}
|
||||
extern E e;
|
||||
}
|
||||
// Clang used to complain that NsEnumForwardDecl::E was undeclared below.
|
||||
NsEnumForwardDecl::E NsEnumForwardDecl_e;
|
||||
namespace NsEnumForwardDecl {
|
||||
extern E e;
|
||||
}
|
||||
|
||||
namespace PR11791 {
|
||||
template<class _Ty>
|
||||
|
|
Loading…
Reference in New Issue