@@ -18,7 +18,7 @@ enum class SignedEnumClass : signed int {};
18
18
enum class UnsignedEnumClass : unsigned int {};
19
19
struct POD { Enum e; int i; float f; NonPOD* p; };
20
20
struct Empty {};
21
- struct IncompleteStruct ;
21
+ struct IncompleteStruct ; // expected-note {{forward declaration of 'IncompleteStruct'}}
22
22
typedef Empty EmptyAr[10 ];
23
23
typedef Empty EmptyArNB[];
24
24
typedef Empty EmptyArMB[1 ][2 ];
@@ -1908,6 +1908,162 @@ void is_pointer_interconvertible_base_of(int n)
1908
1908
}
1909
1909
}
1910
1910
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
+
1911
2067
void is_signed ()
1912
2068
{
1913
2069
// static_assert(__is_signed(char));
0 commit comments