Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[diag] Silence -Wfixed-enum-extension in C23 #68060

Merged
merged 5 commits into from
Oct 3, 2023

Conversation

smeenai
Copy link
Collaborator

@smeenai smeenai commented Oct 3, 2023

The C23 standard supports enums with fixed underlying types (N3030 [1]),
so we shouldn't emit -Wfixed-enum-extension in C23 mode (since it's no
longer a Clang extension at that point).

[1] https://thephd.dev/_vendor/future_cxx/papers/C%20-%20Enhanced%20Enumerations.html

The C23 standard supports enums with fixed underlying types (N3030 [1]),
so we shouldn't emit `-Wfixed-enum-extension` in C23 mode (since it's no
longer a Clang extension at that point).

[1] https://thephd.dev/_vendor/future_cxx/papers/C%20-%20Enhanced%20Enumerations.html
@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" labels Oct 3, 2023
@llvmbot
Copy link
Collaborator

llvmbot commented Oct 3, 2023

@llvm/pr-subscribers-clang

Changes

The C23 standard supports enums with fixed underlying types (N3030 [1]),
so we shouldn't emit -Wfixed-enum-extension in C23 mode (since it's no
longer a Clang extension at that point).

[1] https://thephd.dev/_vendor/future_cxx/papers/C%20-%20Enhanced%20Enumerations.html


Full diff: https://github.com/llvm/llvm-project/pull/68060.diff

2 Files Affected:

  • (modified) clang/lib/Parse/ParseDecl.cpp (+1-1)
  • (modified) clang/test/Sema/fixed-enum.c (+8-4)
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index a1491596ef6145c..735da4aafae1ca5 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -5019,7 +5019,7 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
         else if (getLangOpts().MicrosoftExt)
           Diag(ColonLoc, diag::ext_ms_c_enum_fixed_underlying_type)
               << BaseRange;
-        else
+        else if (!getLangOpts().C23)
           Diag(ColonLoc, diag::ext_clang_c_enum_fixed_underlying_type)
               << BaseRange;
       }
diff --git a/clang/test/Sema/fixed-enum.c b/clang/test/Sema/fixed-enum.c
index c77f5b0cbe79c5b..73a3fd2b09114c0 100644
--- a/clang/test/Sema/fixed-enum.c
+++ b/clang/test/Sema/fixed-enum.c
@@ -4,13 +4,17 @@
 // RUN: %clang_cc1 -Weverything -std=c11 -xc -DC11 -verify %s
 // RUN: %clang_cc1 -pedantic    -std=c11 -xc -DC11 -verify %s
 // RUN: %clang_cc1 -Weverything -std=c11 -xc -fms-extensions -DMS -verify %s
+// RUN: %clang_cc1 -Weverything -std=c2x -xc -DC23 -verify %s
+// RUN: %clang_cc1 -pedantic    -std=c2x -xc -DC23 -verify %s
+// RUN: %clang_cc1 -Weverything -std=c23 -xc -DC23 -verify %s
+// RUN: %clang_cc1 -pedantic    -std=c23 -xc -DC23 -verify %s
 
 enum X : int {e};
 #if defined(CXX11)
 // expected-warning@-2{{enumeration types with a fixed underlying type are incompatible with C++98}}
 #elif defined(CXX03)
 // expected-warning@-4{{enumeration types with a fixed underlying type are a C++11 extension}}
-#elif defined(OBJC)
+#elif defined(OBJC) || defined(C23)
 // No diagnostic
 #elif defined(C11)
 // expected-warning@-8{{enumeration types with a fixed underlying type are a Clang extension}}
@@ -21,19 +25,19 @@ enum X : int {e};
 // Don't warn about the forward declaration in any language mode.
 enum Fwd : int;
 enum Fwd : int { e2 };
-#ifndef OBJC
+#if !defined(OBJC) && !defined(C23)
 // expected-warning@-3 {{enumeration types with a fixed underlying type}}
 // expected-warning@-3 {{enumeration types with a fixed underlying type}}
 #endif
 
 // Always error on the incompatible redeclaration.
 enum BadFwd : int;
-#ifndef OBJC
+#if !defined(OBJC) && !defined(C23)
 // expected-warning@-2 {{enumeration types with a fixed underlying type}}
 #endif
 // expected-note@-4 {{previous declaration is here}}
 enum BadFwd : char { e3 };
-#ifndef OBJC
+#if !defined(OBJC) && !defined(C23)
 // expected-warning@-2 {{enumeration types with a fixed underlying type}}
 #endif
 // expected-error@-4 {{enumeration redeclared with different underlying type 'char' (was 'int')}}

Copy link
Collaborator

@erichkeane erichkeane left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe this needs a release note as well (see docs/ReleaseNotes.rst), else this LGTM.

Co-authored-by: Erich Keane <ekeane@nvidia.com>
@smeenai smeenai merged commit c6fed74 into llvm:main Oct 3, 2023
2 of 3 checks passed
@smeenai smeenai deleted the c23-fixed-enum-warning branch October 3, 2023 20:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants