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