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