[Clang] Fix a crash when diagnosing a non relocatable with no copy ctr (#143350)

If lookup did not find a copy constructor, it would return nulll,
leading to an assert in `cast`.

Fixes #143325
This commit is contained in:
Corentin Jabot
2025-06-09 10:29:05 +02:00
committed by GitHub
parent f3ffee601c
commit 62c9b0cab6
2 changed files with 45 additions and 1 deletions

View File

@@ -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)

View File

@@ -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();