Author: Aaron Ballman
Date: 2022-05-05T14:00:01-04:00
New Revision: 967137ca3cb7cf38b2fedf0415946ff3ffd0ef50

URL: 
https://github.com/llvm/llvm-project/commit/967137ca3cb7cf38b2fedf0415946ff3ffd0ef50
DIFF: 
https://github.com/llvm/llvm-project/commit/967137ca3cb7cf38b2fedf0415946ff3ffd0ef50.diff

LOG: No longer accept scoped enumerations in C

We had a think-o that would allow a user to declare a scoped
enumeration in C language modes "as a C++11 extension". This is a
think-o because there's no way for the user to spell the name of the
enumerators; C does not have '::' for a fully-qualified name. See
commit d0d87b597259a2b74ae5c2825a081c7e336cb1d0 for details on why this
is unintentional for C.

Fixes #42372

Added: 
    

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/Parse/ParseDecl.cpp
    clang/test/Sema/enum.c

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index f5e9cd941e091..87e4df50ae0f2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -142,6 +142,11 @@ Bug Fixes
 - Fixed a false positive diagnostic about an unevaluated expression having no
   side effects when the expression is of VLA type and is an operand of the
   ``sizeof`` operator. Fixes `Issue 48010 
<https://github.com/llvm/llvm-project/issues/48010>`_.
+- Fixed a false positive diagnostic about scoped enumerations being a C++11
+  extension in C mode. A scoped enumeration's enumerators cannot be named in C
+  because there is no way to fully qualify the enumerator name, so this
+  "extension" was unintentional and useless. This fixes
+  `Issue 42372 <https://github.com/llvm/llvm-project/issues/42372>`_.
 
 Improvements to Clang's diagnostics
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

diff  --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 3d18ffe07ee6b..8d6e84b924c32 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -4531,7 +4531,7 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, 
DeclSpec &DS,
   bool IsScopedUsingClassTag = false;
 
   // In C++11, recognize 'enum class' and 'enum struct'.
-  if (Tok.isOneOf(tok::kw_class, tok::kw_struct)) {
+  if (Tok.isOneOf(tok::kw_class, tok::kw_struct) && getLangOpts().CPlusPlus) {
     Diag(Tok, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_scoped_enum
                                         : diag::ext_scoped_enum);
     IsScopedUsingClassTag = Tok.is(tok::kw_class);

diff  --git a/clang/test/Sema/enum.c b/clang/test/Sema/enum.c
index ae4a8a357e179..0fe54d791aff5 100644
--- a/clang/test/Sema/enum.c
+++ b/clang/test/Sema/enum.c
@@ -159,3 +159,16 @@ struct EnumRedeclStruct {
     PR15071_One // expected-error {{redefinition of enumerator 'PR15071_One'}}
   } e;
 };
+
+enum struct GH42372_1 { // expected-error {{expected identifier or '{'}} 
expected-warning {{declaration does not declare anything}}
+  One
+};
+
+// Because class is not a keyword in C, this looks like a forward declaration.
+// expected-error@+4 {{expected ';' after top level declarator}}
+// expected-error@+3 {{tentative definition has type 'enum class' that is 
never completed}}
+// expected-warning@+2 {{ISO C forbids forward references to 'enum' types}}
+// expected-note@+1 {{forward declaration of 'enum class'}}
+enum class GH42372_2 {
+  One
+};


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to