llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Corentin Jabot (cor3ntin) <details> <summary>Changes</summary> If lookup did not find a copy constructor, it would return nulll, leading to an assert in `cast`. Fixes #<!-- -->143325 --- Full diff: https://github.com/llvm/llvm-project/pull/143350.diff 2 Files Affected: - (modified) clang/lib/Sema/SemaTypeTraits.cpp (+1-1) - (modified) clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp (+44) ``````````diff 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(); `````````` </details> https://github.com/llvm/llvm-project/pull/143350 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits