[clang] [Clang] expunge `trivially_relocate_if_eligible` (PR #174344)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 4 11:47:31 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Corentin Jabot (cor3ntin)
<details>
<summary>Changes</summary>
In Kona, WG21 decided to revert trivial relocation (P2786).
Keep the notion of relocatability
(used in the wild and likely to come back),
but remove the keyword which is no longer conforming
---
Patch is 50.69 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/174344.diff
16 Files Affected:
- (modified) clang/docs/ReleaseNotes.rst (+7-1)
- (modified) clang/include/clang/Basic/Attr.td (-8)
- (modified) clang/include/clang/Basic/DiagnosticParseKinds.td (-13)
- (modified) clang/include/clang/Parse/Parser.h (-5)
- (modified) clang/include/clang/Sema/Sema.h (-1)
- (modified) clang/lib/Parse/ParseDeclCXX.cpp (+5-46)
- (modified) clang/lib/Parse/Parser.cpp (-1)
- (modified) clang/lib/Sema/SemaDecl.cpp (-5)
- (modified) clang/lib/Sema/SemaTypeTraits.cpp (-6)
- (modified) clang/test/CodeGenCXX/cxx2c-trivially-relocatable.cpp (+1-3)
- (removed) clang/test/Parser/cxx2c-trivially-relocatable.cpp (-31)
- (modified) clang/test/SemaCXX/cxx2c-trivially-relocatable.cpp (-123)
- (modified) clang/test/SemaCXX/ptrauth-triviality.cpp (-24)
- (modified) clang/test/SemaCXX/ptrauth-type-traits.cpp (-148)
- (modified) clang/test/SemaCXX/trivially-relocatable-ptrauth.cpp (-43)
- (modified) clang/test/SemaCXX/type-traits-unsatisfied-diags.cpp (-21)
``````````diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 69497505bbb30..54c311914468a 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -130,6 +130,12 @@ C++ Specific Potentially Breaking Changes
- ``VarTemplateSpecializationDecl::getTemplateArgsAsWritten()`` method now
returns ``nullptr`` for implicitly instantiated declarations.
+- ``__builtin_is_replaceable``, ``trivially_relocable_if_eligible``, and ``replaceable_if_eligible``
+ have been removed as `P2786 <https://wg21.link/P2786>`_ have been removed from C++2c.
+ ``__builtin_is_cpp_trivially_relocatable`` and ``__builtin_trivially_relocate`` have been kept back,
+ with the `P2786 <https://wg21.link/P2786>`_ semantics, except there is no longer a way
+ to explicitly specify a type is relocatable.
+
ABI Changes in This Version
---------------------------
- Fix AArch64 argument passing for C++ empty classes with large explicitly specified alignment.
@@ -197,7 +203,7 @@ C++2c Feature Support
^^^^^^^^^^^^^^^^^^^^^
- Started the implementation of `P2686R5 <https://wg21.link/P2686R5>`_ Constexpr structured bindings.
- At this timem, references to constexpr and decomposition of *tuple-like* types are not supported
+ At this time, references to constexpr and decomposition of *tuple-like* types are not supported
(only arrays and aggregates are).
C++23 Feature Support
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
index b017906a8d690..efa64dbe4b51e 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1944,14 +1944,6 @@ def Final : InheritableAttr {
let Documentation = [InternalOnly];
}
-def TriviallyRelocatable : InheritableAttr {
- let Spellings = [CustomKeyword<"trivially_relocatable_if_eligible">];
- let SemaHandler = 0;
- // Omitted from docs, since this is language syntax, not an attribute, as far
- // as users are concerned.
- let Documentation = [InternalOnly];
-}
-
def MinSize : InheritableAttr {
let Spellings = [Clang<"minsize">];
let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>;
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 662fe16d965b6..f4cdc827239f5 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1079,25 +1079,12 @@ def ext_ms_abstract_keyword : ExtWarn<
"'abstract' keyword is a Microsoft extension">,
InGroup<MicrosoftAbstract>;
-def ext_relocatable_keyword
- : ExtWarn<
- "'trivially_relocatable_if_eligible' keyword is a C++2c extension">,
- InGroup<CXX26>;
-def warn_relocatable_keyword
- : Warning<"'trivially_relocatable_if_eligible' keyword is incompatible "
- "with standards before C++2c">,
- DefaultIgnore,
- InGroup<CXXPre26Compat>;
-
def err_access_specifier_interface : Error<
"interface types cannot specify '%select{private|protected}0' access">;
def err_duplicate_class_virt_specifier : Error<
"class already marked '%0'">;
-def err_duplicate_class_relocation_specifier
- : Error<"class already marked 'trivially_relocatable_if_eligible'">;
-
def err_duplicate_virt_specifier : Error<
"class member already marked '%0'">;
diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h
index e03d7994e2fa5..9d21c507959f1 100644
--- a/clang/include/clang/Parse/Parser.h
+++ b/clang/include/clang/Parse/Parser.h
@@ -2834,7 +2834,6 @@ class Parser : public CodeCompletionHandler {
mutable IdentifierInfo *Ident_final;
mutable IdentifierInfo *Ident_GNU_final;
mutable IdentifierInfo *Ident_override;
- mutable IdentifierInfo *Ident_trivially_relocatable_if_eligible;
/// Representation of a class that has been parsed, including
/// any member function declarations or definitions that need to be
@@ -3598,10 +3597,6 @@ class Parser : public CodeCompletionHandler {
/// \endverbatim
AccessSpecifier getAccessSpecifierIfPresent() const;
- bool isCXX2CTriviallyRelocatableKeyword(Token Tok) const;
- bool isCXX2CTriviallyRelocatableKeyword() const;
- void ParseCXX2CTriviallyRelocatableSpecifier(SourceLocation &TRS);
-
/// 'final', a C++26 'trivially_relocatable_if_eligible',
/// or Microsoft 'sealed' or 'abstract' contextual
/// keyword.
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index c9ad6860dc625..b0fc2034eb336 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -4365,7 +4365,6 @@ class Sema final : public SemaBase {
SourceLocation FinalLoc,
bool IsFinalSpelledSealed,
bool IsAbstract,
- SourceLocation TriviallyRelocatable,
SourceLocation LBraceLoc);
/// ActOnTagFinishDefinition - Invoked once we have finished parsing
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 6b67a2aa99cc7..af0361c10a011 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -1871,8 +1871,7 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
(NextToken().is(tok::l_square) ||
NextToken().is(tok::kw_alignas) ||
NextToken().isRegularKeywordAttribute() ||
- isCXX11VirtSpecifier(NextToken()) != VirtSpecifiers::VS_None ||
- isCXX2CTriviallyRelocatableKeyword())) {
+ isCXX11VirtSpecifier(NextToken()) != VirtSpecifiers::VS_None)) {
// We can't tell if this is a definition or reference
// until we skipped the 'final' and C++11 attribute specifiers.
TentativeParsingAction PA(*this);
@@ -2478,34 +2477,7 @@ bool Parser::isCXX11FinalKeyword() const {
Specifier == VirtSpecifiers::VS_Sealed;
}
-bool Parser::isCXX2CTriviallyRelocatableKeyword(Token Tok) const {
- if (!getLangOpts().CPlusPlus || Tok.isNot(tok::identifier))
- return false;
- if (!Ident_trivially_relocatable_if_eligible)
- Ident_trivially_relocatable_if_eligible =
- &PP.getIdentifierTable().get("trivially_relocatable_if_eligible");
- IdentifierInfo *II = Tok.getIdentifierInfo();
- return II == Ident_trivially_relocatable_if_eligible;
-}
-
-bool Parser::isCXX2CTriviallyRelocatableKeyword() const {
- return isCXX2CTriviallyRelocatableKeyword(Tok);
-}
-
-void Parser::ParseCXX2CTriviallyRelocatableSpecifier(SourceLocation &TRS) {
- assert(isCXX2CTriviallyRelocatableKeyword() &&
- "expected a trivially_relocatable specifier");
-
- Diag(Tok.getLocation(), getLangOpts().CPlusPlus26
- ? diag::warn_relocatable_keyword
- : diag::ext_relocatable_keyword);
-
- TRS = ConsumeToken();
-}
-
bool Parser::isClassCompatibleKeyword(Token Tok) const {
- if (isCXX2CTriviallyRelocatableKeyword(Tok))
- return true;
VirtSpecifiers::Specifier Specifier = isCXX11VirtSpecifier(Tok);
return Specifier == VirtSpecifiers::VS_Final ||
Specifier == VirtSpecifiers::VS_GNU_Final ||
@@ -3559,24 +3531,12 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc,
SourceLocation AbstractLoc;
bool IsFinalSpelledSealed = false;
bool IsAbstract = false;
- SourceLocation TriviallyRelocatable;
// Parse the optional 'final' keyword.
if (getLangOpts().CPlusPlus && Tok.is(tok::identifier)) {
while (true) {
VirtSpecifiers::Specifier Specifier = isCXX11VirtSpecifier(Tok);
if (Specifier == VirtSpecifiers::VS_None) {
- if (isCXX2CTriviallyRelocatableKeyword(Tok)) {
- if (TriviallyRelocatable.isValid()) {
- auto Skipped = Tok;
- ConsumeToken();
- Diag(Skipped, diag::err_duplicate_class_relocation_specifier)
- << TriviallyRelocatable;
- } else {
- ParseCXX2CTriviallyRelocatableSpecifier(TriviallyRelocatable);
- }
- continue;
- }
break;
}
if (isCXX11FinalKeyword()) {
@@ -3614,8 +3574,7 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc,
else if (Specifier == VirtSpecifiers::VS_GNU_Final)
Diag(FinalLoc, diag::ext_warn_gnu_final);
}
- assert((FinalLoc.isValid() || AbstractLoc.isValid() ||
- TriviallyRelocatable.isValid()) &&
+ assert((FinalLoc.isValid() || AbstractLoc.isValid()) &&
"not a class definition");
// Parse any C++11 attributes after 'final' keyword.
@@ -3688,9 +3647,9 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc,
T.consumeOpen();
if (TagDecl)
- Actions.ActOnStartCXXMemberDeclarations(
- getCurScope(), TagDecl, FinalLoc, IsFinalSpelledSealed, IsAbstract,
- TriviallyRelocatable, T.getOpenLocation());
+ Actions.ActOnStartCXXMemberDeclarations(getCurScope(), TagDecl, FinalLoc,
+ IsFinalSpelledSealed, IsAbstract,
+ T.getOpenLocation());
// C++ 11p3: Members of a class defined with the keyword class are private
// by default. Members of a class defined with the keywords struct or union
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 1f32bf8009ded..8f6f023dd79d0 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -514,7 +514,6 @@ void Parser::Initialize() {
Ident_sealed = nullptr;
Ident_abstract = nullptr;
Ident_override = nullptr;
- Ident_trivially_relocatable_if_eligible = nullptr;
Ident_GNU_final = nullptr;
Ident_import = nullptr;
Ident_module = nullptr;
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index b943ea2f85030..d55b8afc1b7f7 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -18806,7 +18806,6 @@ void Sema::ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagD,
SourceLocation FinalLoc,
bool IsFinalSpelledSealed,
bool IsAbstract,
- SourceLocation TriviallyRelocatable,
SourceLocation LBraceLoc) {
AdjustDeclIfTemplate(TagD);
CXXRecordDecl *Record = cast<CXXRecordDecl>(TagD);
@@ -18826,10 +18825,6 @@ void Sema::ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagD,
: FinalAttr::Keyword_final));
}
- if (TriviallyRelocatable.isValid())
- Record->addAttr(
- TriviallyRelocatableAttr::Create(Context, TriviallyRelocatable));
-
// C++ [class]p2:
// [...] The class-name is also inserted into the scope of the
// class itself; this is known as the injected-class-name. For
diff --git a/clang/lib/Sema/SemaTypeTraits.cpp b/clang/lib/Sema/SemaTypeTraits.cpp
index f9d223a67e393..be2c8853d6433 100644
--- a/clang/lib/Sema/SemaTypeTraits.cpp
+++ b/clang/lib/Sema/SemaTypeTraits.cpp
@@ -243,10 +243,6 @@ Sema::CheckCXX2CRelocatable(const CXXRecordDecl *D) {
if (!IsEligibleForTrivialRelocation(*this, D))
return false;
- // has the trivially_relocatable_if_eligible class-property-specifier,
- if (D->hasAttr<TriviallyRelocatableAttr>())
- return true;
-
// is a union with no user-declared special member functions, or
if (IsUnion())
return true;
@@ -2082,8 +2078,6 @@ static void DiagnoseNonTriviallyRelocatableReason(Sema &SemaRef,
<< diag::TraitNotSatisfiedReason::DeletedDtr << /*Deleted*/ 0
<< D->getDestructor()->getSourceRange();
- if (D->hasAttr<TriviallyRelocatableAttr>())
- return;
DiagnoseNonDefaultMovable(SemaRef, Loc, D);
}
diff --git a/clang/test/CodeGenCXX/cxx2c-trivially-relocatable.cpp b/clang/test/CodeGenCXX/cxx2c-trivially-relocatable.cpp
index 465e539d363e8..c772c82ae0b4f 100644
--- a/clang/test/CodeGenCXX/cxx2c-trivially-relocatable.cpp
+++ b/clang/test/CodeGenCXX/cxx2c-trivially-relocatable.cpp
@@ -2,9 +2,7 @@
typedef __SIZE_TYPE__ size_t;
-struct S trivially_relocatable_if_eligible {
- S(const S&);
- ~S();
+struct S {
int a;
int b;
};
diff --git a/clang/test/Parser/cxx2c-trivially-relocatable.cpp b/clang/test/Parser/cxx2c-trivially-relocatable.cpp
deleted file mode 100644
index e47fe2a32972c..0000000000000
--- a/clang/test/Parser/cxx2c-trivially-relocatable.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-// RUN: %clang_cc1 -std=c++03 -verify=expected,cxx11,cxx03 -fsyntax-only %s
-// RUN: %clang_cc1 -std=c++11 -verify=expected,cxx11 -fsyntax-only %s
-// RUN: %clang_cc1 -std=c++2c -verify=expected -fsyntax-only %s
-
-
-class A trivially_relocatable_if_eligible {};
-// cxx11-warning at -1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
-class E final trivially_relocatable_if_eligible {};
-// cxx11-warning at -1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
-// cxx03-warning at -2 {{'final' keyword is a C++11 extension}}
-class G trivially_relocatable_if_eligible final{};
-// cxx11-warning at -1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
-// cxx03-warning at -2 {{'final' keyword is a C++11 extension}}
-class I trivially_relocatable_if_eligible trivially_relocatable_if_eligible final {};
-// expected-error at -1 {{class already marked 'trivially_relocatable_if_eligible'}}
-// cxx11-warning at -2 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
-// cxx03-warning at -3 {{'final' keyword is a C++11 extension}}
-class trivially_relocatable_if_eligible trivially_relocatable_if_eligible {};
-// cxx11-warning at -1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
-class L trivially_relocatable_if_eligible final {};
-// cxx11-warning at -1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
-// cxx03-warning at -2 {{'final' keyword is a C++11 extension}}
-class M final trivially_relocatable_if_eligible {};
-// cxx11-warning at -1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
-// cxx03-warning at -2 {{'final' keyword is a C++11 extension}}
-class N final trivially_relocatable_if_eligible {};
-// cxx11-warning at -1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
-// cxx03-warning at -2 {{'final' keyword is a C++11 extension}}
-class O trivially_relocatable_if_eligible final {};
-// cxx11-warning at -1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
-// cxx03-warning at -2 {{'final' keyword is a C++11 extension}}
diff --git a/clang/test/SemaCXX/cxx2c-trivially-relocatable.cpp b/clang/test/SemaCXX/cxx2c-trivially-relocatable.cpp
index 1fdce9cf2ec0b..deaa3d1057d3f 100644
--- a/clang/test/SemaCXX/cxx2c-trivially-relocatable.cpp
+++ b/clang/test/SemaCXX/cxx2c-trivially-relocatable.cpp
@@ -8,59 +8,6 @@ struct NonRelocatable {
};
static NonRelocatable NonRelocatable_g;
-class A trivially_relocatable_if_eligible {};
-static_assert(__builtin_is_cpp_trivially_relocatable(A));
-
-
-class B trivially_relocatable_if_eligible : Trivial{};
-static_assert(__builtin_is_cpp_trivially_relocatable(B));
-
-class C trivially_relocatable_if_eligible {
- int a;
- void* b;
- int c[3];
- Trivial d[3];
- NonRelocatable& e = NonRelocatable_g;
-};
-static_assert(__builtin_is_cpp_trivially_relocatable(C));
-
-
-class D trivially_relocatable_if_eligible : Trivial {};
-static_assert(__builtin_is_cpp_trivially_relocatable(D));
-
-
-class E trivially_relocatable_if_eligible : virtual Trivial {};
-static_assert(!__builtin_is_cpp_trivially_relocatable(E));
-
-
-class F trivially_relocatable_if_eligible : NonRelocatable {};
-static_assert(!__builtin_is_cpp_trivially_relocatable(F));
-
-class G trivially_relocatable_if_eligible {
- G(G&&);
-};
-static_assert(__builtin_is_cpp_trivially_relocatable(G));
-
-class H trivially_relocatable_if_eligible {
- ~H();
-};
-static_assert(__builtin_is_cpp_trivially_relocatable(H));
-
-class I trivially_relocatable_if_eligible {
- NonRelocatable a;
- NonRelocatable b[1];
- const NonRelocatable c;
- const NonRelocatable d[1];
-};
-static_assert(!__builtin_is_cpp_trivially_relocatable(I));
-
-
-class J trivially_relocatable_if_eligible: virtual Trivial, NonRelocatable {
- NonRelocatable a;
-};
-static_assert(!__builtin_is_cpp_trivially_relocatable(J));
-
-
struct Incomplete; // expected-note {{forward declaration of 'Incomplete'}}
static_assert(__builtin_is_cpp_trivially_relocatable(Incomplete)); // expected-error {{incomplete type 'Incomplete' used in type trait expression}}
static_assert(__builtin_is_cpp_trivially_relocatable(int));
@@ -76,11 +23,6 @@ struct WithConst {
};
static_assert(!__builtin_is_cpp_trivially_relocatable(WithConst));
-struct WithConstExplicit trivially_relocatable_if_eligible {
- const int i;
-};
-static_assert(__builtin_is_cpp_trivially_relocatable(WithConstExplicit));
-
struct UserDtr {
~UserDtr();
};
@@ -130,11 +72,6 @@ static_assert(__builtin_is_cpp_trivially_relocatable(UserMoveAssignDefault));
static_assert(__builtin_is_cpp_trivially_relocatable(UserCopyDefault));
static_assert(!__builtin_is_cpp_trivially_relocatable(UserDeletedMove));
-template <typename T>
-class TestDependentErrors trivially_relocatable_if_eligible : T {};
-TestDependentErrors<Trivial> Ok;
-TestDependentErrors<NonRelocatable> Err;
-
struct DeletedMove {
DeletedMove(DeletedMove&&) = delete;
};
@@ -155,13 +92,6 @@ static_assert(!__builtin_is_cpp_trivially_relocatable(DeletedMoveAssign));
static_assert(!__builtin_is_cpp_trivially_relocatable(DeletedDtr));
-union U {
- G g;
-};
-static_assert(!__is_trivially_copyable(U));
-static_assert(__builtin_is_cpp_trivially_relocatable(U));
-
-
template <typename T>
struct S {
T t;
@@ -175,21 +105,6 @@ static_assert(__builtin_is_cpp_trivially_relocatable(S<int[2]>));
static_assert(!__builtin_is_cpp_trivially_relocatable(S<const int[2]>));
static_assert(__builtin_is_cpp_trivially_relocatable(S<int[]>));
-
-template <typename T>
-struct SExplicit trivially_relocatable_if_eligible{
- T t;
-};
-static_assert(__builtin_is_cpp_trivially_relocatable(SExplicit<int>));
-static_assert(__builtin_is_cpp_trivially_relocatable(SExplicit<volatile int>));
-static_assert(__builtin_is_cpp_trivially_relocatable(SExplicit<const int>));
-static_assert(__builtin_is_cpp_trivially_relocatable(SExplicit<const int&>));
-static_assert(__builtin_is_cpp_trivially_relocatable(SExplicit<int&>));
-static_assert(__builtin_is_cpp_trivially_relocatable(SExplicit<int[2]>));
-static_assert(__builtin_is_cpp_trivially_relocatable(SExplicit<const int[2]>));
-static_assert(__builtin_is_cpp_trivially_relocatable(SExplicit<int[]>));
-
-
namespace replaceable {
struct DeletedMove {
@@ -252,15 +167,6 @@ static_assert(!__builtin_is_cpp_trivially_relocatable(int[n]));
// expected-note at -2 {{read of non-const variable 'n' is not allowed in a constant expression}}
-struct S42 trivially_relocatable_if_eligible {
- S42(S42&&);
- S42& operator=(S42&&) = default;
-};
-struct S43 trivially_relocatable_if_eligible {
- S43(S43&&) = default;
- S43& operator=(S43&&);
-};
-
struct Copyable1Explicit {
Copyable1Explicit(Copyable1Explicit const &) = default;
@@ -348,32 +254,3 @@ C& C::operator=(const C&) = default;
static_assert (!__builtin_is_cpp_trivially_relocatable(C));
}
-
-namespace GH144232 {
-
-struct E trivially_relocatable_if_eligible {
- E (E &&);
- E &operator= (E &&) = default;
-};
-
-struct F trivially_relocatable_if_eligible {
- F (F &&) = default;
- F &operator= (F &&);
-};
-
-struct G trivially_relocatable_if_eligible { G (G const &) = default; };
-
-struct I trivially_relocatable_if_eligible { I &operator= (const I &) = default; };
-
-struct J trivially_relocatable_if_eligible { J (J const &); };
-struct K trivially_relocatable_if_eligible { K (K const &); };
-
-
-static_assert (__builtin_is_cpp_trivially_relocatable(E));
-static_assert (__builtin_is_cpp_trivially_relocatable(F));
-static_assert (__builtin_is_cpp_trivially_relocatable(G));
-static_assert (__builtin_is_cpp_trivially_relocatable(I));
-static_assert (__builtin_is_cpp_trivially_relocatable(J));
-static_assert (__builtin_is_cpp_trivially_relocatable(K));
-
-}
diff --git a/clang/test/...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/174344
More information about the cfe-commits
mailing list