@@ -18,7 +18,7 @@ enum class SignedEnumClass : signed int {};
1818enum class UnsignedEnumClass : unsigned int {};
1919struct POD { Enum e; int i; float f; NonPOD* p; };
2020struct Empty {};
21- struct IncompleteStruct ;
21+ struct IncompleteStruct ; // expected-note {{forward declaration of 'IncompleteStruct'}}
2222typedef Empty EmptyAr[10 ];
2323typedef Empty EmptyArNB[];
2424typedef Empty EmptyArMB[1 ][2 ];
@@ -1908,6 +1908,162 @@ void is_pointer_interconvertible_base_of(int n)
19081908}
19091909}
19101910
1911+ struct NoEligibleTrivialContructor {
1912+ NoEligibleTrivialContructor () {};
1913+ NoEligibleTrivialContructor (const NoEligibleTrivialContructor&) {}
1914+ NoEligibleTrivialContructor (NoEligibleTrivialContructor&&) {}
1915+ };
1916+
1917+ struct OnlyDefaultConstructorIsTrivial {
1918+ OnlyDefaultConstructorIsTrivial () = default ;
1919+ OnlyDefaultConstructorIsTrivial (const OnlyDefaultConstructorIsTrivial&) {}
1920+ OnlyDefaultConstructorIsTrivial (OnlyDefaultConstructorIsTrivial&&) {}
1921+ };
1922+
1923+ struct AllContstructorsAreTrivial {
1924+ AllContstructorsAreTrivial () = default ;
1925+ AllContstructorsAreTrivial (const AllContstructorsAreTrivial&) = default ;
1926+ AllContstructorsAreTrivial (AllContstructorsAreTrivial&&) = default ;
1927+ };
1928+
1929+ struct InheritedNoEligibleTrivialConstructor : NoEligibleTrivialContructor {
1930+ using NoEligibleTrivialContructor::NoEligibleTrivialContructor;
1931+ };
1932+
1933+ struct InheritedOnlyDefaultConstructorIsTrivial : OnlyDefaultConstructorIsTrivial {
1934+ using OnlyDefaultConstructorIsTrivial::OnlyDefaultConstructorIsTrivial;
1935+ };
1936+
1937+ struct InheritedAllContstructorsAreTrivial : AllContstructorsAreTrivial {
1938+ using AllContstructorsAreTrivial::AllContstructorsAreTrivial;
1939+ };
1940+
1941+ struct UserDeclaredDestructor {
1942+ ~UserDeclaredDestructor () = default ;
1943+ };
1944+
1945+ struct UserProvidedDestructor {
1946+ ~UserProvidedDestructor () {}
1947+ };
1948+
1949+ struct UserDeletedDestructorInAggregate {
1950+ ~UserDeletedDestructorInAggregate () = delete ;
1951+ };
1952+
1953+ struct UserDeletedDestructorInNonAggregate {
1954+ virtual void NonAggregate ();
1955+ ~UserDeletedDestructorInNonAggregate () = delete ;
1956+ };
1957+
1958+ struct DeletedDestructorViaBaseInAggregate : UserDeletedDestructorInAggregate {};
1959+ struct DeletedDestructorViaBaseInNonAggregate : UserDeletedDestructorInNonAggregate {};
1960+
1961+ #if __cplusplus >= 202002L
1962+ template <bool B>
1963+ struct ConstrainedUserDeclaredDefaultConstructor {
1964+ ConstrainedUserDeclaredDefaultConstructor () requires B = default ;
1965+ ConstrainedUserDeclaredDefaultConstructor (const ConstrainedUserDeclaredDefaultConstructor&) {}
1966+ };
1967+
1968+ template <bool B>
1969+ struct ConstrainedUserProvidedDestructor {
1970+ ~ConstrainedUserProvidedDestructor () = default ;
1971+ ~ConstrainedUserProvidedDestructor () requires B {}
1972+ };
1973+ #endif
1974+
1975+ struct StructWithFAM {
1976+ int a[];
1977+ };
1978+
1979+ struct StructWithZeroSizedArray {
1980+ int a[0 ];
1981+ };
1982+
1983+ typedef float float4 __attribute__ ((ext_vector_type(4 )));
1984+ typedef int *align_value_int __attribute__ ((align_value(16 )));
1985+
1986+ struct [[clang::enforce_read_only_placement]] EnforceReadOnlyPlacement {};
1987+ struct [[clang::type_visibility(" hidden" )]] TypeVisibility {};
1988+
1989+ void is_implicit_lifetime (int n) {
1990+ static_assert (__builtin_is_implicit_lifetime (decltype (nullptr )));
1991+ static_assert (!__builtin_is_implicit_lifetime (void ));
1992+ static_assert (!__builtin_is_implicit_lifetime (const void ));
1993+ static_assert (!__builtin_is_implicit_lifetime (volatile void ));
1994+ static_assert (__builtin_is_implicit_lifetime (int ));
1995+ static_assert (!__builtin_is_implicit_lifetime (int &));
1996+ static_assert (!__builtin_is_implicit_lifetime (int &&));
1997+ static_assert (__builtin_is_implicit_lifetime (float ));
1998+ static_assert (__builtin_is_implicit_lifetime (double ));
1999+ static_assert (__builtin_is_implicit_lifetime (long double ));
2000+ static_assert (__builtin_is_implicit_lifetime (int *));
2001+ static_assert (__builtin_is_implicit_lifetime (int []));
2002+ static_assert (__builtin_is_implicit_lifetime (int [5 ]));
2003+ static_assert (__builtin_is_implicit_lifetime (int [n]));
2004+ // expected-error@-1 {{variable length arrays are not supported in '__builtin_is_implicit_lifetime'}}
2005+ static_assert (__builtin_is_implicit_lifetime (Enum));
2006+ static_assert (__builtin_is_implicit_lifetime (EnumClass));
2007+ static_assert (!__builtin_is_implicit_lifetime (void ()));
2008+ static_assert (!__builtin_is_implicit_lifetime (void () &));
2009+ static_assert (!__builtin_is_implicit_lifetime (void () const ));
2010+ static_assert (!__builtin_is_implicit_lifetime (void (&)()));
2011+ static_assert (__builtin_is_implicit_lifetime (void (*)()));
2012+ static_assert (__builtin_is_implicit_lifetime (decltype (nullptr )));
2013+ static_assert (__builtin_is_implicit_lifetime (int UserDeclaredDestructor::*));
2014+ static_assert (__builtin_is_implicit_lifetime (int (UserDeclaredDestructor::*)()));
2015+ static_assert (__builtin_is_implicit_lifetime (int (UserDeclaredDestructor::*)() const ));
2016+ static_assert (__builtin_is_implicit_lifetime (int (UserDeclaredDestructor::*)() &));
2017+ static_assert (__builtin_is_implicit_lifetime (int (UserDeclaredDestructor::*)() &&));
2018+ static_assert (!__builtin_is_implicit_lifetime (IncompleteStruct));
2019+ // expected-error@-1 {{incomplete type 'IncompleteStruct' used in type trait expression}}
2020+ static_assert (__builtin_is_implicit_lifetime (IncompleteStruct[]));
2021+ static_assert (__builtin_is_implicit_lifetime (IncompleteStruct[5 ]));
2022+ static_assert (__builtin_is_implicit_lifetime (UserDeclaredDestructor));
2023+ static_assert (__builtin_is_implicit_lifetime (const UserDeclaredDestructor));
2024+ static_assert (__builtin_is_implicit_lifetime (volatile UserDeclaredDestructor));
2025+ static_assert (!__builtin_is_implicit_lifetime (UserProvidedDestructor));
2026+ static_assert (!__builtin_is_implicit_lifetime (NoEligibleTrivialContructor));
2027+ static_assert (__builtin_is_implicit_lifetime (OnlyDefaultConstructorIsTrivial));
2028+ static_assert (__builtin_is_implicit_lifetime (AllContstructorsAreTrivial));
2029+ static_assert (!__builtin_is_implicit_lifetime (InheritedNoEligibleTrivialConstructor));
2030+ static_assert (__builtin_is_implicit_lifetime (InheritedOnlyDefaultConstructorIsTrivial));
2031+ static_assert (__builtin_is_implicit_lifetime (InheritedAllContstructorsAreTrivial));
2032+ static_assert (__builtin_is_implicit_lifetime (UserDeletedDestructorInAggregate));
2033+ static_assert (!__builtin_is_implicit_lifetime (UserDeletedDestructorInNonAggregate));
2034+ static_assert (__builtin_is_implicit_lifetime (DeletedDestructorViaBaseInAggregate) == __cplusplus >= 201703L );
2035+ static_assert (!__builtin_is_implicit_lifetime (DeletedDestructorViaBaseInNonAggregate));
2036+ #if __cplusplus >= 202002L
2037+ static_assert (__builtin_is_implicit_lifetime (ConstrainedUserDeclaredDefaultConstructor<true >));
2038+ static_assert (!__builtin_is_implicit_lifetime (ConstrainedUserDeclaredDefaultConstructor<false >));
2039+ static_assert (!__builtin_is_implicit_lifetime (ConstrainedUserProvidedDestructor<true >));
2040+ static_assert (__builtin_is_implicit_lifetime (ConstrainedUserProvidedDestructor<false >));
2041+ #endif
2042+
2043+ static_assert (__builtin_is_implicit_lifetime (__int128));
2044+ static_assert (__builtin_is_implicit_lifetime (_BitInt (8 )));
2045+ static_assert (__builtin_is_implicit_lifetime (_BitInt (128 )));
2046+ static_assert (__builtin_is_implicit_lifetime (int [0 ]));
2047+ static_assert (__builtin_is_implicit_lifetime (StructWithFAM));
2048+ static_assert (__builtin_is_implicit_lifetime (StructWithZeroSizedArray));
2049+ static_assert (__builtin_is_implicit_lifetime (__fp16));
2050+ static_assert (__builtin_is_implicit_lifetime (__bf16));
2051+ static_assert (__builtin_is_implicit_lifetime (_Complex double ));
2052+ static_assert (__builtin_is_implicit_lifetime (float4));
2053+ static_assert (__builtin_is_implicit_lifetime (align_value_int));
2054+ static_assert (__builtin_is_implicit_lifetime (int [[clang::annotate_type (" category2" )]] *));
2055+ static_assert (__builtin_is_implicit_lifetime (int __attribute__ ((btf_type_tag (" user" ))) *));
2056+ static_assert (__builtin_is_implicit_lifetime (EnforceReadOnlyPlacement));
2057+ static_assert (__builtin_is_implicit_lifetime (int __attribute__ ((noderef)) *));
2058+ static_assert (__builtin_is_implicit_lifetime (TypeVisibility));
2059+ static_assert (__builtin_is_implicit_lifetime (int * _Nonnull));
2060+ static_assert (__builtin_is_implicit_lifetime (int * _Null_unspecified));
2061+ static_assert (__builtin_is_implicit_lifetime (int * _Nullable));
2062+ static_assert (!__builtin_is_implicit_lifetime (_Atomic int ));
2063+ // expected-error@-1 {{atomic types are not supported in '__builtin_is_implicit_lifetime'}}
2064+ static_assert (__builtin_is_implicit_lifetime (int * __restrict));
2065+ }
2066+
19112067void is_signed ()
19122068{
19132069 // static_assert(__is_signed(char));
0 commit comments