[clang] [Clang] Fix a crash when diagnosing a non relocatable with no copy ctr (PR #143350)
Corentin Jabot via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 9 00:37:28 PDT 2025
https://github.com/cor3ntin created https://github.com/llvm/llvm-project/pull/143350
If lookup did not find a copy constructor, it would return nulll, leading to an assert in `cast`.
Fixes #143325
>From d9bc4cb344dd4dcb630ae4c608a1be8dff0c4572 Mon Sep 17 00:00:00 2001
From: Corentin Jabot <corentinjabot at gmail.com>
Date: Mon, 9 Jun 2025 09:35:11 +0200
Subject: [PATCH] [Clang] Fix a crash when diagnosing a non relocatable with no
copy ctr
If lookup did not find a copy constructor, it would return nulll,
leading to an assert in `cast`.
Fixes #143325
---
clang/lib/Sema/SemaTypeTraits.cpp | 2 +-
.../SemaCXX/type-traits-unsatisfied-diags.cpp | 44 +++++++++++++++++++
2 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaTypeTraits.cpp b/clang/lib/Sema/SemaTypeTraits.cpp
index 330f2aa750a09..a2cef76cfc673 100644
--- a/clang/lib/Sema/SemaTypeTraits.cpp
+++ b/clang/lib/Sema/SemaTypeTraits.cpp
@@ -2052,7 +2052,7 @@ static void DiagnoseNonTriviallyRelocatableReason(Sema &SemaRef,
}
if (!D->hasSimpleMoveConstructor() && !D->hasSimpleCopyConstructor()) {
- const auto *Decl = cast<CXXConstructorDecl>(
+ const auto *Decl = cast_or_null<CXXConstructorDecl>(
LookupSpecialMemberFromXValue(SemaRef, D, /*Assign=*/false));
if (Decl && Decl->isUserProvided())
SemaRef.Diag(Loc, diag::note_unsatisfied_trait_reason)
diff --git a/clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp b/clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp
index 0256569fcca5f..26378ef25ee99 100644
--- a/clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp
+++ b/clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp
@@ -145,6 +145,50 @@ static_assert(__builtin_is_cpp_trivially_relocatable(U2));
}
+
+namespace GH143325 {
+struct Foo { // expected-note {{previous definition is here}}
+ Foo(const Foo&);
+ ~Foo();
+};
+
+struct Foo { // expected-error {{redefinition of 'Foo'}}
+ Foo();
+ int;
+};
+struct Wrapper { // #GH143325-Wrapper
+ union {
+ Foo p;
+ } u;
+};
+
+static_assert(__builtin_is_cpp_trivially_relocatable(Wrapper));
+// expected-error at -1 {{static assertion failed due to requirement '__builtin_is_cpp_trivially_relocatable(GH143325::Wrapper)'}} \
+// expected-note at -1 {{'Wrapper' is not trivially relocatable}} \
+// expected-note at -1 {{because it has a non-trivially-relocatable member 'u' of type 'union}} \
+// expected-note at -1 {{because it has a deleted destructor}}
+// expected-note@#GH143325-Wrapper {{'Wrapper' defined here}}
+
+struct Polymorphic {
+ virtual ~Polymorphic();
+};
+
+struct UnionOfPolymorphic { // #GH143325-UnionOfPolymorphic
+ union {
+ Polymorphic p;
+ int i;
+ } u;
+};
+
+static_assert(__builtin_is_cpp_trivially_relocatable(UnionOfPolymorphic));
+// expected-error at -1 {{static assertion failed due to requirement '__builtin_is_cpp_trivially_relocatable(GH143325::UnionOfPolymorphic)'}} \
+// expected-note at -1 {{'UnionOfPolymorphic' is not trivially relocatable}} \
+// expected-note at -1 {{because it has a non-trivially-relocatable member 'u' of type 'union}} \
+// expected-note at -1 {{because it has a deleted destructor}} \
+// expected-note@#GH143325-UnionOfPolymorphic {{'UnionOfPolymorphic' defined here}}
+
+}
+
namespace trivially_copyable {
struct B {
virtual ~B();
More information about the cfe-commits
mailing list