|  | // 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}} | 
|  | } |