1 // RUN: %clang_cc1 -pedantic -Wunused-label -verify -x c %s
2 // RUN: cp %s %t
3 // RUN: not %clang_cc1 -pedantic -Wunused-label -fixit -x c %t
4 // RUN: %clang_cc1 -pedantic -Wunused-label -Werror -x c %t
5 // RUN: grep -v CHECK %t | FileCheck %t
6 
7 /* This is a test of the various code modification hints that are
8    provided as part of warning or extension diagnostics. All of the
9    warnings will be fixed by -fixit, and the resulting file should
10    compile cleanly with -Werror -pedantic. */
11 
12 // FIXME: FIX-IT should add #include <string.h>?
13 int strcmp(const char *s1, const char *s2);
14 
f0(void)15 void f0(void) { }; // expected-warning {{';'}}
16 
17 struct s {
18   int x, y;; // expected-warning {{extra ';'}}
19 };
20 
21 // CHECK: _Complex double cd;
22 _Complex cd; // expected-warning {{assuming '_Complex double'}}
23 
24 // CHECK: struct s s0 = { .y = 5 };
25 struct s s0 = { y: 5 }; // expected-warning {{GNU old-style}}
26 
27 // CHECK: int array0[5] = { [3] = 3 };
28 int array0[5] = { [3] 3 }; // expected-warning {{GNU 'missing ='}}
29 
30 // CHECK: int x
31 // CHECK: int y
f1(x,y)32 void f1(x, y) // expected-warning 2{{defaulting to type 'int'}}
33 {
34 }
35 
36 int i0 = { 17 };
37 
38 #define ONE 1
39 #define TWO 2
40 
test_cond(int y,int fooBar)41 int test_cond(int y, int fooBar) { // expected-note {{here}}
42 // CHECK: int x = y ? 1 : 4+fooBar;
43   int x = y ? 1 4+foobar; // expected-error {{expected ':'}} expected-error {{undeclared identifier}} expected-note {{to match}}
44 // CHECK: x = y ? ONE : TWO;
45   x = y ? ONE TWO; // expected-error {{':'}} expected-note {{to match}}
46   return x;
47 }
48 
49 // CHECK: const typedef int int_t;
50 const typedef typedef int int_t; // expected-warning {{duplicate 'typedef'}}
51 
52 // <rdar://problem/7159693>
53 enum Color {
54   Red // expected-error{{missing ',' between enumerators}}
55   Green = 17 // expected-error{{missing ',' between enumerators}}
56   Blue,
57 };
58 
59 // rdar://9295072
60 struct test_struct {
61   // CHECK: struct test_struct *struct_ptr;
62   test_struct *struct_ptr; // expected-error {{must use 'struct' tag to refer to type 'test_struct'}}
63 };
64 
removeUnusedLabels(char c)65 void removeUnusedLabels(char c) {
66   L0 /*removed comment*/:        c++; // expected-warning {{unused label}}
67   removeUnusedLabels(c);
68   L1: // expected-warning {{unused label}}
69   c++;
70   /*preserved comment*/ L2  :        c++; // expected-warning {{unused label}}
71   LL // expected-warning {{unused label}}
72   : c++;
73   c = c + 3; L4: return; // expected-warning {{unused label}}
74 }
75 
76 int oopsAComma = 0, // expected-error {{';'}}
77 void oopsMoreCommas() {
78   static int a[] = { 0, 1, 2 }, // expected-error {{';'}}
79   static int b[] = { 3, 4, 5 }, // expected-error {{';'}}
80   &a == &b ? oopsMoreCommas() : removeUnusedLabels(a[0]);
81 }
82 
commaAtEndOfStatement()83 int commaAtEndOfStatement() {
84   int a = 1;
85   a = 5, // expected-error {{';'}}
86   int m = 5, // expected-error {{';'}}
87   return 0, // expected-error {{';'}}
88 }
89 
90 int noSemiAfterLabel(int n) {
91   switch (n) {
92     default:
93       return n % 4;
94     case 0:
95     case 1:
96     case 2:
97     // CHECK: /*FOO*/ case 3: ;
98     /*FOO*/ case 3: // expected-error {{expected statement}}
99   }
100   switch (n) {
101     case 1:
102     case 2:
103       return 0;
104     // CHECK: /*BAR*/ default: ;
105     /*BAR*/ default: // expected-error {{expected statement}}
106   }
107   return 1;
108 }
109 
110 struct noSemiAfterStruct // expected-error {{expected ';' after struct}}
111 struct noSemiAfterStruct {
112   int n // expected-warning {{';'}}
113 } // expected-error {{expected ';' after struct}}
114 enum noSemiAfterEnum {
115   e1
116 } // expected-error {{expected ';' after enum}}
117 
118 int PR17175 __attribute__((visibility(hidden))); // expected-error {{'visibility' attribute requires a string}}
119