https://github.com/Xinlong-Chen updated 
https://github.com/llvm/llvm-project/pull/183707

>From d47987e2b6303dca27aa54e4df9671ed64704d7d Mon Sep 17 00:00:00 2001
From: xinlongchen <[email protected]>
Date: Fri, 27 Feb 2026 16:59:04 +0800
Subject: [PATCH] [clang] fix crash when evaluating __is_bitwise_cloneable on
 an invalid type

---
 clang/lib/AST/Type.cpp                              | 9 +++++++--
 clang/test/SemaCXX/builtin-is-bitwise-cloneable.cpp | 6 ++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp
index a85f08753a132..efb65f2e8ed4e 100644
--- a/clang/lib/AST/Type.cpp
+++ b/clang/lib/AST/Type.cpp
@@ -2934,6 +2934,9 @@ bool QualType::isBitwiseCloneableType(const ASTContext 
&Context) const {
   if (!RD)
     return true;
 
+  if (RD->isInvalidDecl())
+    return false;
+
   // Never allow memcpy when we're adding poisoned padding bits to the struct.
   // Accessing these posioned bits will trigger false alarms on
   // SanitizeAddressFieldPadding etc.
@@ -2946,12 +2949,14 @@ bool QualType::isBitwiseCloneableType(const ASTContext 
&Context) const {
   }
 
   if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
-    for (auto Base : CXXRD->bases())
+    for (auto Base : CXXRD->bases()) {
       if (!Base.getType().isBitwiseCloneableType(Context))
         return false;
-    for (auto VBase : CXXRD->vbases())
+    }
+    for (auto VBase : CXXRD->vbases()) {
       if (!VBase.getType().isBitwiseCloneableType(Context))
         return false;
+    }
   }
   return true;
 }
diff --git a/clang/test/SemaCXX/builtin-is-bitwise-cloneable.cpp 
b/clang/test/SemaCXX/builtin-is-bitwise-cloneable.cpp
index 1781cf48449f6..b092a6ff574a0 100644
--- a/clang/test/SemaCXX/builtin-is-bitwise-cloneable.cpp
+++ b/clang/test/SemaCXX/builtin-is-bitwise-cloneable.cpp
@@ -6,3 +6,9 @@ static_assert(__is_bitwise_cloneable(DynamicClass));
 
 struct InComplete; // expected-note{{forward declaration}}
 static_assert(!__is_bitwise_cloneable(InComplete)); // 
expected-error{{incomplete type 'InComplete' used in type trait expression}}
+
+// Don't crash when the type has a member of invalid/unknown type.
+struct ABC { // expected-note {{'ABC' declared here}} expected-note 
{{definition of 'ABC' is not complete until the closing '}'}}
+  ABCD ptr; // expected-error {{unknown type name 'ABCD'}} expected-error 
{{field has incomplete type 'ABC'}}
+};
+static_assert(!__is_bitwise_cloneable(ABC));

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to