@@ -1609,7 +1609,12 @@ struct CStructNoUniqueAddress2 {
1609
1609
[[no_unique_address]] int two;
1610
1610
};
1611
1611
1612
- struct CStructAlignment {
1612
+ struct alignas (64 ) CStructAlignment {
1613
+ int one;
1614
+ int two;
1615
+ };
1616
+
1617
+ struct CStructAlignedMembers {
1613
1618
int one;
1614
1619
alignas (16 ) int two;
1615
1620
};
@@ -1711,13 +1716,17 @@ void is_layout_compatible(int n)
1711
1716
{
1712
1717
static_assert (__is_layout_compatible (void , void ), " " );
1713
1718
static_assert (!__is_layout_compatible (void , int ), " " );
1714
- static_assert (! __is_layout_compatible (void , const void ), " " ); // FIXME: this is CWG1719
1715
- static_assert (! __is_layout_compatible (void , volatile void ), " " ); // FIXME: this is CWG1719
1716
- static_assert (! __is_layout_compatible (const int , volatile int ), " " ); // FIXME: this is CWG1719
1719
+ static_assert (__is_layout_compatible (void , const void ), " " );
1720
+ static_assert (__is_layout_compatible (void , volatile void ), " " );
1721
+ static_assert (__is_layout_compatible (const int , volatile int ), " " );
1717
1722
static_assert (__is_layout_compatible (int , int ), " " );
1718
- static_assert (!__is_layout_compatible (int , const int ), " " ); // FIXME: this is CWG1719
1719
- static_assert (!__is_layout_compatible (int , volatile int ), " " ); // FIXME: this is CWG1719
1720
- static_assert (!__is_layout_compatible (const int , volatile int ), " " ); // FIXME: this is CWG1719
1723
+ static_assert (__is_layout_compatible (int , const int ), " " );
1724
+ static_assert (__is_layout_compatible (int , volatile int ), " " );
1725
+ static_assert (__is_layout_compatible (const int , volatile int ), " " );
1726
+ static_assert (__is_layout_compatible (int *, int * __restrict), " " );
1727
+ // Note: atomic qualification matters for layout compatibility.
1728
+ static_assert (!__is_layout_compatible (int , _Atomic int ), " " );
1729
+ static_assert (__is_layout_compatible (_Atomic (int ), _Atomic int ), " " );
1721
1730
static_assert (!__is_layout_compatible (int , unsigned int ), " " );
1722
1731
static_assert (!__is_layout_compatible (char , unsigned char ), " " );
1723
1732
static_assert (!__is_layout_compatible (char , signed char ), " " );
@@ -1758,10 +1767,11 @@ void is_layout_compatible(int n)
1758
1767
static_assert (!__is_layout_compatible (CppStructNonStandardByVirtBase, CppStructNonStandardByVirtBase2), " " );
1759
1768
static_assert (!__is_layout_compatible (CppStructNonStandardBySameBase, CppStructNonStandardBySameBase2), " " );
1760
1769
static_assert (!__is_layout_compatible (CppStructNonStandardBy2ndVirtBase, CppStructNonStandardBy2ndVirtBase2), " " );
1761
- static_assert (! __is_layout_compatible (CStruct, CStructWithQualifiers), " " ); // FIXME: this is CWG1719
1770
+ static_assert (__is_layout_compatible (CStruct, CStructWithQualifiers), " " );
1762
1771
static_assert (__is_layout_compatible (CStruct, CStructNoUniqueAddress) == bool (__has_cpp_attribute (no_unique_address)), " " ); // FIXME: this is CWG2759
1763
1772
static_assert (__is_layout_compatible (CStructNoUniqueAddress, CStructNoUniqueAddress2) == bool (__has_cpp_attribute (no_unique_address)), " " ); // FIXME: this is CWG2759
1764
1773
static_assert (__is_layout_compatible (CStruct, CStructAlignment), " " );
1774
+ static_assert (__is_layout_compatible (CStruct, CStructAlignedMembers), " " ); // FIXME: alignment of members impact common initial sequence
1765
1775
static_assert (__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds), " " );
1766
1776
static_assert (__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds2), " " );
1767
1777
static_assert (!__is_layout_compatible (CStructWithBitfelds, CStructWithBitfelds3), " " );
0 commit comments