@@ -1722,91 +1722,91 @@ struct StructWithAnonUnion3 {
1722
1722
1723
1723
void is_layout_compatible (int n)
1724
1724
{
1725
- static_assert (__is_layout_compatible (void , void ), " " );
1726
- static_assert (!__is_layout_compatible (void , int ), " " );
1727
- static_assert (__is_layout_compatible (void , const void ), " " );
1728
- static_assert (__is_layout_compatible (void , volatile void ), " " );
1729
- static_assert (__is_layout_compatible (const int , volatile int ), " " );
1730
- static_assert (__is_layout_compatible (int , int ), " " );
1731
- static_assert (__is_layout_compatible (int , const int ), " " );
1732
- static_assert (__is_layout_compatible (int , volatile int ), " " );
1733
- static_assert (__is_layout_compatible (const int , volatile int ), " " );
1734
- static_assert (__is_layout_compatible (int *, int * __restrict), " " );
1725
+ static_assert (__is_layout_compatible (void , void ));
1726
+ static_assert (!__is_layout_compatible (void , int ));
1727
+ static_assert (__is_layout_compatible (void , const void ));
1728
+ static_assert (__is_layout_compatible (void , volatile void ));
1729
+ static_assert (__is_layout_compatible (const int , volatile int ));
1730
+ static_assert (__is_layout_compatible (int , int ));
1731
+ static_assert (__is_layout_compatible (int , const int ));
1732
+ static_assert (__is_layout_compatible (int , volatile int ));
1733
+ static_assert (__is_layout_compatible (const int , volatile int ));
1734
+ static_assert (__is_layout_compatible (int *, int * __restrict));
1735
1735
// Note: atomic qualification matters for layout compatibility.
1736
- static_assert (!__is_layout_compatible (int , _Atomic int ), " " );
1737
- static_assert (__is_layout_compatible (_Atomic (int ), _Atomic int ), " " );
1738
- static_assert (!__is_layout_compatible (int , unsigned int ), " " );
1739
- static_assert (!__is_layout_compatible (char , unsigned char ), " " );
1740
- static_assert (!__is_layout_compatible (char , signed char ), " " );
1741
- static_assert (!__is_layout_compatible (unsigned char , signed char ), " " );
1742
- static_assert (__is_layout_compatible (int [], int []), " " );
1743
- static_assert (__is_layout_compatible (int [2 ], int [2 ]), " " );
1744
- static_assert (!__is_layout_compatible (int [n], int [2 ]), " " ); // FIXME: VLAs should be rejected
1745
- static_assert (!__is_layout_compatible (int [n], int [n]), " " ); // FIXME: VLAs should be rejected
1746
- static_assert (__is_layout_compatible (int &, int &), " " );
1747
- static_assert (!__is_layout_compatible (int &, char &), " " );
1748
- static_assert (__is_layout_compatible (void (int ), void (int )), " " );
1749
- static_assert (!__is_layout_compatible (void (int ), void (char )), " " );
1750
- static_assert (__is_layout_compatible (void (&)(int ), void (&)(int )), " " );
1751
- static_assert (!__is_layout_compatible (void (&)(int ), void (&)(char )), " " );
1752
- static_assert (__is_layout_compatible (void (*)(int ), void (*)(int )), " " );
1753
- static_assert (!__is_layout_compatible (void (*)(int ), void (*)(char )), " " );
1736
+ static_assert (!__is_layout_compatible (int , _Atomic int ));
1737
+ static_assert (__is_layout_compatible (_Atomic (int ), _Atomic int ));
1738
+ static_assert (!__is_layout_compatible (int , unsigned int ));
1739
+ static_assert (!__is_layout_compatible (char , unsigned char ));
1740
+ static_assert (!__is_layout_compatible (char , signed char ));
1741
+ static_assert (!__is_layout_compatible (unsigned char , signed char ));
1742
+ static_assert (__is_layout_compatible (int [], int []));
1743
+ static_assert (__is_layout_compatible (int [2 ], int [2 ]));
1744
+ static_assert (!__is_layout_compatible (int [n], int [2 ])); // FIXME: VLAs should be rejected
1745
+ static_assert (!__is_layout_compatible (int [n], int [n])); // FIXME: VLAs should be rejected
1746
+ static_assert (__is_layout_compatible (int &, int &));
1747
+ static_assert (!__is_layout_compatible (int &, char &));
1748
+ static_assert (__is_layout_compatible (void (int ), void (int )));
1749
+ static_assert (!__is_layout_compatible (void (int ), void (char )));
1750
+ static_assert (__is_layout_compatible (void (&)(int ), void (&)(int )));
1751
+ static_assert (!__is_layout_compatible (void (&)(int ), void (&)(char )));
1752
+ static_assert (__is_layout_compatible (void (*)(int ), void (*)(int )));
1753
+ static_assert (!__is_layout_compatible (void (*)(int ), void (*)(char )));
1754
1754
using function_type = void ();
1755
1755
using function_type2 = void (char );
1756
- static_assert (__is_layout_compatible (const function_type, const function_type), " " );
1756
+ static_assert (__is_layout_compatible (const function_type, const function_type));
1757
1757
// expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}
1758
1758
// expected-warning@-2 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}
1759
- static_assert (__is_layout_compatible (function_type, const function_type), " " );
1759
+ static_assert (__is_layout_compatible (function_type, const function_type));
1760
1760
// expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}
1761
- static_assert (!__is_layout_compatible (const function_type, const function_type2), " " );
1761
+ static_assert (!__is_layout_compatible (const function_type, const function_type2));
1762
1762
// expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}
1763
1763
// expected-warning@-2 {{'const' qualifier on function type 'function_type2' (aka 'void (char)') has no effect}}
1764
- static_assert (__is_layout_compatible (CStruct, CStruct2), " " );
1765
- static_assert (__is_layout_compatible (CStruct, const CStruct2), " " );
1766
- static_assert (__is_layout_compatible (CStruct, volatile CStruct2), " " );
1767
- static_assert (__is_layout_compatible (const CStruct, volatile CStruct2), " " );
1768
- static_assert (__is_layout_compatible (CEmptyStruct, CEmptyStruct2), " " );
1769
- static_assert (__is_layout_compatible (CppEmptyStruct, CppEmptyStruct2), " " );
1770
- static_assert (__is_layout_compatible (CppStructStandard, CppStructStandard2), " " );
1771
- static_assert (!__is_layout_compatible (CppStructNonStandardByBase, CppStructNonStandardByBase2), " " );
1772
- static_assert (!__is_layout_compatible (CppStructNonStandardByVirt, CppStructNonStandardByVirt2), " " );
1773
- static_assert (!__is_layout_compatible (CppStructNonStandardByMemb, CppStructNonStandardByMemb2), " " );
1774
- static_assert (!__is_layout_compatible (CppStructNonStandardByProt, CppStructNonStandardByProt2), " " );
1775
- static_assert (!__is_layout_compatible (CppStructNonStandardByVirtBase, CppStructNonStandardByVirtBase2), " " );
1776
- static_assert (!__is_layout_compatible (CppStructNonStandardBySameBase, CppStructNonStandardBySameBase2), " " );
1777
- static_assert (!__is_layout_compatible (CppStructNonStandardBy2ndVirtBase, CppStructNonStandardBy2ndVirtBase2), " " );
1778
- static_assert (__is_layout_compatible (CStruct, CStructWithQualifiers), " " );
1779
- static_assert (__is_layout_compatible (CStruct, CStructNoUniqueAddress) != bool (__has_cpp_attribute (no_unique_address)), " " );
1780
- static_assert (__is_layout_compatible (CStructNoUniqueAddress, CStructNoUniqueAddress2) != bool (__has_cpp_attribute (no_unique_address)), " " );
1781
- static_assert (__is_layout_compatible (CStruct, CStructAlignment), " " );
1782
- static_assert (!__is_layout_compatible (CStruct, CStructAlignedMembers), " " );
1783
- static_assert (__is_layout_compatible (UnionNoOveralignedMembers, UnionWithOveralignedMembers), " " );
1784
- static_assert (__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds), " " );
1785
- static_assert (__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds2), " " );
1786
- static_assert (!__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds3), " " );
1787
- static_assert (!__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds4), " " );
1788
- static_assert (__is_layout_compatible (int CStruct2::*, int CStruct2::*), " " );
1789
- static_assert (!__is_layout_compatible (int CStruct2::*, char CStruct2::*), " " );
1790
- static_assert (__is_layout_compatible (void (CStruct2::*)(int ), void (CStruct2::*)(int )), " " );
1791
- static_assert (!__is_layout_compatible (void (CStruct2::*)(int ), void (CStruct2::*)(char )), " " );
1792
- static_assert (__is_layout_compatible (CStructNested, CStructNested2), " " );
1793
- static_assert (__is_layout_compatible (UnionLayout, UnionLayout), " " );
1794
- static_assert (!__is_layout_compatible (UnionLayout, UnionLayout2), " " );
1795
- static_assert (!__is_layout_compatible (UnionLayout, UnionLayout3), " " );
1796
- static_assert (!__is_layout_compatible (StructWithAnonUnion, StructWithAnonUnion2), " " );
1797
- static_assert (!__is_layout_compatible (StructWithAnonUnion, StructWithAnonUnion3), " " );
1798
- static_assert (__is_layout_compatible (EnumLayout, EnumClassLayout), " " );
1799
- static_assert (__is_layout_compatible (EnumForward, EnumForward), " " );
1800
- static_assert (__is_layout_compatible (EnumForward, EnumClassForward), " " );
1764
+ static_assert (__is_layout_compatible (CStruct, CStruct2));
1765
+ static_assert (__is_layout_compatible (CStruct, const CStruct2));
1766
+ static_assert (__is_layout_compatible (CStruct, volatile CStruct2));
1767
+ static_assert (__is_layout_compatible (const CStruct, volatile CStruct2));
1768
+ static_assert (__is_layout_compatible (CEmptyStruct, CEmptyStruct2));
1769
+ static_assert (__is_layout_compatible (CppEmptyStruct, CppEmptyStruct2));
1770
+ static_assert (__is_layout_compatible (CppStructStandard, CppStructStandard2));
1771
+ static_assert (!__is_layout_compatible (CppStructNonStandardByBase, CppStructNonStandardByBase2));
1772
+ static_assert (!__is_layout_compatible (CppStructNonStandardByVirt, CppStructNonStandardByVirt2));
1773
+ static_assert (!__is_layout_compatible (CppStructNonStandardByMemb, CppStructNonStandardByMemb2));
1774
+ static_assert (!__is_layout_compatible (CppStructNonStandardByProt, CppStructNonStandardByProt2));
1775
+ static_assert (!__is_layout_compatible (CppStructNonStandardByVirtBase, CppStructNonStandardByVirtBase2));
1776
+ static_assert (!__is_layout_compatible (CppStructNonStandardBySameBase, CppStructNonStandardBySameBase2));
1777
+ static_assert (!__is_layout_compatible (CppStructNonStandardBy2ndVirtBase, CppStructNonStandardBy2ndVirtBase2));
1778
+ static_assert (__is_layout_compatible (CStruct, CStructWithQualifiers));
1779
+ static_assert (__is_layout_compatible (CStruct, CStructNoUniqueAddress) != bool (__has_cpp_attribute (no_unique_address)));
1780
+ static_assert (__is_layout_compatible (CStructNoUniqueAddress, CStructNoUniqueAddress2) != bool (__has_cpp_attribute (no_unique_address)));
1781
+ static_assert (__is_layout_compatible (CStruct, CStructAlignment));
1782
+ static_assert (!__is_layout_compatible (CStruct, CStructAlignedMembers));
1783
+ static_assert (__is_layout_compatible (UnionNoOveralignedMembers, UnionWithOveralignedMembers));
1784
+ static_assert (__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds));
1785
+ static_assert (__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds2));
1786
+ static_assert (!__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds3));
1787
+ static_assert (!__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds4));
1788
+ static_assert (__is_layout_compatible (int CStruct2::*, int CStruct2::*));
1789
+ static_assert (!__is_layout_compatible (int CStruct2::*, char CStruct2::*));
1790
+ static_assert (__is_layout_compatible (void (CStruct2::*)(int ), void (CStruct2::*)(int )));
1791
+ static_assert (!__is_layout_compatible (void (CStruct2::*)(int ), void (CStruct2::*)(char )));
1792
+ static_assert (__is_layout_compatible (CStructNested, CStructNested2));
1793
+ static_assert (__is_layout_compatible (UnionLayout, UnionLayout));
1794
+ static_assert (!__is_layout_compatible (UnionLayout, UnionLayout2));
1795
+ static_assert (!__is_layout_compatible (UnionLayout, UnionLayout3));
1796
+ static_assert (!__is_layout_compatible (StructWithAnonUnion, StructWithAnonUnion2));
1797
+ static_assert (!__is_layout_compatible (StructWithAnonUnion, StructWithAnonUnion3));
1798
+ static_assert (__is_layout_compatible (EnumLayout, EnumClassLayout));
1799
+ static_assert (__is_layout_compatible (EnumForward, EnumForward));
1800
+ static_assert (__is_layout_compatible (EnumForward, EnumClassForward));
1801
1801
// Layout compatibility for enums might be relaxed in the future. See https://github.com/cplusplus/CWG/issues/39#issuecomment-1184791364
1802
- static_assert (!__is_layout_compatible (EnumLayout, int ), " " );
1803
- static_assert (!__is_layout_compatible (EnumClassLayout, int ), " " );
1804
- static_assert (!__is_layout_compatible (EnumForward, int ), " " );
1805
- static_assert (!__is_layout_compatible (EnumClassForward, int ), " " );
1802
+ static_assert (!__is_layout_compatible (EnumLayout, int ));
1803
+ static_assert (!__is_layout_compatible (EnumClassLayout, int ));
1804
+ static_assert (!__is_layout_compatible (EnumForward, int ));
1805
+ static_assert (!__is_layout_compatible (EnumClassForward, int ));
1806
1806
// FIXME: the following should be rejected (array of unknown bound and void are the only allowed incomplete types)
1807
- static_assert (__is_layout_compatible (CStructIncomplete, CStructIncomplete), " " );
1808
- static_assert (!__is_layout_compatible (CStruct, CStructIncomplete), " " );
1809
- static_assert (__is_layout_compatible (CStructIncomplete[2 ], CStructIncomplete[2 ]), " " );
1807
+ static_assert (__is_layout_compatible (CStructIncomplete, CStructIncomplete));
1808
+ static_assert (!__is_layout_compatible (CStruct, CStructIncomplete));
1809
+ static_assert (__is_layout_compatible (CStructIncomplete[2 ], CStructIncomplete[2 ]));
1810
1810
}
1811
1811
1812
1812
void is_signed ()
@@ -3340,6 +3340,8 @@ namespace is_trivially_relocatable {
3340
3340
static_assert (!__is_trivially_relocatable(void ));
3341
3341
static_assert (__is_trivially_relocatable(int ));
3342
3342
static_assert (__is_trivially_relocatable(int []));
3343
+ static_assert (__is_trivially_relocatable(const int ));
3344
+ static_assert (__is_trivially_relocatable(volatile int ));
3343
3345
3344
3346
enum Enum {};
3345
3347
static_assert (__is_trivially_relocatable(Enum));
@@ -3351,7 +3353,28 @@ static_assert(__is_trivially_relocatable(Union[]));
3351
3353
3352
3354
struct Trivial {};
3353
3355
static_assert (__is_trivially_relocatable(Trivial));
3356
+ static_assert (__is_trivially_relocatable(const Trivial));
3357
+ static_assert (__is_trivially_relocatable(volatile Trivial));
3358
+
3354
3359
static_assert (__is_trivially_relocatable(Trivial[]));
3360
+ static_assert (__is_trivially_relocatable(const Trivial[]));
3361
+ static_assert (__is_trivially_relocatable(volatile Trivial[]));
3362
+
3363
+ static_assert (__is_trivially_relocatable(int [10 ]));
3364
+ static_assert (__is_trivially_relocatable(const int [10 ]));
3365
+ static_assert (__is_trivially_relocatable(volatile int [10 ]));
3366
+
3367
+ static_assert (__is_trivially_relocatable(int [10 ][10 ]));
3368
+ static_assert (__is_trivially_relocatable(const int [10 ][10 ]));
3369
+ static_assert (__is_trivially_relocatable(volatile int [10 ][10 ]));
3370
+
3371
+ static_assert (__is_trivially_relocatable(int []));
3372
+ static_assert (__is_trivially_relocatable(const int []));
3373
+ static_assert (__is_trivially_relocatable(volatile int []));
3374
+
3375
+ static_assert (__is_trivially_relocatable(int [][10 ]));
3376
+ static_assert (__is_trivially_relocatable(const int [][10 ]));
3377
+ static_assert (__is_trivially_relocatable(volatile int [][10 ]));
3355
3378
3356
3379
struct Incomplete ; // expected-note {{forward declaration of 'is_trivially_relocatable::Incomplete'}}
3357
3380
bool unused = __is_trivially_relocatable(Incomplete); // expected-error {{incomplete type}}
@@ -3361,6 +3384,8 @@ struct NontrivialDtor {
3361
3384
};
3362
3385
static_assert (!__is_trivially_relocatable(NontrivialDtor));
3363
3386
static_assert (!__is_trivially_relocatable(NontrivialDtor[]));
3387
+ static_assert (!__is_trivially_relocatable(const NontrivialDtor));
3388
+ static_assert (!__is_trivially_relocatable(volatile NontrivialDtor));
3364
3389
3365
3390
struct NontrivialCopyCtor {
3366
3391
NontrivialCopyCtor (const NontrivialCopyCtor&) {}
@@ -3379,12 +3404,16 @@ struct [[clang::trivial_abi]] TrivialAbiNontrivialDtor {
3379
3404
};
3380
3405
static_assert (__is_trivially_relocatable(TrivialAbiNontrivialDtor));
3381
3406
static_assert (__is_trivially_relocatable(TrivialAbiNontrivialDtor[]));
3407
+ static_assert (__is_trivially_relocatable(const TrivialAbiNontrivialDtor));
3408
+ static_assert (__is_trivially_relocatable(volatile TrivialAbiNontrivialDtor));
3382
3409
3383
3410
struct [[clang::trivial_abi]] TrivialAbiNontrivialCopyCtor {
3384
3411
TrivialAbiNontrivialCopyCtor (const TrivialAbiNontrivialCopyCtor&) {}
3385
3412
};
3386
3413
static_assert (__is_trivially_relocatable(TrivialAbiNontrivialCopyCtor));
3387
3414
static_assert (__is_trivially_relocatable(TrivialAbiNontrivialCopyCtor[]));
3415
+ static_assert (__is_trivially_relocatable(const TrivialAbiNontrivialCopyCtor));
3416
+ static_assert (__is_trivially_relocatable(volatile TrivialAbiNontrivialCopyCtor));
3388
3417
3389
3418
// A more complete set of tests for the behavior of trivial_abi can be found in
3390
3419
// clang/test/SemaCXX/attr-trivial-abi.cpp
@@ -3393,6 +3422,8 @@ struct [[clang::trivial_abi]] TrivialAbiNontrivialMoveCtor {
3393
3422
};
3394
3423
static_assert (__is_trivially_relocatable(TrivialAbiNontrivialMoveCtor));
3395
3424
static_assert (__is_trivially_relocatable(TrivialAbiNontrivialMoveCtor[]));
3425
+ static_assert (__is_trivially_relocatable(const TrivialAbiNontrivialMoveCtor));
3426
+ static_assert (__is_trivially_relocatable(volatile TrivialAbiNontrivialMoveCtor));
3396
3427
3397
3428
} // namespace is_trivially_relocatable
3398
3429
0 commit comments