[clang] [diag] Silence `-Wfixed-enum-extension` in C23 (PR #68060)

Shoaib Meenai via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 3 08:18:36 PDT 2023


https://github.com/smeenai updated https://github.com/llvm/llvm-project/pull/68060

>From b931e047168d2312f05c0fbf2813915cc4e06ae8 Mon Sep 17 00:00:00 2001
From: Shoaib Meenai <smeenai at fb.com>
Date: Mon, 2 Oct 2023 17:50:36 -0700
Subject: [PATCH 1/4] [diag] Silence `-Wfixed-enum-extension` in C23

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
---
 clang/lib/Parse/ParseDecl.cpp |  2 +-
 clang/test/Sema/fixed-enum.c  | 12 ++++++++----
 2 files changed, 9 insertions(+), 5 deletions(-)

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 at -2{{enumeration types with a fixed underlying type are incompatible with C++98}}
 #elif defined(CXX03)
 // expected-warning at -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 at -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 at -3 {{enumeration types with a fixed underlying type}}
 // expected-warning at -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 at -2 {{enumeration types with a fixed underlying type}}
 #endif
 // expected-note at -4 {{previous declaration is here}}
 enum BadFwd : char { e3 };
-#ifndef OBJC
+#if !defined(OBJC) && !defined(C23)
 // expected-warning at -2 {{enumeration types with a fixed underlying type}}
 #endif
 // expected-error at -4 {{enumeration redeclared with different underlying type 'char' (was 'int')}}

>From 862b7a64968ababc2d6b3495ba75271b764ca335 Mon Sep 17 00:00:00 2001
From: Shoaib Meenai <smeenai at fb.com>
Date: Tue, 3 Oct 2023 07:57:39 -0700
Subject: [PATCH 2/4] Address comment

---
 clang/lib/Parse/ParseDecl.cpp | 4 ++--
 clang/test/Sema/fixed-enum.c  | 1 +
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 735da4aafae1ca5..3cad57e719aad97 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -5009,7 +5009,7 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
 
       BaseRange = SourceRange(ColonLoc, DeclaratorInfo.getSourceRange().getEnd());
 
-      if (!getLangOpts().ObjC) {
+      if (!getLangOpts().ObjC && !getLangOpts().C23) {
         if (getLangOpts().CPlusPlus11)
           Diag(ColonLoc, diag::warn_cxx98_compat_enum_fixed_underlying_type)
               << BaseRange;
@@ -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 if (!getLangOpts().C23)
+        else
           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 73a3fd2b09114c0..954ff8c452b80ca 100644
--- a/clang/test/Sema/fixed-enum.c
+++ b/clang/test/Sema/fixed-enum.c
@@ -8,6 +8,7 @@
 // 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
+// RUN: %clang_cc1 -Weverything -std=c23 -xc -fms-extensions -DC23 -verify %s
 
 enum X : int {e};
 #if defined(CXX11)

>From d7f0ecfacd2f18c10eec9f4c026b1a6d44c8de2d Mon Sep 17 00:00:00 2001
From: Shoaib Meenai <smeenai at fb.com>
Date: Tue, 3 Oct 2023 08:15:07 -0700
Subject: [PATCH 3/4] Add release note

---
 clang/docs/ReleaseNotes.rst | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 6be824771c583be..f5285c43a95f9c5 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -216,6 +216,9 @@ Improvements to Clang's diagnostics
 - The fix-it emitted by ``-Wformat`` for scoped enumerations now take the
   enumeration's underlying type into account instead of suggesting a type just
   based on the format string specifier being used.
+- ``-Wfixed-enum-extension`` and ``-Wmicrosoft-fixed-enunm`` are no longer
+  emitted when building as C23, since C23 standardizes support for enums with a
+  fixed underlying type.
 
 Bug Fixes in This Version
 -------------------------

>From 561730b68ec91310e2cbbdcd0a2959aa51a8482c Mon Sep 17 00:00:00 2001
From: Shoaib Meenai <shoaib.meenai at gmail.com>
Date: Tue, 3 Oct 2023 08:18:28 -0700
Subject: [PATCH 4/4] Update clang/docs/ReleaseNotes.rst

Co-authored-by: Erich Keane <ekeane at nvidia.com>
---
 clang/docs/ReleaseNotes.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index f5285c43a95f9c5..4e7607ce97b35a7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -216,7 +216,7 @@ Improvements to Clang's diagnostics
 - The fix-it emitted by ``-Wformat`` for scoped enumerations now take the
   enumeration's underlying type into account instead of suggesting a type just
   based on the format string specifier being used.
-- ``-Wfixed-enum-extension`` and ``-Wmicrosoft-fixed-enunm`` are no longer
+- ``-Wfixed-enum-extension`` and ``-Wmicrosoft-fixed-enum`` diagnostics are no longer
   emitted when building as C23, since C23 standardizes support for enums with a
   fixed underlying type.
 



More information about the cfe-commits mailing list