]> granicus.if.org Git - clang/commitdiff
When recovering from an invalid forward reference to an enum type in C++,
authorJohn McCall <rjmccall@apple.com>
Fri, 4 Dec 2009 00:07:04 +0000 (00:07 +0000)
committerJohn McCall <rjmccall@apple.com>
Fri, 4 Dec 2009 00:07:04 +0000 (00:07 +0000)
create the enum type in the same scope as you would a record type.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90500 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/SemaCXX/enum.cpp

index e02849f5d59b9576ac1a36e031dc37c61db51e5d..3e29b726e8923cc236c85117934459382242d920 100644 (file)
@@ -4617,8 +4617,7 @@ Sema::DeclPtrTy Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
         Previous.clear();
       }
     }
-  } else if (TUK == TUK_Reference && SS.isEmpty() && Name &&
-             (Kind != TagDecl::TK_enum || !getLangOptions().CPlusPlus)) {
+  } else if (TUK == TUK_Reference && SS.isEmpty() && Name) {
     // C++ [basic.scope.pdecl]p5:
     //   -- for an elaborated-type-specifier of the form
     //
@@ -4636,6 +4635,11 @@ Sema::DeclPtrTy Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
     // C99 6.7.2.3p8 has a similar (but not identical!) provision for
     // C structs and unions.
     //
+    // It is an error in C++ to declare (rather than define) an enum
+    // type, including via an elaborated type specifier.  We'll
+    // diagnose that later; for now, declare the enum in the same
+    // scope as we would have picked for any other tag type.
+    //
     // GNU C also supports this behavior as part of its incomplete
     // enum types extension, while GNU C++ does not.
     //
index db256812ab807e93bfbddfcadfa8a700c0189afc..1aba107a69dad15dd12b2d7bd0645ac6e3da1c02 100644 (file)
@@ -25,13 +25,13 @@ void bar() {
 
 /// PR3688
 struct s1 {
-  enum e1 (*bar)(void); // expected-error{{ISO C++ forbids forward references to 'enum' types}} expected-note{{forward declaration of 'enum s1::e1'}}
+  enum e1 (*bar)(void); // expected-error{{ISO C++ forbids forward references to 'enum' types}}
 };
 
 enum e1 { YES, NO };
 
 static enum e1 badfunc(struct s1 *q) {
-  return q->bar(); // expected-error{{calling function with incomplete return type 'enum s1::e1'}}
+  return q->bar();
 }
 
 enum e2; // expected-error{{ISO C++ forbids forward references to 'enum' types}}