[clang] [clang] fix crash when evaluating __is_bitwise_cloneable on an invalid type (PR #183707)

Corentin Jabot via cfe-commits cfe-commits at lists.llvm.org
Sat Feb 28 05:53:26 PST 2026


================
@@ -2940,18 +2940,28 @@ bool QualType::isBitwiseCloneableType(const ASTContext &Context) const {
   if (RD->mayInsertExtraPadding())
     return false;
 
+  auto isCycleBackToRD = [RD](QualType T) {
+    return !T.isNull() && !T->containsErrors() &&
+           T.getCanonicalType()->getAsRecordDecl() == RD;
+  };
+
   for (auto *const Field : RD->fields()) {
-    if (!Field->getType().isBitwiseCloneableType(Context))
+    if (isCycleBackToRD(Field->getType()) ||
+        !Field->getType().isBitwiseCloneableType(Context))
       return false;
   }
 
   if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
-    for (auto Base : CXXRD->bases())
-      if (!Base.getType().isBitwiseCloneableType(Context))
+    for (auto Base : CXXRD->bases()) {
+      if (isCycleBackToRD(Base.getType()) ||
+          !Base.getType().isBitwiseCloneableType(Context))
         return false;
-    for (auto VBase : CXXRD->vbases())
-      if (!VBase.getType().isBitwiseCloneableType(Context))
+    }
+    for (auto VBase : CXXRD->vbases()) {
+      if (isCycleBackToRD(VBase.getType()) ||
+          !VBase.getType().isBitwiseCloneableType(Context))
         return false;
----------------
cor3ntin wrote:

You don't have a test for that.


https://github.com/llvm/llvm-project/pull/183707


More information about the cfe-commits mailing list