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 <corentinja...@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@-1 {{static assertion failed due to requirement '__builtin_is_cpp_trivially_relocatable(GH143325::Wrapper)'}} \ +// expected-note@-1 {{'Wrapper' is not trivially relocatable}} \ +// expected-note@-1 {{because it has a non-trivially-relocatable member 'u' of type 'union}} \ +// expected-note@-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@-1 {{static assertion failed due to requirement '__builtin_is_cpp_trivially_relocatable(GH143325::UnionOfPolymorphic)'}} \ +// expected-note@-1 {{'UnionOfPolymorphic' is not trivially relocatable}} \ +// expected-note@-1 {{because it has a non-trivially-relocatable member 'u' of type 'union}} \ +// expected-note@-1 {{because it has a deleted destructor}} \ +// expected-note@#GH143325-UnionOfPolymorphic {{'UnionOfPolymorphic' defined here}} + +} + namespace trivially_copyable { struct B { virtual ~B(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits