https://github.com/shenjunjiekoda updated 
https://github.com/llvm/llvm-project/pull/121203

>From 2cee5fc2abd0cf2979c9ba975906e659adcd4463 Mon Sep 17 00:00:00 2001
From: shenjunjie <shenjunjiek...@foxmail.com>
Date: Fri, 27 Dec 2024 14:08:55 +0000
Subject: [PATCH 1/2] [analyzer] Fix zext assertion failure in loop unrolling

---
 clang/lib/StaticAnalyzer/Core/LoopUnrolling.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/clang/lib/StaticAnalyzer/Core/LoopUnrolling.cpp 
b/clang/lib/StaticAnalyzer/Core/LoopUnrolling.cpp
index 96f5d7c44baf89..9227a7876c0b2f 100644
--- a/clang/lib/StaticAnalyzer/Core/LoopUnrolling.cpp
+++ b/clang/lib/StaticAnalyzer/Core/LoopUnrolling.cpp
@@ -283,10 +283,12 @@ static bool shouldCompletelyUnroll(const Stmt *LoopStmt, 
ASTContext &ASTCtx,
   llvm::APInt InitNum =
       Matches[0].getNodeAs<IntegerLiteral>("initNum")->getValue();
   auto CondOp = Matches[0].getNodeAs<BinaryOperator>("conditionOperator");
-  if (InitNum.getBitWidth() != BoundNum.getBitWidth()) {
-    InitNum = InitNum.zext(BoundNum.getBitWidth());
-    BoundNum = BoundNum.zext(InitNum.getBitWidth());
-  }
+  unsigned MaxWidth = std::max(InitNum.getBitWidth(), BoundNum.getBitWidth());
+
+  if (InitNum.getBitWidth() != MaxWidth)
+    InitNum = InitNum.zext(MaxWidth);
+  if (BoundNum.getBitWidth() != MaxWidth)
+    BoundNum = BoundNum.zext(MaxWidth);
 
   if (CondOp->getOpcode() == BO_GE || CondOp->getOpcode() == BO_LE)
     maxStep = (BoundNum - InitNum + 1).abs().getZExtValue();

>From a4d3a24ea797c5f53c5171e05f7172434096bd65 Mon Sep 17 00:00:00 2001
From: shenjunjie <shenjunjiek...@foxmail.com>
Date: Fri, 27 Dec 2024 14:20:23 +0000
Subject: [PATCH 2/2] add testcase

---
 clang/test/Analysis/PR121201.cpp | 50 ++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)
 create mode 100644 clang/test/Analysis/PR121201.cpp

diff --git a/clang/test/Analysis/PR121201.cpp b/clang/test/Analysis/PR121201.cpp
new file mode 100644
index 00000000000000..a2cea89dc10b79
--- /dev/null
+++ b/clang/test/Analysis/PR121201.cpp
@@ -0,0 +1,50 @@
+
+template < bool, typename T, typename > using conditional_t = T;
+class basic_format_arg;
+template < typename > struct formatter;
+template < typename Context > struct value {
+  template < typename T > value(T) {
+    using value_type = T;
+    format_custom_arg<
+        value_type, typename Context::template formatter_type< value_type > >;
+  }
+  template < typename, typename Formatter > static void format_custom_arg() {
+    Context ctx;
+    auto f = Formatter();
+    f.format(0, ctx);
+  }
+};
+struct context {
+  template < typename T > using formatter_type = formatter< T >;
+};
+enum { max_packed_args };
+template < typename Context, long >
+using arg_t =
+    conditional_t< max_packed_args, value< Context >, basic_format_arg >;
+template < int NUM_ARGS > struct format_arg_store {
+  arg_t< context, NUM_ARGS > args;
+};
+template < typename... T, long NUM_ARGS = sizeof...(T) >
+auto make_format_args(T... args) -> format_arg_store< NUM_ARGS > {
+  return {args...};
+}
+template < typename F > void write_padded(F write) { write(0); }
+template < typename... T > void format(T... args) { make_format_args(args...); 
}
+template < int > struct bitset {
+  bitset(long);
+};
+template < long N > struct formatter< bitset< N > > {
+  struct writer {
+    bitset< N > bs;
+    template < typename OutputIt > void operator()(OutputIt) {
+      for (auto pos = N; pos > 0; --pos)
+        ;
+    }
+  };
+  template < typename FormatContext >
+  void format(bitset< N > bs, FormatContext) {
+    write_padded(writer{bs});
+  }
+};
+bitset< 6 > TestBody_bs(2);
+void TestBody() { format(TestBody_bs); }
\ No newline at end of file

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

Reply via email to