[PATCH] D139847: Also allow __is_unsigned to be used as an identifier

Stephan Bergmann via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 12 08:28:04 PST 2022


sberg created this revision.
sberg added reviewers: doug.gregor, aaron.ballman.
Herald added a project: All.
sberg requested review of this revision.
Herald added a project: clang.

...similar to 068730992cf08d7d7e82e7bb147d85f429fc3ddd "libstdc++ 4.4 uses __is_signed as an identifier [...]"

Starting with https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=5329e1a8e1480d536ff96283a6556e51112ba470 "libstdc++: Make chrono::hh_mm_ss more compact", libstdc++ 13 trunk used `__is_signed` as

  static constexpr bool __is_unsigned
    = __and_v<is_integral<typename _Duration::rep>,
              is_unsigned<typename _Duration::rep>>;

in `libstdc++-v3/include/std/chrono`.  Even though that got reverted with https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=cb363fd9f19eb791e1ee1eb0d5c61f5fdf21af32 "libstdc++: Change names that clash with Win32 or Clang", it might make sense to treat `__is_unsigned` the same as `__is_signed` here (and to also make the workaround hit for `constexpr` in addition to `const`).


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D139847

Files:
  clang/lib/Parse/ParseDecl.cpp
  clang/test/SemaCXX/libstdcxx_is_pod_hack.cpp


Index: clang/test/SemaCXX/libstdcxx_is_pod_hack.cpp
===================================================================
--- clang/test/SemaCXX/libstdcxx_is_pod_hack.cpp
+++ clang/test/SemaCXX/libstdcxx_is_pod_hack.cpp
@@ -29,6 +29,13 @@
 
 bool check_signed = test_is_signed::__is_signed;
 
+// Another, similar egregious hack for __is_unsigned, which is a type
+// trait in Embarcadero's compiler but is used as an identifier in
+// libstdc++.
+struct test_is_unsigned {
+  static constexpr bool __is_unsigned = true; // expected-warning {{keyword '__is_unsigned' will be made available as an identifier}}
+};
+
 template<bool B> struct must_be_true {};
 template<> struct must_be_true<false>;
 
Index: clang/lib/Parse/ParseDecl.cpp
===================================================================
--- clang/lib/Parse/ParseDecl.cpp
+++ clang/lib/Parse/ParseDecl.cpp
@@ -3519,6 +3519,7 @@
     }
 
     case tok::kw___is_signed:
+    case tok::kw___is_unsigned:
       // GNU libstdc++ 4.4 uses __is_signed as an identifier, but Clang
       // typically treats it as a trait. If we see __is_signed as it appears
       // in libstdc++, e.g.,
@@ -3526,8 +3527,15 @@
       //   static const bool __is_signed;
       //
       // then treat __is_signed as an identifier rather than as a keyword.
+      //
+      // Similarly, libstdc++ 13 trunk at one point used __is_unsigned as an
+      // identifier as
+      //
+      //   static constexpr bool __is_unsigned;
+      //
       if (DS.getTypeSpecType() == TST_bool &&
-          DS.getTypeQualifiers() == DeclSpec::TQ_const &&
+          (DS.getTypeQualifiers() == DeclSpec::TQ_const ||
+           DS.getConstexprSpecifier() == ConstexprSpecKind::Constexpr) &&
           DS.getStorageClassSpec() == DeclSpec::SCS_static)
         TryKeywordIdentFallback(true);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139847.482138.patch
Type: text/x-patch
Size: 1823 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221212/f495033e/attachment-0001.bin>


More information about the cfe-commits mailing list