@@ -1740,7 +1740,7 @@ void is_layout_compatible(int n)
1740
1740
static_assert(!__is_layout_compatible(void, int));
1741
1741
static_assert(__is_layout_compatible(void, const void));
1742
1742
static_assert(__is_layout_compatible(void, volatile void));
1743
- static_assert(__is_layout_compatible(const int , volatile int ));
1743
+ static_assert(__is_layout_compatible(const void , volatile void ));
1744
1744
static_assert(__is_layout_compatible(int, int));
1745
1745
static_assert(__is_layout_compatible(int, const int));
1746
1746
static_assert(__is_layout_compatible(int, volatile int));
@@ -1839,6 +1839,95 @@ void is_layout_compatible(int n)
1839
1839
static_assert(!__is_layout_compatible(EnumClassForward, int));
1840
1840
}
1841
1841
1842
+ namespace IPIBO {
1843
+ struct Base {};
1844
+ struct Base2 {};
1845
+ struct Base3 : Base {};
1846
+ struct Base3Virtual : virtual Base {};
1847
+ struct Derived : Base {};
1848
+ struct DerivedIndirect : Base3 {};
1849
+ struct DerivedMultiple : Base, Base2 {};
1850
+ struct DerivedAmbiguous : Base, Base3 {};
1851
+ /* expected-warning@-1 {{direct base 'Base' is inaccessible due to ambiguity:
1852
+ struct IPIBO::DerivedAmbiguous -> Base
1853
+ struct IPIBO::DerivedAmbiguous -> Base3 -> Base}} */
1854
+ struct DerivedPrivate : private Base {};
1855
+ struct DerivedVirtual : virtual Base {};
1856
+
1857
+ union Union {};
1858
+ union UnionIncomplete;
1859
+ struct StructIncomplete; // #StructIncomplete
1860
+
1861
+ void is_pointer_interconvertible_base_of(int n)
1862
+ {
1863
+ static_assert(__is_pointer_interconvertible_base_of(Base, Derived));
1864
+ static_assert(!__is_pointer_interconvertible_base_of(Base2, Derived));
1865
+ static_assert(__is_pointer_interconvertible_base_of(Base, DerivedIndirect));
1866
+ static_assert(__is_pointer_interconvertible_base_of(Base, DerivedMultiple));
1867
+ static_assert(!__is_pointer_interconvertible_base_of(Base3, DerivedMultiple));
1868
+ static_assert(!__is_pointer_interconvertible_base_of(Base, DerivedAmbiguous));
1869
+ static_assert(__is_pointer_interconvertible_base_of(Base, DerivedPrivate));
1870
+ static_assert(!__is_pointer_interconvertible_base_of(Base, DerivedVirtual));
1871
+ static_assert(!__is_pointer_interconvertible_base_of(Union, Union));
1872
+ static_assert(!__is_pointer_interconvertible_base_of(UnionIncomplete, UnionIncomplete));
1873
+ static_assert(__is_pointer_interconvertible_base_of(StructIncomplete, StructIncomplete));
1874
+ static_assert(__is_pointer_interconvertible_base_of(StructIncomplete, const StructIncomplete));
1875
+ static_assert(__is_pointer_interconvertible_base_of(StructIncomplete, volatile StructIncomplete));
1876
+ static_assert(__is_pointer_interconvertible_base_of(const StructIncomplete, volatile StructIncomplete));
1877
+ static_assert(!__is_pointer_interconvertible_base_of(StructIncomplete, Derived));
1878
+ static_assert(!__is_pointer_interconvertible_base_of(Base, StructIncomplete));
1879
+ // expected-error@-1 {{incomplete type 'StructIncomplete' where a complete type is required}}
1880
+ // expected-note@#StructIncomplete {{forward declaration of 'IPIBO::StructIncomplete'}}
1881
+ static_assert(!__is_pointer_interconvertible_base_of(CStruct2, CppStructNonStandardByBase2));
1882
+ static_assert(!__is_pointer_interconvertible_base_of(void, void));
1883
+ static_assert(!__is_pointer_interconvertible_base_of(void, int));
1884
+ static_assert(!__is_pointer_interconvertible_base_of(void, const void));
1885
+ static_assert(!__is_pointer_interconvertible_base_of(void, volatile void));
1886
+ static_assert(!__is_pointer_interconvertible_base_of(const void, volatile void));
1887
+ static_assert(!__is_pointer_interconvertible_base_of(int, int));
1888
+ static_assert(!__is_pointer_interconvertible_base_of(int, const int));
1889
+ static_assert(!__is_pointer_interconvertible_base_of(int, volatile int));
1890
+ static_assert(!__is_pointer_interconvertible_base_of(const int, volatile int));
1891
+ static_assert(!__is_pointer_interconvertible_base_of(int *, int * __restrict));
1892
+ static_assert(!__is_pointer_interconvertible_base_of(int, _Atomic int));
1893
+ static_assert(!__is_pointer_interconvertible_base_of(_Atomic(int), _Atomic int));
1894
+ static_assert(!__is_pointer_interconvertible_base_of(int, unsigned int));
1895
+ static_assert(!__is_pointer_interconvertible_base_of(char, unsigned char));
1896
+ static_assert(!__is_pointer_interconvertible_base_of(char, signed char));
1897
+ static_assert(!__is_pointer_interconvertible_base_of(unsigned char, signed char));
1898
+ using function_type = void();
1899
+ using function_type2 = void(char);
1900
+ static_assert(!__is_pointer_interconvertible_base_of(const function_type, const function_type));
1901
+ // expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}
1902
+ // expected-warning@-2 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}
1903
+ static_assert(!__is_pointer_interconvertible_base_of(function_type, const function_type));
1904
+ // expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}
1905
+ static_assert(!__is_pointer_interconvertible_base_of(const function_type, const function_type2));
1906
+ // expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}
1907
+ // expected-warning@-2 {{'const' qualifier on function type 'function_type2' (aka 'void (char)') has no effect}}
1908
+ static_assert(!__is_pointer_interconvertible_base_of(int CStruct2::*, int CStruct2::*));
1909
+ static_assert(!__is_pointer_interconvertible_base_of(int CStruct2::*, char CStruct2::*));
1910
+ static_assert(!__is_pointer_interconvertible_base_of(void(CStruct2::*)(int), void(CStruct2::*)(int)));
1911
+ static_assert(!__is_pointer_interconvertible_base_of(void(CStruct2::*)(int), void(CStruct2::*)(char)));
1912
+ static_assert(!__is_pointer_interconvertible_base_of(int[], int[]));
1913
+ static_assert(!__is_pointer_interconvertible_base_of(int[], double[]));
1914
+ static_assert(!__is_pointer_interconvertible_base_of(int[2], int[2]));
1915
+ static_assert(!__is_pointer_interconvertible_base_of(int[n], int[2]));
1916
+ // expected-error@-1 {{variable length arrays are not supported in '__is_pointer_interconvertible_base_of'}}
1917
+ static_assert(!__is_pointer_interconvertible_base_of(int[n], int[n]));
1918
+ // expected-error@-1 {{variable length arrays are not supported in '__is_pointer_interconvertible_base_of'}}
1919
+ // expected-error@-2 {{variable length arrays are not supported in '__is_pointer_interconvertible_base_of'}}
1920
+ static_assert(!__is_pointer_interconvertible_base_of(int&, int&));
1921
+ static_assert(!__is_pointer_interconvertible_base_of(int&, char&));
1922
+ static_assert(!__is_pointer_interconvertible_base_of(void(int), void(int)));
1923
+ static_assert(!__is_pointer_interconvertible_base_of(void(int), void(char)));
1924
+ static_assert(!__is_pointer_interconvertible_base_of(void(&)(int), void(&)(int)));
1925
+ static_assert(!__is_pointer_interconvertible_base_of(void(&)(int), void(&)(char)));
1926
+ static_assert(!__is_pointer_interconvertible_base_of(void(*)(int), void(*)(int)));
1927
+ static_assert(!__is_pointer_interconvertible_base_of(void(*)(int), void(*)(char)));
1928
+ }
1929
+ }
1930
+
1842
1931
void is_signed()
1843
1932
{
1844
1933
//static_assert(__is_signed(char));
0 commit comments