[PATCH] D157331: [clang] Implement C23 <stdckdint.h>

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 29 11:56:23 PDT 2023


aaron.ballman added a comment.

I have some suggested changes for the way we're checking and diagnosing unsuitable types; I've not tried my suggestions out though, so if you run into problems, please let me know.



================
Comment at: clang/include/clang/AST/Type.h:2159
   bool isEnumeralType() const;
+  bool isPureIntegerType() const;
 
----------------
I'd rather put this logic into SemaChecking.cpp than expose it in Type.h. This isn't a type predicate most other code should need to use.


================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:8616-8625
 def err_overflow_builtin_must_be_int : Error<
   "operand argument to overflow builtin must be an integer (%0 invalid)">;
 def err_overflow_builtin_must_be_ptr_int : Error<
   "result argument to overflow builtin must be a pointer "
   "to a non-const integer (%0 invalid)">;
 def err_overflow_builtin_bit_int_max_size : Error<
   "__builtin_mul_overflow does not support 'signed _BitInt' operands of more "
----------------



================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:8624-8625
   "than %0 bits">;
+def warn_overflow_builtin_can_not_be_short : Warning<
+  "'short' may not be suitable to hold the result of operating two 'int's ">;
 def err_expected_struct_pointer_argument : Error<
----------------
There's a few things that aren't correct here, so I'm suggesting a different approach, but for your own understanding:

* All warning diagnostics need to be added to a warning group, using `InGroup<>`.
* The warning text is very specific to only one problematic situation; it should be generalized to cover as many code patterns as it can.
* We can likely reuse the existing error (`err_overflow_builtin_must_be_int`) instead of making a new one.


================
Comment at: clang/lib/Sema/SemaChecking.cpp:388
+  }
+
   // First two arguments should be integers.
----------------



================
Comment at: clang/lib/Sema/SemaChecking.cpp:396-401
+    bool IsInt = CkdOperation ? Ty->isPureIntegerType() : Ty->isIntegerType();
+    if (!IsInt) {
       S.Diag(Arg.get()->getBeginLoc(), diag::err_overflow_builtin_must_be_int)
           << Ty << Arg.get()->getSourceRange();
       return true;
     }
----------------



================
Comment at: clang/lib/Sema/SemaChecking.cpp:414-431
     if (!PtrTy ||
         !PtrTy->getPointeeType()->isIntegerType() ||
+        (!PtrTy->getPointeeType()->isPureIntegerType() && CkdOperation) ||
         PtrTy->getPointeeType().isConstQualified()) {
       S.Diag(Arg.get()->getBeginLoc(),
              diag::err_overflow_builtin_must_be_ptr_int)
         << Ty << Arg.get()->getSourceRange();
----------------



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D157331



More information about the cfe-commits mailing list