Daniel Dunbar | 8fbe78f | 2009-12-15 20:14:24 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic |
Chris Lattner | df89dd4 | 2006-08-06 18:22:00 +0000 | [diff] [blame] | 2 | |
Chris Lattner | 7cf04d1 | 2007-06-08 18:15:09 +0000 | [diff] [blame] | 3 | extern int a1[]; |
Chris Lattner | df89dd4 | 2006-08-06 18:22:00 +0000 | [diff] [blame] | 4 | |
| 5 | void f0(); |
| 6 | void f1(int [*]); |
| 7 | void f2(int [const *]); |
| 8 | void f3(int [volatile const*]); |
Chris Lattner | 9d51f2b | 2008-04-05 06:32:51 +0000 | [diff] [blame] | 9 | int f4(*XX)(void); /* expected-error {{cannot return}} expected-warning {{type specifier missing, defaults to 'int'}} */ |
David Majnemer | f9834d5 | 2014-08-08 07:21:18 +0000 | [diff] [blame] | 10 | int f5(int [static]); /* expected-error {{'static' may not be used without an array size}} */ |
Chris Lattner | df89dd4 | 2006-08-06 18:22:00 +0000 | [diff] [blame] | 11 | |
| 12 | char ((((*X)))); |
| 13 | |
| 14 | void (*signal(int, void (*)(int)))(int); |
| 15 | |
Chris Lattner | 67b0d6a | 2009-04-12 22:12:26 +0000 | [diff] [blame] | 16 | int aaaa, ***C, * const D, B(int); |
Chris Lattner | df89dd4 | 2006-08-06 18:22:00 +0000 | [diff] [blame] | 17 | |
| 18 | int *A; |
| 19 | |
Chris Lattner | 7bddb3f | 2006-08-13 19:59:13 +0000 | [diff] [blame] | 20 | struct str; |
| 21 | |
Mike Stump | 753d120 | 2009-07-22 00:43:08 +0000 | [diff] [blame] | 22 | void test2(int *P, int A) { |
Chris Lattner | 7bddb3f | 2006-08-13 19:59:13 +0000 | [diff] [blame] | 23 | struct str; |
| 24 | |
| 25 | // Hard case for array decl, not Array[*]. |
Chris Lattner | 3b51ddf | 2006-08-12 18:40:31 +0000 | [diff] [blame] | 26 | int Array[*(int*)P+A]; |
| 27 | } |
Chris Lattner | 7bddb3f | 2006-08-13 19:59:13 +0000 | [diff] [blame] | 28 | |
Chris Lattner | 67b450c | 2008-04-06 06:47:48 +0000 | [diff] [blame] | 29 | typedef int atype; |
Mike Stump | 753d120 | 2009-07-22 00:43:08 +0000 | [diff] [blame] | 30 | void test3(x, |
| 31 | atype /* expected-error {{unexpected type name 'atype': expected identifier}} */ |
| 32 | ) int x, atype; {} |
Chris Lattner | 7bddb3f | 2006-08-13 19:59:13 +0000 | [diff] [blame] | 33 | |
Mike Stump | 753d120 | 2009-07-22 00:43:08 +0000 | [diff] [blame] | 34 | void test4(x, x) int x; {} /* expected-error {{redefinition of parameter 'x'}} */ |
Chris Lattner | 285a3e4 | 2008-04-06 06:50:56 +0000 | [diff] [blame] | 35 | |
Chris Lattner | 8c5dd73 | 2008-11-11 06:13:16 +0000 | [diff] [blame] | 36 | |
| 37 | // PR3031 |
| 38 | int (test5), ; // expected-error {{expected identifier or '('}} |
| 39 | |
Chris Lattner | 6cc055a | 2009-04-12 20:42:31 +0000 | [diff] [blame] | 40 | |
| 41 | |
| 42 | // PR3963 & rdar://6759604 - test error recovery for mistyped "typenames". |
| 43 | |
Chris Lattner | 6cc055a | 2009-04-12 20:42:31 +0000 | [diff] [blame] | 44 | foo_t *d; // expected-error {{unknown type name 'foo_t'}} |
Chris Lattner | 67b0d6a | 2009-04-12 22:12:26 +0000 | [diff] [blame] | 45 | foo_t a; // expected-error {{unknown type name 'foo_t'}} |
Chris Lattner | ffaa0e6 | 2009-04-12 21:49:30 +0000 | [diff] [blame] | 46 | int test6() { return a; } // a should be declared. |
Chris Lattner | 6cc055a | 2009-04-12 20:42:31 +0000 | [diff] [blame] | 47 | |
Chris Lattner | ffaa0e6 | 2009-04-12 21:49:30 +0000 | [diff] [blame] | 48 | // Use of tagged type without tag. rdar://6783347 |
| 49 | struct xyz { int y; }; |
| 50 | enum myenum { ASDFAS }; |
John McCall | 38200b0 | 2010-02-14 01:03:10 +0000 | [diff] [blame] | 51 | xyz b; // expected-error {{must use 'struct' tag to refer to type 'xyz'}} |
| 52 | myenum c; // expected-error {{must use 'enum' tag to refer to type 'myenum'}} |
Chris Lattner | ffaa0e6 | 2009-04-12 21:49:30 +0000 | [diff] [blame] | 53 | |
| 54 | float *test7() { |
| 55 | // We should recover 'b' by parsing it with a valid type of "struct xyz", which |
| 56 | // allows us to diagnose other bad things done with y, such as this. |
Douglas Gregor | c68e140 | 2010-04-09 00:35:39 +0000 | [diff] [blame] | 57 | return &b.y; // expected-warning {{incompatible pointer types returning 'int *' from a function with result type 'float *'}} |
Chris Lattner | ffaa0e6 | 2009-04-12 21:49:30 +0000 | [diff] [blame] | 58 | } |
| 59 | |
Chris Lattner | 67b0d6a | 2009-04-12 22:12:26 +0000 | [diff] [blame] | 60 | struct xyz test8() { return a; } // a should be be marked invalid, no diag. |
| 61 | |
Chris Lattner | ffaa0e6 | 2009-04-12 21:49:30 +0000 | [diff] [blame] | 62 | |
| 63 | // Verify that implicit int still works. |
Chris Lattner | 6cc055a | 2009-04-12 20:42:31 +0000 | [diff] [blame] | 64 | static f; // expected-warning {{type specifier missing, defaults to 'int'}} |
| 65 | static g = 4; // expected-warning {{type specifier missing, defaults to 'int'}} |
| 66 | static h // expected-warning {{type specifier missing, defaults to 'int'}} |
Eli Friedman | 2b680b4 | 2009-04-28 03:13:54 +0000 | [diff] [blame] | 67 | __asm__("foo"); |
Chris Lattner | 245c533 | 2010-02-02 00:37:27 +0000 | [diff] [blame] | 68 | |
| 69 | |
| 70 | struct test9 { |
| 71 | int x // expected-error {{expected ';' at end of declaration list}} |
| 72 | int y; |
| 73 | int z // expected-warning {{expected ';' at end of declaration list}} |
| 74 | }; |
Chris Lattner | afe6a84 | 2010-02-02 17:32:27 +0000 | [diff] [blame] | 75 | |
| 76 | // PR6208 |
| 77 | struct test10 { int a; } static test10x; |
| 78 | struct test11 { int a; } const test11x; |
Chris Lattner | 35af0ab | 2010-02-03 01:45:03 +0000 | [diff] [blame] | 79 | |
| 80 | // PR6216 |
| 81 | void test12() { |
| 82 | (void)__builtin_offsetof(struct { char c; int i; }, i); |
| 83 | } |
Chris Lattner | 5e854b9 | 2010-02-03 20:41:24 +0000 | [diff] [blame] | 84 | |
| 85 | // rdar://7608537 |
| 86 | struct test13 { int a; } (test13x); |
Douglas Gregor | d5a479c | 2010-05-30 22:30:21 +0000 | [diff] [blame] | 87 | |
| 88 | // <rdar://problem/8044088> |
| 89 | struct X<foo::int> { }; // expected-error{{expected identifier or '('}} |
Chris Lattner | 1390134 | 2010-07-11 22:42:07 +0000 | [diff] [blame] | 90 | |
| 91 | |
| 92 | // PR7617 - error recovery on missing ;. |
| 93 | |
Chris Lattner | ef74e2b2 | 2010-07-11 22:46:04 +0000 | [diff] [blame] | 94 | void test14() // expected-error {{expected ';' after top level declarator}} |
Chris Lattner | 1390134 | 2010-07-11 22:42:07 +0000 | [diff] [blame] | 95 | |
| 96 | void test14a(); |
| 97 | void *test14b = (void*)test14a; // Make sure test14a didn't get skipped. |
John McCall | a3707cc | 2010-08-26 17:22:34 +0000 | [diff] [blame] | 98 | |
| 99 | // rdar://problem/8358508 |
John McCall | c162d1b | 2010-08-26 17:42:30 +0000 | [diff] [blame] | 100 | long struct X { int x; } test15(); // expected-error {{'long struct' is invalid}} |
David Blaikie | 89f13cb | 2012-04-06 23:33:59 +0000 | [diff] [blame] | 101 | |
| 102 | void test16(i) int i j; { } // expected-error {{expected ';' at end of declaration}} |
| 103 | void test17(i, j) int i, j k; { } // expected-error {{expected ';' at end of declaration}} |
Alp Toker | eec8101 | 2014-01-05 03:27:57 +0000 | [diff] [blame] | 104 | void knrNoSemi(i) int i { } // expected-error {{expected ';' at end of declaration}} |
Chris Lattner | 02f1b61 | 2012-04-28 16:12:17 +0000 | [diff] [blame] | 105 | |
| 106 | |
| 107 | // PR12595 |
| 108 | void test18() { |
| 109 | int x = 4+(5-12)); // expected-error {{extraneous ')' before ';'}} |
| 110 | } |
| 111 | |
Richard Smith | 200f47c | 2012-07-02 19:14:01 +0000 | [diff] [blame] | 112 | enum E1 { e1 }: // expected-error {{expected ';'}} |
Serge Pavlov | 89578fd | 2013-06-08 13:29:58 +0000 | [diff] [blame] | 113 | struct EnumBitfield { // expected-warning {{struct without named members is a GNU extension}} |
Richard Smith | 200f47c | 2012-07-02 19:14:01 +0000 | [diff] [blame] | 114 | enum E2 { e2 } : 4; // ok |
| 115 | struct S { int n; }: // expected-error {{expected ';'}} |
Fariborz Jahanian | ffc120a | 2014-08-26 21:10:47 +0000 | [diff] [blame] | 116 | // expected-warning@-1 {{declaration does not declare anything}} |
Serge Pavlov | 89578fd | 2013-06-08 13:29:58 +0000 | [diff] [blame] | 117 | |
Richard Smith | 200f47c | 2012-07-02 19:14:01 +0000 | [diff] [blame] | 118 | }; |
Serge Pavlov | 2e3ecb6 | 2013-12-31 06:26:03 +0000 | [diff] [blame] | 119 | |
| 120 | // PR10982 |
| 121 | enum E11 { |
| 122 | A1 = 1, |
| 123 | }; |
| 124 | |
| 125 | enum E12 { |
| 126 | , // expected-error{{expected identifier}} |
| 127 | A2 |
| 128 | }; |
| 129 | void func_E12(enum E12 *p) { *p = A2; } |
| 130 | |
| 131 | enum E13 { |
| 132 | 1D, // expected-error{{expected identifier}} |
| 133 | A3 |
| 134 | }; |
| 135 | void func_E13(enum E13 *p) { *p = A3; } |
| 136 | |
| 137 | enum E14 { |
| 138 | A4 12, // expected-error{{expected '= constant-expression' or end of enumerator definition}} |
| 139 | A4a |
| 140 | }; |
| 141 | void func_E14(enum E14 *p) { *p = A4a; } |
| 142 | |
| 143 | enum E15 { |
| 144 | A5=12 4, // expected-error{{expected '}' or ','}} |
| 145 | A5a |
| 146 | }; |
| 147 | void func_E15(enum E15 *p) { *p = A5a; } |
| 148 | |
| 149 | enum E16 { |
| 150 | A6; // expected-error{{expected '= constant-expression' or end of enumerator definition}} |
| 151 | A6a |
| 152 | }; |
Richard Smith | 843f18f | 2014-08-13 02:13:15 +0000 | [diff] [blame] | 153 | |
| 154 | int PR20634 = sizeof(struct { int n; } [5]); |