https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119064
--- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Patch for reversion of the reflection part of trivial relocatability for
archival purposes:
diff --git a/gcc/cp/metafns.gperf b/gcc/cp/metafns.gperf
index 9509a4bdb65..4759cdfe463 100644
--- a/gcc/cp/metafns.gperf
+++ b/gcc/cp/metafns.gperf
@@ -165,8 +165,6 @@ enum metafn_code {
METAFN_IS_CONST_TYPE,
METAFN_IS_VOLATILE_TYPE,
METAFN_IS_TRIVIALLY_COPYABLE_TYPE,
- METAFN_IS_TRIVIALLY_RELOCATABLE_TYPE,
- METAFN_IS_REPLACEABLE_TYPE,
METAFN_IS_STANDARD_LAYOUT_TYPE,
METAFN_IS_EMPTY_TYPE,
METAFN_IS_POLYMORPHIC_TYPE,
@@ -207,7 +205,6 @@ enum metafn_code {
METAFN_IS_NOTHROW_SWAPPABLE_WITH_TYPE,
METAFN_IS_NOTHROW_SWAPPABLE_TYPE,
METAFN_IS_NOTHROW_DESTRUCTIBLE_TYPE,
- METAFN_IS_NOTHROW_RELOCATABLE_TYPE,
METAFN_IS_IMPLICIT_LIFETIME_TYPE,
METAFN_HAS_VIRTUAL_DESTRUCTOR,
METAFN_HAS_UNIQUE_OBJECT_REPRESENTATIONS,
@@ -553,8 +550,6 @@ is_member_pointer_type, METAFN_IS_MEMBER_POINTER_TYPE,
METAFN_KIND_BOOL_TINFO,
is_const_type, METAFN_IS_CONST_TYPE, METAFN_KIND_BOOL_TINFO,
is_volatile_type, METAFN_IS_VOLATILE_TYPE, METAFN_KIND_BOOL_TINFO,
is_trivially_copyable_type, METAFN_IS_TRIVIALLY_COPYABLE_TYPE,
METAFN_KIND_BOOL_TINFO,
-is_trivially_relocatable_type, METAFN_IS_TRIVIALLY_RELOCATABLE_TYPE,
METAFN_KIND_BOOL_TINFO,
-is_replaceable_type, METAFN_IS_REPLACEABLE_TYPE, METAFN_KIND_BOOL_TINFO,
is_standard_layout_type, METAFN_IS_STANDARD_LAYOUT_TYPE,
METAFN_KIND_BOOL_TINFO,
is_empty_type, METAFN_IS_EMPTY_TYPE, METAFN_KIND_BOOL_TINFO,
is_polymorphic_type, METAFN_IS_POLYMORPHIC_TYPE, METAFN_KIND_BOOL_TINFO,
@@ -595,7 +590,6 @@ is_nothrow_move_assignable_type,
METAFN_IS_NOTHROW_MOVE_ASSIGNABLE_TYPE, METAFN_
is_nothrow_swappable_with_type, METAFN_IS_NOTHROW_SWAPPABLE_WITH_TYPE,
METAFN_KIND_BOOL_TINFO_TINFO,
is_nothrow_swappable_type, METAFN_IS_NOTHROW_SWAPPABLE_TYPE,
METAFN_KIND_BOOL_TINFO,
is_nothrow_destructible_type, METAFN_IS_NOTHROW_DESTRUCTIBLE_TYPE,
METAFN_KIND_BOOL_TINFO,
-is_nothrow_relocatable_type, METAFN_IS_NOTHROW_RELOCATABLE_TYPE,
METAFN_KIND_BOOL_TINFO,
is_implicit_lifetime_type, METAFN_IS_IMPLICIT_LIFETIME_TYPE,
METAFN_KIND_BOOL_TINFO,
has_virtual_destructor, METAFN_HAS_VIRTUAL_DESTRUCTOR, METAFN_KIND_BOOL_TINFO,
has_unique_object_representations, METAFN_HAS_UNIQUE_OBJECT_REPRESENTATIONS,
METAFN_KIND_BOOL_TINFO,
diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc
index e5702ccfd87..d483b3486a7 100644
--- a/gcc/cp/reflect.cc
+++ b/gcc/cp/reflect.cc
@@ -4186,28 +4186,6 @@ eval_is_trivially_copyable_type (tree type)
return boolean_false_node;
}
-/* Process std::meta::is_trivially_relocatable_type. */
-
-static tree
-eval_is_trivially_relocatable_type (tree type)
-{
- if (trivially_relocatable_type_p (type))
- return boolean_true_node;
- else
- return boolean_false_node;
-}
-
-/* Process std::meta::is_replaceable_type. */
-
-static tree
-eval_is_replaceable_type (tree type)
-{
- if (replaceable_type_p (type))
- return boolean_true_node;
- else
- return boolean_false_node;
-}
-
/* Process std::meta::is_standard_layout_type. */
static tree
@@ -4634,14 +4612,6 @@ eval_is_nothrow_destructible_type (location_t loc, tree
type)
return eval_type_trait (loc, type, CPTK_IS_NOTHROW_DESTRUCTIBLE);
}
-/* Process std::meta::is_nothrow_relocatable_type. */
-
-static tree
-eval_is_nothrow_relocatable_type (location_t loc, tree type)
-{
- return eval_type_trait (loc, type, CPTK_IS_NOTHROW_RELOCATABLE);
-}
-
/* Process std::meta::has_virtual_destructor. */
static tree
@@ -7870,10 +7840,6 @@ process_metafunction (const constexpr_ctx *ctx, tree
fun, tree call,
return eval_is_volatile_type (h);
case METAFN_IS_TRIVIALLY_COPYABLE_TYPE:
return eval_is_trivially_copyable_type (h);
- case METAFN_IS_TRIVIALLY_RELOCATABLE_TYPE:
- return eval_is_trivially_relocatable_type (h);
- case METAFN_IS_REPLACEABLE_TYPE:
- return eval_is_replaceable_type (h);
case METAFN_IS_STANDARD_LAYOUT_TYPE:
return eval_is_standard_layout_type (h);
case METAFN_IS_EMPTY_TYPE:
@@ -7959,8 +7925,6 @@ process_metafunction (const constexpr_ctx *ctx, tree fun,
tree call,
"is_nothrow_swappable");
case METAFN_IS_NOTHROW_DESTRUCTIBLE_TYPE:
return eval_is_nothrow_destructible_type (loc, h);
- case METAFN_IS_NOTHROW_RELOCATABLE_TYPE:
- return eval_is_nothrow_relocatable_type (loc, h);
case METAFN_IS_IMPLICIT_LIFETIME_TYPE:
return eval_is_implicit_lifetime_type (h);
case METAFN_HAS_VIRTUAL_DESTRUCTOR:
diff --git a/gcc/testsuite/g++.dg/reflect/eh1.C
b/gcc/testsuite/g++.dg/reflect/eh1.C
index 092fd36fcb7..10eba7b2a8d 100644
--- a/gcc/testsuite/g++.dg/reflect/eh1.C
+++ b/gcc/testsuite/g++.dg/reflect/eh1.C
@@ -128,12 +128,6 @@ eval (int n)
case 38:
is_trivially_copyable_type (^^n);
break;
- case 39:
- is_trivially_relocatable_type (^^n);
- break;
- case 40:
- is_replaceable_type (^^n);
- break;
case 41:
is_standard_layout_type (^^n);
break;
@@ -224,9 +218,6 @@ eval (int n)
case 70:
is_nothrow_destructible_type (^^n);
break;
- case 71:
- is_nothrow_relocatable_type (^^n);
- break;
case 72:
has_virtual_destructor (^^n);
break;
@@ -319,8 +310,6 @@ static_assert (test (35));
static_assert (test (36));
static_assert (test (37));
static_assert (test (38));
-static_assert (test (39));
-static_assert (test (40));
static_assert (test (41));
static_assert (test (42));
static_assert (test (43));
@@ -351,7 +340,6 @@ static_assert (test (67));
static_assert (test (68));
static_assert (test (69));
static_assert (test (70));
-static_assert (test (71));
static_assert (test (72));
static_assert (test (73));
static_assert (test (74));
diff --git a/gcc/testsuite/g++.dg/reflect/eh2.C
b/gcc/testsuite/g++.dg/reflect/eh2.C
index 7f6b235a4ec..21f98796dfe 100644
--- a/gcc/testsuite/g++.dg/reflect/eh2.C
+++ b/gcc/testsuite/g++.dg/reflect/eh2.C
@@ -46,8 +46,6 @@ static_assert ((add_pointer (^^i), true)); // { dg-error
"non-constant|uncaught
static_assert ((is_const_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
static_assert ((is_volatile_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
static_assert ((is_trivially_copyable_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
-static_assert ((is_trivially_relocatable_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
-static_assert ((is_replaceable_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
static_assert ((is_standard_layout_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
static_assert ((is_empty_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
static_assert ((is_polymorphic_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
@@ -78,7 +76,6 @@ static_assert ((is_nothrow_move_constructible_type (^^i),
true)); // { dg-error
static_assert ((is_nothrow_copy_assignable_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
static_assert ((is_nothrow_move_assignable_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
static_assert ((is_nothrow_destructible_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
-static_assert ((is_nothrow_relocatable_type (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
static_assert ((has_virtual_destructor (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
static_assert ((has_unique_object_representations (^^i), true)); // { dg-error
"non-constant|uncaught exception" }
static_assert ((rank (^^i), true)); // { dg-error "non-constant|uncaught
exception" }
diff --git a/gcc/testsuite/g++.dg/reflect/type_trait5.C
b/gcc/testsuite/g++.dg/reflect/type_trait5.C
index f18eb970dbc..ff025882b4f 100644
--- a/gcc/testsuite/g++.dg/reflect/type_trait5.C
+++ b/gcc/testsuite/g++.dg/reflect/type_trait5.C
@@ -207,50 +207,6 @@ namespace N
void foo ();
}
-namespace TR
-{
- struct A {};
-
- struct B {
- B ();
- ~B ();
- B (const B &);
- B (B &&);
- B &operator= (const B &);
- B &operator= (B &&);
- };
-
- struct C {
- C (C &&) = delete;
- C &operator= (C &&) = delete;
- C () = default;
- };
-
- struct D : A {};
-
- struct E : virtual A {};
-
- struct F trivially_relocatable_if_eligible : virtual A {};
-
- struct G { B data; };
-
- struct H { ~H () = default; };
-
- struct I { ~I (); };
- I::~I () = default;
-
- struct J { virtual ~J () = default; };
-
- struct K { ~K () = delete; };
-
- struct L { L (L &&) = default; };
-
- struct M { M (M &&); };
- M::M (M &&) = default;
-
- struct N { N (N &&) = delete; };
-}
-
int v = 1;
struct S1 { decltype (^^long) a; };
union U2 { int a; decltype (^^N::foo) b; };
@@ -316,36 +272,6 @@ static_assert (is_trivially_copyable_type
(^^HasTemplateCCtor));
static_assert (is_trivially_copyable_type (^^MoveOnly));
static_assert (is_trivially_copyable_type (^^MoveOnly2));
-static_assert (is_trivially_relocatable_type (^^TR::A));
-static_assert (!is_trivially_relocatable_type (^^TR::B));
-static_assert (!is_trivially_relocatable_type (^^TR::C));
-static_assert (is_trivially_relocatable_type (^^TR::D));
-static_assert (!is_trivially_relocatable_type (^^TR::E));
-static_assert (!is_trivially_relocatable_type (^^TR::F));
-static_assert (!is_trivially_relocatable_type (^^TR::G));
-static_assert (is_trivially_relocatable_type (^^TR::H));
-static_assert (!is_trivially_relocatable_type (^^TR::I));
-static_assert (is_trivially_relocatable_type (^^TR::J));
-static_assert (!is_trivially_relocatable_type (^^TR::K));
-static_assert (!is_trivially_relocatable_type (^^TR::L));
-static_assert (!is_trivially_relocatable_type (^^TR::M));
-static_assert (!is_trivially_relocatable_type (^^TR::N));
-
-static_assert (is_replaceable_type (^^TR::A));
-static_assert (!is_replaceable_type (^^TR::B));
-static_assert (!is_replaceable_type (^^TR::C));
-static_assert (is_replaceable_type (^^TR::D));
-static_assert (is_replaceable_type (^^TR::E));
-static_assert (is_replaceable_type (^^TR::F));
-static_assert (!is_replaceable_type (^^TR::G));
-static_assert (is_replaceable_type (^^TR::H));
-static_assert (!is_replaceable_type (^^TR::I));
-static_assert (is_replaceable_type (^^TR::J));
-static_assert (!is_replaceable_type (^^TR::K));
-static_assert (!is_replaceable_type (^^TR::L));
-static_assert (!is_replaceable_type (^^TR::M));
-static_assert (!is_replaceable_type (^^TR::N));
-
static_assert (is_standard_layout_type (^^SLType));
static_assert (is_standard_layout_type (^^PODType));
static_assert (!is_standard_layout_type (^^NType));
diff --git a/gcc/testsuite/g++.dg/reflect/type_trait7.C
b/gcc/testsuite/g++.dg/reflect/type_trait7.C
deleted file mode 100644
index 6c3b9f1e7b8..00000000000
--- a/gcc/testsuite/g++.dg/reflect/type_trait7.C
+++ /dev/null
@@ -1,142 +0,0 @@
-// { dg-do compile { target c++26 } }
-// { dg-additional-options "-freflection" }
-// Test reflection type traits [meta.reflection.traits], type properties.
-
-#include <meta>
-using namespace std::meta;
-
-struct A { A (A &&) = default; A &operator= (A &&) = default; ~A () = default;
int a; };
-
-static_assert (is_trivially_relocatable_type (^^A));
-static_assert (is_nothrow_relocatable_type (^^A));
-static_assert (is_replaceable_type (^^A));
-
-struct B { B (B &&); B &operator= (B &&) = default; ~B () = default; int a; };
-
-static_assert (!is_trivially_relocatable_type (^^B));
-static_assert (!is_nothrow_relocatable_type (^^B));
-static_assert (!is_replaceable_type (^^B));
-
-struct C { C (C &&) = default; C &operator= (C &&); ~C () = default; int a; };
-
-static_assert (!is_trivially_relocatable_type (^^C));
-static_assert (is_nothrow_relocatable_type (^^C));
-static_assert (!is_replaceable_type (^^C));
-
-struct D { D (D &&) = delete; D &operator= (D &&) = default; int a; };
-
-static_assert (!is_trivially_relocatable_type (^^D));
-static_assert (!is_nothrow_relocatable_type (^^D));
-static_assert (!is_replaceable_type (^^D));
-
-struct E { E (E &&) = default; E &operator= (E &&) = delete; int a; };
-
-static_assert (!is_trivially_relocatable_type (^^E));
-static_assert (is_nothrow_relocatable_type (^^E));
-static_assert (!is_replaceable_type (^^E));
-
-struct F { F (F &&) = default; F &operator= (F &&) = default; ~F () = delete;
int a; };
-
-static_assert (!is_trivially_relocatable_type (^^F));
-static_assert (!is_nothrow_relocatable_type (^^F));
-static_assert (!is_replaceable_type (^^F));
-
-struct G { G (const G &) = default; G &operator= (const G &) = default; int a;
};
-
-static_assert (is_trivially_relocatable_type (^^G));
-static_assert (is_nothrow_relocatable_type (^^G));
-static_assert (is_replaceable_type (^^G));
-
-struct H { H (const H &); H &operator= (const H &) = default; int a; };
-
-static_assert (!is_trivially_relocatable_type (^^H));
-static_assert (!is_nothrow_relocatable_type (^^H));
-static_assert (!is_replaceable_type (^^H));
-
-struct I { I (const I &) = default; I &operator= (const I &); ~I () = default;
int a; };
-
-static_assert (!is_trivially_relocatable_type (^^I));
-static_assert (is_nothrow_relocatable_type (^^I));
-static_assert (!is_replaceable_type (^^I));
-
-struct J { J (const J &) = delete; J &operator= (const J &) = default; int a;
};
-
-static_assert (!is_trivially_relocatable_type (^^J));
-static_assert (!is_nothrow_relocatable_type (^^J));
-static_assert (!is_replaceable_type (^^J));
-
-struct K { K (const K &) = default; K &operator= (const K &) = delete; int a;
};
-
-static_assert (!is_trivially_relocatable_type (^^K));
-static_assert (is_nothrow_relocatable_type (^^K));
-static_assert (!is_replaceable_type (^^K));
-
-struct M;
-struct L { L (L &&) = default; L (M &&); L &operator= (L &&) = default; int a;
};
-
-static_assert (is_trivially_relocatable_type (^^L));
-static_assert (is_nothrow_relocatable_type (^^L));
-static_assert (is_replaceable_type (^^L));
-
-struct M : public L { using L::L; M (const M &); M &operator= (M &&) =
default; int b; };
-
-static_assert (!is_trivially_relocatable_type (^^M));
-static_assert (!is_nothrow_relocatable_type (^^M));
-static_assert (!is_replaceable_type (^^M));
-
-struct O;
-struct N { N (N &&) = default; N &operator= (N &&) = default; N &operator= (O
&&); int a; };
-
-static_assert (is_trivially_relocatable_type (^^N));
-static_assert (is_nothrow_relocatable_type (^^N));
-static_assert (is_replaceable_type (^^N));
-
-struct O : public N { using N::operator=; O (O &&) = default; int b; };
-
-static_assert (!is_trivially_relocatable_type (^^O));
-static_assert (is_nothrow_relocatable_type (^^O));
-static_assert (!is_replaceable_type (^^O));
-
-struct Q;
-struct P { template <typename T> P (T &&) {} };
-
-static_assert (is_trivially_relocatable_type (^^P));
-static_assert (is_nothrow_relocatable_type (^^P));
-static_assert (is_replaceable_type (^^P));
-
-struct Q : public P { using P::P; Q (const Q &); };
-
-static_assert (!is_trivially_relocatable_type (^^Q));
-static_assert (!is_nothrow_relocatable_type (^^Q));
-static_assert (!is_replaceable_type (^^Q));
-
-struct S;
-struct R { R (const R &) = default; R (const M &); R &operator= (R &&) =
default; int a; };
-
-static_assert (is_trivially_relocatable_type (^^R));
-static_assert (is_nothrow_relocatable_type (^^R));
-static_assert (is_replaceable_type (^^R));
-
-struct S : public R { using R::R; S &operator= (S &&) = default; int b; };
-
-static_assert (!is_trivially_relocatable_type (^^S));
-static_assert (!is_nothrow_relocatable_type (^^S));
-static_assert (!is_replaceable_type (^^S));
-
-struct T { T (T &&) = default; T &operator= (T &&) = default; ~T (); int a; };
-
-static_assert (!is_trivially_relocatable_type (^^T));
-static_assert (is_nothrow_relocatable_type (^^T));
-static_assert (!is_replaceable_type (^^T));
-
-struct U { U (const U &) = default; U &operator= (const U &) = default; ~U ();
int a; };
-
-static_assert (!is_trivially_relocatable_type (^^U));
-static_assert (is_nothrow_relocatable_type (^^U));
-static_assert (!is_replaceable_type (^^U));
-
-struct V { public: V (); private: V (V &&) = default; V &operator= (V &&) =
default; ~V () = default; int a; };
-
-static_assert (is_trivially_relocatable_type (^^V));
-static_assert (is_nothrow_relocatable_type (^^V));
-static_assert (is_replaceable_type (^^V));
diff --git a/libstdc++-v3/include/std/meta b/libstdc++-v3/include/std/meta
index 871ce087067..42f84148371 100644
--- a/libstdc++-v3/include/std/meta
+++ b/libstdc++-v3/include/std/meta
@@ -449,8 +449,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
consteval bool is_const_type(info);
consteval bool is_volatile_type(info);
consteval bool is_trivially_copyable_type(info);
- consteval bool is_trivially_relocatable_type(info);
- consteval bool is_replaceable_type(info);
consteval bool is_standard_layout_type(info);
consteval bool is_empty_type(info);
consteval bool is_polymorphic_type(info);
@@ -504,7 +502,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
consteval bool is_nothrow_swappable_type(info);
consteval bool is_nothrow_destructible_type(info);
- consteval bool is_nothrow_relocatable_type(info);
consteval bool is_implicit_lifetime_type(info);
diff --git a/libstdc++-v3/src/c++23/std.cc.in
b/libstdc++-v3/src/c++23/std.cc.in
index 678e9c0107a..95beea5212d 100644
--- a/libstdc++-v3/src/c++23/std.cc.in
+++ b/libstdc++-v3/src/c++23/std.cc.in
@@ -2195,8 +2195,6 @@ export namespace std
using std::meta::is_const_type;
using std::meta::is_volatile_type;
using std::meta::is_trivially_copyable_type;
- using std::meta::is_trivially_relocatable_type;
- using std::meta::is_replaceable_type;
using std::meta::is_standard_layout_type;
using std::meta::is_empty_type;
using std::meta::is_polymorphic_type;
@@ -2237,7 +2235,6 @@ export namespace std
using std::meta::is_nothrow_swappable_with_type;
using std::meta::is_nothrow_swappable_type;
using std::meta::is_nothrow_destructible_type;
- using std::meta::is_nothrow_relocatable_type;
using std::meta::is_implicit_lifetime_type;
using std::meta::has_virtual_destructor;
using std::meta::has_unique_object_representations;