Author: Aidan Goldfarb Date: 2024-12-03T13:39:17-05:00 New Revision: 9791f258079a4334c61c64cb62d9746a3db2c25c
URL: https://github.com/llvm/llvm-project/commit/9791f258079a4334c61c64cb62d9746a3db2c25c DIFF: https://github.com/llvm/llvm-project/commit/9791f258079a4334c61c64cb62d9746a3db2c25c.diff LOG: [clang][sema] Add support and documentation for `__has_extension(c_fixed_enum)` (#117507) This PR addresses #116880 Updated [LanguageExtensions.rst](https://github.com/llvm/llvm-project/blob/main/clang/docs/LanguageExtensions.rst) to include support for C++11 enumerations with a fixed underlying type in C. Included a note that this is only a language extension prior to C23. Updated [Features.def](https://github.com/llvm-mirror/clang/blob/master/include/clang/Basic/Features.def) to support for `__has_extension(c_fixed_enum)` by added it as a feature (for C23) and an extension (for <C23). Updated [enum.c](https://github.com/llvm/llvm-project/blob/main/clang/test/Sema/enum.c) to ensure support of C++11 enumerations with a fixed underlying type in both <C23 and C23, as well as the functionality of `__has_extension(c_fixed_enum)`. --- In enum.c, I encountered a warning when testing enumerations with a fixed underlying type in pre-C23 modes. Specifically, the test produces the warning: `enumeration types with a fixed underlying type are a C23 extension`. I am unsure if this warning is expected behavior, as enumerations with a fixed underlying type should behave identically in pre-C23 and C23 modes. I expected that adding `c_fixed_enum` as an extension would fix this warning. Feedback on whether this is correct or requires adjustment would be appreciated. I was also unsure of the best location for the additions in `Features.def`, I would appreciate advice on this as well Note that this is my first PR to LLVM, so please liberally critique it! Added: Modified: clang/docs/LanguageExtensions.rst clang/include/clang/Basic/Features.def clang/test/Sema/enum.c Removed: ################################################################################ diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst index 52032e935928f1..6b950d05fb9bf9 100644 --- a/clang/docs/LanguageExtensions.rst +++ b/clang/docs/LanguageExtensions.rst @@ -1989,7 +1989,7 @@ Enumerations with a fixed underlying type ----------------------------------------- Clang provides support for C++11 enumerations with a fixed underlying type -within Objective-C. For example, one can write an enumeration type as: +within Objective-C and C `prior to C23 <https://open-std.org/JTC1/SC22/WG14/www/docs/n3030.htm>`_. For example, one can write an enumeration type as: .. code-block:: c++ @@ -2001,6 +2001,14 @@ value, is ``unsigned char``. Use ``__has_feature(objc_fixed_enum)`` to determine whether support for fixed underlying types is available in Objective-C. +Use ``__has_extension(c_fixed_enum)`` to determine whether support for fixed +underlying types is available in C prior to C23. This will also report ``true`` in C23 +and later modes as the functionality is available even if it's not an extension in +those modes. + +Use ``__has_feature(c_fixed_enum)`` to determine whether support for fixed +underlying types is available in C23 and later. + Interoperability with C++11 lambdas ----------------------------------- diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 9088c867d53ce4..15c59c6bcdf29c 100644 --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -163,6 +163,8 @@ FEATURE(c_atomic, LangOpts.C11) FEATURE(c_generic_selections, LangOpts.C11) FEATURE(c_static_assert, LangOpts.C11) FEATURE(c_thread_local, LangOpts.C11 &&PP.getTargetInfo().isTLSSupported()) +// C23 features +FEATURE(c_fixed_enum, LangOpts.C23) // C++11 features FEATURE(cxx_access_control_sfinae, LangOpts.CPlusPlus11) FEATURE(cxx_alias_templates, LangOpts.CPlusPlus11) @@ -269,6 +271,7 @@ EXTENSION(c_static_assert, true) EXTENSION(c_thread_local, PP.getTargetInfo().isTLSSupported()) // C23 features supported by other languages as extensions EXTENSION(c_attributes, true) +EXTENSION(c_fixed_enum, true) // C++11 features supported by other languages as extensions. EXTENSION(cxx_atomic, LangOpts.CPlusPlus) EXTENSION(cxx_default_function_template_args, LangOpts.CPlusPlus) diff --git a/clang/test/Sema/enum.c b/clang/test/Sema/enum.c index 4f6d04ba7f9182..f12ce61ac13a61 100644 --- a/clang/test/Sema/enum.c +++ b/clang/test/Sema/enum.c @@ -121,6 +121,17 @@ int NegativeShortTest[NegativeShort == -1 ? 1 : -1]; enum Color { Red, Green, Blue }; // expected-note{{previous use is here}} typedef struct Color NewColor; // expected-error {{use of 'Color' with tag type that does not match previous declaration}} +// Enumerations with a fixed underlying type. +// https://github.com/llvm/llvm-project/issues/116880 +#if __STDC_VERSION__ >= 202311L + static_assert(__has_feature(c_fixed_enum)); + static_assert(__has_extension(c_fixed_enum)); // Matches behavior for c_alignas, etc +#else + _Static_assert(__has_extension(c_fixed_enum), ""); + _Static_assert(!__has_feature(c_fixed_enum), ""); +#endif +typedef enum : unsigned char { Pink, Black, Cyan } Color; // pre-c23-warning {{enumeration types with a fixed underlying type are a C23 extension}} + // PR28903 // In C it is valid to define tags inside enums. struct PR28903 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits