Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.0/patches/2175273/?format=api
{ "id": 2175273, "url": "http://patchwork.ozlabs.org/api/1.0/patches/2175273/?format=api", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/1.0/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null }, "msgid": "<aULfKrrC9DALd5En@redhat.com>", "date": "2025-12-17T16:49:46", "name": "[9/9,v2] c++: C++26 Reflection [PR120775]", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "10eb7a1e17ed0c65e05d6182639a10b6ea39fc46", "submitter": { "id": 14370, "url": "http://patchwork.ozlabs.org/api/1.0/people/14370/?format=api", "name": "Marek Polacek", "email": "polacek@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/aULfKrrC9DALd5En@redhat.com/mbox/", "series": [ { "id": 485726, "url": "http://patchwork.ozlabs.org/api/1.0/series/485726/?format=api", "date": "2025-12-17T16:42:41", "name": "c++: C++26 Reflection [PR120775]", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/485726/mbox/" } ], "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2175273/checks/", "tags": {}, "headers": { "Return-Path": "<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=IT1f7Bw8;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)", "sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=IT1f7Bw8", "sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com", "sourceware.org; spf=pass smtp.mailfrom=redhat.com", "server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.129.124" ], "Received": [ "from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4dWg014XV8z1y0P\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 18 Dec 2025 03:55:13 +1100 (AEDT)", "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 755CE4BA2E33\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 17 Dec 2025 16:55:11 +0000 (GMT)", "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by sourceware.org (Postfix) with ESMTP id 69A154BA2E27\n for <gcc-patches@gcc.gnu.org>; Wed, 17 Dec 2025 16:49:55 +0000 (GMT)", "from mail-qk1-f199.google.com (mail-qk1-f199.google.com\n [209.85.222.199]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-501-3WCXBOPbPderLZAoozD80A-1; Wed, 17 Dec 2025 11:49:53 -0500", "by mail-qk1-f199.google.com with SMTP id\n af79cd13be357-8b2e235d4d2so2382764785a.3\n for <gcc-patches@gcc.gnu.org>; Wed, 17 Dec 2025 08:49:53 -0800 (PST)", "from redhat.com ([2603:7000:9500:10::1db4])\n by smtp.gmail.com with ESMTPSA id\n 6a1803df08f44-889a8609e59sm98734386d6.51.2025.12.17.08.49.47\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 17 Dec 2025 08:49:48 -0800 (PST)" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org 755CE4BA2E33", "OpenDKIM Filter v2.11.0 sourceware.org 69A154BA2E27" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 69A154BA2E27", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 69A154BA2E27", "ARC-Seal": "i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1765990195; cv=none;\n b=EI1B5fgjd5GoZn+AoEK7x9lcqKzARVuEvPVGm5h4ZquKNZfRwHqkPGO+u0AnKaWS83TBgYMohRPfmDhtLE0oZIFvG0yAROGmnj4ojETgHiH7fcITGz13IeMuF7vAQbz0UR/R+ikRhviVAgIMpNTqQp7ywW9dHU5ImvqDwjM69lQ=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1765990195; c=relaxed/simple;\n bh=6bXI0QdOywJHyH9vZ2APzG/jmnsTvgHqBhEyU3APZQs=;\n h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version;\n b=XJFf6WunLDv45YgNY8aOM7voZQMXFCtJ8s/6DINl+jHtr45LZuZRFDBmTXAJlKQTmACX7N9UF3R0fESQMysx9ijd71jTR8WqfTcSVetSXiOD12Zg3MHcBXgKak8i3anDO7R6qWRj/WwmHEFGmXRodrPzbxdR8j1BsMLwKMwhoO8=", "ARC-Authentication-Results": "i=1; server2.sourceware.org", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1765990195;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=kJrl34wNnqEakfQYrKN8yTV2lgm4PNTyrrAZ68W8KtQ=;\n b=IT1f7Bw8aUd9+oVH4N7mINu5Tn2yIEkqpzqv+BGGS8iWhxBiGHT+y4+2iFZxMwkK3kXByW\n O11EvRkoN5wGquwp1iiHi6E9iJ6e3IwzZilJ/70Kguc4tROwCkM445AkMB4WuDgq6kEysz\n XiPkiQUBsKqDB8Ddn4xaoJKE2uvfJTA=", "X-MC-Unique": "3WCXBOPbPderLZAoozD80A-1", "X-Mimecast-MFC-AGG-ID": "3WCXBOPbPderLZAoozD80A_1765990193", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1765990192; x=1766594992;\n h=user-agent:in-reply-to:content-disposition:mime-version:references\n :message-id:subject:to:from:date:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=kJrl34wNnqEakfQYrKN8yTV2lgm4PNTyrrAZ68W8KtQ=;\n b=Ik9GQhIqgGZO6CdoZhKA+6pTJA4BnoYX5pwSozGN03I1gST6LZSKyIv+lwcxsZJerH\n CndtZLj8lnF7OBPGIaHObrSJYDyGb2mj5h6A8BrmdpZ+dMeq0enKHlwexXSgTGd2HvSI\n Q+86K+i++cxX6JBSTg+1G6Uewd0NsU2iYOOlRKCeUxZMdrv1vVEE0YSlrP3IStKUFspw\n dGZrv4GYKKybSXgvUYkrSkWcafIee9/GMqSMWH1UqsT1uKgi/BottdBw4fEkjHq7vhYn\n f7urM75yOLIoJPWLzGMSCyRttAcf1u1nL4vtaHyxxxgypbXN4ZYbgO1Incyr7QZFg74d\n nfCg==", "X-Gm-Message-State": "AOJu0YwWmoaLBR0NWCnetd6OgxLZzsPGH30JOePfQ3mt+g2uSks/znA+\n ypbncaP5KGyvtsAr18W0/SkH6Z4UKdDlg+86P8iey5SBJOFkspjbuiNpfHMbGERXVTMxwBBODKK\n K1ajH9JWbX49qfY3yASMPt4wVgxDb0ZRuBOBzLXEXMSED4Dl/4hNaJFNZcVntf9PIyiSpYpYXPw\n p/PDJV6jr02yra3RLHenqZTtulwWgpECD2i3WV8M4oZg==", "X-Gm-Gg": "AY/fxX555R1IKalB8mLJhBxdzVkUOZRPZjPmpTzaN+G917xMfVb9cIWQcnxwd/p3clP\n GbQsa9BaFPJDXfwMVaFrfu+/+I3KuTs4oJiWpz+FXZrCd2McOMV4/801DBXWaHHFAX57mPJ0fJb\n BtdUawZ4qjSwZHHh13uTlZDOMNhMHyKs8C/ClpCdzx8o9vdZLus8c12sg3cttRBAovJFc6OeNMZ\n sqhfOaRGLSkieKIMWpPipt5EvrhlZgoD9tL3xe/nXGkd1aLHTzDck0wl5CDppUy70ecSbmLmOGS\n pRWZDrzTICqexWIXDYmaGOtNUI/Wr+Vr1KCYh7WZVZhw6iXa5znnYlllrZZR8VXe8A==", "X-Received": [ "by 2002:a05:620a:46a7:b0:893:b99:7120 with SMTP id\n af79cd13be357-8bb3a38f6abmr2642274885a.80.1765990190385;\n Wed, 17 Dec 2025 08:49:50 -0800 (PST)", "by 2002:a05:620a:46a7:b0:893:b99:7120 with SMTP id\n af79cd13be357-8bb3a38f6abmr2642263585a.80.1765990188868;\n Wed, 17 Dec 2025 08:49:48 -0800 (PST)" ], "X-Google-Smtp-Source": "\n AGHT+IHrIWmE2JBD2wKOYLiNK+b3Y5X5gp8l07imphct2PGQfi4lFoms3FhBuK0J32sKo3gyfxaY9Q==", "Date": "Wed, 17 Dec 2025 11:49:46 -0500", "From": "Marek Polacek <polacek@redhat.com>", "To": "GCC Patches <gcc-patches@gcc.gnu.org>, Jason Merrill <jason@redhat.com>,\n Jakub Jelinek <jakub@redhat.com>, Jonathan Wakely <jwakely@redhat.com>", "Subject": "[PATCH 9/9 v2] c++: C++26 Reflection [PR120775]", "Message-ID": "<aULfKrrC9DALd5En@redhat.com>", "References": "<aULdgYtbcyGQIxK1@redhat.com>", "MIME-Version": "1.0", "In-Reply-To": "<aULdgYtbcyGQIxK1@redhat.com>", "User-Agent": "Mutt/2.2.14 (2025-02-20)", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "cW3xSKHD6WKuoHfjNWSZUKBSKCKoRROuh7DrorFB9X8_1765990193", "X-Mimecast-Originator": "redhat.com", "Content-Type": "text/plain; charset=us-ascii", "Content-Disposition": "inline", "X-BeenThere": "gcc-patches@gcc.gnu.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "Gcc-patches mailing list <gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>", "List-Archive": "<https://gcc.gnu.org/pipermail/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-request@gcc.gnu.org?subject=help>", "List-Subscribe": "<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>", "Errors-To": "gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org" }, "content": "Testsuite bits part #5.\n\n-- >8 --", "diff": "diff --git a/gcc/testsuite/g++.dg/reflect/type_trait11.C b/gcc/testsuite/g++.dg/reflect/type_trait11.C\nnew file mode 100644\nindex 00000000000..977afbcf125\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/type_trait11.C\n@@ -0,0 +1,447 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test reflection type traits [meta.reflection.traits], type properties.\n+\n+#include <functional>\n+#include <meta>\n+\n+using namespace std::meta;\n+\n+class ClassType { };\n+class DerivedType : public ClassType { };\n+enum EnumType { e0 };\n+struct ThrowDefaultClass { ThrowDefaultClass () noexcept (false); };\n+struct ThrowCopyConsClass { ThrowCopyConsClass (const ThrowCopyConsClass &) noexcept (false); };\n+struct ThrowMoveConsClass { ThrowMoveConsClass (ThrowMoveConsClass &&) noexcept (false); };\n+struct NoexceptDefaultClass { NoexceptDefaultClass () noexcept (true); };\n+struct ExceptDefaultClass { ExceptDefaultClass () noexcept (false); };\n+struct NoexceptCopyConsClass { NoexceptCopyConsClass (const NoexceptCopyConsClass &) noexcept (true); };\n+struct ExceptCopyConsClass { ExceptCopyConsClass (const ExceptCopyConsClass &) noexcept (false); };\n+struct NoexceptMoveConsClass { NoexceptMoveConsClass (NoexceptMoveConsClass &&) noexcept (true); NoexceptMoveConsClass &operator= (NoexceptMoveConsClass &&) = default; };\n+struct ExceptMoveConsClass { ExceptMoveConsClass (ExceptMoveConsClass &&) noexcept (false); };\n+struct NoexceptCopyAssignClass { NoexceptCopyAssignClass &operator= (const NoexceptCopyAssignClass &) noexcept (true); };\n+struct ExceptCopyAssignClass { ExceptCopyAssignClass &operator= (const ExceptCopyAssignClass &) noexcept (false); };\n+struct NoexceptMoveAssignClass { NoexceptMoveAssignClass (NoexceptMoveAssignClass &&) = default; NoexceptMoveAssignClass &operator= (NoexceptMoveAssignClass &&) noexcept (true); };\n+struct ExceptMoveAssignClass { ExceptMoveAssignClass &operator= (ExceptMoveAssignClass &&) noexcept (false); };\n+struct DeletedCopyAssignClass { DeletedCopyAssignClass & operator= (const DeletedCopyAssignClass &) = delete; };\n+struct DeletedMoveAssignClass { DeletedMoveAssignClass &operator= (DeletedMoveAssignClass &&) = delete; };\n+struct NType { int i; int j; virtual ~NType (); };\n+struct TType { int i; private: int j; };\n+struct SLType { int i; int j; ~SLType (); };\n+struct PODType { int i; int j; };\n+struct LType { int i; constexpr LType (int j) : i(j) {} };\n+struct HasTemplateCCtor { HasTemplateCCtor (const HasTemplateCCtor &) = default; template <class T> HasTemplateCCtor (T &&); };\n+struct MoveOnly { MoveOnly (MoveOnly &&) = default; };\n+struct MoveOnly2 { MoveOnly2 (MoveOnly2 &&) = delete; };\n+class PolymorphicClass { virtual void rotate (int); };\n+struct CopyConsOnlyType {\n+ CopyConsOnlyType (int) { }\n+ CopyConsOnlyType (CopyConsOnlyType &&) = delete;\n+ CopyConsOnlyType (const CopyConsOnlyType &) = default;\n+ CopyConsOnlyType &operator= (const CopyConsOnlyType &) = delete;\n+ CopyConsOnlyType &operator= (CopyConsOnlyType &&) = delete;\n+};\n+struct MoveConsOnlyType {\n+ MoveConsOnlyType (int) { }\n+ MoveConsOnlyType (const MoveConsOnlyType &) = delete;\n+ MoveConsOnlyType (MoveConsOnlyType &&) = default;\n+ MoveConsOnlyType &operator= (const MoveConsOnlyType &) = delete;\n+ MoveConsOnlyType &operator= (MoveConsOnlyType &&) = delete;\n+};\n+struct NoexceptExplicitClass {\n+ NoexceptExplicitClass (double &) noexcept (true);\n+ explicit NoexceptExplicitClass (int &) noexcept (true);\n+ NoexceptExplicitClass (double &, int &, double &) noexcept (true);\n+};\n+struct ExceptExplicitClass {\n+ ExceptExplicitClass (double &) noexcept (false);\n+ explicit ExceptExplicitClass (int &) noexcept (false);\n+ ExceptExplicitClass (double &, int &, double &) noexcept (false);\n+};\n+struct NothrowExplicitClass {\n+ NothrowExplicitClass (double &) throw ();\n+ explicit NothrowExplicitClass (int &) throw ();\n+ NothrowExplicitClass (double &, int &, double &) throw ();\n+};\n+\n+namespace N1\n+{\n+ struct Empty {};\n+ struct B { int i; B () {} };\n+ struct D : B {};\n+ enum E { ee1 };\n+ enum E2 { ee2 };\n+ enum class SE { e1 };\n+ enum class SE2 { e2 };\n+ enum OpE : int;\n+ enum class OpSE : bool;\n+ union U { int i; Empty b; };\n+ struct Abstract { virtual ~Abstract () = 0; };\n+ struct AbstractDelDtor { ~AbstractDelDtor () = delete; virtual void foo () = 0; };\n+ struct Ukn;\n+ template <class To>\n+ struct ImplicitTo { operator To (); };\n+ template <class To>\n+ struct DelImplicitTo { operator To () = delete; };\n+ template <class To>\n+ struct ExplicitTo { explicit operator To (); };\n+ struct Ellipsis { Ellipsis (...) {} };\n+ struct DelEllipsis { DelEllipsis (...) = delete; };\n+ struct Any { template <class T> Any (T &&) {} };\n+ struct nAny { template <class... T> nAny (T &&...) {} };\n+ struct DelnAny { template <class... T> DelnAny (T &&...) = delete; };\n+ template <class... Args>\n+ struct FromArgs { FromArgs (Args...); };\n+ struct DelDef { DelDef () = delete; };\n+ struct DelCopy { DelCopy (const DelCopy &) = delete; };\n+ struct DelDtor {\n+ DelDtor () = default;\n+ DelDtor (const DelDtor &) = default;\n+ DelDtor (DelDtor &&) = default;\n+ DelDtor (int);\n+ DelDtor (int, B, U);\n+ ~DelDtor () = delete;\n+ };\n+ struct Nontrivial {\n+ Nontrivial ();\n+ Nontrivial (const Nontrivial &);\n+ Nontrivial &operator= (const Nontrivial &);\n+ ~Nontrivial ();\n+ };\n+ union NontrivialUnion { int i; Nontrivial n; };\n+ struct UnusualCopy { UnusualCopy (UnusualCopy &); };\n+}\n+struct X { X () = default; X (int) noexcept {} X (double) {} };\n+struct Y { int i; X x; };\n+struct Z : Y { };\n+\n+static_assert (is_trivially_constructible_type (^^int, {}));\n+static_assert (is_trivially_constructible_type (^^int, { ^^int }));\n+static_assert (is_trivially_constructible_type (^^int, { ^^int & }));\n+static_assert (is_trivially_constructible_type (^^int, { ^^int && }));\n+static_assert (is_trivially_constructible_type (^^int, { ^^const int & }));\n+static_assert (!is_trivially_constructible_type (^^int, { ^^void * }));\n+static_assert (!is_trivially_constructible_type (^^int, { ^^int * }));\n+static_assert (!is_trivially_constructible_type (^^int, { ^^const int * }));\n+static_assert (!is_trivially_constructible_type (^^int *, { ^^void * }));\n+static_assert (!is_trivially_constructible_type (^^int *, { ^^const int * }));\n+static_assert (!is_trivially_constructible_type (^^int &, { ^^const int }));\n+static_assert (is_trivially_constructible_type (^^const int &, { ^^int }));\n+static_assert (is_trivially_constructible_type (^^const int &, { ^^int & }));\n+static_assert (is_trivially_constructible_type (^^const int *, { ^^int * }));\n+static_assert (!is_trivially_constructible_type (^^PolymorphicClass, {}));\n+static_assert (!is_trivially_constructible_type (^^PolymorphicClass, { ^^PolymorphicClass }));\n+static_assert (!is_trivially_constructible_type (^^PolymorphicClass, { ^^PolymorphicClass & }));\n+static_assert (!is_trivially_constructible_type (^^PolymorphicClass, { ^^PolymorphicClass && }));\n+static_assert (!is_trivially_constructible_type (^^PolymorphicClass, { ^^const PolymorphicClass & }));\n+static_assert (is_trivially_constructible_type (^^TType, {}));\n+static_assert (is_trivially_constructible_type (^^TType, { ^^TType }));\n+static_assert (is_trivially_constructible_type (^^TType, { ^^TType & }));\n+static_assert (is_trivially_constructible_type (^^TType, { ^^TType && }));\n+static_assert (is_trivially_constructible_type (^^TType, { ^^const TType & }));\n+static_assert (!is_trivially_constructible_type (^^TType, { ^^int, ^^int }));\n+static_assert (is_trivially_constructible_type (^^PODType, {}));\n+static_assert (is_trivially_constructible_type (^^PODType, { ^^PODType }));\n+static_assert (is_trivially_constructible_type (^^PODType, { ^^PODType & }));\n+static_assert (is_trivially_constructible_type (^^PODType, { ^^PODType && }));\n+static_assert (is_trivially_constructible_type (^^PODType, { ^^const PODType & }));\n+static_assert (is_trivially_constructible_type (^^PODType, { ^^int, ^^int }));\n+static_assert (!is_trivially_constructible_type (^^NType, {}));\n+static_assert (!is_trivially_constructible_type (^^SLType, {}));\n+static_assert (!is_trivially_constructible_type (^^LType, {}));\n+static_assert (!is_trivially_constructible_type (^^LType, { ^^int }));\n+static_assert (!is_trivially_constructible_type (^^N1::DelDef, {}));\n+static_assert (!is_trivially_constructible_type (^^N1::Abstract, {}));\n+static_assert (!is_trivially_constructible_type (^^N1::Ellipsis, {}));\n+static_assert (!is_trivially_constructible_type (^^N1::DelEllipsis, {}));\n+static_assert (!is_trivially_constructible_type (^^N1::Any, {}));\n+static_assert (!is_trivially_constructible_type (^^N1::DelCopy, {}));\n+static_assert (!is_trivially_constructible_type (^^N1::DelCopy, { ^^const N1::DelCopy & }));\n+static_assert (!is_trivially_constructible_type (^^N1::DelDtor, {}));\n+static_assert (!is_trivially_constructible_type (^^N1::Nontrivial, {}));\n+static_assert (!is_trivially_constructible_type (^^N1::UnusualCopy, {}));\n+static_assert (!is_trivially_constructible_type (^^CopyConsOnlyType, {}));\n+static_assert (!is_trivially_constructible_type (^^CopyConsOnlyType, { ^^CopyConsOnlyType }));\n+static_assert (is_trivially_constructible_type (^^CopyConsOnlyType, { ^^CopyConsOnlyType & }));\n+static_assert (!is_trivially_constructible_type (^^CopyConsOnlyType, { ^^CopyConsOnlyType && }));\n+static_assert (is_trivially_constructible_type (^^CopyConsOnlyType, { ^^const CopyConsOnlyType & }));\n+static_assert (!is_trivially_constructible_type (^^MoveConsOnlyType, {}));\n+static_assert (is_trivially_constructible_type (^^MoveConsOnlyType, { ^^MoveConsOnlyType }));\n+static_assert (!is_trivially_constructible_type (^^MoveConsOnlyType, { ^^MoveConsOnlyType & }));\n+static_assert (is_trivially_constructible_type (^^MoveConsOnlyType, { ^^MoveConsOnlyType && }));\n+static_assert (!is_trivially_constructible_type (^^MoveConsOnlyType, { ^^const MoveConsOnlyType & }));\n+static_assert (is_trivially_constructible_type (^^ClassType, { ^^DerivedType }));\n+static_assert (is_trivially_constructible_type (^^ClassType, { ^^DerivedType & }));\n+static_assert (is_trivially_constructible_type (^^ClassType, { ^^DerivedType && }));\n+static_assert (is_trivially_constructible_type (^^ClassType, { ^^const DerivedType & }));\n+static_assert (!is_trivially_constructible_type (^^HasTemplateCCtor, {}));\n+static_assert (!is_trivially_constructible_type (^^HasTemplateCCtor, { ^^HasTemplateCCtor }));\n+static_assert (is_trivially_constructible_type (^^HasTemplateCCtor, { ^^const HasTemplateCCtor & }));\n+static_assert (!is_trivially_constructible_type (^^MoveOnly, {}));\n+static_assert (is_trivially_constructible_type (^^MoveOnly, { ^^MoveOnly }));\n+static_assert (!is_trivially_constructible_type (^^MoveOnly, { ^^MoveOnly & }));\n+static_assert (is_trivially_constructible_type (^^MoveOnly, { ^^MoveOnly && }));\n+static_assert (!is_trivially_constructible_type (^^MoveOnly, { ^^const MoveOnly & }));\n+static_assert (!is_trivially_constructible_type (^^MoveOnly2, {}));\n+static_assert (!is_trivially_constructible_type (^^int [], {}));\n+\n+static_assert (is_nothrow_constructible_type (^^NoexceptExplicitClass, { ^^double & }));\n+static_assert (is_nothrow_constructible_type (^^NoexceptExplicitClass, { ^^int & }));\n+static_assert (is_nothrow_constructible_type (^^NoexceptExplicitClass, { ^^double &, ^^int &, ^^double & }));\n+static_assert (is_nothrow_constructible_type (^^NothrowExplicitClass, { ^^double & }));\n+static_assert (is_nothrow_constructible_type (^^NothrowExplicitClass, { ^^int & }));\n+static_assert (is_nothrow_constructible_type (^^NothrowExplicitClass, { ^^double &, ^^int &, ^^double & }));\n+static_assert (is_nothrow_constructible_type (^^int [1], {}));\n+static_assert (!is_nothrow_constructible_type (^^NoexceptExplicitClass, { ^^void * }));\n+static_assert (!is_nothrow_constructible_type (^^NoexceptExplicitClass, {}));\n+static_assert (!is_nothrow_constructible_type (^^NoexceptExplicitClass, { ^^int, ^^double }));\n+static_assert (!is_nothrow_constructible_type (^^NothrowExplicitClass, { ^^void * }));\n+static_assert (!is_nothrow_constructible_type (^^NothrowExplicitClass, {}));\n+static_assert (!is_nothrow_constructible_type (^^NothrowExplicitClass, { ^^int, ^^double }));\n+static_assert (!is_nothrow_constructible_type (^^ExceptExplicitClass, { ^^double & }));\n+static_assert (!is_nothrow_constructible_type (^^ExceptExplicitClass, { ^^int & }));\n+static_assert (!is_nothrow_constructible_type (^^ExceptExplicitClass, { ^^double &, ^^int &, ^^double & }));\n+static_assert (!is_nothrow_constructible_type (^^int [], {}));\n+static_assert (is_nothrow_constructible_type (^^int [1], {}));\n+static_assert (is_nothrow_constructible_type (^^int [1], { ^^int }));\n+static_assert (is_nothrow_constructible_type (^^int [2], { ^^int }));\n+static_assert (is_nothrow_constructible_type (^^int [2], { ^^int, ^^int }));\n+static_assert (!is_nothrow_constructible_type (^^int [1], { ^^int, ^^int }));\n+static_assert (!is_nothrow_constructible_type (^^int [], {}));\n+static_assert (!is_nothrow_constructible_type (^^int [], { ^^int }));\n+static_assert (!is_nothrow_constructible_type (^^int [], { ^^int, ^^int }));\n+static_assert (is_nothrow_constructible_type (^^X [2], {}));\n+static_assert (is_nothrow_constructible_type (^^X [1], { ^^X }));\n+static_assert (is_nothrow_constructible_type (^^X [1], { ^^int }));\n+static_assert (!is_nothrow_constructible_type (^^X [1], { ^^double }));\n+static_assert (!is_nothrow_constructible_type (^^X [2], { ^^int, ^^double }));\n+static_assert (is_nothrow_constructible_type (^^Y, {}));\n+static_assert (is_nothrow_constructible_type (^^Y, { ^^Y }));\n+static_assert (is_nothrow_constructible_type (^^Y, { ^^int }));\n+static_assert (!is_nothrow_constructible_type (^^Y, { ^^X }));\n+static_assert (is_nothrow_constructible_type (^^Y, { ^^int, ^^X }));\n+static_assert (is_nothrow_constructible_type (^^Y, { ^^int, ^^int }));\n+static_assert (!is_nothrow_constructible_type (^^Y, { ^^int, ^^double }));\n+static_assert (is_nothrow_constructible_type (^^Z, {}));\n+static_assert (is_nothrow_constructible_type (^^Z, { ^^Z }));\n+static_assert (is_nothrow_constructible_type (^^Z, { ^^Y }));\n+static_assert (!is_nothrow_constructible_type (^^Z, { ^^int }));\n+static_assert (!is_nothrow_constructible_type (^^Z, { ^^int, ^^X }));\n+static_assert (!is_nothrow_constructible_type (^^Z, { ^^int, ^^int }));\n+static_assert (!is_nothrow_constructible_type (^^Z, { ^^Y, ^^double }));\n+static_assert (!is_nothrow_constructible_type (^^Z, { ^^int, ^^double }));\n+static_assert (!is_nothrow_constructible_type (^^Z, { ^^X }));\n+\n+using func_type_v0 = void (*) ();\n+using func_type_i0 = int (*) ();\n+using func_type_l0 = int &(*) ();\n+using func_type_ii = int (*) (int);\n+using func_type_il = int (*) (int &);\n+using func_type_ir = int (*) (int &&);\n+struct W { };\n+\n+using mem_type_i = int W::*;\n+using memfun_type_i = int (W::*) ();\n+using memfun_type_iic = int &(W::*) (int &) const;\n+struct F {\n+ int &operator () ();\n+ long &operator () () const;\n+ short &operator () (int) &&;\n+ char &operator () (int) const &;\n+private:\n+ void operator () (int, int);\n+};\n+using CF = const F;\n+struct T { T (int) { } };\n+struct NT { NT (int) noexcept { } };\n+struct Ex { explicit Ex (int) noexcept { } };\n+using func_type = void (*) ();\n+using func_type_nt = void (*) () noexcept;\n+using mem_type = int W::*;\n+using memfun_type = int (W::*) ();\n+using memfun_type_nt = int (W::*) () noexcept;\n+struct F2 {\n+ int &operator () ();\n+ long &operator () () const noexcept;\n+ short &operator () (int) &&;\n+ char &operator () (int) const & noexcept;\n+private:\n+ void operator () (int, int) noexcept;\n+};\n+using CF2 = const F2;\n+struct FW { W operator () () const noexcept { return {}; } };\n+struct V { explicit V (W) noexcept; V (...); };\n+\n+static_assert (is_invocable_type (^^func_type_v0, {}));\n+static_assert (!is_invocable_type (^^func_type_v0, { ^^int }));\n+static_assert (is_invocable_type (^^func_type_i0, {}));\n+static_assert (!is_invocable_type (^^func_type_i0, { ^^int }));\n+static_assert (is_invocable_type (^^func_type_l0, {}));\n+static_assert (!is_invocable_type (^^func_type_l0 (int), {}));\n+static_assert (!is_invocable_type (^^func_type_ii, {}));\n+static_assert (is_invocable_type (^^func_type_ii, { ^^int }));\n+static_assert (!is_invocable_type (^^func_type_il, {}));\n+static_assert (!is_invocable_type (^^func_type_il, { ^^int }));\n+static_assert (is_invocable_type (^^func_type_il, { ^^int & }));\n+static_assert (!is_invocable_type (^^func_type_ir, {}));\n+static_assert (is_invocable_type (^^func_type_ir, { ^^int }));\n+static_assert (!is_invocable_type (^^func_type_ir, { ^^int & }));\n+static_assert (!is_invocable_type (^^mem_type_i, {}));\n+static_assert (!is_invocable_type (^^mem_type_i, { ^^int }));\n+static_assert (!is_invocable_type (^^mem_type_i, { ^^int & }));\n+static_assert (is_invocable_type (^^mem_type_i, { ^^W & }));\n+static_assert (!is_invocable_type (^^memfun_type_i, {}));\n+static_assert (!is_invocable_type (^^memfun_type_i, { ^^int }));\n+static_assert (!is_invocable_type (^^memfun_type_i, { ^^int & }));\n+static_assert (is_invocable_type (^^memfun_type_i, { ^^W & }));\n+static_assert (is_invocable_type (^^memfun_type_i, { ^^W * }));\n+static_assert (!is_invocable_type (^^memfun_type_i, { ^^const W & }));\n+static_assert (!is_invocable_type (^^memfun_type_i, { ^^W &, ^^int }));\n+static_assert (!is_invocable_type (^^memfun_type_iic, {}));\n+static_assert (!is_invocable_type (^^memfun_type_iic, { ^^int }));\n+static_assert (!is_invocable_type (^^memfun_type_iic, { ^^int & }));\n+static_assert (!is_invocable_type (^^memfun_type_iic, { ^^W &, ^^int }));\n+static_assert (!is_invocable_type (^^memfun_type_iic, { ^^const W &, ^^int }));\n+static_assert (!is_invocable_type (^^memfun_type_iic, { ^^const W &, ^^int &, ^^int }));\n+static_assert (is_invocable_type (^^memfun_type_iic, { ^^const W &, ^^int & }));\n+static_assert (is_invocable_type (^^memfun_type_iic, { ^^const W *, ^^int & }));\n+static_assert (!is_invocable_type (^^F, { ^^int, ^^int }));\n+\n+static_assert (!is_nothrow_invocable_type (^^func_type, {}));\n+static_assert (is_nothrow_invocable_type (^^func_type_nt, {}));\n+static_assert (!is_nothrow_invocable_type (^^mem_type, {}));\n+static_assert (!is_nothrow_invocable_type (^^mem_type, { ^^int }));\n+static_assert (!is_nothrow_invocable_type (^^mem_type, { ^^int & }));\n+static_assert (is_nothrow_invocable_type (^^mem_type, { ^^W & }));\n+static_assert (!is_nothrow_invocable_type (^^memfun_type, {}));\n+static_assert (!is_nothrow_invocable_type (^^memfun_type, { ^^int }));\n+static_assert (!is_nothrow_invocable_type (^^memfun_type, { ^^int & }));\n+static_assert (!is_nothrow_invocable_type (^^memfun_type, { ^^W & }));\n+static_assert (!is_nothrow_invocable_type (^^memfun_type, { ^^W * }));\n+static_assert (!is_nothrow_invocable_type (^^memfun_type_nt, {}));\n+static_assert (!is_nothrow_invocable_type (^^memfun_type_nt, { ^^int }));\n+static_assert (!is_nothrow_invocable_type (^^memfun_type_nt, { ^^int & }));\n+static_assert (is_nothrow_invocable_type (^^memfun_type_nt, { ^^W & }));\n+static_assert (is_nothrow_invocable_type (^^memfun_type_nt, { ^^W * }));\n+static_assert (!is_nothrow_invocable_type (^^F2, {}));\n+static_assert (is_nothrow_invocable_type (^^CF2, {}));\n+static_assert (!is_nothrow_invocable_type (^^F2, { ^^int }));\n+static_assert (is_nothrow_invocable_type (^^F2 &, { ^^int }));\n+static_assert (is_nothrow_invocable_type (^^CF2, { ^^int }));\n+static_assert (is_nothrow_invocable_type (^^CF2 &, { ^^int }));\n+static_assert (!is_nothrow_invocable_type (^^F2, { ^^int, ^^int }));\n+static_assert (is_nothrow_invocable_type (^^FW, {}));\n+\n+static_assert (is_invocable_r_type (^^void, ^^func_type_v0, {}));\n+static_assert (!is_invocable_r_type (^^void *, ^^func_type_v0, {}));\n+static_assert (!is_invocable_r_type (^^int, ^^func_type_v0, {}));\n+static_assert (!is_invocable_r_type (^^void, ^^func_type_v0, { ^^int }));\n+static_assert (!is_invocable_r_type (^^void *, ^^func_type_v0, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int, ^^func_type_v0, { ^^int }));\n+static_assert (is_invocable_r_type (^^void, ^^func_type_i0, {}));\n+static_assert (is_invocable_r_type (^^int, ^^func_type_i0, {}));\n+static_assert (!is_invocable_r_type (^^int &, ^^func_type_i0, {}));\n+static_assert (is_invocable_r_type (^^long, ^^func_type_i0, {}));\n+static_assert (!is_invocable_r_type (^^void, ^^func_type_i0, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int, ^^func_type_i0, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int &, ^^func_type_i0, { ^^int }));\n+static_assert (!is_invocable_r_type (^^long, ^^func_type_i0, { ^^int }));\n+static_assert (is_invocable_r_type (^^void, ^^func_type_l0, {}));\n+static_assert (is_invocable_r_type (^^int, ^^func_type_l0, {}));\n+static_assert (is_invocable_r_type (^^int &, ^^func_type_l0, {}));\n+static_assert (!is_invocable_r_type (^^int &&, ^^func_type_l0, {}));\n+static_assert (is_invocable_r_type (^^long, ^^func_type_l0, {}));\n+static_assert (!is_invocable_r_type (^^long &, ^^func_type_l0, {}));\n+static_assert (!is_invocable_r_type (^^void, ^^func_type_l0, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int, ^^func_type_l0, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int &, ^^func_type_l0, { ^^int }));\n+static_assert (!is_invocable_r_type (^^long, ^^func_type_l0, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int, ^^func_type_ii, {}));\n+static_assert (!is_invocable_r_type (^^int &, ^^func_type_ii, {}));\n+static_assert (!is_invocable_r_type (^^long, ^^func_type_ii, {}));\n+static_assert (is_invocable_r_type (^^int, ^^func_type_ii, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int &, ^^func_type_ii, { ^^int }));\n+static_assert (is_invocable_r_type (^^long, ^^func_type_ii, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int, ^^func_type_il, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int &, ^^func_type_il, { ^^int }));\n+static_assert (!is_invocable_r_type (^^long, ^^func_type_il, { ^^int }));\n+static_assert (is_invocable_r_type (^^int, ^^func_type_il, { ^^int & }));\n+static_assert (!is_invocable_r_type (^^int &, ^^func_type_il, { ^^int & }));\n+static_assert (is_invocable_r_type (^^long, ^^func_type_il, { ^^int & }));\n+static_assert (is_invocable_r_type (^^int, ^^func_type_ir, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int &, ^^func_type_ir, { ^^int }));\n+static_assert (is_invocable_r_type (^^long, ^^func_type_ir, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int, ^^func_type_ir, { ^^int & }));\n+static_assert (!is_invocable_r_type (^^int &, ^^func_type_ir, { ^^int & }));\n+static_assert (!is_invocable_r_type (^^long, ^^func_type_ir, { ^^int & }));\n+static_assert (!is_invocable_r_type (^^int, ^^mem_type_i, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int &, ^^mem_type_i, { ^^int }));\n+static_assert (!is_invocable_r_type (^^long, ^^mem_type_i, { ^^int }));\n+static_assert (!is_invocable_r_type (^^int, ^^mem_type_i, { ^^int & }));\n+static_assert (!is_invocable_r_type (^^int &, ^^mem_type_i, { ^^int & }));\n+static_assert (!is_invocable_r_type (^^long, ^^mem_type_i, { ^^int & }));\n+static_assert (is_invocable_r_type (^^int, ^^mem_type_i, { ^^W & }));\n+static_assert (is_invocable_r_type (^^int &, ^^mem_type_i, { ^^W & }));\n+static_assert (is_invocable_r_type (^^long, ^^mem_type_i, { ^^W & }));\n+static_assert (is_invocable_r_type (^^int, ^^memfun_type_i, { ^^W & }));\n+static_assert (!is_invocable_r_type (^^int &, ^^memfun_type_i, { ^^W & }));\n+static_assert (is_invocable_r_type (^^long, ^^memfun_type_i, { ^^W & }));\n+static_assert (!is_invocable_r_type (^^int, ^^memfun_type_i, { ^^const W & }));\n+static_assert (is_invocable_r_type (^^int, ^^memfun_type_iic, { ^^const W &, ^^int & }));\n+static_assert (is_invocable_r_type (^^int &, ^^memfun_type_iic, { ^^const W &, ^^int & }));\n+static_assert (is_invocable_r_type (^^long, ^^memfun_type_iic, { ^^const W &, ^^int & }));\n+static_assert (!is_invocable_r_type (^^long &, ^^memfun_type_iic, { ^^const W &, ^^int & }));\n+static_assert (is_invocable_r_type (^^int &, ^^F, {}));\n+static_assert (is_invocable_r_type (^^int &, ^^F &, {}));\n+static_assert (is_invocable_r_type (^^long &, ^^CF, {}));\n+static_assert (is_invocable_r_type (^^long &, ^^CF &, {}));\n+static_assert (is_invocable_r_type (^^short &, ^^F, { ^^int }));\n+static_assert (is_invocable_r_type (^^char &, ^^F &, { ^^int }));\n+static_assert (is_invocable_r_type (^^char &, ^^CF, { ^^int }));\n+static_assert (is_invocable_r_type (^^char &, ^^CF &, { ^^int }));\n+\n+static_assert (is_nothrow_invocable_r_type (^^int, ^^mem_type, { ^^W & }));\n+static_assert (is_nothrow_invocable_r_type (^^int &, ^^mem_type, { ^^W & }));\n+static_assert (is_nothrow_invocable_r_type (^^long, ^^mem_type, { ^^W & }));\n+static_assert (!is_nothrow_invocable_r_type (^^long &, ^^mem_type, { ^^W & }));\n+static_assert (is_nothrow_invocable_r_type (^^int &, ^^mem_type, { ^^W * }));\n+static_assert (!is_nothrow_invocable_r_type (^^T, ^^mem_type, { ^^W & }));\n+static_assert (is_nothrow_invocable_r_type (^^NT, ^^mem_type, { ^^W & }));\n+static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^mem_type, { ^^W & }));\n+static_assert (!is_nothrow_invocable_r_type (^^T, ^^memfun_type, { ^^W & }));\n+static_assert (!is_nothrow_invocable_r_type (^^NT, ^^memfun_type, { ^^W & }));\n+static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^memfun_type, { ^^W & }));\n+static_assert (!is_nothrow_invocable_r_type (^^T, ^^memfun_type_nt, { ^^W & }));\n+static_assert (is_nothrow_invocable_r_type (^^NT, ^^memfun_type_nt, { ^^W & }));\n+static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^memfun_type_nt, { ^^W & }));\n+static_assert (!is_nothrow_invocable_r_type (^^int &, ^^F2, {}));\n+static_assert (is_nothrow_invocable_r_type (^^long &, ^^CF2, {}));\n+static_assert (!is_nothrow_invocable_r_type (^^T, ^^F2, {}));\n+static_assert (!is_nothrow_invocable_r_type (^^NT, ^^F2, {}));\n+static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^F2, {}));\n+static_assert (!is_nothrow_invocable_r_type (^^void, ^^F2, {}));\n+static_assert (!is_nothrow_invocable_r_type (^^T, ^^CF2, {}));\n+static_assert (is_nothrow_invocable_r_type (^^NT, ^^CF2, {}));\n+static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^CF2, {}));\n+static_assert (is_nothrow_invocable_r_type (^^void, ^^CF2, {}));\n+static_assert (!is_nothrow_invocable_r_type (^^short &, ^^F2, { ^^int }));\n+static_assert (is_nothrow_invocable_r_type (^^char &, ^^F2 &, { ^^int }));\n+static_assert (!is_nothrow_invocable_r_type (^^T, ^^F2 &, { ^^int }));\n+static_assert (is_nothrow_invocable_r_type (^^NT, ^^F2 &, { ^^int }));\n+static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^F2 &, { ^^int }));\n+static_assert (is_nothrow_invocable_r_type (^^char &, ^^CF2, { ^^int }));\n+static_assert (is_nothrow_invocable_r_type (^^char &, ^^CF2 &, { ^^int }));\n+static_assert (is_nothrow_invocable_r_type (^^void, ^^CF2 &, { ^^int }));\n+static_assert (!is_nothrow_invocable_r_type (^^T, ^^CF2 &, { ^^int }));\n+static_assert (is_nothrow_invocable_r_type (^^NT, ^^CF2 &, { ^^int }));\n+static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^CF2 &, { ^^int }));\n+static_assert (is_nothrow_invocable_r_type (^^void, ^^CF2 &, { ^^int }));\n+static_assert (!is_nothrow_invocable_r_type (^^void, ^^F2, { ^^int, ^^int }));\n+static_assert (!is_nothrow_invocable_r_type (^^V, ^^FW, {}));\n+\n+static_assert (invoke_result (^^std::copyable_function <void ()>, {}) == ^^void);\n+static_assert (invoke_result (^^std::copyable_function <int ()>, {}) == ^^int);\n+static_assert (invoke_result (^^std::copyable_function <int & ()>, {}) == ^^int &);\n+static_assert (invoke_result (^^std::copyable_function <void (long, int)>, { ^^long, ^^int }) == ^^void);\n+static_assert (invoke_result (^^std::copyable_function <int (double, unsigned)>, { ^^double, ^^unsigned }) == ^^int);\n+static_assert (invoke_result (^^std::copyable_function <int & (int &)>, { ^^int & }) == ^^int &);\ndiff --git a/gcc/testsuite/g++.dg/reflect/type_trait12.C b/gcc/testsuite/g++.dg/reflect/type_trait12.C\nnew file mode 100644\nindex 00000000000..372d7408f29\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/type_trait12.C\n@@ -0,0 +1,137 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// { dg-add-options float16 }\n+// { dg-add-options float32 }\n+// { dg-add-options float64 }\n+// { dg-add-options float128 }\n+// Test reflection type traits [meta.reflection.traits], type properties.\n+\n+#include <functional>\n+#include <meta>\n+\n+using namespace std::meta;\n+\n+struct A { int a, b, c; };\n+class B { static int a; private: static int b; public: int c; };\n+struct C { C () {} int a, b, c; };\n+struct D { explicit D (int) {} int a, b, c; };\n+struct E : public A { int d, e, f; };\n+struct F : public C { using C::C; int d, e, f; };\n+class G { int a, b; };\n+struct H { private: int a, b; };\n+struct I { protected: int a, b; };\n+struct J { int a, b; void foo (); };\n+struct K { int a, b; virtual void foo (); };\n+struct L : virtual public A { int d, e; };\n+struct M : protected A { int d, e; };\n+struct N : private A { int d, e; };\n+struct O { O () = delete; int a, b, c; };\n+struct P { P () = default; int a, b, c; };\n+struct Q { Q (); Q (const Q &); int a, b, c; };\n+struct R { R (); R (const R &); R (R &&) = default; int a, b, c; };\n+struct S { S (); ~S (); int a, b, c; };\n+struct T { T (); ~T () = default; int a, b, c; };\n+struct U { U (); U (const U &) = default; int a, b, c; };\n+struct V { V () = default; V (const V &); int a, b, c; };\n+enum W { W1 };\n+enum class X : int { X1 };\n+struct Y { int g; int foo (int); };\n+struct Z;\n+struct AA { Q a; Q b; };\n+struct AB { Q a; Q b; ~AB () = default; };\n+struct AC { Q a; Q b; ~AC () {} };\n+struct AD : public Q {};\n+struct AE : public Q { ~AE () = default; };\n+struct AF : public Q { ~AF () {} };\n+\n+static_assert (!is_implicit_lifetime_type (^^void));\n+static_assert (!is_implicit_lifetime_type (^^const void));\n+static_assert (!is_implicit_lifetime_type (^^volatile void));\n+static_assert (is_implicit_lifetime_type (^^char));\n+static_assert (is_implicit_lifetime_type (^^signed char));\n+static_assert (is_implicit_lifetime_type (^^const unsigned char));\n+static_assert (is_implicit_lifetime_type (^^short));\n+static_assert (is_implicit_lifetime_type (^^volatile unsigned short));\n+static_assert (is_implicit_lifetime_type (^^int));\n+static_assert (is_implicit_lifetime_type (^^unsigned int));\n+static_assert (is_implicit_lifetime_type (^^const volatile long));\n+static_assert (is_implicit_lifetime_type (^^unsigned long));\n+static_assert (is_implicit_lifetime_type (^^long long));\n+static_assert (is_implicit_lifetime_type (^^unsigned long long));\n+#ifdef __SIZEOF_INT128__\n+__extension__ static_assert (is_implicit_lifetime_type (^^__int128));\n+__extension__ static_assert (is_implicit_lifetime_type (^^unsigned __int128));\n+#endif\n+static_assert (is_implicit_lifetime_type (^^float));\n+static_assert (is_implicit_lifetime_type (^^double));\n+static_assert (is_implicit_lifetime_type (^^long double volatile));\n+#ifdef __STDCPP_FLOAT16_T__\n+static_assert (is_implicit_lifetime_type (^^_Float16));\n+#endif\n+#ifdef __STDCPP_FLOAT32_T__\n+static_assert (is_implicit_lifetime_type (^^_Float32));\n+#endif\n+#ifdef __STDCPP_FLOAT64_T__\n+static_assert (is_implicit_lifetime_type (^^const _Float64));\n+#endif\n+#ifdef __STDCPP_FLOAT128_T__\n+static_assert (is_implicit_lifetime_type (^^_Float128));\n+#endif\n+#ifdef __STDCPP_BFLOAT16_T__\n+static_assert (is_implicit_lifetime_type (^^decltype(0.bf16)));\n+#endif\n+static_assert (is_implicit_lifetime_type (^^W));\n+static_assert (is_implicit_lifetime_type (^^const volatile X));\n+static_assert (is_implicit_lifetime_type (^^int *));\n+static_assert (is_implicit_lifetime_type (^^int (*) (int)));\n+static_assert (is_implicit_lifetime_type (^^int (Y::*)));\n+static_assert (is_implicit_lifetime_type (^^int (Y::*) (int)));\n+static_assert (!is_implicit_lifetime_type (^^int &));\n+static_assert (!is_implicit_lifetime_type (^^char &&));\n+static_assert (is_implicit_lifetime_type (^^int []));\n+__extension__ static_assert (!is_implicit_lifetime_type (^^int [0]));\n+static_assert (is_implicit_lifetime_type (^^int [1]));\n+static_assert (is_implicit_lifetime_type (^^const Y [42]));\n+static_assert (!is_implicit_lifetime_type (^^int ()));\n+static_assert (!is_implicit_lifetime_type (^^int () &));\n+static_assert (!is_implicit_lifetime_type (^^int () const));\n+static_assert (!is_implicit_lifetime_type (^^int (&) ()));\n+static_assert (is_implicit_lifetime_type (^^Z []));\n+static_assert (is_implicit_lifetime_type (^^Z [5]));\n+static_assert (is_implicit_lifetime_type (^^A));\n+static_assert (is_implicit_lifetime_type (^^B));\n+static_assert (is_implicit_lifetime_type (^^C));\n+static_assert (is_implicit_lifetime_type (^^D));\n+static_assert (is_implicit_lifetime_type (^^E));\n+static_assert (is_implicit_lifetime_type (^^F));\n+static_assert (is_implicit_lifetime_type (^^G));\n+static_assert (is_implicit_lifetime_type (^^H));\n+static_assert (is_implicit_lifetime_type (^^I));\n+static_assert (is_implicit_lifetime_type (^^J));\n+static_assert (!is_implicit_lifetime_type (^^K));\n+static_assert (!is_implicit_lifetime_type (^^L));\n+static_assert (is_implicit_lifetime_type (^^M));\n+static_assert (is_implicit_lifetime_type (^^N));\n+static_assert (is_implicit_lifetime_type (^^O));\n+static_assert (is_implicit_lifetime_type (^^P));\n+static_assert (!is_implicit_lifetime_type (^^Q));\n+static_assert (is_implicit_lifetime_type (^^R));\n+static_assert (!is_implicit_lifetime_type (^^S));\n+static_assert (is_implicit_lifetime_type (^^S [3]));\n+static_assert (is_implicit_lifetime_type (^^T));\n+static_assert (is_implicit_lifetime_type (^^U));\n+static_assert (is_implicit_lifetime_type (^^V));\n+static_assert (is_implicit_lifetime_type (^^_Complex double));\n+static_assert (is_implicit_lifetime_type (^^int [[gnu::vector_size (4 * sizeof (int))]]));\n+static_assert (is_implicit_lifetime_type (^^AA));\n+static_assert (is_implicit_lifetime_type (^^AB));\n+static_assert (!is_implicit_lifetime_type (^^AC));\n+static_assert (is_implicit_lifetime_type (^^AD));\n+static_assert (is_implicit_lifetime_type (^^AE));\n+static_assert (!is_implicit_lifetime_type (^^AF));\n+\n+void\n+foo (int n)\n+{\n+ __extension__ static_assert (is_implicit_lifetime_type (^^char [n]));\n+}\ndiff --git a/gcc/testsuite/g++.dg/reflect/type_trait13.C b/gcc/testsuite/g++.dg/reflect/type_trait13.C\nnew file mode 100644\nindex 00000000000..cd9f956cc81\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/type_trait13.C\n@@ -0,0 +1,425 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test reflection type traits [meta.reflection.traits], type properties.\n+\n+#include <meta>\n+#include <utility>\n+#include <array>\n+#include <tuple>\n+#include <queue>\n+#include <stack>\n+\n+using namespace std::meta;\n+\n+class ClassType { };\n+enum EnumType { e0 };\n+struct ThrowCopyConsClass { ThrowCopyConsClass (const ThrowCopyConsClass &) noexcept (false); };\n+struct DeletedCopyAssignClass { DeletedCopyAssignClass & operator= (const DeletedCopyAssignClass &) = delete; };\n+struct DeletedMoveAssignClass { DeletedMoveAssignClass &operator= (DeletedMoveAssignClass &&) = delete; };\n+struct PODType { int i; int j; };\n+union UnionType { };\n+\n+namespace N1\n+{\n+ struct Empty {};\n+ enum class SE { e1 };\n+ struct Abstract { virtual ~Abstract () = 0; };\n+ struct Any { template <class T> Any (T &&) {} };\n+ struct nAny { template <class... T> nAny (T &&...) {} };\n+ struct DelCopy { DelCopy (const DelCopy &) = delete; };\n+ struct Nontrivial {\n+ Nontrivial ();\n+ Nontrivial (const Nontrivial &);\n+ Nontrivial &operator= (const Nontrivial &);\n+ ~Nontrivial ();\n+ };\n+ union NontrivialUnion { int i; Nontrivial n; };\n+}\n+\n+namespace funny1 {\n+ struct F {};\n+ void swap (F &, F &) = delete;\n+ void swap (F (&) [5], F (&) [5]);\n+ struct F2 { friend void swap (F2 &, F2 &) = delete; };\n+ struct F3 { friend void swap (F3 &, F3) {} };\n+ struct DummyCmp { template <class T> bool operator () (const T &, const T &) const { return false; } };\n+}\n+\n+namespace funny2 {\n+ struct T0 {};\n+ void swap (T0, T0);\n+ struct T1 {};\n+ struct T2 {};\n+ void swap (T1, T2);\n+ void swap (T2, T1);\n+ struct BoolLike {};\n+ void swap (BoolLike, bool &);\n+ void swap (bool &, BoolLike);\n+ struct F0 {};\n+ void swap (F0, F0) = delete;\n+ struct F1 {};\n+ void swap (F0, F1) = delete;\n+ void swap (F1, F0) = delete;\n+ struct F2 {};\n+ struct F3 {};\n+ void swap (F2, F3);\n+ void swap (F3, F2) = delete;\n+ struct F4 { friend void swap (F4, F4) = delete; };\n+}\n+\n+namespace funny3 {\n+ struct F {};\n+ void swap (F &, F &) = delete;\n+ void swap (F (&) [5], F (&) [5]) noexcept;\n+ void swap (F (&) [6], F (&) [6]);\n+ struct A {};\n+ void swap (A &, A &) noexcept (false);\n+}\n+namespace std {\n+ template <>\n+ void swap <funny3::A> (funny3::A &, funny3::A &) noexcept {}\n+ template <>\n+ void swap <funny3::A> (funny3::A (&) [3], funny3::A (&) [3]) noexcept (false) {}\n+}\n+namespace ns1 {\n+ struct SwapThrow {};\n+ void swap (SwapThrow &, SwapThrow &);\n+ void swap (SwapThrow (&) [3], SwapThrow (&) [3]) noexcept;\n+}\n+namespace ns2 {\n+ struct SwapThrow {\n+ SwapThrow () noexcept = default;\n+ SwapThrow (const SwapThrow &) noexcept (false);\n+ SwapThrow &operator = (const SwapThrow &) noexcept (false);\n+ };\n+}\n+namespace ns3 {\n+ struct SwapNoThrow {\n+ SwapNoThrow () noexcept = default;\n+ SwapNoThrow (const SwapNoThrow &) noexcept (false);\n+ SwapNoThrow &operator = (const SwapNoThrow &) noexcept (false);\n+ };\n+ void swap (SwapNoThrow &, SwapNoThrow &) noexcept;\n+}\n+namespace ns4 {\n+ struct SwapNoThrow {};\n+}\n+namespace ns5 {\n+ struct SwapThrow {\n+ SwapThrow () noexcept = default;\n+ SwapThrow (SwapThrow &&) noexcept;\n+ SwapThrow & operator = (const SwapThrow &) noexcept (false);\n+ };\n+}\n+namespace comps {\n+ struct CompareNoThrowCopyable {\n+ template <class T>\n+ bool operator () (const T &, const T &) const { return false; }\n+ };\n+ struct CompareNonCopyable {\n+ CompareNonCopyable () = default;\n+ CompareNonCopyable (const CompareNonCopyable &) = delete;\n+ CompareNonCopyable &operator= (const CompareNonCopyable &) noexcept;\n+ template <class T>\n+ bool operator () (const T &, const T &) const { return false; }\n+ };\n+ struct CompareThrowCopyable {\n+ CompareThrowCopyable () = default;\n+ CompareThrowCopyable (const CompareThrowCopyable &) noexcept (false);\n+ CompareThrowCopyable &operator = (const CompareThrowCopyable &);\n+ template <class T>\n+ bool operator () (const T &, const T &) const { return false; }\n+ };\n+}\n+\n+namespace funny4 {\n+ struct T0 {};\n+ void swap (T0, T0) noexcept;\n+ struct T1 { friend void swap (T1, T1) noexcept; };\n+ struct T2 {};\n+ struct T3 {};\n+ void swap (T2, T3) noexcept;\n+ void swap (T3, T2) noexcept;\n+ struct T4 { operator T0 () const noexcept; };\n+ struct F0 {};\n+ void swap (F0, F0) = delete;\n+ struct F1 {};\n+ void swap (F1, F1);\n+ struct F2 {};\n+ void swap (F0, F2) noexcept;\n+ void swap (F2, F0);\n+ struct F3 { friend void swap (F3, F3) = delete; };\n+ struct F4 { friend void swap (F4, F4); };\n+ struct F5 { operator T0 () const; };\n+ struct BoolLike {};\n+ void swap (BoolLike, bool &) noexcept;\n+ void swap (bool &, BoolLike) noexcept;\n+ struct BoolLikeErr {};\n+ void swap (BoolLikeErr, bool &);\n+ void swap (bool &, BoolLikeErr) noexcept;\n+}\n+\n+static_assert (is_swappable_type (^^int));\n+static_assert (is_swappable_type (^^bool));\n+static_assert (is_swappable_type (^^decltype (nullptr)));\n+static_assert (is_swappable_type (^^int &));\n+static_assert (is_swappable_type (^^int &&));\n+static_assert (is_swappable_type (^^int [1]));\n+static_assert (is_swappable_type (^^int [1][2]));\n+static_assert (is_swappable_type (^^int [1][2][3]));\n+static_assert (is_swappable_type (^^int (&) [1]));\n+static_assert (is_swappable_type (^^funny1::F [5]));\n+static_assert (is_swappable_type (^^funny1::F3));\n+static_assert (is_swappable_type (^^funny1::F3 [1]));\n+static_assert (is_swappable_type (^^funny1::F3 [1][2]));\n+static_assert (is_swappable_type (^^funny1::F3 [1][2][3]));\n+static_assert (is_swappable_type (^^ThrowCopyConsClass));\n+static_assert (is_swappable_type (^^EnumType));\n+static_assert (is_swappable_type (^^PODType));\n+static_assert (is_swappable_type (^^UnionType));\n+static_assert (is_swappable_type (^^N1::SE));\n+static_assert (is_swappable_type (^^N1::Empty));\n+static_assert (is_swappable_type (^^void *));\n+static_assert (is_swappable_type (^^int const *));\n+static_assert (is_swappable_type (^^ClassType *));\n+static_assert (is_swappable_type (^^int ClassType::*));\n+static_assert (is_swappable_type (^^void (ClassType::*) ()));\n+static_assert (is_swappable_type (^^N1::Nontrivial));\n+static_assert (is_swappable_type (^^N1::Any));\n+static_assert (is_swappable_type (^^N1::nAny));\n+static_assert (is_swappable_type (^^std::pair <int, int>));\n+static_assert (is_swappable_type (^^std::pair <int, int> [1]));\n+static_assert (is_swappable_type (^^std::pair <int, int> [1][2]));\n+static_assert (is_swappable_type (^^std::pair <int, int> [1][2][3]));\n+static_assert (is_swappable_type (^^std::pair <N1::Nontrivial, N1::Nontrivial>));\n+static_assert (is_swappable_type (^^std::tuple <int>));\n+static_assert (is_swappable_type (^^std::tuple <int> [1]));\n+static_assert (is_swappable_type (^^std::tuple <int> [1][2]));\n+static_assert (is_swappable_type (^^std::tuple <int> [1][2][3]));\n+static_assert (is_swappable_type (^^std::tuple <>));\n+static_assert (is_swappable_type (^^std::tuple <> [1]));\n+static_assert (is_swappable_type (^^std::tuple <> [1][2]));\n+static_assert (is_swappable_type (^^std::tuple <> [1][2][3]));\n+static_assert (is_swappable_type (^^std::tuple <N1::Nontrivial>));\n+static_assert (is_swappable_type (^^std::array <int, 1>));\n+static_assert (is_swappable_type (^^std::array <int, 1> [1]));\n+static_assert (is_swappable_type (^^std::array <int, 1> [1][2]));\n+static_assert (is_swappable_type (^^std::array <int, 1> [1][2][3]));\n+static_assert (is_swappable_type (^^std::array <N1::Nontrivial, 1>));\n+static_assert (is_swappable_type (^^std::array <int, 0>));\n+static_assert (is_swappable_type (^^std::array <N1::DelCopy, 0>));\n+static_assert (is_swappable_type (^^std::queue <int>));\n+static_assert (is_swappable_type (^^std::queue <int> [1]));\n+static_assert (is_swappable_type (^^std::queue <int> [1][2]));\n+static_assert (is_swappable_type (^^std::queue <int> [1][2][3]));\n+static_assert (is_swappable_type (^^std::queue <N1::Nontrivial>));\n+//static_assert (is_swappable_type (^^std::priority_queue <int>));\n+//static_assert (is_swappable_type (^^std::priority_queue <int> [1]));\n+//static_assert (is_swappable_type (^^std::priority_queue <int> [1][2]));\n+//static_assert (is_swappable_type (^^std::priority_queue <int> [1][2][3]));\n+//static_assert (is_swappable_type (^^std::priority_queue <N1::Nontrivial, std::vector <N1::Nontrivial>, funny1::DummyCmp>));\n+static_assert (is_swappable_type (^^std::stack <int>));\n+static_assert (is_swappable_type (^^std::stack <int> [1]));\n+static_assert (is_swappable_type (^^std::stack <int> [1][2]));\n+static_assert (is_swappable_type (^^std::stack <int> [1][2][3]));\n+static_assert (is_swappable_type (^^std::stack <N1::Nontrivial>));\n+static_assert (!is_swappable_type (^^void));\n+static_assert (!is_swappable_type (^^const void));\n+static_assert (!is_swappable_type (^^void ()));\n+static_assert (!is_swappable_type (^^void () const));\n+static_assert (!is_swappable_type (^^void () volatile));\n+static_assert (!is_swappable_type (^^void () const volatile));\n+static_assert (!is_swappable_type (^^const int));\n+static_assert (!is_swappable_type (^^const bool));\n+static_assert (!is_swappable_type (^^int []));\n+static_assert (!is_swappable_type (^^const int []));\n+static_assert (!is_swappable_type (^^int [][1]));\n+static_assert (!is_swappable_type (^^const int [1]));\n+static_assert (!is_swappable_type (^^const int [1][2]));\n+static_assert (!is_swappable_type (^^const int [1][2][3]));\n+static_assert (!is_swappable_type (^^N1::DelCopy));\n+static_assert (!is_swappable_type (^^N1::Abstract));\n+static_assert (!is_swappable_type (^^N1::NontrivialUnion));\n+static_assert (!is_swappable_type (^^funny1::F));\n+static_assert (!is_swappable_type (^^funny1::F [1]));\n+static_assert (!is_swappable_type (^^funny1::F [1][2]));\n+static_assert (!is_swappable_type (^^funny1::F [1][2][3]));\n+static_assert (!is_swappable_type (^^funny1::F [4]));\n+static_assert (!is_swappable_type (^^N1::DelCopy));\n+static_assert (!is_swappable_type (^^DeletedCopyAssignClass));\n+static_assert (!is_swappable_type (^^DeletedMoveAssignClass));\n+static_assert (!is_swappable_type (^^funny1::F2));\n+static_assert (!is_swappable_type (^^funny1::F2 [1]));\n+static_assert (!is_swappable_type (^^funny1::F2 [1][2]));\n+static_assert (!is_swappable_type (^^funny1::F2 [1][2][3]));\n+static_assert (!is_swappable_type (^^funny1::F2 [4]));\n+static_assert (!is_swappable_type (^^funny1::F2 [5]));\n+\n+static_assert (is_swappable_with_type (^^int &, ^^int &));\n+static_assert (is_swappable_with_type (^^funny2::T0, ^^funny2::T0));\n+static_assert (is_swappable_with_type (^^funny2::T0, ^^const funny2::T0));\n+static_assert (is_swappable_with_type (^^funny2::T1, ^^funny2::T2));\n+static_assert (is_swappable_with_type (^^funny2::T2, ^^funny2::T1));\n+static_assert (is_swappable_with_type (^^funny2::BoolLike, ^^bool &));\n+static_assert (is_swappable_with_type (^^const funny2::BoolLike, ^^bool &));\n+static_assert (!is_swappable_with_type (^^int, ^^int));\n+static_assert (!is_swappable_with_type (^^int &, ^^unsigned &));\n+static_assert (!is_swappable_with_type (^^const int &, ^^const int &));\n+static_assert (!is_swappable_with_type (^^funny2::F0, ^^funny2::F0));\n+static_assert (!is_swappable_with_type (^^funny2::F0, ^^const funny2::F0));\n+static_assert (!is_swappable_with_type (^^funny2::T0, ^^funny2::T1));\n+static_assert (!is_swappable_with_type (^^funny2::F0, ^^funny2::F1));\n+static_assert (!is_swappable_with_type (^^funny2::F0, ^^const funny2::F1));\n+static_assert (!is_swappable_with_type (^^const funny2::F0, ^^funny2::F1));\n+static_assert (!is_swappable_with_type (^^funny2::F2, ^^funny2::F3));\n+static_assert (!is_swappable_with_type (^^funny2::F2, ^^const funny2::F3));\n+static_assert (!is_swappable_with_type (^^const funny2::F2, ^^funny2::F3));\n+static_assert (!is_swappable_with_type (^^funny2::F4, ^^funny2::F4));\n+static_assert (!is_swappable_with_type (^^funny2::BoolLike, ^^funny2::BoolLike));\n+\n+static_assert (is_nothrow_swappable_type (^^int));\n+static_assert (is_nothrow_swappable_type (^^bool));\n+static_assert (is_nothrow_swappable_type (^^decltype (nullptr)));\n+static_assert (is_nothrow_swappable_type (^^int &));\n+static_assert (is_nothrow_swappable_type (^^int &&));\n+static_assert (is_nothrow_swappable_type (^^int [1]));\n+static_assert (is_nothrow_swappable_type (^^int [1][2]));\n+static_assert (is_nothrow_swappable_type (^^int [1][2][3]));\n+static_assert (is_nothrow_swappable_type (^^funny3::F [5]));\n+static_assert (is_nothrow_swappable_type (^^EnumType));\n+static_assert (is_nothrow_swappable_type (^^PODType));\n+static_assert (is_nothrow_swappable_type (^^UnionType));\n+static_assert (is_nothrow_swappable_type (^^N1::SE));\n+static_assert (is_nothrow_swappable_type (^^N1::Empty));\n+static_assert (is_nothrow_swappable_type (^^void *));\n+static_assert (is_nothrow_swappable_type (^^void (*) ()));\n+static_assert (is_nothrow_swappable_type (^^int const *));\n+static_assert (is_nothrow_swappable_type (^^ClassType *));\n+static_assert (is_nothrow_swappable_type (^^int ClassType::*));\n+static_assert (is_nothrow_swappable_type (^^void (ClassType::*) ()));\n+static_assert (is_nothrow_swappable_type (^^int (ClassType::*) () const volatile));\n+static_assert (is_nothrow_swappable_type (^^ns1::SwapThrow [3]));\n+static_assert (is_nothrow_swappable_type (^^ns3::SwapNoThrow));\n+static_assert (is_nothrow_swappable_type (^^ns3::SwapNoThrow [1]));\n+static_assert (is_nothrow_swappable_type (^^ns3::SwapNoThrow [3]));\n+static_assert (is_nothrow_swappable_type (^^ns3::SwapNoThrow [2][3][4]));\n+static_assert (is_nothrow_swappable_type (^^ns4::SwapNoThrow));\n+static_assert (is_nothrow_swappable_type (^^ns4::SwapNoThrow [1]));\n+static_assert (is_nothrow_swappable_type (^^ns4::SwapNoThrow [3]));\n+static_assert (is_nothrow_swappable_type (^^ns4::SwapNoThrow [2][3][4]));\n+static_assert (is_nothrow_swappable_type (^^std::pair <int, int>));\n+static_assert (is_nothrow_swappable_type (^^std::pair <int, int> [1]));\n+static_assert (is_nothrow_swappable_type (^^std::pair <int, int> [1][2]));\n+static_assert (is_nothrow_swappable_type (^^std::tuple <int>));\n+static_assert (is_nothrow_swappable_type (^^std::tuple <int> [1]));\n+static_assert (is_nothrow_swappable_type (^^std::tuple <int> [1][2]));\n+static_assert (is_nothrow_swappable_type (^^std::tuple <>));\n+static_assert (is_nothrow_swappable_type (^^std::tuple <> [1]));\n+static_assert (is_nothrow_swappable_type (^^std::tuple <> [1][2]));\n+static_assert (is_nothrow_swappable_type (^^std::array <int, 1>));\n+static_assert (is_nothrow_swappable_type (^^std::array <int, 0>));\n+static_assert (is_nothrow_swappable_type (^^std::array <N1::DelCopy, 0>));\n+static_assert (is_nothrow_swappable_type (^^std::array <ns1::SwapThrow, 0>));\n+static_assert (is_nothrow_swappable_type (^^std::queue <int>));\n+//static_assert (is_nothrow_swappable_type (^^std::priority_queue <int>));\n+static_assert (is_nothrow_swappable_type (^^std::stack <int>));\n+//static_assert (is_nothrow_swappable_type (^^std::priority_queue <int, std::vector <int>, comps::CompareNoThrowCopyable>));\n+static_assert (!is_nothrow_swappable_type (^^void));\n+static_assert (!is_nothrow_swappable_type (^^const void));\n+static_assert (!is_nothrow_swappable_type (^^void ()));\n+static_assert (!is_nothrow_swappable_type (^^void () const));\n+static_assert (!is_nothrow_swappable_type (^^void () volatile));\n+static_assert (!is_nothrow_swappable_type (^^void () const volatile));\n+static_assert (!is_nothrow_swappable_type (^^const int));\n+static_assert (!is_nothrow_swappable_type (^^const bool));\n+static_assert (!is_nothrow_swappable_type (^^const int [1]));\n+static_assert (!is_nothrow_swappable_type (^^const int [1][2]));\n+static_assert (!is_nothrow_swappable_type (^^const int [1][2][3]));\n+static_assert (!is_nothrow_swappable_type (^^int []));\n+static_assert (!is_nothrow_swappable_type (^^const int []));\n+static_assert (!is_nothrow_swappable_type (^^int [][1]));\n+static_assert (!is_nothrow_swappable_type (^^const funny3::F [5]));\n+static_assert (!is_nothrow_swappable_type (^^N1::Abstract));\n+static_assert (!is_nothrow_swappable_type (^^N1::DelCopy));\n+static_assert (!is_nothrow_swappable_type (^^funny3::F));\n+static_assert (!is_nothrow_swappable_type (^^funny3::F [1]));\n+static_assert (!is_nothrow_swappable_type (^^funny3::F [1][2]));\n+static_assert (!is_nothrow_swappable_type (^^funny3::F [1][2][3]));\n+static_assert (!is_nothrow_swappable_type (^^funny3::F [6]));\n+static_assert (!is_nothrow_swappable_type (^^funny3::A));\n+static_assert (!is_nothrow_swappable_type (^^funny3::A [3]));\n+static_assert (!is_nothrow_swappable_type (^^ns1::SwapThrow));\n+static_assert (!is_nothrow_swappable_type (^^ns1::SwapThrow [1]));\n+static_assert (!is_nothrow_swappable_type (^^ns1::SwapThrow [3][2]));\n+static_assert (!is_nothrow_swappable_type (^^ns1::SwapThrow [2][3][4]));\n+static_assert (!is_nothrow_swappable_type (^^ns2::SwapThrow));\n+static_assert (!is_nothrow_swappable_type (^^ns2::SwapThrow [1]));\n+static_assert (!is_nothrow_swappable_type (^^ns2::SwapThrow [2][3][4]));\n+static_assert (!is_nothrow_swappable_type (^^ns5::SwapThrow));\n+static_assert (!is_nothrow_swappable_type (^^ns5::SwapThrow [1]));\n+static_assert (!is_nothrow_swappable_type (^^ns5::SwapThrow [2][3][4]));\n+static_assert (!is_nothrow_swappable_type (^^ThrowCopyConsClass));\n+static_assert (!is_nothrow_swappable_type (^^std::pair <ThrowCopyConsClass, ThrowCopyConsClass>));\n+static_assert (!is_nothrow_swappable_type (^^std::tuple <ThrowCopyConsClass>));\n+static_assert (!is_nothrow_swappable_type (^^std::array <ThrowCopyConsClass, 1>));\n+static_assert (is_nothrow_swappable_type (^^std::queue <ThrowCopyConsClass>));\n+static_assert (is_nothrow_swappable_type (^^std::priority_queue <ThrowCopyConsClass, std::vector <ThrowCopyConsClass>, comps::CompareNoThrowCopyable>));\n+static_assert (is_nothrow_swappable_type (^^std::stack <ThrowCopyConsClass>));\n+static_assert (!is_nothrow_swappable_type (^^std::priority_queue <int, std::vector <int>, comps::CompareNonCopyable>));\n+static_assert (!is_nothrow_swappable_type (^^std::priority_queue <int, std::vector <int>, comps::CompareThrowCopyable>));\n+\n+static_assert (is_nothrow_swappable_with_type (^^int &, ^^int &));\n+static_assert (is_nothrow_swappable_with_type (^^funny4::T0, ^^funny4::T0));\n+static_assert (is_nothrow_swappable_with_type (^^funny4::T0, ^^const funny4::T0));\n+static_assert (is_nothrow_swappable_with_type (^^funny4::T1, ^^funny4::T1));\n+static_assert (is_nothrow_swappable_with_type (^^funny4::T1, ^^const funny4::T1));\n+static_assert (is_nothrow_swappable_with_type (^^funny4::T2, ^^funny4::T3));\n+static_assert (is_nothrow_swappable_with_type (^^funny4::T3, ^^funny4::T2));\n+static_assert (is_nothrow_swappable_with_type (^^funny4::T0, ^^funny4::T4));\n+static_assert (is_nothrow_swappable_with_type (^^funny4::T4, ^^funny4::T0));\n+static_assert (is_nothrow_swappable_with_type (^^funny4::BoolLike, ^^bool &));\n+static_assert (is_nothrow_swappable_with_type (^^const funny4::BoolLike, ^^bool &));\n+static_assert (!is_nothrow_swappable_with_type (^^const int &, ^^const int &));\n+static_assert (!is_nothrow_swappable_with_type (^^int &, ^^unsigned &));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F0, ^^funny4::F0));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F0, ^^const funny4::F0));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F1, ^^funny4::F1));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F1, ^^const funny4::F1));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F0, ^^funny4::F2));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F2, ^^funny4::F0));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F3, ^^funny4::F3));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F3, ^^const funny4::F3));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F4, ^^funny4::F4));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F4, ^^const funny4::F4));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::T0, ^^funny4::F5));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::F5, ^^funny4::T0));\n+static_assert (!is_nothrow_swappable_with_type (^^funny4::BoolLikeErr, ^^bool &));\n+static_assert (!is_nothrow_swappable_with_type (^^const funny4::BoolLikeErr, ^^bool &));\n+\n+static_assert (unwrap_reference (^^int) == ^^int);\n+static_assert (unwrap_reference (^^const int) == ^^const int);\n+static_assert (unwrap_reference (^^const int &) == ^^const int &);\n+static_assert (unwrap_reference (^^const int *) == ^^const int *);\n+static_assert (unwrap_reference (^^const int *&) == ^^const int *&);\n+static_assert (unwrap_reference (^^std::reference_wrapper <int>) == ^^int &);\n+static_assert (unwrap_reference (^^std::reference_wrapper <const int>) == ^^const int &);\n+static_assert (unwrap_reference (^^std::reference_wrapper <long>) == ^^long &);\n+static_assert (unwrap_reference (^^const std::reference_wrapper <int>) == ^^const std::reference_wrapper <int>);\n+static_assert (unwrap_reference (^^volatile std::reference_wrapper <int>) == ^^volatile std::reference_wrapper <int>);\n+static_assert (unwrap_reference (^^const volatile std::reference_wrapper <int>) == ^^const volatile std::reference_wrapper <int>);\n+static_assert (unwrap_reference (^^std::reference_wrapper <int> &) == ^^std::reference_wrapper <int> &);\n+static_assert (unwrap_reference (^^std::reference_wrapper <int> &&) == ^^std::reference_wrapper <int> &&);\n+static_assert (unwrap_reference (^^const std::reference_wrapper <int> &) == ^^const std::reference_wrapper <int> &);\n+\n+static_assert (unwrap_ref_decay (^^int) == decay (^^int));\n+static_assert (unwrap_ref_decay (^^const int) == decay (^^const int));\n+static_assert (unwrap_ref_decay (^^const int &) == decay (^^const int &));\n+static_assert (unwrap_ref_decay (^^const int *) == decay (^^const int *));\n+static_assert (unwrap_ref_decay (^^const int *&) == decay (^^const int *&));\n+static_assert (unwrap_ref_decay (^^std::reference_wrapper <int>) == ^^int &);\n+static_assert (unwrap_ref_decay (^^std::reference_wrapper <int> &) == ^^int &);\n+static_assert (unwrap_ref_decay (^^const std::reference_wrapper <int>) == ^^int &);\n+static_assert (unwrap_ref_decay (^^const std::reference_wrapper <int> &) == ^^int &);\n+static_assert (unwrap_ref_decay (^^std::reference_wrapper <const int>) == ^^const int &);\n+static_assert (unwrap_ref_decay (^^std::reference_wrapper <const int> &) == ^^const int &);\n+static_assert (unwrap_ref_decay (^^std::reference_wrapper <long>) == ^^long &);\ndiff --git a/gcc/testsuite/g++.dg/reflect/type_trait2.C b/gcc/testsuite/g++.dg/reflect/type_trait2.C\nnew file mode 100644\nindex 00000000000..3bf87ad2b8a\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/type_trait2.C\n@@ -0,0 +1,92 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test reflection type traits [meta.reflection.traits], const-volatile\n+// modifications.\n+\n+#include <meta>\n+using namespace std::meta;\n+\n+struct C { };\n+\n+static_assert (remove_const (^^const int) == ^^int);\n+static_assert (remove_const (^^volatile int) == ^^volatile int);\n+static_assert (remove_const (^^const volatile int) == ^^volatile int);\n+static_assert (remove_const (^^const volatile int *) == ^^const volatile int *);\n+static_assert (remove_const (^^const volatile int &) == ^^const volatile int &);\n+static_assert (remove_const (^^const volatile int []) == ^^volatile int []);\n+static_assert (remove_const (^^volatile int *const) == ^^volatile int *);\n+static_assert (remove_const (^^const volatile C) == ^^volatile C);\n+static_assert (remove_const (^^void (C::* const volatile)(int) const) == ^^void (C::* volatile)(int) const);\n+static_assert (remove_const (^^int (int)) == ^^int (int));\n+using T1 = int;\n+static_assert (remove_const (^^T1) == dealias (^^T1));\n+\n+static_assert (remove_volatile (^^const int) == ^^const int);\n+static_assert (remove_volatile (^^volatile int) == ^^int);\n+static_assert (remove_volatile (^^const volatile int) == ^^const int);\n+static_assert (remove_volatile (^^const volatile int *) == ^^const volatile int *);\n+static_assert (remove_volatile (^^const volatile int &) == ^^const volatile int &);\n+static_assert (remove_volatile (^^const volatile int []) == ^^const int []);\n+static_assert (remove_volatile (^^volatile int *const) == ^^volatile int *const);\n+static_assert (remove_volatile (^^volatile int *volatile) == ^^volatile int *);\n+static_assert (remove_volatile (^^const volatile C) == ^^const C);\n+static_assert (remove_volatile (^^void (C::* const volatile)(int) const) == ^^void (C::* const)(int) const);\n+static_assert (remove_volatile (^^int (int)) == ^^int (int));\n+static_assert (remove_volatile (^^T1) == dealias (^^T1));\n+\n+static_assert (remove_cv (^^const int) == ^^int);\n+static_assert (remove_cv (^^volatile int) == ^^int);\n+static_assert (remove_cv (^^const volatile int) == ^^int);\n+static_assert (remove_cv (^^const volatile int *) == ^^const volatile int *);\n+static_assert (remove_cv (^^const volatile int &) == ^^const volatile int &);\n+static_assert (remove_cv (^^const volatile int []) == ^^int []);\n+static_assert (remove_cv (^^volatile int *const) == ^^volatile int *);\n+static_assert (remove_cv (^^const volatile C) == ^^C);\n+static_assert (remove_cv (^^void (C::* const volatile)(int) const) == ^^void (C::*)(int) const);\n+static_assert (remove_cv (^^int (int)) == ^^int (int));\n+static_assert (remove_cv (^^T1) == dealias (^^T1));\n+\n+static_assert (add_const (^^int) == ^^const int);\n+static_assert (add_const (^^const int) == ^^const int);\n+static_assert (add_const (^^volatile int) == ^^const volatile int);\n+static_assert (add_const (^^const volatile int) == ^^const volatile int);\n+static_assert (add_const (^^const volatile int *) == ^^const volatile int *const);\n+static_assert (add_const (^^int []) == ^^const int[]);\n+static_assert (add_const (^^int *) == ^^int *const);\n+static_assert (add_const (^^C) == ^^const C);\n+static_assert (add_const (^^void (C::*)(int) const) == ^^void (C::* const)(int) const);\n+static_assert (add_const (^^int (int)) == ^^int (int));\n+static_assert (add_const (^^int &) == ^^int &);\n+static_assert (add_const (^^const int &&) == ^^const int &&);\n+using T2 = const int;\n+static_assert (add_const (^^T2) == dealias (^^T2));\n+\n+static_assert (add_volatile (^^int) == ^^volatile int);\n+static_assert (add_volatile (^^const int) == ^^const volatile int);\n+static_assert (add_volatile (^^volatile int) == ^^volatile int);\n+static_assert (add_volatile (^^const volatile int) == ^^const volatile int);\n+static_assert (add_volatile (^^const volatile int *) == ^^const volatile int *volatile);\n+static_assert (add_volatile (^^int []) == ^^volatile int[]);\n+static_assert (add_volatile (^^int *) == ^^int *volatile);\n+static_assert (add_volatile (^^C) == ^^volatile C);\n+static_assert (add_volatile (^^void (C::*)(int) const) == ^^void (C::* volatile)(int) const);\n+static_assert (add_volatile (^^int (int)) == ^^int (int));\n+static_assert (add_volatile (^^int &) == ^^int &);\n+static_assert (add_volatile (^^const int &&) == ^^const int &&);\n+using T3 = volatile int;\n+static_assert (add_volatile (^^T3) == dealias (^^T3));\n+\n+static_assert (add_cv (^^int) == ^^const volatile int);\n+static_assert (add_cv (^^const int) == ^^const volatile int);\n+static_assert (add_cv (^^volatile int) == ^^const volatile int);\n+static_assert (add_cv (^^const volatile int) == ^^const volatile int);\n+static_assert (add_cv (^^const volatile int *) == ^^const volatile int *const volatile);\n+static_assert (add_cv (^^int []) == ^^const volatile int[]);\n+static_assert (add_cv (^^int *) == ^^int *const volatile);\n+static_assert (add_cv (^^C) == ^^const volatile C);\n+static_assert (add_cv (^^void (C::*)(int) const) == ^^void (C::* const volatile)(int) const);\n+static_assert (add_cv (^^int (int)) == ^^int (int));\n+static_assert (add_cv (^^int &) == ^^int &);\n+static_assert (add_cv (^^const int &&) == ^^const int &&);\n+using T4 = const volatile int;\n+static_assert (add_cv (^^T4) == dealias (^^T4));\ndiff --git a/gcc/testsuite/g++.dg/reflect/type_trait3.C b/gcc/testsuite/g++.dg/reflect/type_trait3.C\nnew file mode 100644\nindex 00000000000..eca95ad04ec\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/type_trait3.C\n@@ -0,0 +1,218 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test reflection type traits [meta.reflection.traits], reference, sign,\n+// array and pointer modifications.\n+\n+#include <meta>\n+using namespace std::meta;\n+\n+struct C { };\n+enum E1 : int { E10, E11 };\n+enum E2 : unsigned char { E20, E21 };\n+enum E3 : short int { E30, E31 };\n+enum E4 : long long { E40, E41 };\n+\n+static_assert (remove_reference (^^int) == ^^int);\n+static_assert (remove_reference (^^const int *) == ^^const int *);\n+static_assert (remove_reference (^^unsigned long &) == ^^unsigned long);\n+static_assert (remove_reference (^^const short &) == ^^const short);\n+static_assert (remove_reference (^^long long &&) == ^^long long);\n+static_assert (remove_reference (^^volatile char &&) == ^^volatile char);\n+static_assert (remove_reference (^^int *&) == ^^int *);\n+static_assert (remove_reference (^^C &) == ^^C);\n+static_assert (remove_reference (^^C &&) == ^^C);\n+static_assert (remove_reference (^^C) == ^^C);\n+static_assert (remove_reference (^^int (&) (int)) == ^^int (int));\n+static_assert (remove_reference (^^int (&&) (int)) == ^^int (int));\n+static_assert (remove_reference (^^int (int)) == ^^int (int));\n+using T1 = int;\n+static_assert (remove_reference (^^T1) == dealias (^^T1));\n+\n+static_assert (add_lvalue_reference (^^int) == ^^int &);\n+static_assert (add_lvalue_reference (^^int &) == ^^int &);\n+static_assert (add_lvalue_reference (^^const int) == ^^const int &);\n+static_assert (add_lvalue_reference (^^int *) == ^^int *&);\n+static_assert (add_lvalue_reference (^^C &) == ^^C &);\n+static_assert (add_lvalue_reference (^^C) == ^^C &);\n+static_assert (add_lvalue_reference (^^int (int)) == ^^int (&) (int));\n+static_assert (add_lvalue_reference (^^int &&) == ^^int &);\n+static_assert (add_lvalue_reference (^^C &&) == ^^C &);\n+static_assert (add_lvalue_reference (^^void) == ^^void);\n+static_assert (add_lvalue_reference (^^const void) == ^^const void);\n+static_assert (add_lvalue_reference (^^bool (int) const) == ^^bool (int) const);\n+static_assert (add_lvalue_reference (^^bool (int) &) == ^^bool (int) &);\n+static_assert (add_lvalue_reference (^^bool (int) const &&) == ^^bool (int) const &&);\n+static_assert (add_lvalue_reference (^^bool (int)) == ^^bool (&) (int));\n+using T2 = int &;\n+static_assert (add_lvalue_reference (^^T2) == dealias (^^T2));\n+\n+static_assert (add_rvalue_reference (^^int) == ^^int &&);\n+static_assert (add_rvalue_reference (^^int &&) == ^^int &&);\n+static_assert (add_rvalue_reference (^^int &) == ^^int &);\n+static_assert (add_rvalue_reference (^^const int) == ^^const int &&);\n+static_assert (add_rvalue_reference (^^int *) == ^^int *&&);\n+static_assert (add_rvalue_reference (^^C &&) == ^^C &&);\n+static_assert (add_rvalue_reference (^^C) == ^^C &&);\n+static_assert (add_rvalue_reference (^^int (int)) == ^^int (&&) (int));\n+static_assert (add_rvalue_reference (^^void) == ^^void);\n+static_assert (add_rvalue_reference (^^const void) == ^^const void);\n+static_assert (add_rvalue_reference (^^bool (int) const) == ^^bool (int) const);\n+static_assert (add_rvalue_reference (^^bool (int) &) == ^^bool (int) &);\n+static_assert (add_rvalue_reference (^^bool (int) const &&) == ^^bool (int) const &&);\n+static_assert (add_rvalue_reference (^^bool (int)) == ^^bool (&&) (int));\n+using T3 = int &&;\n+static_assert (add_rvalue_reference (^^T3) == dealias (^^T3));\n+\n+static_assert (make_signed (^^const char) == ^^const signed char);\n+static_assert (make_signed (^^volatile signed char) == ^^volatile signed char);\n+static_assert (make_signed (^^unsigned char) == ^^signed char);\n+static_assert (make_signed (^^const signed short) == ^^const short);\n+static_assert (make_signed (^^volatile unsigned short) == ^^volatile signed short);\n+static_assert (make_signed (^^int) == ^^signed int);\n+static_assert (make_signed (^^const unsigned int) == ^^const int);\n+static_assert (make_signed (^^volatile long) == ^^volatile signed long);\n+static_assert (make_signed (^^unsigned long) == ^^long);\n+static_assert (make_signed (^^const signed long long) == ^^const long long);\n+static_assert (make_signed (^^volatile long long unsigned) == ^^volatile long long);\n+#if __SIZEOF_SHORT__ > 1 && __SIZEOF_SHORT__ < __SIZEOF_INT__ \\\n+ && __SIZEOF_INT__ < __SIZEOF_LONG_LONG__\n+static_assert (make_signed (^^const E1) == ^^const int);\n+static_assert (make_signed (^^volatile E2) == ^^volatile signed char);\n+static_assert (make_signed (^^E3) == ^^short);\n+#if __SIZEOF_LONG__ < __SIZEOF_LONG_LONG__\n+static_assert (make_signed (^^const volatile E4) == ^^const volatile long long);\n+#else\n+static_assert (make_signed (^^const volatile E4) == ^^const volatile long);\n+#endif\n+static_assert (make_signed (^^volatile char8_t) == ^^volatile signed char);\n+static_assert (sizeof (char16_t) != sizeof (short) || make_signed (^^char16_t) == ^^signed short);\n+static_assert (sizeof (char32_t) != sizeof (int) || make_signed (^^const volatile char32_t) == ^^const volatile int);\n+static_assert (sizeof (wchar_t) != sizeof (short) || make_signed (^^wchar_t) == ^^short);\n+static_assert (sizeof (wchar_t) != sizeof (int) || make_signed (^^wchar_t) == ^^signed int);\n+#endif\n+static_assert (make_signed (^^T1) == ^^int);\n+\n+static_assert (make_unsigned (^^const char) == ^^const unsigned char);\n+static_assert (make_unsigned (^^volatile signed char) == ^^volatile unsigned char);\n+static_assert (make_unsigned (^^unsigned char) == ^^unsigned char);\n+static_assert (make_unsigned (^^const signed short) == ^^const unsigned short);\n+static_assert (make_unsigned (^^volatile unsigned short) == ^^volatile unsigned short);\n+static_assert (make_unsigned (^^int) == ^^unsigned int);\n+static_assert (make_unsigned (^^const unsigned int) == ^^const unsigned);\n+static_assert (make_unsigned (^^volatile long) == ^^volatile unsigned long);\n+static_assert (make_unsigned (^^unsigned long) == ^^unsigned long);\n+static_assert (make_unsigned (^^const signed long long) == ^^const unsigned long long);\n+static_assert (make_unsigned (^^volatile long long unsigned) == ^^volatile unsigned long long);\n+#if __SIZEOF_SHORT__ > 1 && __SIZEOF_SHORT__ < __SIZEOF_INT__ \\\n+ && __SIZEOF_INT__ < __SIZEOF_LONG_LONG__\n+static_assert (make_unsigned (^^const E1) == ^^const unsigned int);\n+static_assert (make_unsigned (^^volatile E2) == ^^volatile unsigned char);\n+static_assert (make_unsigned (^^E3) == ^^unsigned short);\n+#if __SIZEOF_LONG__ < __SIZEOF_LONG_LONG__\n+static_assert (make_unsigned (^^const volatile E4) == ^^const volatile unsigned long long);\n+#else\n+static_assert (make_unsigned (^^const volatile E4) == ^^const volatile long unsigned);\n+#endif\n+static_assert (make_unsigned (^^volatile char8_t) == ^^volatile unsigned char);\n+static_assert (sizeof (char16_t) != sizeof (short) || make_unsigned (^^char16_t) == ^^unsigned short);\n+static_assert (sizeof (char32_t) != sizeof (int) || make_unsigned (^^const volatile char32_t) == ^^const volatile unsigned);\n+static_assert (sizeof (wchar_t) != sizeof (short) || make_unsigned (^^wchar_t) == ^^unsigned short);\n+static_assert (sizeof (wchar_t) != sizeof (int) || make_unsigned (^^wchar_t) == ^^unsigned int);\n+#endif\n+using T4 = unsigned;\n+static_assert (make_unsigned (^^T4) == ^^unsigned);\n+\n+static_assert (remove_extent (^^int) == ^^int);\n+static_assert (remove_extent (^^int[2]) == ^^int);\n+static_assert (remove_extent (^^int[2][3]) == ^^int[3]);\n+static_assert (remove_extent (^^int[][3]) == ^^int[3]);\n+static_assert (remove_extent (^^const int[2]) == ^^const int);\n+static_assert (remove_extent (^^C) == ^^C);\n+static_assert (remove_extent (^^C[2]) == ^^C);\n+static_assert (remove_extent (^^C[2][3]) == ^^C[3]);\n+static_assert (remove_extent (^^C[][3]) == ^^C[3]);\n+static_assert (remove_extent (^^const C[2]) == ^^const C);\n+static_assert (remove_extent (^^T1) == ^^int);\n+\n+static_assert (remove_all_extents (^^int) == ^^int);\n+static_assert (remove_all_extents (^^int[2]) == ^^int);\n+static_assert (remove_all_extents (^^int[2][3]) == ^^int);\n+static_assert (remove_all_extents (^^int[][3]) == ^^int);\n+static_assert (remove_all_extents (^^const int[2][3]) == ^^const int);\n+static_assert (remove_all_extents (^^C) == ^^C);\n+static_assert (remove_all_extents (^^C[2]) == ^^C);\n+static_assert (remove_all_extents (^^C[2][3]) == ^^C);\n+static_assert (remove_all_extents (^^C[][3]) == ^^C);\n+static_assert (remove_all_extents (^^const C[2][3]) == ^^const C);\n+static_assert (remove_all_extents (^^T1) == ^^int);\n+\n+static_assert (remove_pointer (^^int *) == ^^int);\n+static_assert (remove_pointer (^^int) == ^^int);\n+static_assert (remove_pointer (^^const int *) == ^^const int);\n+static_assert (remove_pointer (^^int **) == ^^int *);\n+static_assert (remove_pointer (^^C *) == ^^C);\n+static_assert (remove_pointer (^^C) == ^^C);\n+static_assert (remove_pointer (^^T1) == ^^int);\n+\n+static_assert (add_pointer (^^int) == ^^int *);\n+static_assert (add_pointer (^^int *) == ^^int **);\n+static_assert (add_pointer (^^const int) == ^^const int *);\n+static_assert (add_pointer (^^int &) == ^^int *);\n+static_assert (add_pointer (^^C *) == ^^C **);\n+static_assert (add_pointer (^^C) == ^^C *);\n+static_assert (add_pointer (^^void) == ^^void *);\n+static_assert (add_pointer (^^const void) == ^^const void *);\n+static_assert (add_pointer (^^volatile void) == ^^volatile void *);\n+static_assert (add_pointer (^^const volatile void) == ^^const volatile void *);\n+\n+consteval\n+{\n+ try\n+ {\n+ make_signed (^^bool);\n+ throw 1;\n+ }\n+ catch (std::meta::exception &)\n+ {\n+ }\n+ try\n+ {\n+ make_unsigned (^^bool);\n+ throw 1;\n+ }\n+ catch (std::meta::exception &)\n+ {\n+ }\n+ try\n+ {\n+ make_signed (^^float);\n+ throw 1;\n+ }\n+ catch (std::meta::exception &)\n+ {\n+ }\n+ try\n+ {\n+ make_unsigned (^^double);\n+ throw 1;\n+ }\n+ catch (std::meta::exception &)\n+ {\n+ }\n+ try\n+ {\n+ make_signed (^^C);\n+ throw 1;\n+ }\n+ catch (std::meta::exception &)\n+ {\n+ }\n+ try\n+ {\n+ make_unsigned (^^C);\n+ throw 1;\n+ }\n+ catch (std::meta::exception &)\n+ {\n+ }\n+}\ndiff --git a/gcc/testsuite/g++.dg/reflect/type_trait4.C b/gcc/testsuite/g++.dg/reflect/type_trait4.C\nnew file mode 100644\nindex 00000000000..7d44ab2dac9\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/type_trait4.C\n@@ -0,0 +1,12 @@\n+// { dg-do compile { target { c++26 && int128 } } }\n+// { dg-options \"-freflection\" }\n+// Test reflection type traits [meta.reflection.traits], sign modifications.\n+\n+#include <meta>\n+using namespace std::meta;\n+\n+static_assert (make_signed (^^const signed __int128) == ^^const __int128);\n+static_assert (make_signed (^^volatile __int128 unsigned) == ^^volatile __int128);\n+\n+static_assert (make_unsigned (^^const volatile signed __int128) == ^^const volatile unsigned __int128);\n+static_assert (make_unsigned (^^__int128 unsigned) == ^^unsigned __int128);\ndiff --git a/gcc/testsuite/g++.dg/reflect/type_trait5.C b/gcc/testsuite/g++.dg/reflect/type_trait5.C\nnew file mode 100644\nindex 00000000000..ff025882b4f\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/type_trait5.C\n@@ -0,0 +1,453 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test reflection type traits [meta.reflection.traits], type properties.\n+\n+#include <meta>\n+using namespace std::meta;\n+\n+struct C { };\n+\n+struct HasTemplateCCtor\n+{\n+ HasTemplateCCtor (const HasTemplateCCtor &) = default;\n+ template <class T>\n+ HasTemplateCCtor (T &&);\n+};\n+ \n+struct MoveOnly\n+{\n+ MoveOnly (MoveOnly &&) = default;\n+};\n+ \n+struct MoveOnly2\n+{\n+ MoveOnly2 (MoveOnly2 &&) = delete;\n+};\n+\n+class EmptyClassOne\n+{ typedef int type; };\n+\n+class EmptyClassTwo\n+{ static int data; };\n+\n+class EmptyClassThree\n+{ int f(); };\n+\n+class NonEmptyClassOne\n+{ int data; };\n+\n+class NonEmptyClassTwo\n+{\n+ virtual int f();\n+ virtual ~NonEmptyClassTwo();\n+};\n+\n+class ClassType { };\n+typedef const ClassType cClassType;\n+typedef volatile ClassType vClassType;\n+typedef const volatile ClassType cvClassType;\n+\n+class DerivedType : public ClassType { };\n+\n+class FinalType final : public DerivedType { };\n+\n+enum EnumType { e0 };\n+\n+struct ConvType\n+{ operator int () const; };\n+\n+class AbstractClass\n+{\n+ virtual void rotate (int) = 0;\n+};\n+\n+class PolymorphicClass\n+{\n+ virtual void rotate (int);\n+};\n+\n+class DerivedPolymorphic : public PolymorphicClass { };\n+\n+class VirtualDestructorClass\n+{\n+ virtual ~VirtualDestructorClass();\n+};\n+\n+union UnionType { };\n+\n+union IncompleteUnion;\n+\n+class IncompleteClass;\n+\n+struct ExplicitClass\n+{\n+ ExplicitClass (double &);\n+ explicit ExplicitClass (int &);\n+ ExplicitClass (double &, int &, double &);\n+};\n+\n+struct NoexceptMoveAssignClass\n+{\n+ NoexceptMoveAssignClass (NoexceptMoveAssignClass &&) = default;\n+ NoexceptMoveAssignClass &operator= (NoexceptMoveAssignClass &&) noexcept (true);\n+};\n+\n+struct NType\n+{\n+ int i;\n+ int j;\n+ virtual ~NType ();\n+};\n+\n+struct TType\n+{\n+ int i;\n+private:\n+ int j;\n+};\n+\n+struct SLType\n+{\n+ int i;\n+ int j;\n+ ~SLType ();\n+};\n+\n+struct PODType\n+{\n+ int i;\n+ int j;\n+};\n+\n+struct CopyConsOnlyType\n+{\n+ CopyConsOnlyType (int) { }\n+ CopyConsOnlyType (CopyConsOnlyType &&) = delete;\n+ CopyConsOnlyType (const CopyConsOnlyType &) = default;\n+ CopyConsOnlyType &operator= (const CopyConsOnlyType &) = delete;\n+ CopyConsOnlyType &operator= (CopyConsOnlyType &&) = delete;\n+};\n+\n+struct MoveConsOnlyType\n+{\n+ MoveConsOnlyType (int) { }\n+ MoveConsOnlyType (const MoveConsOnlyType &) = delete;\n+ MoveConsOnlyType (MoveConsOnlyType &&) = default;\n+ MoveConsOnlyType& operator= (const MoveConsOnlyType &) = delete;\n+ MoveConsOnlyType& operator= (MoveConsOnlyType &&) = delete;\n+};\n+\n+struct Incomplete_struct;\n+\n+namespace construct\n+{\n+ struct Empty {};\n+\n+ struct B { int i; B () {} };\n+\n+ union U { int i; Empty b; };\n+\n+ struct Abstract\n+ {\n+ virtual ~Abstract () = 0;\n+ };\n+\n+ struct Any\n+ {\n+ template <class T>\n+ Any (T &&) {}\n+ };\n+\n+ struct DelDef\n+ {\n+ DelDef () = delete;\n+ };\n+\n+ struct DelCopy\n+ {\n+ DelCopy (const DelCopy &) = delete;\n+ };\n+\n+ struct DelDtor\n+ {\n+ DelDtor () = default;\n+ DelDtor (const DelDtor &) = default;\n+ DelDtor (DelDtor &&) = default;\n+ DelDtor (int);\n+ DelDtor (int, B, U);\n+ ~DelDtor () = delete;\n+ };\n+\n+ struct Ellipsis\n+ {\n+ Ellipsis (...) {}\n+ };\n+\n+ struct DelEllipsis\n+ {\n+ DelEllipsis (...) = delete;\n+ };\n+\n+ struct Nontrivial\n+ {\n+ Nontrivial ();\n+ Nontrivial (const Nontrivial &);\n+ Nontrivial &operator= (const Nontrivial &);\n+ ~Nontrivial ();\n+ };\n+\n+ struct UnusualCopy\n+ {\n+ UnusualCopy (UnusualCopy &);\n+ };\n+}\n+\n+namespace N\n+{\n+ void foo ();\n+}\n+\n+int v = 1;\n+struct S1 { decltype (^^long) a; };\n+union U2 { int a; decltype (^^N::foo) b; };\n+struct S3 { const decltype (^^N) *c; };\n+struct S4 : public S3 {};\n+struct S5 { int a; long *b; };\n+\n+static_assert (is_const_type (^^const int));\n+static_assert (is_const_type (^^const volatile int));\n+static_assert (is_const_type (^^cClassType));\n+static_assert (is_const_type (^^cvClassType));\n+static_assert (!is_const_type (^^int));\n+static_assert (!is_const_type (^^volatile int));\n+static_assert (!is_const_type (^^ClassType));\n+static_assert (!is_const_type (^^vClassType));\n+\n+static_assert (is_volatile_type (^^volatile int));\n+static_assert (is_volatile_type (^^const volatile int));\n+static_assert (is_volatile_type (^^vClassType));\n+static_assert (is_volatile_type (^^cvClassType));\n+static_assert (!is_volatile_type (^^int));\n+static_assert (!is_volatile_type (^^const int));\n+static_assert (!is_volatile_type (^^ClassType));\n+static_assert (!is_volatile_type (^^cClassType));\n+\n+static_assert (is_trivially_copyable_type (^^int));\n+static_assert (is_trivially_copyable_type (^^volatile int));\n+static_assert (is_trivially_copyable_type (^^TType));\n+static_assert (is_trivially_copyable_type (^^PODType));\n+static_assert (!is_trivially_copyable_type (^^NType));\n+static_assert (!is_trivially_copyable_type (^^SLType));\n+static_assert (is_trivially_copyable_type (^^construct::DelDef));\n+static_assert (!is_trivially_copyable_type (^^construct::Abstract));\n+static_assert (is_trivially_copyable_type (^^construct::Ellipsis));\n+static_assert (is_trivially_copyable_type (^^construct::DelEllipsis));\n+static_assert (is_trivially_copyable_type (^^construct::Any));\n+static_assert (is_trivially_copyable_type (^^construct::DelCopy));\n+static_assert (is_trivially_copyable_type (^^construct::DelDtor));\n+static_assert (!is_trivially_copyable_type (^^construct::Nontrivial));\n+static_assert (!is_trivially_copyable_type (^^construct::UnusualCopy));\n+static_assert (is_trivially_copyable_type (^^CopyConsOnlyType));\n+static_assert (is_trivially_copyable_type (^^MoveConsOnlyType));\n+static_assert (is_trivially_copyable_type (^^HasTemplateCCtor));\n+static_assert (is_trivially_copyable_type (^^MoveOnly));\n+static_assert (is_trivially_copyable_type (^^MoveOnly2));\n+static_assert (is_trivially_copyable_type (^^volatile int));\n+static_assert (is_trivially_copyable_type (^^TType));\n+static_assert (is_trivially_copyable_type (^^PODType));\n+static_assert (!is_trivially_copyable_type (^^NType));\n+static_assert (!is_trivially_copyable_type (^^SLType));\n+static_assert (is_trivially_copyable_type (^^construct::DelDef));\n+static_assert (!is_trivially_copyable_type (^^construct::Abstract));\n+static_assert (is_trivially_copyable_type (^^construct::Ellipsis));\n+static_assert (is_trivially_copyable_type (^^construct::DelEllipsis));\n+static_assert (is_trivially_copyable_type (^^construct::Any));\n+static_assert (is_trivially_copyable_type (^^construct::DelCopy));\n+static_assert (is_trivially_copyable_type (^^construct::DelDtor));\n+static_assert (!is_trivially_copyable_type (^^construct::Nontrivial));\n+static_assert (!is_trivially_copyable_type (^^construct::UnusualCopy));\n+static_assert (is_trivially_copyable_type (^^CopyConsOnlyType));\n+static_assert (is_trivially_copyable_type (^^MoveConsOnlyType));\n+static_assert (is_trivially_copyable_type (^^HasTemplateCCtor));\n+static_assert (is_trivially_copyable_type (^^MoveOnly));\n+static_assert (is_trivially_copyable_type (^^MoveOnly2));\n+\n+static_assert (is_standard_layout_type (^^SLType));\n+static_assert (is_standard_layout_type (^^PODType));\n+static_assert (!is_standard_layout_type (^^NType));\n+static_assert (!is_standard_layout_type (^^TType));\n+\n+static_assert (is_empty_type (^^ClassType));\n+static_assert (is_empty_type (^^EmptyClassOne));\n+static_assert (is_empty_type (^^EmptyClassTwo));\n+static_assert (is_empty_type (^^EmptyClassThree));\n+static_assert (!is_empty_type (^^void));\n+static_assert (!is_empty_type (^^float));\n+static_assert (!is_empty_type (^^int[4]));\n+static_assert (!is_empty_type (^^int *));\n+static_assert (!is_empty_type (^^int &));\n+static_assert (!is_empty_type (^^int (ClassType::*)));\n+static_assert (!is_empty_type (^^EnumType));\n+static_assert (!is_empty_type (^^int (int)));\n+static_assert (!is_empty_type (^^AbstractClass));\n+static_assert (!is_empty_type (^^NonEmptyClassOne));\n+static_assert (!is_empty_type (^^NonEmptyClassTwo));\n+\n+static_assert (is_polymorphic_type (^^PolymorphicClass));\n+static_assert (is_polymorphic_type (^^DerivedPolymorphic));\n+static_assert (is_polymorphic_type (^^AbstractClass));\n+static_assert (is_polymorphic_type (^^VirtualDestructorClass));\n+static_assert (!is_polymorphic_type (^^void));\n+static_assert (!is_polymorphic_type (^^int (int)));\n+static_assert (!is_polymorphic_type (^^int &));\n+static_assert (!is_polymorphic_type (^^EnumType));\n+static_assert (!is_polymorphic_type (^^ClassType));\n+static_assert (!is_polymorphic_type (^^DerivedType));\n+\n+static_assert (is_abstract_type (^^AbstractClass));\n+static_assert (!is_abstract_type (^^void));\n+static_assert (!is_abstract_type (^^int (int)));\n+static_assert (!is_abstract_type (^^int &));\n+static_assert (!is_abstract_type (^^ClassType));\n+\n+static_assert (is_final_type (^^FinalType));\n+static_assert (!is_final_type (^^ClassType));\n+static_assert (!is_final_type (^^DerivedType));\n+\n+static_assert (is_aggregate_type (^^ClassType));\n+static_assert (is_aggregate_type (^^UnionType));\n+static_assert (is_aggregate_type (^^SLType));\n+static_assert (is_aggregate_type (^^unsigned[3]));\n+static_assert (is_aggregate_type (^^unsigned[3][2]));\n+static_assert (is_aggregate_type (^^unsigned[]));\n+static_assert (is_aggregate_type (^^unsigned[][2]));\n+static_assert (is_aggregate_type (^^EnumType[3]));\n+static_assert (is_aggregate_type (^^EnumType[3][2]));\n+static_assert (is_aggregate_type (^^EnumType[]));\n+static_assert (is_aggregate_type (^^EnumType[][2]));\n+static_assert (!is_aggregate_type (^^AbstractClass));\n+static_assert (!is_aggregate_type (^^PolymorphicClass));\n+static_assert (!is_aggregate_type (^^ExplicitClass));\n+static_assert (!is_aggregate_type (^^char));\n+static_assert (!is_aggregate_type (^^unsigned char));\n+static_assert (!is_aggregate_type (^^signed char));\n+static_assert (!is_aggregate_type (^^unsigned));\n+static_assert (!is_aggregate_type (^^bool));\n+static_assert (!is_aggregate_type (^^float));\n+static_assert (!is_aggregate_type (^^double));\n+static_assert (!is_aggregate_type (^^EnumType));\n+static_assert (!is_aggregate_type (^^void));\n+static_assert (!is_aggregate_type (^^NoexceptMoveAssignClass));\n+\n+static_assert (is_consteval_only_type (^^decltype (^^long)));\n+static_assert (is_consteval_only_type (^^const decltype (^^N::foo)));\n+static_assert (is_consteval_only_type (^^volatile decltype (^^N)));\n+static_assert (is_consteval_only_type (^^const volatile decltype (^^v)));\n+static_assert (is_consteval_only_type (^^const S1));\n+static_assert (is_consteval_only_type (^^U2));\n+static_assert (is_consteval_only_type (^^S3));\n+static_assert (is_consteval_only_type (^^S4));\n+static_assert (!is_consteval_only_type (^^int));\n+static_assert (!is_consteval_only_type (^^S5));\n+\n+static_assert (!is_signed_type (^^void));\n+static_assert (char (-1) < char (0) ? is_signed_type (^^char) : !is_signed_type (^^char));\n+static_assert (is_signed_type (^^signed char));\n+static_assert (!is_signed_type (^^unsigned char));\n+static_assert (wchar_t (-1) < wchar_t (0) ? is_signed_type (^^wchar_t) : !is_signed_type (^^wchar_t));\n+static_assert (is_signed_type (^^short));\n+static_assert (!is_signed_type (^^unsigned short));\n+static_assert (is_signed_type (^^int));\n+static_assert (!is_signed_type (^^unsigned int));\n+static_assert (is_signed_type (^^long));\n+static_assert (!is_signed_type (^^unsigned long));\n+static_assert (is_signed_type (^^long long));\n+static_assert (!is_signed_type (^^unsigned long long));\n+static_assert (is_signed_type (^^float));\n+static_assert (is_signed_type (^^double));\n+static_assert (is_signed_type (^^long double));\n+static_assert (!is_signed_type (^^ClassType));\n+\n+static_assert (!is_unsigned_type (^^void));\n+static_assert (char (-1) < char (0) ? !is_unsigned_type (^^char) : is_unsigned_type (^^char));\n+static_assert (!is_unsigned_type (^^signed char));\n+static_assert (is_unsigned_type (^^unsigned char));\n+static_assert (wchar_t (-1) < wchar_t (0) ? !is_unsigned_type (^^wchar_t) : is_unsigned_type (^^wchar_t));\n+static_assert (!is_unsigned_type (^^short));\n+static_assert (is_unsigned_type (^^unsigned short));\n+static_assert (!is_unsigned_type (^^int));\n+static_assert (is_unsigned_type (^^unsigned int));\n+static_assert (!is_unsigned_type (^^long));\n+static_assert (is_unsigned_type (^^unsigned long));\n+static_assert (!is_unsigned_type (^^long long));\n+static_assert (is_unsigned_type (^^unsigned long long));\n+static_assert (!is_unsigned_type (^^float));\n+static_assert (!is_unsigned_type (^^double));\n+static_assert (!is_unsigned_type (^^long double));\n+static_assert (!is_unsigned_type (^^ClassType));\n+\n+static_assert (is_bounded_array_type (^^int[2]));\n+static_assert (!is_bounded_array_type (^^int[]));\n+static_assert (is_bounded_array_type (^^int[2][3]));\n+static_assert (!is_bounded_array_type (^^int[][3]));\n+static_assert (is_bounded_array_type (^^float *[2]));\n+static_assert (!is_bounded_array_type (^^float *[]));\n+static_assert (is_bounded_array_type (^^float *[2][3]));\n+static_assert (!is_bounded_array_type (^^float *[][3]));\n+static_assert (is_bounded_array_type (^^ClassType[2]));\n+static_assert (!is_bounded_array_type (^^ClassType[]));\n+static_assert (is_bounded_array_type (^^ClassType[2][3]));\n+static_assert (!is_bounded_array_type (^^ClassType[][3]));\n+static_assert (!is_bounded_array_type (^^int (*)[2]));\n+static_assert (!is_bounded_array_type (^^int (*)[]));\n+static_assert (!is_bounded_array_type (^^int (&)[2]));\n+static_assert (!is_bounded_array_type (^^int (&)[]));\n+static_assert (!is_bounded_array_type (^^ClassType));\n+static_assert (!is_bounded_array_type (^^void ()));\n+\n+static_assert (!is_unbounded_array_type (^^int[2]));\n+static_assert (is_unbounded_array_type (^^int[]));\n+static_assert (!is_unbounded_array_type (^^int[2][3]));\n+static_assert (is_unbounded_array_type (^^int[][3]));\n+static_assert (!is_unbounded_array_type (^^float *[2]));\n+static_assert (is_unbounded_array_type (^^float *[]));\n+static_assert (!is_unbounded_array_type (^^float *[2][3]));\n+static_assert (is_unbounded_array_type (^^float *[][3]));\n+static_assert (!is_unbounded_array_type (^^ClassType[2]));\n+static_assert (is_unbounded_array_type (^^ClassType[]));\n+static_assert (!is_unbounded_array_type (^^ClassType[2][3]));\n+static_assert (is_unbounded_array_type (^^ClassType[][3]));\n+static_assert (!is_unbounded_array_type (^^IncompleteClass[2][3]));\n+static_assert (is_unbounded_array_type (^^IncompleteClass[][3]));\n+static_assert (!is_unbounded_array_type (^^int (*)[2]));\n+static_assert (!is_unbounded_array_type (^^int (*)[]));\n+static_assert (!is_unbounded_array_type (^^int (&)[2]));\n+static_assert (!is_unbounded_array_type (^^int (&)[]));\n+static_assert (!is_unbounded_array_type (^^ClassType));\n+static_assert (!is_unbounded_array_type (^^IncompleteClass));\n+static_assert (!is_unbounded_array_type (^^IncompleteUnion));\n+\n+enum class E { e1, e2 };\n+static_assert (is_scoped_enum_type (^^E));\n+enum class Ec : char { e1, e2 };\n+static_assert (is_scoped_enum_type (^^Ec));\n+enum U { u1, u2 };\n+static_assert (!is_scoped_enum_type (^^U));\n+enum F : int { f1, f2 };\n+static_assert (!is_scoped_enum_type (^^F));\n+static_assert (!is_scoped_enum_type (^^Incomplete_struct));\n+struct S;\n+static_assert (!is_scoped_enum_type (^^S));\n+struct S { };\n+static_assert (!is_scoped_enum_type (^^S));\n+static_assert (!is_scoped_enum_type (^^int));\n+static_assert (!is_scoped_enum_type (^^int[]));\n+static_assert (!is_scoped_enum_type (^^int[2]));\n+static_assert (!is_scoped_enum_type (^^int[][2]));\n+static_assert (!is_scoped_enum_type (^^int[2][3]));\n+static_assert (!is_scoped_enum_type (^^int *));\n+static_assert (!is_scoped_enum_type (^^int &));\n+static_assert (!is_scoped_enum_type (^^int *&));\n+static_assert (!is_scoped_enum_type (^^int ()));\n+static_assert (!is_scoped_enum_type (^^int (*) ()));\n+static_assert (!is_scoped_enum_type (^^int (&) ()));\ndiff --git a/gcc/testsuite/g++.dg/reflect/type_trait6.C b/gcc/testsuite/g++.dg/reflect/type_trait6.C\nnew file mode 100644\nindex 00000000000..e1b466f3cb6\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/type_trait6.C\n@@ -0,0 +1,1381 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test reflection type traits [meta.reflection.traits], type properties.\n+\n+#include <meta>\n+using namespace std::meta;\n+\n+class ClassType { };\n+class DerivedType : public ClassType { };\n+enum EnumType { e0 };\n+struct ThrowDefaultClass { ThrowDefaultClass () noexcept (false); };\n+struct ThrowCopyConsClass { ThrowCopyConsClass (const ThrowCopyConsClass &) noexcept (false); };\n+struct ThrowMoveConsClass { ThrowMoveConsClass (ThrowMoveConsClass &&) noexcept (false); };\n+struct NoexceptDefaultClass { NoexceptDefaultClass () noexcept (true); };\n+struct ExceptDefaultClass { ExceptDefaultClass () noexcept (false); };\n+struct NoexceptCopyConsClass { NoexceptCopyConsClass (const NoexceptCopyConsClass &) noexcept (true); };\n+struct ExceptCopyConsClass { ExceptCopyConsClass (const ExceptCopyConsClass &) noexcept (false); };\n+struct NoexceptMoveConsClass { NoexceptMoveConsClass (NoexceptMoveConsClass &&) noexcept (true); NoexceptMoveConsClass &operator= (NoexceptMoveConsClass &&) = default; };\n+struct ExceptMoveConsClass { ExceptMoveConsClass (ExceptMoveConsClass &&) noexcept (false); };\n+struct NoexceptCopyAssignClass { NoexceptCopyAssignClass &operator= (const NoexceptCopyAssignClass &) noexcept (true); };\n+struct ExceptCopyAssignClass { ExceptCopyAssignClass &operator= (const ExceptCopyAssignClass &) noexcept (false); };\n+struct NoexceptMoveAssignClass { NoexceptMoveAssignClass (NoexceptMoveAssignClass &&) = default; NoexceptMoveAssignClass &operator= (NoexceptMoveAssignClass &&) noexcept (true); };\n+struct ExceptMoveAssignClass { ExceptMoveAssignClass &operator= (ExceptMoveAssignClass &&) noexcept (false); };\n+struct DeletedCopyAssignClass { DeletedCopyAssignClass & operator= (const DeletedCopyAssignClass &) = delete; };\n+struct DeletedMoveAssignClass { DeletedMoveAssignClass &operator= (DeletedMoveAssignClass &&) = delete; };\n+struct NType { int i; int j; virtual ~NType (); };\n+struct TType { int i; private: int j; };\n+struct SLType { int i; int j; ~SLType (); };\n+struct PODType { int i; int j; };\n+\n+namespace N1\n+{\n+ struct Empty {};\n+ struct B { int i; B () {} };\n+ struct D : B {};\n+ enum E { ee1 };\n+ enum E2 { ee2 };\n+ enum class SE { e1 };\n+ enum class SE2 { e2 };\n+ enum OpE : int;\n+ enum class OpSE : bool;\n+ union U { int i; Empty b; };\n+ struct Abstract { virtual ~Abstract () = 0; };\n+ struct AbstractDelDtor { ~AbstractDelDtor () = delete; virtual void foo () = 0; };\n+ struct Ukn;\n+ template <class To>\n+ struct ImplicitTo { operator To (); };\n+ template <class To>\n+ struct DelImplicitTo { operator To () = delete; };\n+ template <class To>\n+ struct ExplicitTo { explicit operator To (); };\n+ struct Ellipsis { Ellipsis (...) {} };\n+ struct DelEllipsis { DelEllipsis (...) = delete; };\n+ struct Any { template <class T> Any (T &&) {} };\n+ struct nAny { template <class... T> nAny (T &&...) {} };\n+ struct DelnAny { template <class... T> DelnAny (T &&...) = delete; };\n+ template <class... Args>\n+ struct FromArgs { FromArgs (Args...); };\n+ struct DelDef { DelDef () = delete; };\n+ struct DelCopy { DelCopy (const DelCopy &) = delete; };\n+ struct DelDtor {\n+ DelDtor () = default;\n+ DelDtor (const DelDtor &) = default;\n+ DelDtor (DelDtor &&) = default;\n+ DelDtor (int);\n+ DelDtor (int, B, U);\n+ ~DelDtor () = delete;\n+ };\n+ struct Nontrivial {\n+ Nontrivial ();\n+ Nontrivial (const Nontrivial &);\n+ Nontrivial &operator= (const Nontrivial &);\n+ ~Nontrivial ();\n+ };\n+ union NontrivialUnion { int i; Nontrivial n; };\n+ struct UnusualCopy { UnusualCopy (UnusualCopy &); };\n+}\n+\n+namespace N2\n+{\n+ struct E {};\n+ struct NTD1 { ~NTD1 () = default; };\n+ struct NTD2 { ~NTD2 (); };\n+ struct NTD3 { ~NTD3 () noexcept (true); };\n+ struct TD1 { ~TD1 () noexcept (false); };\n+ struct TD2 { ~TD2 () noexcept (false); };\n+ struct Aggr { int i; bool b; E e; };\n+ struct Aggr2 { int i; bool b; TD1 r; };\n+ struct Del { ~Del () = delete; };\n+ struct Del2 { ~Del2 () noexcept = delete; };\n+ struct Del3 { ~Del3 () noexcept (false) = delete; };\n+ struct Der : Aggr {};\n+ struct Der2 : Aggr2 {};\n+ union U1 { int i; double d; void *p; TD1 *pt; };\n+ union Ut { int i; double d; void *p; TD1 pt; };\n+ enum class En { a, b, c, d };\n+ enum En2 { En2a, En2b, En2c, En2d };\n+ enum OpE : int;\n+ enum class OpSE : bool;\n+ struct Abstract1 { virtual ~Abstract1 () = 0; };\n+ struct AbstractDelDtor { ~AbstractDelDtor () = delete; virtual void foo () = 0; };\n+ struct Abstract2 { virtual ~Abstract2 () noexcept (false) = 0; };\n+ struct Abstract3 { ~Abstract3 () noexcept (false); virtual void foo () noexcept = 0; };\n+ struct Nontrivial {\n+ Nontrivial ();\n+ Nontrivial (const Nontrivial &);\n+ Nontrivial &operator= (const Nontrivial &);\n+ ~Nontrivial ();\n+ };\n+ union NontrivialUnion { int i; Nontrivial n; };\n+ struct UnusualCopy { UnusualCopy (UnusualCopy &); };\n+ struct Ellipsis { Ellipsis (...) {} };\n+ struct DelEllipsis { DelEllipsis (...) = delete; };\n+ struct DelDef { DelDef () = delete; };\n+ struct DelCopy { DelCopy (const DelCopy &) = delete; };\n+}\n+\n+namespace N3\n+{\n+ struct Empty {};\n+ struct B { int i; B (){} };\n+ struct D : B {};\n+ enum E { ee1 };\n+ enum E2 { ee2 };\n+ enum class SE { e1 };\n+ enum class SE2 { e2 };\n+ enum OpE : int;\n+ enum class OpSE : bool;\n+ union U { int i; Empty b; };\n+ union UAssignAll { bool b; char c; template <class T> void operator= (T &&); };\n+ union UDelAssignAll { bool b; char c; template <class T> void operator= (T &&) = delete; };\n+ struct Abstract { virtual ~Abstract () = 0; };\n+ struct AbstractDelDtor { ~AbstractDelDtor () = delete; virtual void foo () = 0; };\n+ struct Ukn;\n+ template <class To>\n+ struct ImplicitTo { operator To (); };\n+ template <class To>\n+ struct ExplicitTo { explicit operator To (); };\n+ template <class To>\n+ struct DelImplicitTo { operator To () = delete; };\n+ template<class To> struct DelExplicitTo { explicit operator To () = delete; };\n+ struct Ellipsis { Ellipsis (...) {} };\n+ struct DelEllipsis { DelEllipsis (...) = delete; };\n+ struct Any { template <class T> Any (T &&) {} };\n+ struct nAny { template <class... T> nAny (T &&...) {} };\n+ struct DelnAny { template <class... T> DelnAny (T &&...) = delete; };\n+ template<class... Args>\n+ struct FromArgs { FromArgs (Args...); };\n+ template<class... Args>\n+ struct DelFromArgs { DelFromArgs (Args...) = delete; };\n+ struct DelDef { DelDef () = delete; };\n+ struct DelCopy { DelCopy (const DelCopy &) = delete; };\n+ struct DelDtor {\n+ DelDtor () = default;\n+ DelDtor (const DelDtor &) = default;\n+ DelDtor (DelDtor &&) = default;\n+ DelDtor (int);\n+ DelDtor (int, B, U);\n+ ~DelDtor () = delete;\n+ };\n+ struct Nontrivial {\n+ Nontrivial ();\n+ Nontrivial (const Nontrivial &);\n+ Nontrivial &operator= (const Nontrivial &);\n+ ~Nontrivial ();\n+ };\n+ union NontrivialUnion { int i; Nontrivial n; };\n+ struct UnusualCopy { UnusualCopy (UnusualCopy &); };\n+ struct AnyAssign { template <class T> void operator= (T &&); };\n+ struct DelAnyAssign { template <class T> void operator= (T &&) = delete; };\n+ struct DelCopyAssign {\n+ DelCopyAssign &operator= (const DelCopyAssign &) = delete;\n+ DelCopyAssign &operator= (DelCopyAssign &&) = default;\n+ };\n+ struct MO { MO (MO &&) = default; MO &operator= (MO &&) = default; };\n+}\n+\n+struct CopyConsOnlyType {\n+ CopyConsOnlyType (int) { }\n+ CopyConsOnlyType (CopyConsOnlyType &&) = delete;\n+ CopyConsOnlyType (const CopyConsOnlyType &) = default;\n+ CopyConsOnlyType &operator= (const CopyConsOnlyType &) = delete;\n+ CopyConsOnlyType &operator= (CopyConsOnlyType &&) = delete;\n+};\n+\n+struct MoveConsOnlyType {\n+ MoveConsOnlyType (int) { }\n+ MoveConsOnlyType (const MoveConsOnlyType &) = delete;\n+ MoveConsOnlyType (MoveConsOnlyType &&) = default;\n+ MoveConsOnlyType &operator= (const MoveConsOnlyType &) = delete;\n+ MoveConsOnlyType &operator= (MoveConsOnlyType &&) = delete;\n+};\n+\n+struct HasTemplateCtor { HasTemplateCtor () = default; template <class T> HasTemplateCtor (); };\n+struct HasTemplateCCtor {\n+ HasTemplateCCtor (const HasTemplateCCtor &) = default;\n+ template <class T>\n+ HasTemplateCCtor (T &&);\n+};\n+struct MoveOnly { MoveOnly (MoveOnly &&) = default; };\n+struct MoveOnly2 { MoveOnly2 (MoveOnly2 &&) = delete; };\n+struct HasTemplateCAssign\n+{\n+ HasTemplateCAssign &operator= (const HasTemplateCAssign &) = default;\n+ template <class T>\n+ HasTemplateCAssign &operator= (T &&);\n+};\n+struct MoveOnly3 { MoveOnly3 &operator= (MoveOnly3 &&) = default; };\n+struct MoveOnly4 { MoveOnly4 &operator= (MoveOnly4 &&) = delete; };\n+\n+static_assert (is_default_constructible_type (^^int));\n+static_assert (is_default_constructible_type (^^int const));\n+static_assert (is_default_constructible_type (^^int const volatile));\n+static_assert (is_default_constructible_type (^^int *));\n+static_assert (is_default_constructible_type (^^void *));\n+static_assert (is_default_constructible_type (^^void *const));\n+static_assert (is_default_constructible_type (^^int N1::B::*));\n+static_assert (is_default_constructible_type (^^void (*) ()));\n+static_assert (is_default_constructible_type (^^std::nullptr_t));\n+static_assert (is_default_constructible_type (^^std::nullptr_t const));\n+static_assert (is_default_constructible_type (^^N1::Empty));\n+static_assert (is_default_constructible_type (^^N1::Empty const));\n+static_assert (is_default_constructible_type (^^N1::FromArgs <>));\n+static_assert (is_default_constructible_type (^^N1::FromArgs <> const));\n+static_assert (is_default_constructible_type (^^N1::nAny));\n+static_assert (is_default_constructible_type (^^N1::nAny const));\n+static_assert (is_default_constructible_type (^^N1::Ellipsis));\n+static_assert (is_default_constructible_type (^^N1::Ellipsis const));\n+static_assert (is_default_constructible_type (^^N1::U));\n+static_assert (is_default_constructible_type (^^N1::U const));\n+static_assert (is_default_constructible_type (^^N1::E));\n+static_assert (is_default_constructible_type (^^N1::E const));\n+static_assert (is_default_constructible_type (^^N1::SE));\n+static_assert (is_default_constructible_type (^^N1::SE const));\n+static_assert (is_default_constructible_type (^^N1::OpE));\n+static_assert (is_default_constructible_type (^^N1::OpE const));\n+static_assert (is_default_constructible_type (^^N1::OpSE));\n+static_assert (is_default_constructible_type (^^N1::OpSE const));\n+static_assert (is_default_constructible_type (^^int [1]));\n+static_assert (is_default_constructible_type (^^const int [1]));\n+static_assert (is_default_constructible_type (^^int [1][2]));\n+static_assert (is_default_constructible_type (^^const int [1][2]));\n+static_assert (is_default_constructible_type (^^N1::FromArgs <> [1]));\n+static_assert (is_default_constructible_type (^^const N1::FromArgs <> [1]));\n+static_assert (is_default_constructible_type (^^N1::U [1]));\n+static_assert (is_default_constructible_type (^^const N1::U [1]));\n+static_assert (is_default_constructible_type (^^N1::Empty [1]));\n+static_assert (is_default_constructible_type (^^const N1::Empty [1]));\n+static_assert (is_default_constructible_type (^^N1::Ellipsis [1]));\n+static_assert (is_default_constructible_type (^^const N1::Ellipsis [1]));\n+static_assert (is_default_constructible_type (^^std::nullptr_t [1]));\n+static_assert (is_default_constructible_type (^^const std::nullptr_t [1]));\n+static_assert (is_default_constructible_type (^^N1::nAny [1]));\n+static_assert (is_default_constructible_type (^^const N1::nAny [1]));\n+static_assert (is_default_constructible_type (^^N1::E [1]));\n+static_assert (is_default_constructible_type (^^const N1::E [1]));\n+static_assert (is_default_constructible_type (^^N1::SE [1]));\n+static_assert (is_default_constructible_type (^^const N1::SE [1]));\n+static_assert (is_default_constructible_type (^^N1::OpE [1]));\n+static_assert (is_default_constructible_type (^^const N1::OpE [1]));\n+static_assert (is_default_constructible_type (^^N1::OpSE [1]));\n+static_assert (is_default_constructible_type (^^const N1::OpSE [1]));\n+static_assert (is_default_constructible_type (^^int * [1]));\n+static_assert (is_default_constructible_type (^^int * const [1]));\n+static_assert (is_default_constructible_type (^^int N1::B::* [1]));\n+static_assert (is_default_constructible_type (^^int N1::B::* const [1]));\n+static_assert (is_default_constructible_type (^^std::initializer_list <int>));\n+static_assert (is_default_constructible_type (^^const std::initializer_list <int>));\n+static_assert (is_default_constructible_type (^^std::initializer_list <int> [1]));\n+static_assert (is_default_constructible_type (^^const std::initializer_list <int> [1]));\n+static_assert (is_default_constructible_type (^^NoexceptDefaultClass));\n+static_assert (is_default_constructible_type (^^ThrowDefaultClass));\n+static_assert (is_default_constructible_type (^^ExceptDefaultClass));\n+static_assert (!is_default_constructible_type (^^void));\n+static_assert (!is_default_constructible_type (^^const void));\n+static_assert (!is_default_constructible_type (^^N1::Abstract));\n+static_assert (!is_default_constructible_type (^^const N1::Abstract));\n+static_assert (!is_default_constructible_type (^^N1::Any));\n+static_assert (!is_default_constructible_type (^^const N1::Any));\n+static_assert (!is_default_constructible_type (^^N1::FromArgs <int>));\n+static_assert (!is_default_constructible_type (^^const N1::FromArgs <int>));\n+static_assert (!is_default_constructible_type (^^int &));\n+static_assert (!is_default_constructible_type (^^int &&));\n+static_assert (!is_default_constructible_type (^^void ()));\n+static_assert (!is_default_constructible_type (^^void () const volatile));\n+static_assert (!is_default_constructible_type (^^void (&) ()));\n+static_assert (!is_default_constructible_type (^^int (&) [1]));\n+static_assert (!is_default_constructible_type (^^int (&) []));\n+static_assert (!is_default_constructible_type (^^int []));\n+static_assert (!is_default_constructible_type (^^const int []));\n+static_assert (!is_default_constructible_type (^^int [][1][2]));\n+static_assert (!is_default_constructible_type (^^const int [][1][2]));\n+static_assert (!is_default_constructible_type (^^N1::Any [1]));\n+static_assert (!is_default_constructible_type (^^const N1::Any [1]));\n+static_assert (!is_default_constructible_type (^^N1::FromArgs <int> [1]));\n+static_assert (!is_default_constructible_type (^^const N1::FromArgs <int> [1]));\n+static_assert (!is_default_constructible_type (^^N1::FromArgs <std::initializer_list <int>>));\n+static_assert (!is_default_constructible_type (^^const N1::FromArgs <std::initializer_list <int>>));\n+static_assert (!is_default_constructible_type (^^const N1::FromArgs <const std::initializer_list <int>>));\n+static_assert (!is_default_constructible_type (^^N1::DelDef));\n+static_assert (!is_default_constructible_type (^^const N1::DelDef));\n+static_assert (!is_default_constructible_type (^^N1::DelCopy));\n+static_assert (!is_default_constructible_type (^^const N1::DelCopy));\n+static_assert (!is_default_constructible_type (^^N1::DelDtor));\n+static_assert (!is_default_constructible_type (^^const N1::DelDtor));\n+static_assert (!is_default_constructible_type (^^int []));\n+static_assert (!is_default_constructible_type (^^N1::Empty []));\n+static_assert (!is_default_constructible_type (^^N1::B []));\n+static_assert (!is_default_constructible_type (^^N1::D []));\n+static_assert (!is_default_constructible_type (^^N1::U []));\n+static_assert (!is_default_constructible_type (^^N1::Ukn []));\n+static_assert (!is_default_constructible_type (^^N1::Ellipsis []));\n+static_assert (!is_default_constructible_type (^^N1::Any []));\n+static_assert (!is_default_constructible_type (^^N1::nAny []));\n+\n+static_assert (is_copy_constructible_type (^^int));\n+static_assert (is_copy_constructible_type (^^float));\n+static_assert (is_copy_constructible_type (^^EnumType));\n+static_assert (is_copy_constructible_type (^^int *));\n+static_assert (is_copy_constructible_type (^^int (*) (int)));\n+static_assert (is_copy_constructible_type (^^int (ClassType::*)));\n+static_assert (is_copy_constructible_type (^^int (ClassType::*) (int)));\n+static_assert (is_copy_constructible_type (^^NoexceptCopyConsClass));\n+static_assert (is_copy_constructible_type (^^const NoexceptCopyConsClass));\n+static_assert (is_copy_constructible_type (^^ThrowCopyConsClass));\n+static_assert (is_copy_constructible_type (^^ExceptCopyConsClass));\n+static_assert (!is_copy_constructible_type (^^void));\n+static_assert (!is_copy_constructible_type (^^int [2]));\n+static_assert (!is_copy_constructible_type (^^int []));\n+static_assert (!is_copy_constructible_type (^^float [][3]));\n+static_assert (!is_copy_constructible_type (^^EnumType [2][3][4]));\n+static_assert (!is_copy_constructible_type (^^int * [3]));\n+static_assert (!is_copy_constructible_type (^^int (* [][2]) (int)));\n+static_assert (!is_copy_constructible_type (^^int (ClassType::* [2][3])));\n+static_assert (!is_copy_constructible_type (^^int (ClassType::* [][2][3]) (int)));\n+static_assert (!is_copy_constructible_type (^^ClassType (unsigned) const &));\n+static_assert (!is_copy_constructible_type (^^bool (ClassType) const));\n+static_assert (!is_copy_constructible_type (^^bool (...) &&));\n+static_assert (!is_copy_constructible_type (^^EnumType (int, ...)));\n+static_assert (!is_copy_constructible_type (^^volatile NoexceptCopyConsClass));\n+\n+static_assert (is_move_constructible_type (^^int));\n+static_assert (is_move_constructible_type (^^float));\n+static_assert (is_move_constructible_type (^^EnumType));\n+static_assert (is_move_constructible_type (^^int *));\n+static_assert (is_move_constructible_type (^^int (*) (int)));\n+static_assert (is_move_constructible_type (^^int (ClassType::*)));\n+static_assert (is_move_constructible_type (^^int (ClassType::*) (int)));\n+static_assert (is_move_constructible_type (^^NoexceptMoveConsClass));\n+static_assert (is_move_constructible_type (^^ThrowMoveConsClass));\n+static_assert (is_move_constructible_type (^^ExceptMoveConsClass));\n+static_assert (!is_move_constructible_type (^^void));\n+static_assert (!is_move_constructible_type (^^int [2]));\n+static_assert (!is_move_constructible_type (^^int []));\n+static_assert (!is_move_constructible_type (^^float [][3]));\n+static_assert (!is_move_constructible_type (^^EnumType [2][3][4]));\n+static_assert (!is_move_constructible_type (^^int * [3]));\n+static_assert (!is_move_constructible_type (^^int (* [][2]) (int)));\n+static_assert (!is_move_constructible_type (^^int (ClassType::* [2][3])));\n+static_assert (!is_move_constructible_type (^^int (ClassType::* [][2][3]) (int)));\n+static_assert (!is_move_constructible_type (^^ClassType (unsigned) const &));\n+static_assert (!is_move_constructible_type (^^bool (ClassType) const));\n+static_assert (!is_move_constructible_type (^^bool (...) &&));\n+static_assert (!is_move_constructible_type (^^EnumType (int, ...)));\n+static_assert (!is_move_constructible_type (^^const NoexceptMoveConsClass));\n+static_assert (!is_move_constructible_type (^^volatile NoexceptMoveConsClass));\n+\n+static_assert (is_assignable_type (^^int &, ^^int));\n+static_assert (is_assignable_type (^^int &, ^^const int));\n+static_assert (is_assignable_type (^^int &, ^^int &));\n+static_assert (is_assignable_type (^^int &, ^^const int &));\n+static_assert (!is_assignable_type (^^int, ^^int));\n+static_assert (!is_assignable_type (^^int, ^^const int));\n+static_assert (!is_assignable_type (^^int, ^^int &));\n+static_assert (!is_assignable_type (^^int, ^^const int &));\n+static_assert (!is_assignable_type (^^const int, ^^int));\n+static_assert (!is_assignable_type (^^const int, ^^const int));\n+static_assert (!is_assignable_type (^^const int, ^^int &));\n+static_assert (!is_assignable_type (^^const int, ^^const int &));\n+static_assert (!is_assignable_type (^^const int &, ^^int));\n+static_assert (!is_assignable_type (^^const int &, ^^const int));\n+static_assert (!is_assignable_type (^^const int &, ^^int &));\n+static_assert (!is_assignable_type (^^const int &, ^^const int &));\n+static_assert (is_assignable_type (^^N3::Empty &, ^^N3::Empty));\n+static_assert (is_assignable_type (^^N3::Empty &, ^^const N3::Empty));\n+static_assert (is_assignable_type (^^N3::Empty &, ^^N3::Empty &));\n+static_assert (is_assignable_type (^^N3::Empty &, ^^const N3::Empty &));\n+static_assert (is_assignable_type (^^N3::Empty, ^^N3::Empty));\n+static_assert (is_assignable_type (^^N3::Empty, ^^const N3::Empty));\n+static_assert (is_assignable_type (^^N3::Empty, ^^N3::Empty &));\n+static_assert (is_assignable_type (^^N3::Empty, ^^const N3::Empty &));\n+static_assert (is_assignable_type (^^N3::B &, ^^N3::B));\n+static_assert (is_assignable_type (^^N3::B &, ^^const N3::B));\n+static_assert (is_assignable_type (^^N3::B &, ^^N3::B &));\n+static_assert (is_assignable_type (^^N3::B &, ^^const N3::B &));\n+static_assert (is_assignable_type (^^N3::B, ^^N3::B));\n+static_assert (is_assignable_type (^^N3::B, ^^const N3::B));\n+static_assert (is_assignable_type (^^N3::B, ^^N3::B &));\n+static_assert (is_assignable_type (^^N3::B, ^^const N3::B &));\n+static_assert (is_assignable_type (^^bool &, ^^bool));\n+static_assert (is_assignable_type (^^bool &, ^^const bool));\n+static_assert (is_assignable_type (^^bool &, ^^bool &));\n+static_assert (is_assignable_type (^^bool &, ^^const bool &));\n+static_assert (!is_assignable_type (^^bool, ^^bool));\n+static_assert (!is_assignable_type (^^bool, ^^const bool));\n+static_assert (!is_assignable_type (^^bool, ^^bool &));\n+static_assert (!is_assignable_type (^^bool, ^^const bool &));\n+static_assert (is_assignable_type (^^std::nullptr_t &, ^^std::nullptr_t));\n+static_assert (is_assignable_type (^^std::nullptr_t &, ^^const std::nullptr_t));\n+static_assert (is_assignable_type (^^std::nullptr_t &, ^^std::nullptr_t &));\n+static_assert (is_assignable_type (^^std::nullptr_t &, ^^const std::nullptr_t &));\n+static_assert (!is_assignable_type (^^std::nullptr_t, ^^std::nullptr_t));\n+static_assert (!is_assignable_type (^^std::nullptr_t, ^^const std::nullptr_t));\n+static_assert (!is_assignable_type (^^std::nullptr_t, ^^std::nullptr_t &));\n+static_assert (!is_assignable_type (^^std::nullptr_t, ^^const std::nullptr_t &));\n+static_assert (is_assignable_type (^^N3::E &, ^^N3::E));\n+static_assert (is_assignable_type (^^N3::E &, ^^const N3::E));\n+static_assert (is_assignable_type (^^N3::E &, ^^N3::E &));\n+static_assert (is_assignable_type (^^N3::E &, ^^const N3::E &));\n+static_assert (is_assignable_type (^^int &, ^^N3::E));\n+static_assert (is_assignable_type (^^int &, ^^const N3::E));\n+static_assert (is_assignable_type (^^int &, ^^N3::E &));\n+static_assert (is_assignable_type (^^int &, ^^const N3::E &));\n+static_assert (!is_assignable_type (^^N3::E &, ^^int));\n+static_assert (!is_assignable_type (^^N3::E &, ^^const int));\n+static_assert (!is_assignable_type (^^N3::E &, ^^int &));\n+static_assert (!is_assignable_type (^^N3::E &, ^^const int &));\n+static_assert (!is_assignable_type (^^N3::E &, ^^N3::E2));\n+static_assert (!is_assignable_type (^^N3::E &, ^^const N3::E2));\n+static_assert (!is_assignable_type (^^N3::E &, ^^N3::E2 &));\n+static_assert (!is_assignable_type (^^N3::E &, ^^const N3::E2 &));\n+static_assert (!is_assignable_type (^^N3::E, ^^N3::E));\n+static_assert (!is_assignable_type (^^N3::E, ^^const N3::E));\n+static_assert (!is_assignable_type (^^N3::E, ^^N3::E &));\n+static_assert (!is_assignable_type (^^N3::E, ^^const N3::E &));\n+static_assert (is_assignable_type (^^N3::SE &, ^^N3::SE));\n+static_assert (is_assignable_type (^^N3::SE &, ^^const N3::SE));\n+static_assert (is_assignable_type (^^N3::SE &, ^^N3::SE &));\n+static_assert (is_assignable_type (^^N3::SE &, ^^const N3::SE &));\n+static_assert (!is_assignable_type (^^int &, ^^N3::SE));\n+static_assert (!is_assignable_type (^^int &, ^^const N3::SE));\n+static_assert (!is_assignable_type (^^int &, ^^N3::SE &));\n+static_assert (!is_assignable_type (^^int &, ^^const N3::SE &));\n+static_assert (!is_assignable_type (^^N3::SE &, ^^int));\n+static_assert (!is_assignable_type (^^N3::SE &, ^^const int));\n+static_assert (!is_assignable_type (^^N3::SE &, ^^int &));\n+static_assert (!is_assignable_type (^^N3::SE &, ^^const int &));\n+static_assert (!is_assignable_type (^^N3::SE, ^^N3::SE));\n+static_assert (!is_assignable_type (^^N3::SE, ^^const N3::SE));\n+static_assert (!is_assignable_type (^^N3::SE, ^^N3::SE &));\n+static_assert (!is_assignable_type (^^N3::SE, ^^const N3::SE &));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^int));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^std::nullptr_t));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::E));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::SE));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::Empty));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::U));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^int &));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^std::nullptr_t &));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::E &));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::SE &));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::Empty &));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::U &));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::AnyAssign));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^std::initializer_list <int>));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^int [1]));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^std::nullptr_t [1]));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::E [1]));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::SE [1]));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^int (&) [1]));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^std::nullptr_t (&) [1]));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::E (&) [1]));\n+static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::SE (&) [1]));\n+static_assert (is_assignable_type (^^int &, ^^N3::E));\n+static_assert (!is_assignable_type (^^int &, ^^N3::SE));\n+static_assert (is_assignable_type (^^bool &, ^^N3::E));\n+static_assert (!is_assignable_type (^^bool &, ^^N3::SE));\n+static_assert (is_assignable_type (^^bool &, ^^void *));\n+static_assert (is_assignable_type (^^bool &, ^^int N3::B::*));\n+static_assert (is_assignable_type (^^bool &, ^^void *));\n+static_assert (!is_assignable_type (^^bool &, ^^std::nullptr_t));\n+static_assert (is_assignable_type (^^std::nullptr_t &, ^^std::nullptr_t));\n+static_assert (is_assignable_type (^^void *&, ^^std::nullptr_t));\n+static_assert (is_assignable_type (^^int *&, ^^std::nullptr_t));\n+static_assert (is_assignable_type (^^int N3::B::*&, ^^std::nullptr_t));\n+static_assert (!is_assignable_type (^^std::nullptr_t &, ^^bool));\n+static_assert (!is_assignable_type (^^void *&, ^^bool));\n+static_assert (!is_assignable_type (^^N3::E &, ^^bool));\n+static_assert (!is_assignable_type (^^N3::SE &, ^^bool));\n+static_assert (is_assignable_type (^^std::initializer_list <int> &, ^^std::initializer_list <int>));\n+static_assert (is_assignable_type (^^std::initializer_list <int> &, ^^std::initializer_list <int> &&));\n+static_assert (is_assignable_type (^^std::initializer_list <int> &, ^^const std::initializer_list <int> &&));\n+static_assert (is_assignable_type (^^std::initializer_list <int> &, ^^std::initializer_list <int> &));\n+static_assert (is_assignable_type (^^std::initializer_list <int> &, ^^const std::initializer_list <int> &));\n+static_assert (!is_assignable_type (^^const std::initializer_list <int> &, ^^std::initializer_list <int>));\n+static_assert (!is_assignable_type (^^const N3::AnyAssign &, ^^int));\n+static_assert (!is_assignable_type (^^N3::AnyAssign &, ^^void));\n+static_assert (!is_assignable_type (^^void, ^^int));\n+static_assert (!is_assignable_type (^^const void, ^^int));\n+static_assert (!is_assignable_type (^^int, ^^void));\n+static_assert (!is_assignable_type (^^int, ^^const void));\n+static_assert (!is_assignable_type (^^const int, ^^void));\n+static_assert (!is_assignable_type (^^const int, ^^const void));\n+static_assert (!is_assignable_type (^^int &, ^^void));\n+static_assert (!is_assignable_type (^^int &, ^^const void));\n+static_assert (!is_assignable_type (^^const int &, ^^void));\n+static_assert (!is_assignable_type (^^const int &, ^^const void));\n+static_assert (!is_assignable_type (^^void, ^^void));\n+static_assert (!is_assignable_type (^^const void, ^^void));\n+static_assert (!is_assignable_type (^^const void, ^^const void));\n+static_assert (!is_assignable_type (^^int [1], ^^int [1]));\n+static_assert (!is_assignable_type (^^int (&) [1], ^^int [1]));\n+static_assert (!is_assignable_type (^^int (&) [1], ^^int (&) [1]));\n+static_assert (!is_assignable_type (^^int [2], ^^int [1]));\n+static_assert (!is_assignable_type (^^int (&) [2], ^^int [1]));\n+static_assert (!is_assignable_type (^^int (&) [2], ^^int (&) [1]));\n+static_assert (!is_assignable_type (^^int [1], ^^void));\n+static_assert (!is_assignable_type (^^int (&) [1], ^^void));\n+static_assert (!is_assignable_type (^^void, ^^int [1]));\n+static_assert (!is_assignable_type (^^void, ^^int (&) [1]));\n+static_assert (!is_assignable_type (^^int [], ^^int []));\n+static_assert (!is_assignable_type (^^int (&) [], ^^int []));\n+static_assert (!is_assignable_type (^^int (&) [], ^^int (&) []));\n+static_assert (!is_assignable_type (^^int [1], ^^int []));\n+static_assert (!is_assignable_type (^^int (&) [1], ^^int []));\n+static_assert (!is_assignable_type (^^int (&) [1], ^^int (&) []));\n+static_assert (!is_assignable_type (^^int [], ^^int [1]));\n+static_assert (!is_assignable_type (^^int (&) [], ^^int [1]));\n+static_assert (!is_assignable_type (^^int (&) [], ^^int (&) [1]));\n+static_assert (!is_assignable_type (^^int [], ^^void));\n+static_assert (!is_assignable_type (^^int (&) [], ^^void));\n+static_assert (!is_assignable_type (^^void, ^^int []));\n+static_assert (!is_assignable_type (^^void, ^^int (&) []));\n+static_assert (is_assignable_type (^^N3::DelCopyAssign &, ^^N3::DelCopyAssign));\n+static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^const N3::DelCopyAssign));\n+static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^N3::DelCopyAssign &));\n+static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^const N3::DelCopyAssign &));\n+static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^void));\n+static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^void ()));\n+static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^void (&) ()));\n+static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^int));\n+static_assert (is_assignable_type (^^N3::DelAnyAssign &, ^^N3::DelAnyAssign &&));\n+static_assert (is_assignable_type (^^N3::DelAnyAssign &, ^^const N3::DelAnyAssign &));\n+static_assert (is_assignable_type (^^N3::DelAnyAssign, ^^N3::DelAnyAssign &&));\n+static_assert (is_assignable_type (^^N3::DelAnyAssign, ^^const N3::DelAnyAssign &));\n+static_assert (!is_assignable_type (^^const N3::DelAnyAssign &, ^^N3::DelAnyAssign &&));\n+static_assert (!is_assignable_type (^^const N3::DelAnyAssign &, ^^const N3::DelAnyAssign &));\n+static_assert (!is_assignable_type (^^const N3::DelAnyAssign, ^^N3::DelAnyAssign &&));\n+static_assert (!is_assignable_type (^^const N3::DelAnyAssign, ^^const N3::DelAnyAssign &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^const int &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void ()));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void () const));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void (&) ()));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void (&&) ()));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^std::nullptr_t));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^std::nullptr_t &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^std::initializer_list <int>));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^std::initializer_list <int> &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^bool));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^bool &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::E));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::E &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::SE));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::SE &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::Empty));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::Empty &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::B));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::B &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::U));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::U &));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void *));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int *));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::B *));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::D *));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int N3::B::*));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int N3::D::*));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int []));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int [1]));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int (&) []));\n+static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int (&) [1]));\n+static_assert (!is_assignable_type (^^void (), ^^void));\n+static_assert (!is_assignable_type (^^void, ^^void ()));\n+static_assert (!is_assignable_type (^^void (), ^^void ()));\n+static_assert (!is_assignable_type (^^void (&) (), ^^void));\n+static_assert (!is_assignable_type (^^void, ^^void (&) ()));\n+static_assert (!is_assignable_type (^^void (&) (), ^^void (&) ()));\n+static_assert (!is_assignable_type (^^void (&) (), ^^void ()));\n+static_assert (!is_assignable_type (^^void (), ^^void (&) ()));\n+static_assert (is_assignable_type (^^int &, ^^N3::ImplicitTo <int>));\n+static_assert (!is_assignable_type (^^int &, ^^N3::ExplicitTo <int>));\n+static_assert (!is_assignable_type (^^int, ^^N3::ImplicitTo <int>));\n+static_assert (!is_assignable_type (^^int, ^^N3::ExplicitTo <int>));\n+static_assert (!is_assignable_type (^^const int, ^^N3::ImplicitTo <int>));\n+static_assert (!is_assignable_type (^^const int, ^^N3::ExplicitTo <int>));\n+static_assert (!is_assignable_type (^^const int &, ^^N3::ImplicitTo <int>));\n+static_assert (!is_assignable_type (^^const int &, ^^N3::ExplicitTo <int>));\n+static_assert (is_assignable_type (^^N3::DelImplicitTo <int> &, ^^N3::DelImplicitTo <int>));\n+static_assert (is_assignable_type (^^N3::DelImplicitTo <int>, ^^N3::DelImplicitTo <int>));\n+static_assert (!is_assignable_type (^^int &, ^^N3::DelImplicitTo <int>));\n+static_assert (!is_assignable_type (^^int, ^^N3::DelImplicitTo <int>));\n+static_assert (!is_assignable_type (^^const int &, ^^N3::DelImplicitTo <int>));\n+static_assert (!is_assignable_type (^^const int, ^^N3::DelImplicitTo <int>));\n+static_assert (!is_assignable_type (^^int &, ^^N3::DelExplicitTo <int>));\n+static_assert (!is_assignable_type (^^int, ^^N3::DelExplicitTo <int>));\n+static_assert (!is_assignable_type (^^const int &, ^^N3::DelExplicitTo <int>));\n+static_assert (!is_assignable_type (^^const int, ^^N3::DelExplicitTo <int>));\n+static_assert (is_assignable_type (^^N3::B &, ^^N3::B));\n+static_assert (is_assignable_type (^^N3::B &, ^^N3::D));\n+static_assert (is_assignable_type (^^N3::B &, ^^N3::B &));\n+static_assert (is_assignable_type (^^N3::B &, ^^N3::D &));\n+static_assert (!is_assignable_type (^^const N3::B &, ^^N3::B &));\n+static_assert (!is_assignable_type (^^const N3::B &, ^^N3::D &));\n+static_assert (!is_assignable_type (^^N3::D &, ^^N3::B));\n+static_assert (!is_assignable_type (^^N3::D &, ^^N3::B &));\n+static_assert (is_assignable_type (^^N3::B *&, ^^N3::B *));\n+static_assert (is_assignable_type (^^N3::B *&, ^^N3::D *));\n+static_assert (is_assignable_type (^^const N3::B *&, ^^N3::D *));\n+static_assert (is_assignable_type (^^const N3::B *&, ^^const N3::D *));\n+static_assert (is_assignable_type (^^N3::B *&, ^^N3::B *&));\n+static_assert (is_assignable_type (^^N3::B *&, ^^N3::D *&));\n+static_assert (is_assignable_type (^^const N3::B *&, ^^N3::B *&));\n+static_assert (is_assignable_type (^^const N3::B *&, ^^N3::D *&));\n+static_assert (!is_assignable_type (^^N3::B * const &, ^^N3::B *&));\n+static_assert (!is_assignable_type (^^N3::B * const &, ^^N3::D *&));\n+static_assert (!is_assignable_type (^^N3::D *&, ^^N3::B *));\n+static_assert (!is_assignable_type (^^N3::D *&, ^^N3::B *&));\n+static_assert (is_assignable_type (^^N3::MO &, ^^N3::MO));\n+static_assert (is_assignable_type (^^N3::MO &, ^^N3::MO &&));\n+static_assert (is_assignable_type (^^N3::MO, ^^N3::MO));\n+static_assert (is_assignable_type (^^N3::MO, ^^N3::MO &&));\n+static_assert (!is_assignable_type (^^const N3::MO &, ^^N3::MO));\n+static_assert (!is_assignable_type (^^const N3::MO &, ^^N3::MO &&));\n+static_assert (!is_assignable_type (^^N3::MO &, ^^const N3::MO &&));\n+static_assert (!is_assignable_type (^^N3::MO &, ^^N3::MO &));\n+static_assert (!is_assignable_type (^^N3::MO &, ^^const N3::MO &));\n+static_assert (!is_assignable_type (^^const N3::MO, ^^N3::MO));\n+static_assert (!is_assignable_type (^^const N3::MO, ^^N3::MO &&));\n+static_assert (!is_assignable_type (^^N3::MO, ^^const N3::MO &&));\n+static_assert (!is_assignable_type (^^N3::MO, ^^N3::MO &));\n+static_assert (!is_assignable_type (^^N3::MO, ^^const N3::MO &));\n+static_assert (!is_assignable_type (^^N3::NontrivialUnion &, ^^N3::NontrivialUnion));\n+static_assert (!is_assignable_type (^^N3::NontrivialUnion &, ^^N3::NontrivialUnion &&));\n+static_assert (!is_assignable_type (^^N3::NontrivialUnion &, ^^N3::NontrivialUnion &));\n+static_assert (!is_assignable_type (^^N3::NontrivialUnion &, ^^const N3::NontrivialUnion &));\n+static_assert (!is_assignable_type (^^N3::NontrivialUnion &, ^^const N3::NontrivialUnion &&));\n+static_assert (is_assignable_type (^^N3::Abstract &, ^^N3::Abstract));\n+static_assert (is_assignable_type (^^N3::Abstract &, ^^N3::Abstract &&));\n+static_assert (is_assignable_type (^^N3::Abstract &, ^^N3::Abstract &));\n+static_assert (is_assignable_type (^^N3::Abstract &, ^^const N3::Abstract &));\n+static_assert (is_assignable_type (^^N3::Abstract &, ^^const N3::Abstract &&));\n+static_assert (is_assignable_type (^^N3::Abstract &&, ^^N3::Abstract));\n+static_assert (is_assignable_type (^^N3::Abstract &&, ^^N3::Abstract &&));\n+static_assert (is_assignable_type (^^N3::Abstract &&, ^^N3::Abstract &));\n+static_assert (is_assignable_type (^^N3::Abstract &&, ^^const N3::Abstract &));\n+static_assert (is_assignable_type (^^N3::Abstract &&, ^^const N3::Abstract &&));\n+static_assert (is_assignable_type (^^N3::AbstractDelDtor &, ^^N3::AbstractDelDtor));\n+static_assert (is_assignable_type (^^N3::AbstractDelDtor &, ^^N3::AbstractDelDtor &&));\n+static_assert (is_assignable_type (^^N3::AbstractDelDtor &, ^^N3::AbstractDelDtor &));\n+static_assert (is_assignable_type (^^N3::AbstractDelDtor &, ^^const N3::AbstractDelDtor &));\n+static_assert (is_assignable_type (^^N3::AbstractDelDtor &, ^^const N3::AbstractDelDtor &&));\n+static_assert (is_assignable_type (^^N3::AbstractDelDtor &&, ^^N3::AbstractDelDtor));\n+static_assert (is_assignable_type (^^N3::AbstractDelDtor &&, ^^N3::AbstractDelDtor &&));\n+static_assert (is_assignable_type (^^N3::AbstractDelDtor &&, ^^N3::AbstractDelDtor &));\n+static_assert (is_assignable_type (^^N3::AbstractDelDtor &&, ^^const N3::AbstractDelDtor &));\n+static_assert (is_assignable_type (^^N3::AbstractDelDtor &&, ^^const N3::AbstractDelDtor &&));\n+static_assert (is_assignable_type (^^N3::DelDef &, ^^N3::DelDef));\n+static_assert (is_assignable_type (^^N3::DelDef &, ^^N3::DelDef &&));\n+static_assert (is_assignable_type (^^N3::DelDef &, ^^N3::DelDef &));\n+static_assert (is_assignable_type (^^N3::DelDef &, ^^const N3::DelDef &));\n+static_assert (is_assignable_type (^^N3::DelDef &, ^^const N3::DelDef &&));\n+static_assert (is_assignable_type (^^N3::DelDef &&, ^^N3::DelDef));\n+static_assert (is_assignable_type (^^N3::DelDef &&, ^^N3::DelDef &&));\n+static_assert (is_assignable_type (^^N3::DelDef &&, ^^N3::DelDef &));\n+static_assert (is_assignable_type (^^N3::DelDef &&, ^^const N3::DelDef &));\n+static_assert (is_assignable_type (^^N3::DelDef &&, ^^const N3::DelDef &&));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::Ellipsis));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::Ellipsis));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::Ellipsis &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::Ellipsis &));\n+static_assert (is_assignable_type (^^N3::Ellipsis, ^^N3::Ellipsis));\n+static_assert (is_assignable_type (^^N3::Ellipsis, ^^const N3::Ellipsis));\n+static_assert (is_assignable_type (^^N3::Ellipsis, ^^N3::Ellipsis &));\n+static_assert (is_assignable_type (^^N3::Ellipsis, ^^const N3::Ellipsis &));\n+static_assert (!is_assignable_type (^^N3::Ellipsis &, ^^void));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^int));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const int));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^int &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const int &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::Empty));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::Empty));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::Empty &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::Empty &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::E));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::E));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::E &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::E &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::SE));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::SE));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::SE &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::SE &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^bool));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const bool));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^bool &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const bool &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^std::nullptr_t));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const std::nullptr_t));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^std::nullptr_t &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const std::nullptr_t &));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^void *));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const void *));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^void *&));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const void *&));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^void ()));\n+static_assert (is_assignable_type (^^N3::Ellipsis &, ^^void (&) ()));\n+static_assert (is_assignable_type (^^N3::DelEllipsis &, ^^N3::DelEllipsis));\n+static_assert (is_assignable_type (^^N3::DelEllipsis &, ^^const N3::DelEllipsis));\n+static_assert (is_assignable_type (^^N3::DelEllipsis &, ^^N3::DelEllipsis &));\n+static_assert (is_assignable_type (^^N3::DelEllipsis &, ^^const N3::DelEllipsis &));\n+static_assert (is_assignable_type (^^N3::DelEllipsis, ^^N3::DelEllipsis));\n+static_assert (is_assignable_type (^^N3::DelEllipsis, ^^const N3::DelEllipsis));\n+static_assert (is_assignable_type (^^N3::DelEllipsis, ^^N3::DelEllipsis &));\n+static_assert (is_assignable_type (^^N3::DelEllipsis, ^^const N3::DelEllipsis &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^void));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^int));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const int));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^int &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const int &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::Empty));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::Empty));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::Empty &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::Empty &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::E));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::E));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::E &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::E &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::SE));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::SE));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::SE &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::SE &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^bool));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const bool));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^bool &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const bool &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^std::nullptr_t));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const std::nullptr_t));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^std::nullptr_t &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const std::nullptr_t &));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^void *));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const void *));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^void *&));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const void *&));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^void ()));\n+static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^void (&) ()));\n+static_assert (is_assignable_type (^^N3::FromArgs <int> &, ^^int));\n+static_assert (is_assignable_type (^^N3::FromArgs <int> &, ^^const int));\n+static_assert (!is_assignable_type (^^N3::FromArgs <int> &, ^^N3::ImplicitTo <int>));\n+static_assert (!is_assignable_type (^^N3::FromArgs <int> &, ^^N3::ImplicitTo <const int>));\n+static_assert (!is_assignable_type (^^N3::FromArgs <int> &, ^^N3::ExplicitTo <int>));\n+static_assert (!is_assignable_type (^^N3::FromArgs <int> &, ^^N3::ExplicitTo <const int>));\n+static_assert (!is_assignable_type (^^N3::DelFromArgs <int> &, ^^int));\n+static_assert (!is_assignable_type (^^N3::DelFromArgs <int> &, ^^const int));\n+static_assert (is_assignable_type (^^void (*&) (), ^^N3::ImplicitTo <void (*) ()>));\n+static_assert (!is_assignable_type (^^void (*&) (), ^^N3::ExplicitTo <void (*) ()>));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::UAssignAll));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const N3::UAssignAll));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::UAssignAll &));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const N3::UAssignAll &));\n+static_assert (is_assignable_type (^^N3::UAssignAll, ^^N3::UAssignAll));\n+static_assert (is_assignable_type (^^N3::UAssignAll, ^^const N3::UAssignAll));\n+static_assert (is_assignable_type (^^N3::UAssignAll, ^^N3::UAssignAll &));\n+static_assert (is_assignable_type (^^N3::UAssignAll, ^^const N3::UAssignAll &));\n+static_assert (!is_assignable_type (^^N3::UAssignAll &, ^^void));\n+static_assert (!is_assignable_type (^^const N3::UAssignAll &, ^^void));\n+static_assert (!is_assignable_type (^^const N3::UAssignAll &, ^^N3::UAssignAll));\n+static_assert (!is_assignable_type (^^const N3::UAssignAll &, ^^const N3::UAssignAll));\n+static_assert (!is_assignable_type (^^const N3::UAssignAll &, ^^N3::UAssignAll &));\n+static_assert (!is_assignable_type (^^const N3::UAssignAll &, ^^const N3::UAssignAll &));\n+static_assert (!is_assignable_type (^^N3::UAssignAll &, ^^void () const));\n+static_assert (!is_assignable_type (^^N3::UAssignAll &, ^^void () &));\n+static_assert (!is_assignable_type (^^N3::UAssignAll &, ^^void () const volatile &&));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int &));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::E));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::E &));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::SE));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::SE &));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^double));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^double &));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::Empty));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::Empty &));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::B));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::B &));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::U));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::U &));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^std::nullptr_t));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^std::nullptr_t &));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void ()));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void (&) ()));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void (*) ()));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void (*&) ()));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int *));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int *&));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void *));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void *&));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const int *));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const int *&));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const void *));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const void *&));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int [1]));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int (&) [1]));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int []));\n+static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int (&) []));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int &));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::E));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::E &));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::SE));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::SE &));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^double));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^double &));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::Empty));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::Empty &));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::B));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::B &));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::U));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::U &));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^std::nullptr_t));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^std::nullptr_t &));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void ()));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void (&) ()));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void () const));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void (*) ()));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void (*&) ()));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int *));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int *&));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void *));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void *&));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^const int *));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^const int *&));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^const void *));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^const void *&));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int [1]));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int (&) [1]));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int []));\n+static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int (&) []));\n+static_assert (!is_assignable_type (^^void (&) (), ^^std::nullptr_t));\n+static_assert (!is_assignable_type (^^std::nullptr_t, ^^void (&) ()));\n+static_assert (!is_assignable_type (^^void (&) (), ^^int []));\n+static_assert (!is_assignable_type (^^int [], ^^void (&) ()));\n+static_assert (!is_assignable_type (^^int [], ^^std::nullptr_t));\n+static_assert (!is_assignable_type (^^std::nullptr_t, ^^int []));\n+static_assert (!is_assignable_type (^^int [1], ^^std::nullptr_t));\n+static_assert (!is_assignable_type (^^std::nullptr_t, ^^int [1]));\n+static_assert (!is_assignable_type (^^void, ^^std::nullptr_t));\n+static_assert (!is_assignable_type (^^std::nullptr_t, ^^void));\n+static_assert (!is_assignable_type (^^const N3::D &, ^^N3::B &));\n+static_assert (!is_assignable_type (^^const N3::B &, ^^N3::B &));\n+static_assert (is_assignable_type (^^N3::B &, ^^const N3::D &));\n+static_assert (is_assignable_type (^^N3::B &, ^^const N3::B &));\n+static_assert (is_assignable_type (^^int &, ^^const int &));\n+static_assert (is_assignable_type (^^int &, ^^const double &));\n+\n+static_assert (is_copy_assignable_type (^^int));\n+static_assert (is_copy_assignable_type (^^float));\n+static_assert (is_copy_assignable_type (^^EnumType));\n+static_assert (is_copy_assignable_type (^^int *));\n+static_assert (is_copy_assignable_type (^^int (*) (int)));\n+static_assert (is_copy_assignable_type (^^int (ClassType::*)));\n+static_assert (is_copy_assignable_type (^^int (ClassType::*) (int)));\n+static_assert (is_copy_assignable_type (^^NoexceptCopyAssignClass));\n+static_assert (is_copy_assignable_type (^^ExceptCopyAssignClass));\n+static_assert (!is_copy_assignable_type (^^void));\n+static_assert (!is_copy_assignable_type (^^int [2]));\n+static_assert (!is_copy_assignable_type (^^float [][3]));\n+static_assert (!is_copy_assignable_type (^^EnumType [2][3][4]));\n+static_assert (!is_copy_assignable_type (^^int * [3]));\n+static_assert (!is_copy_assignable_type (^^int (* [][2]) (int)));\n+static_assert (!is_copy_assignable_type (^^int (ClassType::* [2][3])));\n+static_assert (!is_copy_assignable_type (^^int (ClassType::* [][2][3]) (int)));\n+static_assert (!is_copy_assignable_type (^^ClassType (unsigned) const &));\n+static_assert (!is_copy_assignable_type (^^bool (ClassType) const));\n+static_assert (!is_copy_assignable_type (^^bool (...) &&));\n+static_assert (!is_copy_assignable_type (^^EnumType (int, ...)));\n+static_assert (!is_copy_assignable_type (^^NoexceptMoveAssignClass));\n+static_assert (!is_copy_assignable_type (^^ExceptMoveAssignClass));\n+static_assert (!is_copy_assignable_type (^^DeletedCopyAssignClass));\n+static_assert (!is_copy_assignable_type (^^DeletedMoveAssignClass));\n+\n+static_assert (is_move_assignable_type (^^int));\n+static_assert (is_move_assignable_type (^^float));\n+static_assert (is_move_assignable_type (^^EnumType));\n+static_assert (is_move_assignable_type (^^int *));\n+static_assert (is_move_assignable_type (^^int (*) (int)));\n+static_assert (is_move_assignable_type (^^int (ClassType::*)));\n+static_assert (is_move_assignable_type (^^int (ClassType::*) (int)));\n+static_assert (is_move_assignable_type (^^NoexceptMoveAssignClass));\n+static_assert (is_move_assignable_type (^^ExceptMoveAssignClass));\n+static_assert (is_move_assignable_type (^^NoexceptCopyAssignClass));\n+static_assert (is_move_assignable_type (^^ExceptCopyAssignClass));\n+static_assert (!is_move_assignable_type (^^void));\n+static_assert (!is_move_assignable_type (^^int [2]));\n+static_assert (!is_move_assignable_type (^^float [][3]));\n+static_assert (!is_move_assignable_type (^^EnumType [2][3][4]));\n+static_assert (!is_move_assignable_type (^^int * [3]));\n+static_assert (!is_move_assignable_type (^^int (* [][2]) (int)));\n+static_assert (!is_move_assignable_type (^^int (ClassType::* [2][3])));\n+static_assert (!is_move_assignable_type (^^int (ClassType::* [][2][3]) (int)));\n+static_assert (!is_move_assignable_type (^^ClassType (unsigned) const &));\n+static_assert (!is_move_assignable_type (^^bool (ClassType) const));\n+static_assert (!is_move_assignable_type (^^bool (...) &&));\n+static_assert (!is_move_assignable_type (^^EnumType (int, ...)));\n+static_assert (!is_move_assignable_type (^^DeletedCopyAssignClass));\n+static_assert (!is_move_assignable_type (^^DeletedMoveAssignClass));\n+\n+static_assert (is_destructible_type (^^int));\n+static_assert (is_destructible_type (^^const int));\n+static_assert (is_destructible_type (^^bool));\n+static_assert (is_destructible_type (^^const bool));\n+static_assert (is_destructible_type (^^int *));\n+static_assert (is_destructible_type (^^void *));\n+static_assert (is_destructible_type (^^int N2::Der::*));\n+static_assert (is_destructible_type (^^const int N2::Der::*));\n+static_assert (is_destructible_type (^^void (N2::Der::*) () const));\n+static_assert (is_destructible_type (^^void (*) ()));\n+static_assert (is_destructible_type (^^N2::En));\n+static_assert (is_destructible_type (^^const N2::En));\n+static_assert (is_destructible_type (^^N2::En2));\n+static_assert (is_destructible_type (^^const N2::En2));\n+static_assert (is_destructible_type (^^N2::OpE));\n+static_assert (is_destructible_type (^^const N2::OpE));\n+static_assert (is_destructible_type (^^N2::OpSE));\n+static_assert (is_destructible_type (^^const N2::OpSE));\n+static_assert (is_destructible_type (^^std::nullptr_t));\n+static_assert (is_destructible_type (^^const std::nullptr_t));\n+static_assert (is_destructible_type (^^N2::Der));\n+static_assert (is_destructible_type (^^const N2::Der));\n+static_assert (is_destructible_type (^^N2::Aggr));\n+static_assert (is_destructible_type (^^const N2::Aggr));\n+static_assert (is_destructible_type (^^N2::E));\n+static_assert (is_destructible_type (^^const N2::E));\n+static_assert (is_destructible_type (^^N2::U1));\n+static_assert (is_destructible_type (^^const N2::U1));\n+static_assert (is_destructible_type (^^N2::Abstract1));\n+static_assert (is_destructible_type (^^const N2::Abstract1));\n+static_assert (is_destructible_type (^^int [1]));\n+static_assert (is_destructible_type (^^const int [1]));\n+static_assert (is_destructible_type (^^int [1][2]));\n+static_assert (is_destructible_type (^^const int [1][2]));\n+static_assert (is_destructible_type (^^int &));\n+static_assert (is_destructible_type (^^int &&));\n+static_assert (is_destructible_type (^^int (&) [1]));\n+static_assert (is_destructible_type (^^const int (&) [1]));\n+static_assert (is_destructible_type (^^void (&) ()));\n+static_assert (is_destructible_type (^^N2::Ellipsis));\n+static_assert (is_destructible_type (^^const N2::Ellipsis));\n+static_assert (is_destructible_type (^^N2::Abstract2));\n+static_assert (is_destructible_type (^^const N2::Abstract2));\n+static_assert (is_destructible_type (^^N2::Aggr2));\n+static_assert (is_destructible_type (^^const N2::Aggr2));\n+static_assert (is_destructible_type (^^N2::DelDef));\n+static_assert (is_destructible_type (^^const N2::DelDef));\n+static_assert (is_destructible_type (^^N2::DelCopy));\n+static_assert (is_destructible_type (^^const N2::DelCopy));\n+static_assert (is_destructible_type (^^N2::DelEllipsis));\n+static_assert (is_destructible_type (^^const N2::DelEllipsis));\n+static_assert (is_destructible_type (^^std::initializer_list <int>));\n+static_assert (is_destructible_type (^^const std::initializer_list <int>));\n+static_assert (is_destructible_type (^^std::initializer_list <N2::Del>));\n+static_assert (!is_destructible_type (^^void));\n+static_assert (!is_destructible_type (^^const void));\n+static_assert (!is_destructible_type (^^void ()));\n+static_assert (!is_destructible_type (^^void () const));\n+static_assert (!is_destructible_type (^^int []));\n+static_assert (!is_destructible_type (^^const int []));\n+static_assert (!is_destructible_type (^^N2::Del));\n+static_assert (!is_destructible_type (^^const N2::Del));\n+static_assert (!is_destructible_type (^^N2::AbstractDelDtor));\n+static_assert (!is_destructible_type (^^const N2::AbstractDelDtor));\n+static_assert (!is_destructible_type (^^int [][1]));\n+static_assert (!is_destructible_type (^^const int [][1]));\n+static_assert (!is_destructible_type (^^N2::Del [1]));\n+static_assert (!is_destructible_type (^^const N2::Del [1]));\n+static_assert (!is_destructible_type (^^N2::Del []));\n+static_assert (!is_destructible_type (^^const N2::Del []));\n+static_assert (!is_destructible_type (^^N2::NontrivialUnion));\n+static_assert (is_destructible_type (^^N2::UnusualCopy));\n+\n+static_assert (is_trivially_default_constructible_type (^^int));\n+static_assert (is_trivially_default_constructible_type (^^TType));\n+static_assert (is_trivially_default_constructible_type (^^PODType));\n+static_assert (!is_trivially_default_constructible_type (^^NType));\n+static_assert (!is_trivially_default_constructible_type (^^SLType));\n+static_assert (!is_trivially_default_constructible_type (^^N1::DelDef));\n+static_assert (!is_trivially_default_constructible_type (^^N1::Abstract));\n+static_assert (!is_trivially_default_constructible_type (^^N1::Ellipsis));\n+static_assert (!is_trivially_default_constructible_type (^^N1::DelEllipsis));\n+static_assert (!is_trivially_default_constructible_type (^^N1::Any));\n+static_assert (!is_trivially_default_constructible_type (^^N1::DelCopy));\n+static_assert (!is_trivially_default_constructible_type (^^N1::DelDtor));\n+static_assert (!is_trivially_default_constructible_type (^^N1::Nontrivial));\n+static_assert (is_trivially_default_constructible_type (^^HasTemplateCtor));\n+\n+static_assert (!is_trivially_default_constructible_type (^^int []));\n+struct A { };\n+static_assert (!is_trivially_default_constructible_type (^^A []));\n+struct B { B () { } };\n+static_assert (!is_trivially_default_constructible_type (^^B []));\n+\n+static_assert (is_trivially_copy_constructible_type (^^int));\n+static_assert (is_trivially_copy_constructible_type (^^TType));\n+static_assert (is_trivially_copy_constructible_type (^^PODType));\n+static_assert (!is_trivially_copy_constructible_type (^^NType));\n+static_assert (!is_trivially_copy_constructible_type (^^SLType));\n+static_assert (is_trivially_copy_constructible_type (^^N1::DelDef));\n+static_assert (!is_trivially_copy_constructible_type (^^N1::Abstract));\n+static_assert (is_trivially_copy_constructible_type (^^N1::Ellipsis));\n+static_assert (is_trivially_copy_constructible_type (^^N1::DelEllipsis));\n+static_assert (is_trivially_copy_constructible_type (^^N1::Any));\n+static_assert (!is_trivially_copy_constructible_type (^^N1::DelCopy));\n+static_assert (!is_trivially_copy_constructible_type (^^N1::DelDtor));\n+static_assert (!is_trivially_copy_constructible_type (^^N1::Nontrivial));\n+static_assert (!is_trivially_copy_constructible_type (^^N1::UnusualCopy));\n+static_assert (is_trivially_copy_constructible_type (^^CopyConsOnlyType));\n+static_assert (!is_trivially_copy_constructible_type (^^MoveConsOnlyType));\n+static_assert (is_trivially_copy_constructible_type (^^HasTemplateCCtor));\n+static_assert (!is_trivially_copy_constructible_type (^^MoveOnly));\n+static_assert (!is_trivially_copy_constructible_type (^^MoveOnly2));\n+static_assert (!is_trivially_copy_constructible_type (^^void));\n+\n+static_assert (is_trivially_move_constructible_type (^^int));\n+static_assert (is_trivially_move_constructible_type (^^TType));\n+static_assert (is_trivially_move_constructible_type (^^PODType));\n+static_assert (!is_trivially_move_constructible_type (^^NType));\n+static_assert (!is_trivially_move_constructible_type (^^SLType));\n+static_assert (is_trivially_move_constructible_type (^^N1::DelDef));\n+static_assert (!is_trivially_move_constructible_type (^^N1::Abstract));\n+static_assert (is_trivially_move_constructible_type (^^N1::Ellipsis));\n+static_assert (is_trivially_move_constructible_type (^^N1::DelEllipsis));\n+static_assert (is_trivially_move_constructible_type (^^N1::Any));\n+static_assert (!is_trivially_move_constructible_type (^^N1::DelCopy));\n+static_assert (!is_trivially_move_constructible_type (^^N1::DelDtor));\n+static_assert (!is_trivially_move_constructible_type (^^N1::Nontrivial));\n+static_assert (!is_trivially_move_constructible_type (^^N1::UnusualCopy));\n+static_assert (!is_trivially_move_constructible_type (^^CopyConsOnlyType));\n+static_assert (is_trivially_move_constructible_type (^^MoveConsOnlyType));\n+static_assert (!is_trivially_move_constructible_type (^^HasTemplateCCtor));\n+static_assert (is_trivially_move_constructible_type (^^MoveOnly));\n+static_assert (!is_trivially_move_constructible_type (^^MoveOnly2));\n+static_assert (!is_trivially_move_constructible_type (^^void));\n+\n+static_assert (!is_trivially_assignable_type (^^int, ^^int));\n+static_assert (is_trivially_assignable_type (^^int &, ^^int));\n+static_assert (is_trivially_assignable_type (^^int &, ^^int &));\n+static_assert (is_trivially_assignable_type (^^int &, ^^int &&));\n+static_assert (is_trivially_assignable_type (^^int &, ^^const int &));\n+static_assert (!is_trivially_assignable_type (^^int &, ^^int *));\n+static_assert (!is_trivially_assignable_type (^^int &, ^^void *));\n+static_assert (!is_trivially_assignable_type (^^const int, ^^int));\n+static_assert (!is_trivially_assignable_type (^^const int &, ^^int));\n+static_assert (!is_trivially_assignable_type (^^const int &, ^^const int &));\n+static_assert (is_trivially_assignable_type (^^const int *&, ^^int *));\n+static_assert (!is_trivially_assignable_type (^^int *&, ^^const int *&));\n+static_assert (!is_trivially_assignable_type (^^int *&, ^^const int &));\n+static_assert (!is_trivially_assignable_type (^^const int *&, ^^void *));\n+static_assert (is_trivially_assignable_type (^^const void *&, ^^void *));\n+static_assert (is_trivially_assignable_type (^^const void *&, ^^int *));\n+static_assert (is_trivially_assignable_type (^^TType, ^^TType));\n+static_assert (is_trivially_assignable_type (^^TType &, ^^TType));\n+static_assert (is_trivially_assignable_type (^^TType &, ^^TType &));\n+static_assert (is_trivially_assignable_type (^^TType &, ^^TType &&));\n+static_assert (is_trivially_assignable_type (^^TType &, ^^const TType &));\n+static_assert (is_trivially_assignable_type (^^PODType, ^^PODType));\n+static_assert (!is_trivially_assignable_type (^^NType &, ^^NType &));\n+static_assert (is_trivially_assignable_type (^^SLType, ^^SLType));\n+static_assert (is_trivially_assignable_type (^^N3::Empty, ^^N3::Empty));\n+static_assert (!is_trivially_assignable_type (^^N3::Abstract, ^^N3::Abstract));\n+static_assert (is_trivially_assignable_type (^^N3::Ellipsis, ^^N3::Ellipsis));\n+static_assert (is_trivially_assignable_type (^^N3::DelEllipsis, ^^N3::DelEllipsis));\n+static_assert (is_trivially_assignable_type (^^N3::Any, ^^N3::Any));\n+static_assert (is_trivially_assignable_type (^^N3::DelDef, ^^N3::DelDef));\n+static_assert (is_trivially_assignable_type (^^N3::DelCopy, ^^N3::DelCopy));\n+static_assert (!is_trivially_assignable_type (^^N3::Nontrivial, ^^N3::Nontrivial));\n+static_assert (is_trivially_assignable_type (^^N3::AnyAssign, ^^N3::AnyAssign));\n+static_assert (is_trivially_assignable_type (^^N3::DelAnyAssign, ^^N3::DelAnyAssign));\n+static_assert (is_trivially_assignable_type (^^N3::DelCopyAssign, ^^N3::DelCopyAssign));\n+static_assert (is_trivially_assignable_type (^^N3::MO, ^^N3::MO));\n+static_assert (is_trivially_assignable_type (^^N3::MO, ^^N3::MO &&));\n+static_assert (!is_trivially_assignable_type (^^N3::MO, ^^N3::MO &));\n+static_assert (!is_trivially_assignable_type (^^N3::MO, ^^const N3::MO &));\n+static_assert (!is_trivially_assignable_type (^^CopyConsOnlyType, ^^CopyConsOnlyType));\n+static_assert (!is_trivially_assignable_type (^^CopyConsOnlyType, ^^const CopyConsOnlyType &));\n+static_assert (!is_trivially_assignable_type (^^MoveConsOnlyType, ^^MoveConsOnlyType));\n+static_assert (!is_trivially_assignable_type (^^MoveConsOnlyType, ^^MoveConsOnlyType &&));\n+static_assert (!is_trivially_assignable_type (^^HasTemplateCAssign, ^^HasTemplateCAssign));\n+static_assert (is_trivially_assignable_type (^^HasTemplateCAssign, ^^const HasTemplateCAssign &));\n+static_assert (is_trivially_assignable_type (^^ClassType, ^^DerivedType));\n+static_assert (is_trivially_assignable_type (^^ClassType, ^^DerivedType &));\n+static_assert (is_trivially_assignable_type (^^ClassType, ^^DerivedType &&));\n+static_assert (is_trivially_assignable_type (^^ClassType, ^^const DerivedType &));\n+static_assert (is_trivially_assignable_type (^^MoveOnly3, ^^MoveOnly3));\n+static_assert (is_trivially_assignable_type (^^MoveOnly3, ^^MoveOnly3 &&));\n+static_assert (!is_trivially_assignable_type (^^MoveOnly3, ^^MoveOnly3 &));\n+static_assert (!is_trivially_assignable_type (^^MoveOnly3, ^^const MoveOnly3 &));\n+static_assert (!is_trivially_assignable_type (^^MoveOnly4, ^^MoveOnly4));\n+\n+static_assert (is_trivially_copy_assignable_type (^^int));\n+static_assert (is_trivially_copy_assignable_type (^^TType));\n+static_assert (is_trivially_copy_assignable_type (^^PODType));\n+static_assert (!is_trivially_copy_assignable_type (^^NType));\n+static_assert (is_trivially_copy_assignable_type (^^SLType));\n+static_assert (is_trivially_copy_assignable_type (^^N3::Empty));\n+static_assert (!is_trivially_copy_assignable_type (^^N3::Abstract));\n+static_assert (is_trivially_copy_assignable_type (^^N3::Ellipsis));\n+static_assert (is_trivially_copy_assignable_type (^^N3::DelEllipsis));\n+static_assert (is_trivially_copy_assignable_type (^^N3::Any));\n+static_assert (is_trivially_copy_assignable_type (^^N3::DelDef));\n+static_assert (is_trivially_copy_assignable_type (^^N3::DelCopy));\n+static_assert (!is_trivially_copy_assignable_type (^^N3::Nontrivial));\n+static_assert (is_trivially_copy_assignable_type (^^N3::AnyAssign));\n+static_assert (is_trivially_copy_assignable_type (^^N3::DelAnyAssign));\n+static_assert (!is_trivially_copy_assignable_type (^^N3::DelCopyAssign));\n+static_assert (!is_trivially_copy_assignable_type (^^N3::MO));\n+static_assert (!is_trivially_copy_assignable_type (^^CopyConsOnlyType));\n+static_assert (!is_trivially_copy_assignable_type (^^MoveConsOnlyType));\n+static_assert (is_trivially_copy_assignable_type (^^HasTemplateCAssign));\n+static_assert (!is_trivially_copy_assignable_type (^^MoveOnly3));\n+static_assert (!is_trivially_copy_assignable_type (^^MoveOnly4));\n+static_assert (!is_trivially_copy_assignable_type (^^void));\n+\n+static_assert (is_trivially_move_assignable_type (^^int));\n+static_assert (is_trivially_move_assignable_type (^^TType));\n+static_assert (is_trivially_move_assignable_type (^^PODType));\n+static_assert (!is_trivially_move_assignable_type (^^NType));\n+static_assert (is_trivially_move_assignable_type (^^SLType));\n+static_assert (is_trivially_move_assignable_type (^^N3::Empty));\n+static_assert (!is_trivially_move_assignable_type (^^N3::Abstract));\n+static_assert (is_trivially_move_assignable_type (^^N3::Ellipsis));\n+static_assert (is_trivially_move_assignable_type (^^N3::DelEllipsis));\n+static_assert (is_trivially_move_assignable_type (^^N3::Any));\n+static_assert (is_trivially_move_assignable_type (^^N3::DelDef));\n+static_assert (is_trivially_move_assignable_type (^^N3::DelCopy));\n+static_assert (!is_trivially_move_assignable_type (^^N3::Nontrivial));\n+static_assert (is_trivially_move_assignable_type (^^N3::AnyAssign));\n+static_assert (is_trivially_move_assignable_type (^^N3::DelAnyAssign));\n+static_assert (is_trivially_move_assignable_type (^^N3::DelCopyAssign));\n+static_assert (is_trivially_move_assignable_type (^^N3::MO));\n+static_assert (!is_trivially_move_assignable_type (^^CopyConsOnlyType));\n+static_assert (!is_trivially_move_assignable_type (^^MoveConsOnlyType));\n+static_assert (!is_trivially_move_assignable_type (^^HasTemplateCAssign));\n+static_assert (is_trivially_move_assignable_type (^^MoveOnly3));\n+static_assert (!is_trivially_move_assignable_type (^^MoveOnly4));\n+static_assert (!is_trivially_move_assignable_type (^^void));\n+\n+static_assert (is_trivially_destructible_type (^^int));\n+static_assert (is_trivially_destructible_type (^^TType));\n+static_assert (is_trivially_destructible_type (^^PODType));\n+static_assert (!is_trivially_destructible_type (^^NType));\n+static_assert (!is_trivially_destructible_type (^^SLType));\n+\n+static_assert (is_nothrow_default_constructible_type (^^int));\n+static_assert (is_nothrow_default_constructible_type (^^float));\n+static_assert (is_nothrow_default_constructible_type (^^EnumType));\n+static_assert (is_nothrow_default_constructible_type (^^int *));\n+static_assert (is_nothrow_default_constructible_type (^^int (*) (int)));\n+static_assert (is_nothrow_default_constructible_type (^^int (ClassType:: *)));\n+static_assert (is_nothrow_default_constructible_type (^^int (ClassType:: *) (int)));\n+static_assert (is_nothrow_default_constructible_type (^^int [2]));\n+static_assert (is_nothrow_default_constructible_type (^^EnumType [2][3][4]));\n+static_assert (is_nothrow_default_constructible_type (^^int * [3]));\n+static_assert (is_nothrow_default_constructible_type (^^int (ClassType::* [2][3])));\n+static_assert (is_nothrow_default_constructible_type (^^ClassType));\n+static_assert (is_nothrow_default_constructible_type (^^NoexceptDefaultClass));\n+static_assert (!is_nothrow_default_constructible_type (^^void));\n+static_assert (!is_nothrow_default_constructible_type (^^int []));\n+static_assert (!is_nothrow_default_constructible_type (^^float [][3]));\n+static_assert (!is_nothrow_default_constructible_type (^^int (* [][2]) (int)));\n+static_assert (!is_nothrow_default_constructible_type (^^int (ClassType:: * [][2][3]) (int)));\n+static_assert (!is_nothrow_default_constructible_type (^^ThrowDefaultClass));\n+static_assert (!is_nothrow_default_constructible_type (^^ExceptDefaultClass));\n+\n+static_assert (is_nothrow_copy_constructible_type (^^int));\n+static_assert (is_nothrow_copy_constructible_type (^^float));\n+static_assert (is_nothrow_copy_constructible_type (^^EnumType));\n+static_assert (is_nothrow_copy_constructible_type (^^int *));\n+static_assert (is_nothrow_copy_constructible_type (^^int (*) (int)));\n+static_assert (is_nothrow_copy_constructible_type (^^int (ClassType:: *)));\n+static_assert (is_nothrow_copy_constructible_type (^^int (ClassType:: *) (int)));\n+static_assert (is_nothrow_copy_constructible_type (^^NoexceptCopyConsClass));\n+static_assert (is_nothrow_copy_constructible_type (^^const NoexceptCopyConsClass));\n+static_assert (!is_nothrow_copy_constructible_type (^^void));\n+static_assert (!is_nothrow_copy_constructible_type (^^int [2]));\n+static_assert (!is_nothrow_copy_constructible_type (^^int []));\n+static_assert (!is_nothrow_copy_constructible_type (^^float [][3]));\n+static_assert (!is_nothrow_copy_constructible_type (^^EnumType [2][3][4]));\n+static_assert (!is_nothrow_copy_constructible_type (^^int * [3]));\n+static_assert (!is_nothrow_copy_constructible_type (^^int (* [][2]) (int)));\n+static_assert (!is_nothrow_copy_constructible_type (^^int (ClassType:: * [2][3])));\n+static_assert (!is_nothrow_copy_constructible_type (^^int (ClassType:: * [][2][3]) (int)));\n+static_assert (!is_nothrow_copy_constructible_type (^^ClassType (unsigned) const &));\n+static_assert (!is_nothrow_copy_constructible_type (^^bool (ClassType) const));\n+static_assert (!is_nothrow_copy_constructible_type (^^bool (...) &&));\n+static_assert (!is_nothrow_copy_constructible_type (^^EnumType (int, ...)));\n+static_assert (!is_nothrow_copy_constructible_type (^^volatile NoexceptCopyConsClass));\n+static_assert (!is_nothrow_copy_constructible_type (^^ThrowCopyConsClass));\n+static_assert (!is_nothrow_copy_constructible_type (^^ExceptCopyConsClass));\n+\n+static_assert (is_nothrow_move_constructible_type (^^int));\n+static_assert (is_nothrow_move_constructible_type (^^float));\n+static_assert (is_nothrow_move_constructible_type (^^EnumType));\n+static_assert (is_nothrow_move_constructible_type (^^int *));\n+static_assert (is_nothrow_move_constructible_type (^^int (*) (int)));\n+static_assert (is_nothrow_move_constructible_type (^^int (ClassType:: *)));\n+static_assert (is_nothrow_move_constructible_type (^^int (ClassType:: *) (int)));\n+static_assert (is_nothrow_move_constructible_type (^^NoexceptMoveConsClass));\n+static_assert (!is_nothrow_move_constructible_type (^^void));\n+static_assert (!is_nothrow_move_constructible_type (^^int [2]));\n+static_assert (!is_nothrow_move_constructible_type (^^int []));\n+static_assert (!is_nothrow_move_constructible_type (^^float [][3]));\n+static_assert (!is_nothrow_move_constructible_type (^^EnumType [2][3][4]));\n+static_assert (!is_nothrow_move_constructible_type (^^int * [3]));\n+static_assert (!is_nothrow_move_constructible_type (^^int (* [][2]) (int)));\n+static_assert (!is_nothrow_move_constructible_type (^^int (ClassType:: * [2][3])));\n+static_assert (!is_nothrow_move_constructible_type (^^int (ClassType:: * [][2][3]) (int)));\n+static_assert (!is_nothrow_move_constructible_type (^^ClassType (unsigned) const &));\n+static_assert (!is_nothrow_move_constructible_type (^^bool (ClassType) const));\n+static_assert (!is_nothrow_move_constructible_type (^^bool (...) &&));\n+static_assert (!is_nothrow_move_constructible_type (^^EnumType (int, ...)));\n+static_assert (!is_nothrow_move_constructible_type (^^const NoexceptMoveConsClass));\n+static_assert (!is_nothrow_move_constructible_type (^^volatile NoexceptMoveConsClass));\n+static_assert (!is_nothrow_move_constructible_type (^^ThrowMoveConsClass));\n+static_assert (!is_nothrow_move_constructible_type (^^ExceptMoveConsClass));\n+\n+static_assert (is_nothrow_assignable_type (^^int &, ^^int));\n+static_assert (is_nothrow_assignable_type (^^int &, ^^const int));\n+static_assert (is_nothrow_assignable_type (^^NoexceptCopyAssignClass &, ^^const NoexceptCopyAssignClass &));\n+static_assert (is_nothrow_assignable_type (^^NoexceptMoveAssignClass &, ^^NoexceptMoveAssignClass &&));\n+static_assert (is_nothrow_assignable_type (^^NoexceptCopyAssignClass &, ^^NoexceptCopyAssignClass &&));\n+static_assert (!is_nothrow_assignable_type (^^int, ^^int));\n+static_assert (!is_nothrow_assignable_type (^^int, ^^const int));\n+static_assert (!is_nothrow_assignable_type (^^ExceptCopyAssignClass &, ^^const ExceptCopyAssignClass &));\n+static_assert (!is_nothrow_assignable_type (^^ExceptMoveAssignClass &, ^^ExceptMoveAssignClass &&));\n+static_assert (!is_nothrow_assignable_type (^^NoexceptMoveAssignClass &, ^^const NoexceptMoveAssignClass &));\n+\n+static_assert (is_nothrow_copy_assignable_type (^^int));\n+static_assert (is_nothrow_copy_assignable_type (^^float));\n+static_assert (is_nothrow_copy_assignable_type (^^EnumType));\n+static_assert (is_nothrow_copy_assignable_type (^^int *));\n+static_assert (is_nothrow_copy_assignable_type (^^int (*) (int)));\n+static_assert (is_nothrow_copy_assignable_type (^^int (ClassType:: *)));\n+static_assert (is_nothrow_copy_assignable_type (^^int (ClassType:: *) (int)));\n+static_assert (is_nothrow_copy_assignable_type (^^NoexceptCopyAssignClass));\n+static_assert (!is_nothrow_copy_assignable_type (^^void));\n+static_assert (!is_nothrow_copy_assignable_type (^^int [2]));\n+static_assert (!is_nothrow_copy_assignable_type (^^float [][3]));\n+static_assert (!is_nothrow_copy_assignable_type (^^EnumType [2][3][4]));\n+static_assert (!is_nothrow_copy_assignable_type (^^int * [3]));\n+static_assert (!is_nothrow_copy_assignable_type (^^int (* [][2]) (int)));\n+static_assert (!is_nothrow_copy_assignable_type (^^int (ClassType:: * [2][3])));\n+static_assert (!is_nothrow_copy_assignable_type (^^int (ClassType:: * [][2][3]) (int)));\n+static_assert (!is_nothrow_copy_assignable_type (^^ClassType (unsigned) const &));\n+static_assert (!is_nothrow_copy_assignable_type (^^bool (ClassType) const));\n+static_assert (!is_nothrow_copy_assignable_type (^^bool (...) &&));\n+static_assert (!is_nothrow_copy_assignable_type (^^EnumType (int, ...)));\n+static_assert (!is_nothrow_copy_assignable_type (^^ExceptCopyAssignClass));\n+static_assert (!is_nothrow_copy_assignable_type (^^NoexceptMoveAssignClass));\n+static_assert (!is_nothrow_copy_assignable_type (^^ExceptMoveAssignClass));\n+static_assert (!is_nothrow_copy_assignable_type (^^DeletedCopyAssignClass));\n+static_assert (!is_nothrow_copy_assignable_type (^^DeletedMoveAssignClass));\n+\n+static_assert (is_nothrow_move_assignable_type (^^int));\n+static_assert (is_nothrow_move_assignable_type (^^float));\n+static_assert (is_nothrow_move_assignable_type (^^EnumType));\n+static_assert (is_nothrow_move_assignable_type (^^int *));\n+static_assert (is_nothrow_move_assignable_type (^^int (*) (int)));\n+static_assert (is_nothrow_move_assignable_type (^^int (ClassType:: *)));\n+static_assert (is_nothrow_move_assignable_type (^^int (ClassType:: *) (int)));\n+static_assert (is_nothrow_move_assignable_type (^^NoexceptMoveAssignClass));\n+static_assert (is_nothrow_move_assignable_type (^^NoexceptCopyAssignClass));\n+static_assert (!is_nothrow_move_assignable_type (^^void));\n+static_assert (!is_nothrow_move_assignable_type (^^int [2]));\n+static_assert (!is_nothrow_move_assignable_type (^^float [][3]));\n+static_assert (!is_nothrow_move_assignable_type (^^EnumType [2][3][4]));\n+static_assert (!is_nothrow_move_assignable_type (^^int * [3]));\n+static_assert (!is_nothrow_move_assignable_type (^^int (* [][2]) (int)));\n+static_assert (!is_nothrow_move_assignable_type (^^int (ClassType:: * [2][3])));\n+static_assert (!is_nothrow_move_assignable_type (^^int (ClassType:: * [][2][3]) (int)));\n+static_assert (!is_nothrow_move_assignable_type (^^ClassType (unsigned) const &));\n+static_assert (!is_nothrow_move_assignable_type (^^bool (ClassType) const));\n+static_assert (!is_nothrow_move_assignable_type (^^bool (...) &&));\n+static_assert (!is_nothrow_move_assignable_type (^^EnumType (int, ...)));\n+static_assert (!is_nothrow_move_assignable_type (^^ExceptMoveAssignClass));\n+static_assert (!is_nothrow_move_assignable_type (^^ExceptCopyAssignClass));\n+static_assert (!is_nothrow_move_assignable_type (^^DeletedMoveAssignClass));\n+static_assert (!is_nothrow_move_assignable_type (^^DeletedCopyAssignClass));\n+\n+static_assert (is_nothrow_destructible_type (^^int));\n+static_assert (is_nothrow_destructible_type (^^const int));\n+static_assert (is_nothrow_destructible_type (^^const volatile int));\n+static_assert (is_nothrow_destructible_type (^^int [12]));\n+static_assert (is_nothrow_destructible_type (^^const int [12]));\n+static_assert (is_nothrow_destructible_type (^^const volatile int [12]));\n+static_assert (is_nothrow_destructible_type (^^decltype (nullptr)));\n+static_assert (is_nothrow_destructible_type (^^std::initializer_list<int>));\n+static_assert (is_nothrow_destructible_type (^^std::initializer_list<decltype (nullptr)>));\n+static_assert (is_nothrow_destructible_type (^^std::initializer_list<N2::TD1>));\n+static_assert (is_nothrow_destructible_type (^^std::initializer_list<N2::TD2>));\n+static_assert (is_nothrow_destructible_type (^^N2::E));\n+static_assert (is_nothrow_destructible_type (^^const N2::E));\n+static_assert (is_nothrow_destructible_type (^^const volatile N2::E));\n+static_assert (is_nothrow_destructible_type (^^N2::NTD1));\n+static_assert (is_nothrow_destructible_type (^^N2::NTD2));\n+static_assert (is_nothrow_destructible_type (^^N2::NTD3));\n+static_assert (is_nothrow_destructible_type (^^N2::Aggr));\n+static_assert (is_nothrow_destructible_type (^^N2::U1));\n+static_assert (is_nothrow_destructible_type (^^void (*) ()));\n+static_assert (is_nothrow_destructible_type (^^void *));\n+static_assert (is_nothrow_destructible_type (^^int &));\n+static_assert (is_nothrow_destructible_type (^^N2::TD1 &));\n+static_assert (is_nothrow_destructible_type (^^N2::TD2 &));\n+static_assert (is_nothrow_destructible_type (^^N2::TD1 *));\n+static_assert (is_nothrow_destructible_type (^^N2::TD2 *));\n+static_assert (is_nothrow_destructible_type (^^void (&) ()));\n+static_assert (is_nothrow_destructible_type (^^void (&&) ()));\n+static_assert (is_nothrow_destructible_type (^^N2::En));\n+static_assert (is_nothrow_destructible_type (^^N2::En *));\n+static_assert (is_nothrow_destructible_type (^^N2::En &));\n+static_assert (is_nothrow_destructible_type (^^N2::En2));\n+static_assert (is_nothrow_destructible_type (^^N2::En2 *));\n+static_assert (is_nothrow_destructible_type (^^N2::En2 &));\n+static_assert (is_nothrow_destructible_type (^^N2::TD1 (&) (N2::Aggr2, N2::TD2)));\n+static_assert (is_nothrow_destructible_type (^^N2::TD1 (*) (N2::Aggr2, N2::TD2)));\n+static_assert (is_nothrow_destructible_type (^^N2::Abstract1));\n+static_assert (is_nothrow_destructible_type (^^N2::Der));\n+static_assert (is_nothrow_destructible_type (^^N2::Del &));\n+static_assert (is_nothrow_destructible_type (^^N2::Del2 &));\n+static_assert (is_nothrow_destructible_type (^^N2::Del3 &));\n+static_assert (is_nothrow_destructible_type (^^N2::Del (&) [1]));\n+static_assert (is_nothrow_destructible_type (^^N2::Del2 (&) [2]));\n+static_assert (is_nothrow_destructible_type (^^N2::Del3 (&) [3]));\n+static_assert (is_nothrow_destructible_type (^^N2::Del &&));\n+static_assert (is_nothrow_destructible_type (^^N2::Del2 &&));\n+static_assert (is_nothrow_destructible_type (^^N2::Del3 &));\n+static_assert (is_nothrow_destructible_type (^^N2::Del (&&) [1]));\n+static_assert (is_nothrow_destructible_type (^^N2::Del2 (&&) [2]));\n+static_assert (is_nothrow_destructible_type (^^N2::Del3 (&&) [3]));\n+static_assert (is_nothrow_destructible_type (^^N2::Ut &));\n+static_assert (is_nothrow_destructible_type (^^N2::Ut &&));\n+static_assert (is_nothrow_destructible_type (^^N2::Ut *));\n+static_assert (is_nothrow_destructible_type (^^N2::Abstract2 &));\n+static_assert (is_nothrow_destructible_type (^^N2::Abstract3 &));\n+static_assert (is_nothrow_destructible_type (^^N2::Abstract2 *));\n+static_assert (is_nothrow_destructible_type (^^N2::Abstract3 *));\n+static_assert (!is_nothrow_destructible_type (^^void));\n+static_assert (!is_nothrow_destructible_type (^^const void));\n+static_assert (!is_nothrow_destructible_type (^^void ()));\n+static_assert (!is_nothrow_destructible_type (^^void () const));\n+static_assert (!is_nothrow_destructible_type (^^N2::TD1 (N2::Aggr2, N2::TD2)));\n+static_assert (!is_nothrow_destructible_type (^^int []));\n+static_assert (!is_nothrow_destructible_type (^^const int []));\n+static_assert (!is_nothrow_destructible_type (^^const volatile int []));\n+static_assert (!is_nothrow_destructible_type (^^int [][123]));\n+static_assert (!is_nothrow_destructible_type (^^N2::TD1));\n+static_assert (!is_nothrow_destructible_type (^^N2::TD2));\n+static_assert (!is_nothrow_destructible_type (^^N2::Aggr2));\n+static_assert (!is_nothrow_destructible_type (^^N2::Aggr2 [1]));\n+static_assert (!is_nothrow_destructible_type (^^N2::TD1 [1][2]));\n+static_assert (!is_nothrow_destructible_type (^^N2::Ut));\n+static_assert (!is_nothrow_destructible_type (^^N2::Ut [3]));\n+static_assert (!is_nothrow_destructible_type (^^N2::AbstractDelDtor));\n+static_assert (!is_nothrow_destructible_type (^^N2::Abstract2));\n+static_assert (!is_nothrow_destructible_type (^^N2::Abstract3));\n+static_assert (!is_nothrow_destructible_type (^^N2::Der2));\n+static_assert (!is_nothrow_destructible_type (^^N2::Del));\n+static_assert (!is_nothrow_destructible_type (^^N2::Del2));\n+static_assert (!is_nothrow_destructible_type (^^N2::Del3));\n+static_assert (!is_nothrow_destructible_type (^^N2::Del [1]));\n+static_assert (!is_nothrow_destructible_type (^^N2::Del2 [2]));\n+static_assert (!is_nothrow_destructible_type (^^N2::Del3 [3]));\ndiff --git a/gcc/testsuite/g++.dg/reflect/type_trait8.C b/gcc/testsuite/g++.dg/reflect/type_trait8.C\nnew file mode 100644\nindex 00000000000..33f04098911\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/type_trait8.C\n@@ -0,0 +1,129 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test reflection type traits [meta.reflection.traits], type properties.\n+\n+#include <meta>\n+using namespace std::meta;\n+\n+class ClassType { };\n+class DerivedType : public ClassType { };\n+enum EnumType { e0 };\n+class AbstractClass { virtual void rotate (int) = 0; };\n+class PolymorphicClass { virtual void rotate (int); };\n+class DerivedPolymorphic : public PolymorphicClass { };\n+class VirtualDestructorClass { virtual ~VirtualDestructorClass (); };\n+\n+static_assert (has_virtual_destructor (^^VirtualDestructorClass));\n+static_assert (!has_virtual_destructor (^^PolymorphicClass));\n+static_assert (!has_virtual_destructor (^^DerivedPolymorphic));\n+static_assert (!has_virtual_destructor (^^AbstractClass));\n+static_assert (!has_virtual_destructor (^^void));\n+static_assert (!has_virtual_destructor (^^int (int)));\n+static_assert (!has_virtual_destructor (^^int &));\n+static_assert (!has_virtual_destructor (^^EnumType));\n+static_assert (!has_virtual_destructor (^^ClassType));\n+static_assert (!has_virtual_destructor (^^DerivedType));\n+\n+static_assert (has_unique_object_representations (^^char));\n+static_assert (has_unique_object_representations (^^unsigned char));\n+static_assert (has_unique_object_representations (^^signed char));\n+static_assert (has_unique_object_representations (^^unsigned));\n+static_assert (has_unique_object_representations (^^bool));\n+enum E3 : unsigned { };\n+static_assert (has_unique_object_representations (^^E3));\n+static_assert (has_unique_object_representations (^^unsigned [3]));\n+static_assert (has_unique_object_representations (^^unsigned [3][2]));\n+static_assert (has_unique_object_representations (^^unsigned []));\n+static_assert (has_unique_object_representations (^^unsigned [][2]));\n+static_assert (has_unique_object_representations (^^E3 [3]));\n+static_assert (has_unique_object_representations (^^E3 [3][2]));\n+static_assert (has_unique_object_representations (^^E3 []));\n+static_assert (has_unique_object_representations (^^E3 [][2]));\n+struct Padded { char c1; alignas(4) char c2; };\n+struct Bitfield { int i : 3; };\n+struct Aligned { alignas(4) char c; };\n+static_assert (!has_unique_object_representations (^^void));\n+static_assert (!has_unique_object_representations (^^float));\n+static_assert (!has_unique_object_representations (^^Padded));\n+static_assert (!has_unique_object_representations (^^Padded [2]));\n+static_assert (!has_unique_object_representations (^^Padded [2][1]));\n+static_assert (!has_unique_object_representations (^^Padded []));\n+static_assert (!has_unique_object_representations (^^Padded [][1]));\n+static_assert (!has_unique_object_representations (^^Bitfield));\n+static_assert (!has_unique_object_representations (^^Bitfield [2]));\n+static_assert (!has_unique_object_representations (^^Bitfield [2][1]));\n+static_assert (!has_unique_object_representations (^^Bitfield []));\n+static_assert (!has_unique_object_representations (^^Bitfield [][1]));\n+static_assert (!has_unique_object_representations (^^Aligned));\n+static_assert (!has_unique_object_representations (^^Aligned [2]));\n+static_assert (!has_unique_object_representations (^^Aligned [2][1]));\n+static_assert (!has_unique_object_representations (^^Aligned []));\n+static_assert (!has_unique_object_representations (^^Aligned [][1]));\n+\n+struct A { A(); };\n+struct B { operator int (); explicit operator int && (); };\n+struct C { operator int (); explicit operator int & (); };\n+\n+static_assert (!reference_constructs_from_temporary (^^int, ^^int));\n+static_assert (!reference_constructs_from_temporary (^^int &, ^^void));\n+static_assert (!reference_constructs_from_temporary (^^int &, ^^const volatile void));\n+static_assert (!reference_constructs_from_temporary (^^void, ^^void));\n+static_assert (!reference_constructs_from_temporary (^^int &, ^^int));\n+static_assert (!reference_constructs_from_temporary (^^int &, ^^int &));\n+static_assert (!reference_constructs_from_temporary (^^int &, ^^int &&));\n+static_assert (!reference_constructs_from_temporary (^^int &, ^^long));\n+static_assert (!reference_constructs_from_temporary (^^int &, ^^long &));\n+static_assert (!reference_constructs_from_temporary (^^int &, ^^long &&));\n+static_assert (reference_constructs_from_temporary (^^const int &, ^^int));\n+static_assert (!reference_constructs_from_temporary (^^const int &, ^^int &));\n+static_assert (!reference_constructs_from_temporary (^^const int &, ^^int &&));\n+static_assert (reference_constructs_from_temporary (^^const int &, ^^long));\n+static_assert (reference_constructs_from_temporary (^^const int &, ^^long &));\n+static_assert (reference_constructs_from_temporary (^^const int &, ^^long &&));\n+static_assert (reference_constructs_from_temporary (^^int &&, ^^int));\n+static_assert (!reference_constructs_from_temporary (^^int &&, ^^int &));\n+static_assert (!reference_constructs_from_temporary (^^int &&, ^^int &&));\n+static_assert (reference_constructs_from_temporary (^^int &&, ^^long));\n+static_assert (reference_constructs_from_temporary (^^int &&, ^^long &));\n+static_assert (reference_constructs_from_temporary (^^int &&, ^^long &&));\n+static_assert (reference_constructs_from_temporary (^^const A &, ^^A));\n+static_assert (!reference_constructs_from_temporary (^^const A &, ^^A &&));\n+static_assert (reference_constructs_from_temporary (^^A &&, ^^A));\n+static_assert (!reference_constructs_from_temporary (^^int &, ^^int []));\n+static_assert (!reference_constructs_from_temporary (^^const int &, ^^int []));\n+static_assert (!reference_constructs_from_temporary (^^int &&, ^^int []));\n+static_assert (!reference_constructs_from_temporary (^^int &&, ^^B));\n+static_assert (!reference_constructs_from_temporary (^^const int &, ^^C));\n+static_assert (reference_constructs_from_temporary (^^const std::string &, ^^const char *));\n+\n+static_assert (!reference_converts_from_temporary (^^int, ^^int));\n+static_assert (!reference_converts_from_temporary (^^int &, ^^void));\n+static_assert (!reference_converts_from_temporary (^^int &, ^^const volatile void));\n+static_assert (!reference_converts_from_temporary (^^void, ^^void));\n+static_assert (!reference_converts_from_temporary (^^int &, ^^int));\n+static_assert (!reference_converts_from_temporary (^^int &, ^^int &));\n+static_assert (!reference_converts_from_temporary (^^int &, ^^int &&));\n+static_assert (!reference_converts_from_temporary (^^int &, ^^long));\n+static_assert (!reference_converts_from_temporary (^^int &, ^^long &));\n+static_assert (!reference_converts_from_temporary (^^int &, ^^long &&));\n+static_assert (reference_converts_from_temporary (^^const int &, ^^int));\n+static_assert (!reference_converts_from_temporary (^^const int &, ^^int &));\n+static_assert (!reference_converts_from_temporary (^^const int &, ^^int &&));\n+static_assert (reference_converts_from_temporary (^^const int &, ^^long));\n+static_assert (reference_converts_from_temporary (^^const int &, ^^long &));\n+static_assert (reference_converts_from_temporary (^^const int &, ^^long &&));\n+static_assert (reference_converts_from_temporary (^^int &&, ^^int));\n+static_assert (!reference_converts_from_temporary (^^int &&, ^^int &));\n+static_assert (!reference_converts_from_temporary (^^int &&, ^^int &&));\n+static_assert (reference_converts_from_temporary (^^int &&, ^^long));\n+static_assert (reference_converts_from_temporary (^^int &&, ^^long &));\n+static_assert (reference_converts_from_temporary (^^int &&, ^^long &&));\n+static_assert (reference_converts_from_temporary (^^const A &, ^^A));\n+static_assert (!reference_converts_from_temporary (^^const A &, ^^A &&));\n+static_assert (reference_converts_from_temporary (^^A &&, ^^A));\n+static_assert (!reference_converts_from_temporary (^^int &, ^^int []));\n+static_assert (!reference_converts_from_temporary (^^const int &, ^^int []));\n+static_assert (!reference_converts_from_temporary (^^int &&, ^^int []));\n+static_assert (reference_converts_from_temporary (^^int &&, ^^B));\n+static_assert (reference_converts_from_temporary (^^const int &, ^^C));\n+static_assert (reference_converts_from_temporary (^^const std::string &, ^^const char *));\ndiff --git a/gcc/testsuite/g++.dg/reflect/type_trait9.C b/gcc/testsuite/g++.dg/reflect/type_trait9.C\nnew file mode 100644\nindex 00000000000..4790f16e002\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/type_trait9.C\n@@ -0,0 +1,67 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test reflection type traits [meta.reflection.traits], type property\n+// queries.\n+\n+#include <meta>\n+using namespace std::meta;\n+\n+class ClassType { };\n+\n+static_assert (rank (^^int) == 0);\n+static_assert (rank (^^const void) == 0);\n+static_assert (rank (^^char &) == 0);\n+static_assert (rank (^^long &&) == 0);\n+static_assert (rank (^^int [2]) == 1);\n+static_assert (rank (^^int [][4]) == 2);\n+static_assert (rank (^^int [2][2][4][4][6][6]) == 6);\n+static_assert (rank (^^int []) == 1);\n+static_assert (rank (^^ClassType) == 0);\n+static_assert (rank (^^ClassType [2]) == 1);\n+static_assert (rank (^^ClassType [][4]) == 2);\n+static_assert (rank (^^ClassType [2][2][4][4][6][6]) == 6);\n+static_assert (rank (^^ClassType []) == 1);\n+using D = ClassType [2][2][4][4][6][6][6];\n+static_assert (rank (^^D) == 7);\n+\n+static_assert (extent (^^int) == 0);\n+static_assert (extent (^^const void, 0) == 0);\n+static_assert (extent (^^char &, 42) == 0);\n+static_assert (extent (^^long &&, 18) == 0);\n+static_assert (extent (^^int [2]) == 2);\n+static_assert (extent (^^int [2][4]) == 2);\n+static_assert (extent (^^int [][4]) == 0);\n+static_assert (extent (^^int []) == 0);\n+static_assert (extent (^^int, 0) == 0);\n+static_assert (extent (^^int [2], 0) == 2);\n+static_assert (extent (^^int [2][4], 0) == 2);\n+static_assert (extent (^^int [][4], 0) == 0);\n+static_assert (extent (^^int [], 0) == 0);\n+static_assert (extent (^^int, 1) == 0);\n+static_assert (extent (^^int [2], 1) == 0);\n+static_assert (extent (^^int [2][4], 1) == 4);\n+static_assert (extent (^^int [][4], 1) == 4);\n+static_assert (extent (^^int [10][4][6][8][12][2], 4) == 12);\n+static_assert (extent (^^int [], 1) == 0);\n+static_assert (extent (^^ClassType) == 0);\n+static_assert (extent (^^ClassType [2]) == 2);\n+static_assert (extent (^^ClassType [2][4]) == 2);\n+static_assert (extent (^^ClassType [][4]) == 0);\n+static_assert (extent (^^ClassType, 0) == 0);\n+static_assert (extent (^^ClassType [2], 0) == 2);\n+static_assert (extent (^^ClassType [2][4], 0) == 2);\n+static_assert (extent (^^ClassType [][4], 0) == 0);\n+static_assert (extent (^^ClassType, 1) == 0);\n+static_assert (extent (^^ClassType [2], 1) == 0);\n+static_assert (extent (^^ClassType [2][4], 1) == 4);\n+static_assert (extent (^^ClassType [][4], 1) == 4);\n+static_assert (extent (^^ClassType [10][4][6][8][12][2], 4) == 12);\n+\n+__extension__ void\n+ext ()\n+{\n+ static_assert (rank (^^int [0]) == 1);\n+ static_assert (extent (^^int [0]) == 0);\n+ static_assert (extent (^^int [0], 0) == 0);\n+ static_assert (extent (^^int [0], 1) == 0);\n+}\ndiff --git a/gcc/testsuite/g++.dg/reflect/u8display_string_of1.C b/gcc/testsuite/g++.dg/reflect/u8display_string_of1.C\nnew file mode 100644\nindex 00000000000..762a3c4be19\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/u8display_string_of1.C\n@@ -0,0 +1,230 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::u8display_string_of.\n+\n+#include <meta>\n+\n+using namespace std::meta;\n+\n+constexpr info null_reflection;\n+int arr[] = {1, 2, 3};\n+auto [a1, a2, a3] = arr;\n+void fn();\n+auto &fn2();\n+enum Enum { A };\n+using Alias = int;\n+struct B {};\n+struct S : B {\n+ int mem;\n+ int : 0;\n+};\n+struct T {\n+ T () {}\n+ T (const T &) {}\n+ ~T () {}\n+};\n+struct U {\n+ int u;\n+ int v : 5;\n+};\n+template<auto> struct TCls {};\n+template<auto> void TFn();\n+template<auto> int TVar;\n+template<auto> concept Concept = requires { true; };\n+namespace NS {};\n+namespace NSAlias = NS;\n+namespace {\n+ namespace NS2 {}\n+};\n+namespace NS3 {\n+ namespace {\n+ namespace {\n+ namespace NS4 {}\n+ }\n+ }\n+};\n+enum { Z };\n+\n+constexpr auto ctx = access_context::current ();\n+\n+struct AN { int a; long b; char c; };\n+\n+[[=1, =AN { 1, 42, ' ' }]] void bar (long, const T f, int g[2], T &);\n+\n+struct V1 {\n+ constexpr V1 (int) {}\n+};\n+struct V2 {\n+ V2 &operator = (const V2 &);\n+};\n+struct V3 {\n+ V3 &operator = (V3 &&);\n+};\n+struct V4 {\n+ V4 &operator += (const V4 &);\n+};\n+struct V5 {\n+ operator int ();\n+};\n+int operator \"\"_a (const char *);\n+\n+void\n+foo (int a, const long b, T c, int d[4], T &e)\n+{\n+ static_assert (u8display_string_of (^^a) == u8\"a\");\n+ static_assert (u8display_string_of (^^b) == u8\"b\");\n+ static_assert (u8display_string_of (^^c) == u8\"c\");\n+ static_assert (u8display_string_of (^^d) == u8\"d\");\n+ static_assert (u8display_string_of (^^e) == u8\"e\");\n+ static_assert (u8display_string_of (parameters_of (^^foo)[0]) == u8\"<parameter a of void foo(int, long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^foo)[1]) == u8\"<parameter b of void foo(int, long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^foo)[2]) == u8\"<parameter c of void foo(int, long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^foo)[3]) == u8\"<parameter d of void foo(int, long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^foo)[4]) == u8\"<parameter e of void foo(int, long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^bar)[0]) == u8\"<unnamed parameter 1 of void bar(long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^bar)[1]) == u8\"<parameter f of void bar(long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^bar)[2]) == u8\"<parameter g of void bar(long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^bar)[3]) == u8\"<unnamed parameter 4 of void bar(long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (null_reflection) == u8\"<null reflection>\");\n+ static_assert (u8display_string_of (^^::) == u8\"::\");\n+ static_assert (u8display_string_of (^^NS2) == u8\"{anonymous}::NS2\");\n+ static_assert (u8display_string_of (parent_of (^^NS2)) == u8\"{anonymous}\");\n+ static_assert (u8display_string_of (^^NS3::NS4) == u8\"NS3::{anonymous}::{anonymous}::NS4\");\n+ static_assert (u8display_string_of (parent_of (^^NS3::NS4)) == u8\"NS3::{anonymous}::{anonymous}\");\n+ static_assert (u8display_string_of (parent_of (parent_of (^^NS3::NS4))) == u8\"NS3::{anonymous}\");\n+ static_assert (u8display_string_of (parent_of (parent_of (parent_of (^^NS3::NS4)))) == u8\"NS3\");\n+ static_assert (u8display_string_of (^^Z) == u8\"Z\");\n+ static_assert (u8display_string_of (parent_of (^^Z)) == u8\"<unnamed enum>\");\n+ static_assert (u8display_string_of (reflect_constant (42)) == u8\"42\");\n+ static_assert (u8display_string_of (reflect_object (arr[1])) == u8\"arr[1]\");\n+ static_assert (u8display_string_of (^^arr) == u8\"arr\");\n+ static_assert (u8display_string_of (^^a3) == u8\"a3\");\n+ static_assert (u8display_string_of (^^fn) == u8\"void fn()\");\n+ static_assert (u8display_string_of (^^fn2) == u8\"auto& fn2()\");\n+ static_assert (u8display_string_of (^^Enum::A) == u8\"A\");\n+ static_assert (u8display_string_of (^^Alias) == u8\"Alias {aka int}\");\n+ static_assert (u8display_string_of (^^S) == u8\"S\");\n+ static_assert (u8display_string_of (^^S::mem) == u8\"S::mem\");\n+ static_assert (u8display_string_of (members_of (^^S, ctx)[1]) == u8\"S::<unnamed bit-field>\");\n+ static_assert (u8display_string_of (^^TCls) == u8\"template<auto <anonymous> > struct TCls\");\n+ static_assert (u8display_string_of (^^TFn) == u8\"template<auto <anonymous> > void TFn()\");\n+ static_assert (u8display_string_of (^^TVar) == u8\"template<auto <anonymous> > int TVar<<anonymous> >\");\n+ static_assert (u8display_string_of (^^Concept) == u8\"template<auto <anonymous> > concept Concept\");\n+ static_assert (u8display_string_of (^^NSAlias) == u8\"NSAlias\");\n+ static_assert (u8display_string_of (^^NS) == u8\"NS\");\n+ static_assert (u8display_string_of (bases_of (^^S, ctx)[0]) == u8\"(S, B)\");\n+ static_assert (u8display_string_of (data_member_spec (^^int, { .name = \"member\", .alignment = 128, .no_unique_address = true })) == u8\"(int, member, 128, , true)\");\n+ static_assert (u8display_string_of (data_member_spec (^^const int, { .name = \"member\", .bit_width = 6 })) == u8\"(const int, member, , 6, false)\");\n+ static_assert (u8display_string_of (data_member_spec (^^int, { .bit_width = 0 })) == u8\"(int, , , 0, false)\");\n+ static_assert (u8display_string_of (data_member_spec (^^long, { .bit_width = 5 })) == u8\"(long int, , , 5, false)\");\n+ static_assert (u8display_string_of (annotations_of (^^bar)[0]) == u8\"[[=1]]\");\n+ static_assert (u8display_string_of (annotations_of (^^bar)[1]) == u8\"[[=AN{1, 42, ' '}]]\");\n+ static_assert (u8display_string_of (^^int) == u8\"int\");\n+ static_assert (u8display_string_of (^^unsigned) == u8\"unsigned int\");\n+ static_assert (u8display_string_of (^^unsigned long) == u8\"long unsigned int\");\n+ static_assert (u8display_string_of (^^const long long &) == u8\"const long long int&\");\n+ static_assert (u8display_string_of (^^const double **) == u8\"const double**\");\n+ static_assert (u8display_string_of (^^int (int)) == u8\"int(int)\");\n+ static_assert (u8display_string_of (^^int (&) (int, long, S &)) == u8\"int (&)(int, long int, S&)\");\n+ static_assert (u8display_string_of (^^int (*) (int, long, S &)) == u8\"int (*)(int, long int, S&)\");\n+ static_assert (u8display_string_of (members_of (^^V2, ctx)[0]) == u8\"V2& V2::operator=(const V2&)\");\n+ static_assert (u8display_string_of (members_of (^^V3, ctx)[0]) == u8\"V3& V3::operator=(V3&&)\");\n+ static_assert (u8display_string_of (members_of (^^V4, ctx)[0]) == u8\"V4& V4::operator+=(const V4&)\");\n+ static_assert (u8display_string_of (members_of (^^V5, ctx)[0]) == u8\"V5::operator int()\");\n+ static_assert (u8display_string_of (^^operator\"\"_a) == u8\"int operator\\\"\\\"_a(const char*)\");\n+}\n+\n+namespace NS5 {\n+ int arr[] = {1, 2, 3};\n+ auto [a1, a2, a3] = arr;\n+ void fn();\n+ auto &fn2();\n+ enum Enum { A };\n+ using Alias = int;\n+ struct B {};\n+ struct S : B {\n+ int mem;\n+ int : 0;\n+ };\n+ struct T {\n+ T () {}\n+ T (const T &) {}\n+ ~T () {}\n+ };\n+ struct U {\n+ int u;\n+ int v : 5;\n+ };\n+ template<auto> struct TCls {};\n+ template<auto> void TFn();\n+ template<auto> int TVar;\n+ template<auto> concept Concept = requires { true; };\n+ enum { Z };\n+\n+ struct AN { int a; long b; char c; };\n+\n+ [[=1, =AN { 1, 42, ' ' }]] void bar (long, const T f, int g[2], T &);\n+\n+ struct V1 {\n+ constexpr V1 (int) {}\n+ };\n+ struct V2 {\n+ V2 &operator = (const V2 &);\n+ };\n+ struct V3 {\n+ V3 &operator = (V3 &&);\n+ };\n+ struct V4 {\n+ V4 &operator += (const V4 &);\n+ };\n+ struct V5 {\n+ operator int ();\n+ };\n+ int operator \"\"_a (const char *);\n+\n+ void\n+ foo (int a, const long b, T c, int d[4], T &e)\n+ {\n+ static_assert (u8display_string_of (^^a) == u8\"a\");\n+ static_assert (u8display_string_of (^^b) == u8\"b\");\n+ static_assert (u8display_string_of (^^c) == u8\"c\");\n+ static_assert (u8display_string_of (^^d) == u8\"d\");\n+ static_assert (u8display_string_of (^^e) == u8\"e\");\n+ static_assert (u8display_string_of (parameters_of (^^foo)[0]) == u8\"<parameter a of void NS5::foo(int, long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^foo)[1]) == u8\"<parameter b of void NS5::foo(int, long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^foo)[2]) == u8\"<parameter c of void NS5::foo(int, long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^foo)[3]) == u8\"<parameter d of void NS5::foo(int, long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^foo)[4]) == u8\"<parameter e of void NS5::foo(int, long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^bar)[0]) == u8\"<unnamed parameter 1 of void NS5::bar(long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^bar)[1]) == u8\"<parameter f of void NS5::bar(long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^bar)[2]) == u8\"<parameter g of void NS5::bar(long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (parameters_of (^^bar)[3]) == u8\"<unnamed parameter 4 of void NS5::bar(long int, T, int*, T&)>\");\n+ static_assert (u8display_string_of (^^Z) == u8\"NS5::Z\");\n+ static_assert (u8display_string_of (parent_of (^^Z)) == u8\"NS5::<unnamed enum>\");\n+ static_assert (u8display_string_of (reflect_constant (42)) == u8\"42\");\n+ static_assert (u8display_string_of (reflect_object (arr[1])) == u8\"NS5::arr[1]\");\n+ static_assert (u8display_string_of (^^arr) == u8\"NS5::arr\");\n+ static_assert (u8display_string_of (^^a3) == u8\"NS5::a3\");\n+ static_assert (u8display_string_of (^^fn) == u8\"void NS5::fn()\");\n+ static_assert (u8display_string_of (^^fn2) == u8\"auto& NS5::fn2()\");\n+ static_assert (u8display_string_of (^^Enum::A) == u8\"NS5::A\");\n+ static_assert (u8display_string_of (^^Alias) == u8\"NS5::Alias {aka int}\");\n+ static_assert (u8display_string_of (^^S) == u8\"NS5::S\");\n+ static_assert (u8display_string_of (^^S::mem) == u8\"NS5::S::mem\");\n+ static_assert (u8display_string_of (members_of (^^S, ctx)[1]) == u8\"NS5::S::<unnamed bit-field>\");\n+ static_assert (u8display_string_of (^^TCls) == u8\"template<auto <anonymous> > struct NS5::TCls\");\n+ static_assert (u8display_string_of (^^TFn) == u8\"template<auto <anonymous> > void NS5::TFn()\");\n+ static_assert (u8display_string_of (^^TVar) == u8\"template<auto <anonymous> > int NS5::TVar<<anonymous> >\");\n+ static_assert (u8display_string_of (^^Concept) == u8\"template<auto <anonymous> > concept NS5::Concept\");\n+ static_assert (u8display_string_of (bases_of (^^S, ctx)[0]) == u8\"(NS5::S, NS5::B)\");\n+ static_assert (u8display_string_of (annotations_of (^^bar)[0]) == u8\"[[=1]]\");\n+ static_assert (u8display_string_of (annotations_of (^^bar)[1]) == u8\"[[=NS5::AN{1, 42, ' '}]]\");\n+ static_assert (u8display_string_of (^^int (&) (int, long, S &)) == u8\"int (&)(int, long int, NS5::S&)\");\n+ static_assert (u8display_string_of (^^int (*) (int, long, S &)) == u8\"int (*)(int, long int, NS5::S&)\");\n+ static_assert (u8display_string_of (members_of (^^V2, ctx)[0]) == u8\"NS5::V2& NS5::V2::operator=(const NS5::V2&)\");\n+ static_assert (u8display_string_of (members_of (^^V3, ctx)[0]) == u8\"NS5::V3& NS5::V3::operator=(NS5::V3&&)\");\n+ static_assert (u8display_string_of (members_of (^^V4, ctx)[0]) == u8\"NS5::V4& NS5::V4::operator+=(const NS5::V4&)\");\n+ static_assert (u8display_string_of (members_of (^^V5, ctx)[0]) == u8\"NS5::V5::operator int()\");\n+ static_assert (u8display_string_of (^^operator\"\"_a) == u8\"int NS5::operator\\\"\\\"_a(const char*)\");\n+ }\n+}\ndiff --git a/gcc/testsuite/g++.dg/reflect/u8identifier_of1.C b/gcc/testsuite/g++.dg/reflect/u8identifier_of1.C\nnew file mode 100644\nindex 00000000000..0d30197d79d\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/u8identifier_of1.C\n@@ -0,0 +1,168 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::u8identifier_of.\n+\n+#include <meta>\n+\n+using namespace std::meta;\n+\n+struct C { };\n+\n+constexpr std::u8string_view sv = std::meta::u8identifier_of (^^C);\n+static_assert (sv == u8\"C\");\n+static_assert (sv.data ()[0] == u8'C');\n+static_assert (sv.data ()[1] == u8'\\0');\n+\n+struct S { };\n+using T = int;\n+using U = S;\n+enum E { E1, E2 };\n+enum { E3, E4 };\n+typedef enum { E5, E6 } E7;\n+\n+static_assert (u8identifier_of (^^T) == std::u8string_view (u8\"T\"));\n+static_assert (u8identifier_of (^^S) == std::u8string_view (u8\"S\"));\n+static_assert (u8identifier_of (^^U) == std::u8string_view (u8\"U\"));\n+static_assert (u8identifier_of (^^std) == std::u8string_view (u8\"std\"));\n+static_assert (u8identifier_of (^^std::meta) == std::u8string_view (u8\"meta\"));\n+static_assert (u8identifier_of (^^E1) == std::u8string_view (u8\"E1\"));\n+static_assert (u8identifier_of (^^E) == std::u8string_view (u8\"E\"));\n+static_assert (u8identifier_of (parent_of (^^E5)) == std::u8string_view (u8\"E7\"));\n+static_assert (u8identifier_of (^^E7) == std::u8string_view (u8\"E7\"));\n+static_assert (u8identifier_of (data_member_spec (^^long, { .name = u8\"foo\", .bit_width = 6 })) == std::u8string_view (u8\"foo\"));\n+static_assert (u8identifier_of (data_member_spec (^^long, { .name = u8\"extremely_long_string_used_as_identifier\" })) == std::u8string_view (u8\"extremely_long_string_used_as_identifier\"));\n+\n+namespace N {}\n+namespace NA = N;\n+static_assert (u8identifier_of (^^N) == std::u8string_view (u8\"N\"));\n+static_assert (u8identifier_of (^^NA) == std::u8string_view (u8\"NA\"));\n+\n+namespace {\n+ int a;\n+ namespace M {}\n+ static_assert (u8identifier_of (^^a) == std::u8string_view (u8\"a\"));\n+ static_assert (u8identifier_of (^^M) == std::u8string_view (u8\"M\"));\n+}\n+\n+typedef struct {\n+ int a;\n+ static_assert (u8identifier_of (^^a) == std::u8string_view (u8\"a\"));\n+} SV;\n+static_assert (u8identifier_of (^^SV) == std::u8string_view (u8\"SV\"));\n+static_assert (u8identifier_of (parent_of (^^SV::a)) == std::u8string_view (u8\"SV\"));\n+static_assert (u8identifier_of (dealias (^^SV)) == std::u8string_view (u8\"SV\"));\n+\n+template <int N>\n+struct ST\n+{\n+ static_assert (u8identifier_of (^^ST) == std::u8string_view (u8\"ST\"));\n+};\n+\n+struct V\n+{\n+ void foo () { int a; static_assert (u8identifier_of (parent_of (^^a)) == std::u8string_view (u8\"foo\")); }\n+ template <int N>\n+ void bar () { int a; static_assert (u8identifier_of (parent_of (^^a)) == std::u8string_view (u8\"bar\")); }\n+};\n+\n+int\n+operator \"\"_a (const char *)\n+{\n+ int a;\n+ static_assert (u8identifier_of (parent_of (^^a)) == std::u8string_view (u8\"_a\"));\n+ return 0;\n+}\n+\n+int v;\n+static_assert (u8identifier_of (^^V::foo) == std::u8string_view (u8\"foo\"));\n+static_assert (u8identifier_of (^^V::bar) == std::u8string_view (u8\"bar\"));\n+\n+void foo (int);\n+static_assert (u8identifier_of (^^foo) == std::u8string_view (u8\"foo\"));\n+\n+int arr[3];\n+\n+void\n+foo (int a)\n+{\n+ auto [b, c, d] = arr;\n+ static_assert (u8identifier_of (^^foo) == std::u8string_view (u8\"foo\"));\n+ static_assert (u8identifier_of (^^a) == std::u8string_view (u8\"a\"));\n+ static_assert (u8identifier_of (^^b) == std::u8string_view (u8\"b\"));\n+ static_assert (u8identifier_of (^^c) == std::u8string_view (u8\"c\"));\n+ static_assert (u8identifier_of (^^d) == std::u8string_view (u8\"d\"));\n+}\n+\n+template <int N>\n+void\n+bar (int a)\n+{\n+ auto [...b, c] = arr;\n+ static_assert (u8identifier_of (^^a) == std::u8string_view (u8\"a\"));\n+ static_assert (u8identifier_of (^^c) == std::u8string_view (u8\"c\"));\n+}\n+\n+void\n+baz ()\n+{\n+ auto a = [] {\n+ int a;\n+ static_assert (u8identifier_of (^^a) == std::u8string_view (u8\"a\"));\n+ static_assert (u8identifier_of (parent_of (parent_of (parent_of (^^a)))) == std::u8string_view (u8\"baz\"));\n+ };\n+ using t = decltype (a);\n+ static_assert (u8identifier_of (^^t) == std::u8string_view (u8\"t\"));\n+}\n+\n+void qux (int, int b, int c, int d, int);\n+constexpr auto p0 = parameters_of (^^qux)[0];\n+constexpr auto p1 = parameters_of (^^qux)[1];\n+constexpr auto p2 = parameters_of (^^qux)[2];\n+constexpr auto p3 = parameters_of (^^qux)[3];\n+constexpr auto p4 = parameters_of (^^qux)[4];\n+static_assert (u8identifier_of (p1) == std::u8string_view (u8\"b\"));\n+static_assert (u8identifier_of (p2) == std::u8string_view (u8\"c\"));\n+static_assert (u8identifier_of (p3) == std::u8string_view (u8\"d\"));\n+void qux (int a, int, int c, int e, int);\n+static_assert (u8identifier_of (p0) == std::u8string_view (u8\"a\"));\n+static_assert (u8identifier_of (p1) == std::u8string_view (u8\"b\"));\n+static_assert (u8identifier_of (p2) == std::u8string_view (u8\"c\"));\n+\n+void\n+qux (int a, int, int, int e, int)\n+{\n+ static_assert (u8identifier_of (p0) == std::u8string_view (u8\"a\"));\n+ static_assert (u8identifier_of (p1) == std::u8string_view (u8\"b\"));\n+ static_assert (u8identifier_of (p2) == std::u8string_view (u8\"c\"));\n+ static_assert (u8identifier_of (variable_of (p0)) == std::u8string_view (u8\"a\"));\n+ static_assert (u8identifier_of (variable_of (p3)) == std::u8string_view (u8\"e\"));\n+}\n+\n+void qux (int f, int, int, int, int g);\n+static_assert (u8identifier_of (p1) == std::u8string_view (u8\"b\"));\n+static_assert (u8identifier_of (p2) == std::u8string_view (u8\"c\"));\n+static_assert (u8identifier_of (p4) == std::u8string_view (u8\"g\"));\n+\n+template <typename... T>\n+void\n+freddy (int a, T... b)\n+{\n+}\n+\n+static_assert (u8identifier_of (parameters_of (^^freddy <int, long, char>)[0]) == std::u8string_view (u8\"a\"));\n+\n+struct {\n+ int a;\n+} s;\n+\n+static_assert (u8identifier_of (^^s) == std::u8string_view (u8\"s\"));\n+\n+int qu\\u00E6 = 1;\n+\n+static_assert (u8identifier_of (^^qu\\u00E6) == std::u8string_view (u8\"qu\\N{LATIN SMALL LETTER AE}\"));\n+\n+typedef enum {\n+ E8,\n+ E9\n+} E10;\n+static_assert (u8identifier_of (parent_of (^^E8)) == std::u8string_view (u8\"E10\"));\ndiff --git a/gcc/testsuite/g++.dg/reflect/u8symbol_of1.C b/gcc/testsuite/g++.dg/reflect/u8symbol_of1.C\nnew file mode 100644\nindex 00000000000..1c8bc411655\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/u8symbol_of1.C\n@@ -0,0 +1,61 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::u8symbol_of.\n+\n+#include <meta>\n+\n+using namespace std::meta;\n+\n+consteval bool\n+has_u8symbol_of (operators op)\n+{\n+ try { u8symbol_of (op); }\n+ catch (std::meta::exception &) { return false; }\n+ return true;\n+}\n+\n+static_assert (!has_u8symbol_of (static_cast <operators> (4242)));\n+static_assert (u8symbol_of (op_new) == std::u8string_view (u8\"new\"));\n+static_assert (u8symbol_of (op_delete) == std::u8string_view (u8\"delete\"));\n+static_assert (u8symbol_of (op_array_new) == std::u8string_view (u8\"new[]\"));\n+static_assert (u8symbol_of (op_array_delete) == std::u8string_view (u8\"delete[]\"));\n+static_assert (u8symbol_of (op_co_await) == std::u8string_view (u8\"co_await\"));\n+static_assert (u8symbol_of (op_parentheses) == std::u8string_view (u8\"()\"));\n+static_assert (u8symbol_of (op_square_brackets) == std::u8string_view (u8\"[]\"));\n+static_assert (u8symbol_of (op_arrow) == std::u8string_view (u8\"->\"));\n+static_assert (u8symbol_of (op_arrow_star) == std::u8string_view (u8\"->*\"));\n+static_assert (u8symbol_of (op_tilde) == std::u8string_view (u8\"~\"));\n+static_assert (u8symbol_of (op_exclamation) == std::u8string_view (u8\"!\"));\n+static_assert (u8symbol_of (op_plus) == std::u8string_view (u8\"+\"));\n+static_assert (u8symbol_of (op_minus) == std::u8string_view (u8\"-\"));\n+static_assert (u8symbol_of (op_star) == std::u8string_view (u8\"*\"));\n+static_assert (u8symbol_of (op_slash) == std::u8string_view (u8\"/\"));\n+static_assert (u8symbol_of (op_percent) == std::u8string_view (u8\"%\"));\n+static_assert (u8symbol_of (op_caret) == std::u8string_view (u8\"^\"));\n+static_assert (u8symbol_of (op_ampersand) == std::u8string_view (u8\"&\"));\n+static_assert (u8symbol_of (op_equals) == std::u8string_view (u8\"=\"));\n+static_assert (u8symbol_of (op_pipe) == std::u8string_view (u8\"|\"));\n+static_assert (u8symbol_of (op_plus_equals) == std::u8string_view (u8\"+=\"));\n+static_assert (u8symbol_of (op_minus_equals) == std::u8string_view (u8\"-=\"));\n+static_assert (u8symbol_of (op_star_equals) == std::u8string_view (u8\"*=\"));\n+static_assert (u8symbol_of (op_slash_equals) == std::u8string_view (u8\"/=\"));\n+static_assert (u8symbol_of (op_percent_equals) == std::u8string_view (u8\"%=\"));\n+static_assert (u8symbol_of (op_caret_equals) == std::u8string_view (u8\"^=\"));\n+static_assert (u8symbol_of (op_ampersand_equals) == std::u8string_view (u8\"&=\"));\n+static_assert (u8symbol_of (op_pipe_equals) == std::u8string_view (u8\"|=\"));\n+static_assert (u8symbol_of (op_equals_equals) == std::u8string_view (u8\"==\"));\n+static_assert (u8symbol_of (op_exclamation_equals) == std::u8string_view (u8\"!=\"));\n+static_assert (u8symbol_of (op_less) == std::u8string_view (u8\"<\"));\n+static_assert (u8symbol_of (op_greater) == std::u8string_view (u8\">\"));\n+static_assert (u8symbol_of (op_less_equals) == std::u8string_view (u8\"<=\"));\n+static_assert (u8symbol_of (op_greater_equals) == std::u8string_view (u8\">=\"));\n+static_assert (u8symbol_of (op_spaceship) == std::u8string_view (u8\"<=>\"));\n+static_assert (u8symbol_of (op_ampersand_ampersand) == std::u8string_view (u8\"&&\"));\n+static_assert (u8symbol_of (op_pipe_pipe) == std::u8string_view (u8\"||\"));\n+static_assert (u8symbol_of (op_less_less) == std::u8string_view (u8\"<<\"));\n+static_assert (u8symbol_of (op_greater_greater) == std::u8string_view (u8\">>\"));\n+static_assert (u8symbol_of (op_less_less_equals) == std::u8string_view (u8\"<<=\"));\n+static_assert (u8symbol_of (op_greater_greater_equals) == std::u8string_view (u8\">>=\"));\n+static_assert (u8symbol_of (op_plus_plus) == std::u8string_view (u8\"++\"));\n+static_assert (u8symbol_of (op_minus_minus) == std::u8string_view (u8\"--\"));\n+static_assert (u8symbol_of (op_comma) == std::u8string_view (u8\",\"));\ndiff --git a/gcc/testsuite/g++.dg/reflect/underlying_type1.C b/gcc/testsuite/g++.dg/reflect/underlying_type1.C\nnew file mode 100644\nindex 00000000000..8d5dbb2e4c2\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/underlying_type1.C\n@@ -0,0 +1,13 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::underlying_type.\n+\n+#include <meta>\n+\n+constexpr auto a = std::meta::underlying_type (^^int);\t// { dg-error \"uncaught exception of type\" }\n+\n+enum E {\n+ E0 = 1,\n+ E1 = std::meta::underlying_type (^^E) == ^^int,\t// { dg-error \"uncaught exception of type\" }\n+ E2 = 2\t\t\t\t\t\t// { dg-error \"enumerator value for 'E1' is not an integer constant\" \"\" { target *-*-* } .-1 }\n+};\ndiff --git a/gcc/testsuite/g++.dg/reflect/using1.C b/gcc/testsuite/g++.dg/reflect/using1.C\nnew file mode 100644\nindex 00000000000..915f81f5171\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/using1.C\n@@ -0,0 +1,13 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+\n+struct A {\n+ int a;\n+ consteval A(int p) : a(p) {}\n+};\n+\n+constexpr auto r = ^^A;\n+\n+struct B : A {\n+ using typename [: r :]::A;\n+};\ndiff --git a/gcc/testsuite/g++.dg/reflect/value_or_object1.C b/gcc/testsuite/g++.dg/reflect/value_or_object1.C\nnew file mode 100644\nindex 00000000000..9135bab8be8\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/value_or_object1.C\n@@ -0,0 +1,50 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::is_value and is_object.\n+\n+#include <meta>\n+\n+using namespace std::meta;\n+\n+constexpr int i = 42;\n+\n+template<int N>\n+constexpr int v = N;\n+\n+static_assert (!is_object (^^i));\n+static_assert (!is_value (^^i));\n+static_assert (is_variable (^^i));\n+static_assert (!is_object (reflect_constant (^^i)));\n+static_assert (is_value (reflect_constant (^^i)));\n+static_assert (!is_variable (reflect_constant (^^i)));\n+static_assert (!is_object (substitute (^^v, { reflect_constant (15) })));\n+static_assert (!is_object (^^v<15>));\n+static_assert (!is_value (^^v<15>));\n+static_assert (is_variable (^^v<15>));\n+static_assert (is_value (reflect_constant (^^v<15>)));\n+static_assert (!is_object (reflect_constant (^^v<15>)));\n+static_assert (!is_variable (reflect_constant (^^v<15>)));\n+\n+constexpr std::pair<std::pair<int, bool>, int> p = {{1, true}, 2};\n+constexpr info rfirst = reflect_object (p.first);\n+static_assert (is_object (rfirst) && !is_value (rfirst));\n+static_assert (type_of (rfirst) == ^^const std::pair<int, bool>);\n+static_assert (rfirst != reflect_constant (std::make_pair (1, true)));\n+\n+constexpr int k = 3;\n+constexpr const int *pk = &k;\n+constexpr const int &ref = k;\n+constexpr auto rp = ^^pk;\n+constexpr auto rref = ^^ref;\n+static_assert (is_variable (rp));\n+static_assert (!is_object (rp));\n+static_assert (!is_value (rp));\n+static_assert (!is_variable (reflect_constant (rp)));\n+static_assert (!is_object (reflect_constant (rp)));\n+static_assert (is_value (reflect_constant (rp)));\n+static_assert (is_variable (rref));\n+static_assert (!is_object (rref));\n+static_assert (!is_value (rref));\n+static_assert (!is_variable (reflect_constant (rref)));\n+static_assert (!is_object (reflect_constant (rref)));\n+static_assert (is_value (reflect_constant (rref)));\ndiff --git a/gcc/testsuite/g++.dg/reflect/variable_of1.C b/gcc/testsuite/g++.dg/reflect/variable_of1.C\nnew file mode 100644\nindex 00000000000..ae27875d0e9\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/variable_of1.C\n@@ -0,0 +1,136 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::variable_of.\n+\n+#include <meta>\n+\n+using namespace std::meta;\n+\n+int arr[] = {1, 2, 3};\n+auto [a1, a2, a3] = arr;\n+void fn();\n+auto &fn2();\n+enum Enum { A };\n+using Alias = int;\n+struct B {};\n+struct S : B {\n+ int mem;\n+ int : 0;\n+};\n+struct T {\n+ T ();\n+ T (const T &);\n+ ~T ();\n+};\n+struct U {\n+ int u;\n+};\n+template<auto> struct TCls {};\n+template<auto> void TFn();\n+template<auto> int TVar;\n+template<auto> concept Concept = requires { true; };\n+namespace NS {};\n+namespace NSAlias = NS;\n+\n+constexpr auto ctx = std::meta::access_context::current ();\n+\n+consteval bool\n+has_variable_of (info r)\n+{\n+ try { variable_of (r); }\n+ catch (std::meta::exception &) { return false; }\n+ return true;\n+}\n+\n+static_assert (!has_variable_of (std::meta::reflect_constant (42)));\n+static_assert (!has_variable_of (std::meta::reflect_object (arr[1])));\n+static_assert (!has_variable_of (^^arr));\n+static_assert (!has_variable_of (^^a3));\n+static_assert (!has_variable_of (^^fn));\n+static_assert (!has_variable_of (^^fn2));\n+static_assert (!has_variable_of (^^Enum::A));\n+static_assert (!has_variable_of (^^Alias));\n+static_assert (!has_variable_of (^^S));\n+static_assert (!has_variable_of (^^S::mem));\n+static_assert (!has_variable_of (std::meta::members_of (^^S, ctx)[1]));\n+static_assert (!has_variable_of (^^TCls));\n+static_assert (!has_variable_of (^^TFn));\n+static_assert (!has_variable_of (^^TVar));\n+static_assert (!has_variable_of (^^Concept));\n+static_assert (!has_variable_of (^^NSAlias));\n+static_assert (!has_variable_of (^^NS));\n+static_assert (!has_variable_of (std::meta::bases_of (^^S, ctx)[0]));\n+static_assert (!has_variable_of (std::meta::data_member_spec (^^int, { .name = \"member\" })));\n+\n+void\n+bar (long, const T f, int g[2], T &)\n+{\n+}\n+\n+void\n+foo (int a, const long b, T c, int d[4], T &e)\n+{\n+ static_assert (!has_variable_of (^^a));\n+ static_assert (!has_variable_of (^^b));\n+ static_assert (!has_variable_of (^^c));\n+ static_assert (!has_variable_of (^^d));\n+ static_assert (!has_variable_of (^^e));\n+ static_assert (has_variable_of (parameters_of (^^foo)[0]));\n+ static_assert (has_variable_of (parameters_of (^^foo)[1]));\n+ static_assert (has_variable_of (parameters_of (^^foo)[2]));\n+ static_assert (has_variable_of (parameters_of (^^foo)[3]));\n+ static_assert (has_variable_of (parameters_of (^^foo)[4]));\n+ static_assert (!has_variable_of (parameters_of (^^bar)[0]));\n+ static_assert (!has_variable_of (parameters_of (^^bar)[1]));\n+ static_assert (!has_variable_of (parameters_of (^^bar)[2]));\n+ static_assert (!has_variable_of (parameters_of (^^bar)[3]));\n+ static_assert (variable_of (parameters_of (^^foo)[0]) == ^^a);\n+ static_assert (variable_of (parameters_of (^^foo)[1]) == ^^b);\n+ static_assert (variable_of (parameters_of (^^foo)[2]) == ^^c);\n+ static_assert (variable_of (parameters_of (^^foo)[3]) == ^^d);\n+ static_assert (variable_of (parameters_of (^^foo)[4]) == ^^e);\n+ static_assert (variable_of (parameters_of (^^foo)[0]) != parameters_of (^^foo)[0]);\n+ static_assert (variable_of (parameters_of (^^foo)[1]) != parameters_of (^^foo)[1]);\n+ static_assert (variable_of (parameters_of (^^foo)[2]) != parameters_of (^^foo)[2]);\n+ static_assert (variable_of (parameters_of (^^foo)[3]) != parameters_of (^^foo)[3]);\n+ static_assert (variable_of (parameters_of (^^foo)[4]) != parameters_of (^^foo)[4]);\n+ static_assert (parameters_of (^^foo)[0] != ^^a);\n+ static_assert (parameters_of (^^foo)[1] != ^^b);\n+ static_assert (parameters_of (^^foo)[2] != ^^c);\n+ static_assert (parameters_of (^^foo)[3] != ^^d);\n+ static_assert (parameters_of (^^foo)[4] != ^^e);\n+}\n+\n+consteval bool\n+baz (int a, info b, info c, info d)\n+{\n+ if (a != 43)\n+ return false;\n+ if (b != d)\n+ return false;\n+ if (b == c)\n+ return false;\n+ if (b == parameters_of (^^baz)[1])\n+ return false;\n+\n+ // variable can be accessed only in innermost scope\n+ try { variable_of (c); return false; }\n+ catch (exception) {}\n+ try { variable_of (parameters_of (^^baz)[1]); return false; } \n+ catch (exception) {}\n+ return true;\n+}\n+\n+consteval bool\n+qux (int a)\n+{\n+ return baz (a + 1, ^^a, parameters_of (^^qux)[0],\n+ // TODO: This doesn't work yet, I think we want to check\n+ // whether DECL_CONTEXT of the PARM_DECL is current_function_decl\n+ // or any of the ctx->call->fundef->decl on the constexpr evaluation\n+ // stack. But currently we only have access to the innermost.\n+\t // variable_of (parameters_of (^^qux)[0]));\n+\t ^^a);\n+}\n+\n+static_assert (qux (42));\ndiff --git a/gcc/testsuite/g++.dg/reflect/variable_of2.C b/gcc/testsuite/g++.dg/reflect/variable_of2.C\nnew file mode 100644\nindex 00000000000..0a55f696a0f\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/variable_of2.C\n@@ -0,0 +1,21 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::variable_of.\n+\n+#include <meta>\n+\n+using namespace std::meta;\n+\n+consteval int fn(int p) {\n+ constexpr auto rp = parameters_of(^^fn)[0];\n+ constexpr auto rv = variable_of(rp);\n+ static_assert(is_function_parameter(rp));\n+ static_assert(!is_function_parameter(rv));\n+ static_assert(!is_variable(rp));\n+ static_assert(is_variable(rv));\n+ static_assert(^^p == rv);\n+\n+ return [:variable_of(parameters_of(^^fn)[0]):];\n+}\n+\n+static_assert(fn(42) == 42);\ndiff --git a/gcc/testsuite/g++.dg/reflect/variable_of3.C b/gcc/testsuite/g++.dg/reflect/variable_of3.C\nnew file mode 100644\nindex 00000000000..9b16346bdf8\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/variable_of3.C\n@@ -0,0 +1,28 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::variable_of.\n+\n+#include <meta>\n+#include <utility>\n+\n+using namespace std::meta;\n+\n+constexpr int fn(int, int) {\n+ return [: variable_of (parameters_of (^^fn)[0]) :]\n+ + [: variable_of (parameters_of (^^fn)[1]) :];\n+}\n+\n+static_assert(fn(10, 32) == 42);\n+\n+template<typename... Args>\n+constexpr int bar(Args...)\n+{\n+ constexpr int vt[] {__integer_pack (sizeof...(Args))...};\n+ constexpr auto [...ids] = vt;\n+ return (0 + ... + [: variable_of (parameters_of (^^bar<Args...>)[ids]) :]);\n+}\n+\n+static_assert(bar(42) == 42);\n+static_assert(bar(10, 32) == 42);\n+static_assert(bar(10, 15, 17) == 42);\n+static_assert(bar(10, 15, 11, 6) == 42);\ndiff --git a/gcc/testsuite/g++.dg/reflect/variant1.C b/gcc/testsuite/g++.dg/reflect/variant1.C\nnew file mode 100644\nindex 00000000000..a3cc066da67\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/variant1.C\n@@ -0,0 +1,37 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::variant_{size,alternative}.\n+\n+#include <meta>\n+#include <variant>\n+\n+using namespace std::meta;\n+\n+using V0 = std::variant<>;\n+static_assert (variant_size (^^V0) == 0);\n+static_assert (variant_size (^^const V0) == 0);\n+\n+using V1 = std::variant<void *>;\n+static_assert (variant_size (^^V1) == 1);\n+static_assert (variant_size (^^const V1) == 1);\n+static_assert (variant_alternative (0, ^^V1) == ^^void *);\n+\n+using V4 = std::variant<long, long, void *, double>;\n+static_assert (variant_size (^^V4) == 4);\n+static_assert (variant_size (^^const V4) == 4);\n+static_assert (variant_alternative (0, ^^V4) == ^^long);\n+static_assert (variant_alternative (1, ^^V4) == ^^long);\n+static_assert (variant_alternative (2, ^^V4) == ^^void *);\n+static_assert (variant_alternative (3, ^^V4) == ^^double);\n+// cv-qualification on the variant type propagates to the extracted alternative type.\n+static_assert (variant_alternative (0, ^^const V4) == ^^const long);\n+static_assert (variant_alternative (1, ^^const V4) == ^^const long);\n+static_assert (variant_alternative (2, ^^const V4) == ^^void *const);\n+static_assert (variant_alternative (3, ^^const V4) == ^^const double);\n+\n+using mytype1 = float;\n+using mytype2 = mytype1 *;\n+using V2 = std::variant<mytype1, mytype2>;\n+static_assert (variant_size (^^V2) == 2);\n+static_assert (variant_alternative (0, ^^V2) == ^^float);\n+static_assert (variant_alternative (1, ^^V2) == ^^float *);\ndiff --git a/gcc/testsuite/g++.dg/reflect/variant2.C b/gcc/testsuite/g++.dg/reflect/variant2.C\nnew file mode 100644\nindex 00000000000..4570aa71c98\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/variant2.C\n@@ -0,0 +1,19 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::variant_{size,alternative}.\n+\n+#include <meta>\n+#include <variant>\n+\n+using namespace std::meta;\n+\n+constexpr auto s1 = variant_size (^^int); // { dg-error \"couldn't instantiate 'std::variant_size<int>'\" }\n+int x;\n+constexpr auto s2 = variant_size (^^x); // { dg-error \"uncaught exception\" }\n+\n+constexpr auto r1 = variant_alternative (0, ^^std::variant<>); // { dg-error \"uncaught exception\" }\n+constexpr auto r2 = variant_alternative (0, ^^int); // { dg-error \"uncaught exception\" }\n+constexpr auto r3 = variant_alternative (0, ^^x); // { dg-error \"uncaught exception\" }\n+\n+// { dg-error \"static assertion failed\" \"\" { target *-*-* } 0 }\n+// { dg-error \"pack index .0.\" \"\" { target *-*-* } 0 }\ndiff --git a/gcc/testsuite/g++.dg/reflect/vector1.C b/gcc/testsuite/g++.dg/reflect/vector1.C\nnew file mode 100644\nindex 00000000000..179a056fd3e\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/vector1.C\n@@ -0,0 +1,28 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::vector<std::meta::info>.\n+\n+#include <vector>\n+#include <meta>\n+\n+using namespace std::meta;\n+\n+void die ();\n+\n+consteval void\n+f ()\n+{\n+ constexpr auto e = std::vector<info>{^^int}[0];\n+ typename [:e:] i = 42;\n+ auto f = std::vector<info>{^^int}[0];\n+ std::vector<info> v1 = { ^^int };\n+ auto v2 = std::vector<info>{^^int};\n+ if (v1.size () != v2.size ())\n+ die ();\n+}\n+\n+void\n+g ()\n+{\n+ f ();\n+}\ndiff --git a/gcc/testsuite/g++.dg/reflect/visibility1.C b/gcc/testsuite/g++.dg/reflect/visibility1.C\nnew file mode 100644\nindex 00000000000..c47817b9b4e\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/visibility1.C\n@@ -0,0 +1,121 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection -O0\" }\n+\n+#include <meta>\n+\n+template <int N, std::meta::info I>\n+void\n+foo ()\n+{\n+}\n+\n+struct A {};\n+\n+namespace\n+{\n+ void baz (int) {}\n+ struct B {};\n+ struct C : public A {};\n+ template <typename T>\n+ struct G {};\n+}\n+\n+struct D : public B {};\n+\n+template <typename T>\n+struct F {};\n+\n+struct H : public A {};\n+\n+static union { int au; };\n+int b;\n+static int c;\n+\n+constexpr auto ctx = std::meta::access_context::current ();\n+\n+static void\n+bar (int x)\n+{\n+ int v = 42;\n+ foo <100, ^^x> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi100EL\" } } - var in TU-local fn\n+ foo <101, ^^v> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi101EL\" } } - var in TU-local fn\n+ foo <102, parameters_of (^^baz)[0]> ();\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi102EL\" } } - param of TU-local fn\n+ foo <103, bases_of (^^C, ctx)[0]> ();\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi103EL\" } } - direct base relationship with TU-local derived\n+ foo <104, bases_of (^^D, ctx)[0]> ();\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi104EL\" } } - direct base relationship with TU-local base\n+ foo <105, data_member_spec (^^B, { .name = \"foo\" })> (); // { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi105EL\" } } - data member spec with TU-local type\n+}\n+\n+inline void\n+qux (int x)\n+{\n+ int v = 42;\n+ foo <106, ^^x> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi106EL\" } } - var in inline fn - TODO, shall this be exported?\n+ foo <107, ^^v> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi107EL\" } } - var in inline fn - TODO, shall this be exported?\n+}\n+\n+template <int N>\n+void\n+plugh (int x)\n+{\n+ int v = 42;\n+ foo <132, ^^x> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi132EL\" } } - var in public fn template instantiation - TODO, shall this be exported?\n+ foo <133, ^^v> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi133EL\" } } - var in public fn template instantiation - TODO, shall this be exported?\n+ foo <134, parameters_of (parent_of (^^v))[0]> (); // { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi134EL\" { target *-*-linux* } } } - fn parm of public fn template instantiation\n+}\n+\n+namespace {\n+template <int N>\n+void\n+garply (int x)\n+{\n+ int v = 42;\n+ foo <135, ^^x> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi135EL\" } } - var in TU-local fn template instantiation\n+ foo <136, ^^v> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi136EL\" } } - var in Tu-local fn template instantiation\n+ foo <137, parameters_of (parent_of (^^v))[0]> (); // { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi137EL\" } } - fn parm of TU-local fn template instantiation\n+}\n+}\n+\n+template <typename T>\n+void\n+fred (int x)\n+{\n+ int v = 42;\n+ foo <138, ^^x> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi138EL\" } } - var in TU-local fn template instantiation\n+ foo <139, ^^v> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi139EL\" } } - var in Tu-local fn template instantiation\n+ foo <140, parameters_of (parent_of (^^v))[0]> (); // { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi140EL\" { xfail *-*-* } } } - fn parm of TU-local fn template instantiation - TODO, I think this shouldn't be exported and the mangling of these 3 doesn't include the template parameter\n+}\n+\n+[[=1]] void\n+xyzzy (int x)\n+{\n+ int v;\n+ struct E {};\n+ qux (x);\n+ foo <108, annotations_of (^^xyzzy)[0]> ();\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi108EL\" } } - annotations always TU-local\n+ foo <109, parameters_of (^^bar)[0]> ();\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi109EL\" } } - fn parm of TU-local fn\n+ foo <110, parameters_of (^^qux)[0]> ();\t// { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi110EL\" { target *-*-linux* } } } - fn parm of inline fn\n+ foo <111, parameters_of (^^xyzzy)[0]> ();\t// { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi111EL\" { target *-*-linux* } } } - fn parm of public fn\n+ foo <112, ^^B> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi112EL\" } } - TU-local class\n+ foo <113, ^^C> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi113EL\" } } - TU-local class\n+ foo <114, ^^D> ();\t\t\t\t// { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi114EL\" { target *-*-linux* } } } - public class\n+ foo <115, ^^E> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi115EL\" } } - TU-local class\n+ foo <116, ^^au> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi116EL\" } } - anon union var at namespace scope\n+ foo <117, ^^F> ();\t\t\t\t// { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi117EL\" { target *-*-linux* } } } - public template\n+ foo <118, ^^F <int>> ();\t\t\t// { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi118EL\" { target *-*-linux* } } } - specialization of public template\n+ foo <119, ^^F <A>> ();\t\t\t// { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi119EL\" { target *-*-linux* } } } - specialization of public template\n+ foo <120, ^^F <B>> ();\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi120EL\" } } - specialization with TU-local parameter\n+ foo <121, ^^G> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi121EL\" } } - TU-local template\n+ foo <122, ^^G <int>> ();\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi122EL\" } } - specialization of TU-local template\n+ foo <123, ^^G <A>> ();\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi123EL\" } } - specialization of TU-local template\n+ foo <124, ^^G <B>> ();\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi124EL\" } } - specialization of TU-local template\n+ foo <125, ^^x> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi125EL\" } } - var in public fn but non-comdat - TODO, shall this be exported?\n+ foo <126, ^^v> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi126EL\" } } - var in public fn but non-comdat - TODO, shall this be exported?\n+ foo <127, std::meta::info {}> ();\t\t// { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi127EL\" { target *-*-linux* } } } - null reflection\n+ foo <128, ^^b> ();\t\t\t\t// { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi128EL\" { target *-*-linux* } } } - public variable\n+ foo <129, ^^c> ();\t\t\t\t// { dg-final { scan-assembler-not \"\\t.weak\\t_Z3fooILi129EL\" } } - TU-local variable\n+ foo <130, data_member_spec (^^D, { .name = \"foo\" })> (); // { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi130EL\" { target *-*-linux* } } } - data member spec with public type\n+ foo <131, bases_of (^^H, ctx)[0]> ();\t\t// { dg-final { scan-assembler \"\\t.weak\\t_Z3fooILi131EL\" { target *-*-linux* } } } - direct base relationship with both types public\n+ plugh <42> (x);\n+ garply <42> (x);\n+ fred <B> (x);\n+}\n", "prefixes": [ "9/9", "v2" ] }