[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