2013-04-03 17:46:04 +08:00
// RUN: %clang_cc1 -std=c11 -fsyntax-only -verify %s
2021-03-03 21:44:04 +08:00
// RUN: %clang_cc1 -fms-compatibility -DMS -fsyntax-only -verify=expected,ms %s
2019-08-27 22:41:39 +08:00
// RUN: %clang_cc1 -std=c99 -pedantic -fsyntax-only -verify=expected,ext %s
2019-08-31 06:52:55 +08:00
// RUN: %clang_cc1 -xc++ -std=c++11 -pedantic -fsyntax-only -verify=expected,ext,cxx %s
2011-04-15 08:35:57 +08:00
2019-08-27 22:41:39 +08:00
_Static_assert ( " foo " , " string is nonzero " ) ; // ext-warning {{'_Static_assert' is a C11 extension}}
2013-04-03 17:46:04 +08:00
# ifndef __cplusplus
// expected-error@-2 {{static_assert expression is not an integral constant expression}}
# endif
2011-04-15 08:35:57 +08:00
2019-08-27 22:41:39 +08:00
_Static_assert ( 1 , " 1 is nonzero " ) ; // ext-warning {{'_Static_assert' is a C11 extension}}
_Static_assert ( 0 , " 0 is nonzero " ) ; / / expected - error { { static_assert failed " 0 is nonzero " } } \
// ext-warning {{'_Static_assert' is a C11 extension}}
2011-04-15 08:35:57 +08:00
2021-01-28 05:51:27 +08:00
# ifdef MS
2021-03-03 21:44:04 +08:00
static_assert ( 1 , " 1 is nonzero " ) ; // ms-warning {{use of 'static_assert' without inclusion of <assert.h> is a Microsoft extension}}
2021-01-28 05:51:27 +08:00
# endif
2011-04-15 08:35:57 +08:00
void foo ( void ) {
2019-08-27 22:41:39 +08:00
_Static_assert ( 1 , " 1 is nonzero " ) ; // ext-warning {{'_Static_assert' is a C11 extension}}
_Static_assert ( 0 , " 0 is nonzero " ) ; / / expected - error { { static_assert failed " 0 is nonzero " } } \
// ext-warning {{'_Static_assert' is a C11 extension}}
2021-01-28 05:51:27 +08:00
# ifdef MS
2021-03-03 21:44:04 +08:00
static_assert ( 1 , " 1 is nonzero " ) ; // ms-warning {{use of 'static_assert' without}}
2021-01-28 05:51:27 +08:00
# endif
2011-04-15 08:35:57 +08:00
}
2012-11-18 03:16:52 +08:00
2019-08-27 22:41:39 +08:00
_Static_assert ( 1 , invalid ) ; / / expected - error { { expected string literal for diagnostic message in static_assert } } \
// ext-warning {{'_Static_assert' is a C11 extension}}
2013-04-03 17:46:04 +08:00
struct A {
int a ;
2019-08-27 22:41:39 +08:00
_Static_assert ( 1 , " 1 is nonzero " ) ; // ext-warning {{'_Static_assert' is a C11 extension}}
_Static_assert ( 0 , " 0 is nonzero " ) ; / / expected - error { { static_assert failed " 0 is nonzero " } } \
// ext-warning {{'_Static_assert' is a C11 extension}}
2021-01-28 05:51:27 +08:00
# ifdef MS
2021-03-03 21:44:04 +08:00
static_assert ( 1 , " 1 is nonzero " ) ; // ms-warning {{use of 'static_assert' without}}
2021-01-28 05:51:27 +08:00
# endif
2013-04-03 17:46:04 +08:00
} ;
# ifdef __cplusplus
# define ASSERT_IS_TYPE(T) __is_same(T, T)
# else
# define ASSERT_IS_TYPE(T) __builtin_types_compatible_p(T, T)
# endif
# define UNION(T1, T2) union { \
__typeof__ ( T1 ) one ; \
__typeof__ ( T2 ) two ; \
_Static_assert ( ASSERT_IS_TYPE ( T1 ) , " T1 is not a type " ) ; \
_Static_assert ( ASSERT_IS_TYPE ( T2 ) , " T2 is not a type " ) ; \
_Static_assert ( sizeof ( T1 ) = = sizeof ( T2 ) , " type size mismatch " ) ; \
}
2019-08-27 22:41:39 +08:00
typedef UNION ( unsigned , struct A ) U1 ; // ext-warning 3 {{'_Static_assert' is a C11 extension}}
2019-08-31 06:52:55 +08:00
UNION ( char [ 2 ] , short ) u2 = { . one = { ' a ' , ' b ' } } ; // ext-warning 3 {{'_Static_assert' is a C11 extension}} cxx-warning {{designated initializers are a C++20 extension}}
2019-08-27 22:41:39 +08:00
typedef UNION ( char , short ) U3 ; / / expected - error { { static_assert failed due to requirement ' sizeof ( char ) = = sizeof ( short ) ' " type size mismatch " } } \
// ext-warning 3 {{'_Static_assert' is a C11 extension}}
typedef UNION ( float , 0.5f ) U4 ; / / expected - error { { expected a type } } \
// ext-warning 3 {{'_Static_assert' is a C11 extension}}
2021-03-03 21:44:04 +08:00
// After defining the assert macro in MS-compatibility mode, we should
// no longer warn about including <assert.h> under the assumption the
// user already did that.
# ifdef MS
# define assert(expr)
static_assert ( 1 , " 1 is nonzero " ) ; // ok
// But we should still warn if the user did something bonkers.
# undef static_assert
static_assert ( 1 , " 1 is nonzero " ) ; // ms-warning {{use of 'static_assert' without}}
# endif