rsmith added inline comments.

================
Comment at: clang/include/clang/Basic/DiagnosticCommonKinds.td:190
   InGroup<CXX98CompatPedantic>, DefaultIgnore;
+def ext_cxx2b_size_t_suffix : Extension<
+  "'size_t' suffix for literals is a C++2b extension">,
----------------
Should this be an `ExtWarn`? I think we should warn on this by default.


================
Comment at: clang/lib/Lex/LiteralSupport.cpp:594-595
 
   // Loop over all of the characters of the suffix.  If we see something bad,
   // we break out of the loop.
   for (; s != ThisTokEnd; ++s) {
----------------
General comment: I think the checks here have become too complex and 
error-prone. I suggest we add another flag, `hasSize`, that's set when we parse 
any size modifier (`F`, `L`, `LL`, `H`, `F128`, `I64`, and now `Z`), and when 
parsing any size modifier, replace the existing ad-hoc set of checks with a 
check for `hasSize`.


================
Comment at: clang/lib/Lex/PPExpressions.cpp:325
+    // 'z/uz' literals are a C++2b feature.
+    if (!PP.getLangOpts().CPlusPlus2b && Literal.isSizeT)
+      PP.Diag(PeekTok, PP.getLangOpts().CPlusPlus
----------------
We should issue a compat warning when these literals are used in C++2b or 
later. (That is, always issue a diagnostic for a `size_t` literal: in C, it's 
an error, in C++20 and before, it's an extension warning, and in C++2b and 
later, it's a backwards-compatibility warning.) There are a bunch of examples 
of this elsewhere in the codebase -- look for the emission of 
`warn_cxx.*_compat`.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:3871
+    // 'z/uz' literals are a C++2b feature.
+    if (!getLangOpts().CPlusPlus2b && Literal.isSizeT)
+      Diag(Tok.getLocation(), getLangOpts().CPlusPlus
----------------
Also need the C++20-and-before compat warning here for C++2b-onwards mode.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:3928
+
       if (Ty.isNull() && !Literal.isLong && !Literal.isLongLong) {
         // Are int/unsigned possibilities?
----------------
This should exclude the `isSizeT` case in addition to `isLong` and 
`isLongLong`. (It probably doesn't matter, because `int` is not larger than 
`size_t` on any platform we support, but nonetheless we should check.)


================
Comment at: clang/lib/Sema/SemaExpr.cpp:3944
       // Are long/unsigned long possibilities?
       if (Ty.isNull() && !Literal.isLongLong) {
         unsigned LongSize = Context.getTargetInfo().getLongWidth();
----------------
Likewise here.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:3975
       // Check long long if needed.
       if (Ty.isNull()) {
         unsigned LongLongSize = Context.getTargetInfo().getLongLongWidth();
----------------
Likewise here -- and this one actually does matter, because we have targets 
with a 32-bit `size_t` but a 64-bit `long long`.


================
Comment at: clang/test/Lexer/size_t-literal.cpp:6-8
+#if 1uz != 1
+#error "size_t suffix must be recognized by preprocessor"
+#endif
----------------
Please also check `-1z < 0` and `-1zu < 0` to ensure that the preprocessor gets 
the signedness correct.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D99456/new/

https://reviews.llvm.org/D99456

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

Reply via email to