llvmbot wrote:

@llvm/pr-subscribers-clang-tidy

<details>
<summary>Changes</summary>

This crash was exposed recently in our randomized testing. _BitInts were not 
being handled properly during IntegerLiteral visitation. This patch addresses 
the problem for now.

The BitIntType has no getKind() method, so the FoldingSetID is taken from the 
APInt value representing the _BitInt(), similar to other methods in 
StmtProfile.cpp.

Crash seen (summary form):

clang-tidy: <src-root>/llvm/include/llvm/Support/Casting.h:566: decltype(auto) 
llvm::cast(const From&) [with To = clang::BuiltinType; From = clang::QualType]: 
Assertion `isa<To>(Val) && "cast<Ty>() argument of incompatible type!"' failed

...
  #9 <address> decltype(auto) llvm::cast<clang::BuiltinType,
       clang::QualType>(clang::QualType const&)
       <src-root>/llvm/include/llvm/Support/Casting.h:566:3
 #10 <address> clang::BuiltinType const* 
clang::Type::castAs<clang::BuiltinType>() const
       <bin-root>/tools/clang/include/clang/AST/TypeNodes.inc:86:1
 #11 <address> (anonymous namespace)::StmtProfiler::VisitIntegerLiteral(
       clang::IntegerLiteral const*)
       <src-root>/clang/lib/AST/StmtProfile.cpp:1362:64
 #12 <address> clang::StmtVisitorBase<llvm::make_const_ptr,
       (anonymous namespace)::StmtProfiler, void>::Visit(clang::Stmt const*)
       <src-root>/clang/include/clang/AST/StmtNodes.inc:1225:1
...

Reviewed By: donat.nagy
--
Full diff: https://github.com/llvm/llvm-project/pull/65889.diff

2 Files Affected:

- (added) 
clang-tools-extra/test/clang-tidy/checkers/bugprone/inc-dec-in-conditions-bitint-no-crash.c
 (+10) 
- (modified) clang/lib/AST/StmtProfile.cpp (+9-1) 


<pre>
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/bugprone/inc-dec-in-conditions-bitint-no-crash.c
 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/inc-dec-in-conditions-bitint-no-crash.c
new file mode 100644
index 000000000000000..55921205f34875e
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/inc-dec-in-conditions-bitint-no-crash.c
@@ -0,0 +1,10 @@
+// RUN: %check_clang_tidy %s bugprone-inc-dec-in-conditions %t
+
+#define foo(x)                                                 \
+  ({                                                           \
+    _BitInt(5) y = x;                                          \
+    16777215wb ?: ++y;                                         \
+  })
+
+_BitInt(8) v_401_0() { 0 && foo(0); }
+// CHECK-MESSAGES: warning 
diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp
index 27f71edd6f99b32..0a6bc388bd73e18 100644
--- a/clang/lib/AST/StmtProfile.cpp
+++ b/clang/lib/AST/StmtProfile.cpp
@@ -1333,7 +1333,15 @@ void StmtProfiler::VisitPredefinedExpr(const 
PredefinedExpr *S) {
 void StmtProfiler::VisitIntegerLiteral(const IntegerLiteral *S) {
   VisitExpr(S);
   S->getValue().Profile(ID);
-  ID.AddInteger(S->getType()->castAs<BuiltinType>()->getKind());
+
+  int FoldingSetID = 0;
+
+  if (S->getType()->isBitIntType())
+    FoldingSetID = S->getValue().getSExtValue();
+  else
+    FoldingSetID = S->getType()->castAs<BuiltinType>()->getKind();
+
+  ID.AddInteger(FoldingSetID);
 }
 
 void StmtProfiler::VisitFixedPointLiteral(const FixedPointLiteral *S) {
</pre>

</details>

https://github.com/llvm/llvm-project/pull/65889
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to