132 lines
8.1 KiB
C
132 lines
8.1 KiB
C
// RUN: %clang_cc1 -fsyntax-only -verify=expected,c23 -std=c23 %s
|
|
// RUN: %clang_cc1 -fsyntax-only -verify=expected,c17 -std=c17 %s
|
|
|
|
#define AUTO_MACRO(_NAME, ARG, ARG2, ARG3) \
|
|
auto _NAME = ARG + (ARG2 / ARG3);
|
|
|
|
struct S {
|
|
int a;
|
|
auto b; // c23-error {{'auto' not allowed in struct member}} \
|
|
c17-error {{type name does not allow storage class to be specified}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
union {
|
|
char c;
|
|
auto smth; // c23-error {{'auto' not allowed in union member}} \
|
|
c17-error {{type name does not allow storage class to be specified}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
} u;
|
|
};
|
|
|
|
enum E : auto { // c23-error {{'auto' not allowed here}} \
|
|
c17-error {{expected a type}} \
|
|
c17-error {{type name does not allow storage class to be specified}}
|
|
One,
|
|
Two,
|
|
Tree,
|
|
};
|
|
|
|
auto basic_usage(auto auto) { // c23-error {{'auto' not allowed in function prototype}} \
|
|
c23-error {{'auto' not allowed in function return type}} \
|
|
c23-error {{cannot combine with previous 'auto' declaration specifier}} \
|
|
c17-error {{invalid storage class specifier in function declarator}} \
|
|
c17-error {{illegal storage class on function}} \
|
|
c17-warning {{duplicate 'auto' declaration specifier}} \
|
|
c17-warning {{omitting the parameter name in a function definition is a C23 extension}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
auto = 4; // expected-error {{expected identifier or '('}}
|
|
|
|
auto a = 4; // c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
auto auto aa = 12; // c23-error {{cannot combine with previous 'auto' declaration specifier}} \
|
|
c17-warning {{duplicate 'auto' declaration specifier}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
auto b[4]; // c23-error {{'auto' not allowed in array declaration}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
auto array[auto]; // expected-error {{expected expression}} \
|
|
c23-error {{declaration of variable 'array' with deduced type 'auto' requires an initializer}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
AUTO_MACRO(auto, 1, 2, 3); // c23-error {{cannot combine with previous 'auto' declaration specifier}} \
|
|
expected-error {{expected identifier or '('}} \
|
|
c17-warning {{duplicate 'auto' declaration specifier}}
|
|
|
|
auto c = (auto)a; // expected-error {{expected expression}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
auto ci = (auto){12}; // expected-error {{expected expression}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
int auto_cxx_decl = auto(0); // expected-error {{expected expression}}
|
|
|
|
return c;
|
|
}
|
|
|
|
void structs(void) {
|
|
struct s_auto { auto a; }; // c23-error {{'auto' not allowed in struct member}} \
|
|
c17-error {{type name does not allow storage class to be specified}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
// FIXME: this should end up being rejected when we implement underspecified
|
|
// declarations in N3006.
|
|
auto s_int = (struct { int a; } *)0; // c17-error {{incompatible pointer to integer conversion initializing 'int' with an expression of type}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
typedef auto auto_type; // c23-error {{'auto' not allowed in typedef}} \
|
|
c17-error {{cannot combine with previous 'typedef' declaration specifier}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
}
|
|
|
|
void sizeof_alignas(void) {
|
|
auto auto_size = sizeof(auto); // expected-error {{expected expression}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
}
|
|
|
|
void generic_alignof_alignas(void) {
|
|
int g;
|
|
_Generic(g, auto : 0); // c23-error {{'auto' not allowed here}} \
|
|
c17-error {{expected a type}} \
|
|
c17-error {{type name does not allow storage class to be specified}}
|
|
|
|
_Alignof(auto); // expected-error {{expected expression}} \
|
|
expected-warning {{'_Alignof' applied to an expression is a GNU extension}}
|
|
|
|
_Alignas(auto); // expected-error {{expected expression}} \
|
|
expected-warning {{declaration does not declare anything}}
|
|
}
|
|
|
|
void function_designators(void) {
|
|
extern auto auto_ret_func(void); // c23-error {{'auto' not allowed in function return type}} \
|
|
c17-error {{cannot combine with previous 'extern' declaration specifier}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
extern void auto_param_func(auto); // c23-error {{'auto' not allowed in function prototype}} \
|
|
c17-error {{invalid storage class specifier in function declarator}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
auto (auto_ret_func)(void); // c23-error {{'auto' not allowed in function return type}} \
|
|
c17-error {{illegal storage class on function}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
void (auto_param_func)(auto); // c23-error {{'auto' not allowed in function prototype}} \
|
|
c17-error {{invalid storage class specifier in function declarator}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
}
|
|
|
|
void atomic(void) {
|
|
_Atomic(auto) atom1 = 12; // c23-error {{'auto' not allowed here}} \
|
|
c23-error {{a type specifier is required for all declarations}} \
|
|
c17-error {{expected a type}} \
|
|
c17-error {{type name does not allow storage class to be specified}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
|
|
_Atomic auto atom2 = 12; // c23-error {{_Atomic cannot be applied to type 'auto' in C23}} \
|
|
c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
}
|
|
|
|
void attributes(void) {
|
|
auto ident [[clang::annotate("this works")]] = 12; // c17-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
|
|
}
|