| /* Test C2x auto. Invalid code. */ |
| /* { dg-do compile } */ |
| /* { dg-options "-std=c2x -pedantic-errors" } */ |
| |
| auto; /* { dg-error "empty declaration" } */ |
| auto *p = (int *) 0; /* { dg-error "plain identifier" } */ |
| auto i; /* { dg-error "initialized data declaration" } */ |
| auto g { } /* { dg-error "initialized data declaration" } */ |
| auto a = 1, b = 2; /* { dg-error "single declarator" } */ |
| auto long e0 = 0; /* { dg-error "file-scope declaration" } */ |
| long auto e1 = 0; /* { dg-error "file-scope declaration" } */ |
| int auto e2 = 0; /* { dg-error "file-scope declaration" } */ |
| |
| extern int e3; |
| auto e3 = 1; /* { dg-error "underspecified declaration of 'e3', which is already declared in this scope" } */ |
| |
| void |
| f () |
| { |
| extern int fe1; |
| auto fe1 = 1; /* { dg-error "underspecified declaration of 'fe1', which is already declared in this scope" } */ |
| /* { dg-error "declaration of 'fe1' with no linkage follows extern declaration" "linkage error" { target *-*-* } .-1 } */ |
| auto fe2 = (struct s *) 0; /* { dg-error "declared in underspecified object initializer" } */ |
| auto fe3 = (union u *) 0; /* { dg-error "declared in underspecified object initializer" } */ |
| auto fe4 = (struct s2 { int a; }) { }; /* { dg-error "defined in underspecified object initializer" } */ |
| auto fe5 = (struct { int a; }) { }; /* { dg-error "defined in underspecified object initializer" } */ |
| auto fe6 = (union u2 { int a; }) { }; /* { dg-error "defined in underspecified object initializer" } */ |
| auto fe7 = (union { int a; }) { }; /* { dg-error "defined in underspecified object initializer" } */ |
| auto fe8 = sizeof (enum e { A }); /* { dg-error "defined in underspecified object initializer" } */ |
| /* The following case is undefined behavior (so doesn't actually require a |
| diagnostic). */ |
| auto fe9 = sizeof (enum { B }); /* { dg-error "defined in underspecified object initializer" } */ |
| /* Examples with a forward declaration, then definition inside auto. */ |
| struct s3; |
| auto fe10 = (struct s3 { int a; }) { }; /* { dg-error "defined in underspecified object initializer" } */ |
| union u3; |
| auto fe11 = (union u3 { int a; }) { }; /* { dg-error "defined in underspecified object initializer" } */ |
| } |
| |
| void f2 (auto x); /* { dg-error "storage class specified for parameter" } */ |
| void f3 (auto y) { } /* { dg-error "storage class specified for parameter" } */ |
| |
| auto e4 = sizeof (e4); /* { dg-error "underspecified 'e4' referenced in its initializer" } */ |
| __SIZE_TYPE__ e5; |
| void |
| f4 () |
| { |
| auto e5 = sizeof (e5); /* { dg-error "underspecified 'e5' referenced in its initializer" } */ |
| } |
| |
| auto typedef int T; /* { dg-error "'typedef' used with 'auto'" } */ |
| auto auto e6 = 1; /* { dg-error "duplicate 'auto'" } */ |
| static auto int e7 = 1; /* { dg-error "multiple storage classes in declaration specifiers" } */ |
| _Thread_local auto int e8 = 2; /* { dg-error "'_Thread_local' used with 'auto'" } */ |
| _Thread_local int auto e9 = 3; /* { dg-error "'_Thread_local' used with 'auto'" } */ |
| /* { dg-error "file-scope declaration of 'e9' specifies 'auto'" "file-scope error" { target *-*-* } .-1 } */ |
| |
| typedef auto int T2; /* { dg-error "multiple storage classes in declaration specifiers" } */ |
| |
| void |
| f5 () |
| { |
| static int auto e10 = 3; /* { dg-error "multiple storage classes in declaration specifiers" } */ |
| } |