| // RUN: %clang_cc1 -pedantic -Wunused-label -verify -x c %s | 
 | // RUN: cp %s %t | 
 | // RUN: not %clang_cc1 -pedantic -Wunused-label -fixit -x c %t | 
 | // RUN: grep -v CHECK %t > %t2 | 
 | // RUN: %clang_cc1 -pedantic -Wunused-label -Werror -x c %t | 
 | // RUN: FileCheck -input-file=%t2 %t | 
 |  | 
 | /* This is a test of the various code modification hints that are | 
 |    provided as part of warning or extension diagnostics. All of the | 
 |    warnings will be fixed by -fixit, and the resulting file should | 
 |    compile cleanly with -Werror -pedantic. */ | 
 |  | 
 | // FIXME: FIX-IT should add #include <string.h>? | 
 | int strcmp(const char *s1, const char *s2); | 
 |  | 
 | void f0(void) { }; // expected-warning {{';'}} | 
 |  | 
 | struct s { | 
 |   int x, y;; // expected-warning {{extra ';'}} | 
 | }; | 
 |  | 
 | // CHECK: _Complex double cd; | 
 | _Complex cd; // expected-warning {{assuming '_Complex double'}} | 
 |  | 
 | // CHECK: struct s s0 = { .y = 5 }; | 
 | struct s s0 = { y: 5 }; // expected-warning {{GNU old-style}} | 
 |  | 
 | // CHECK: int array0[5] = { [3] = 3 }; | 
 | int array0[5] = { [3] 3 }; // expected-warning {{GNU 'missing ='}} | 
 |  | 
 | // CHECK: int x | 
 | // CHECK: int y | 
 | void f1(x, y) // expected-warning 2{{defaulting to type 'int'}} | 
 | { | 
 | } | 
 |  | 
 | int i0 = { 17 }; | 
 |  | 
 | #define ONE 1 | 
 | #define TWO 2 | 
 |  | 
 | int test_cond(int y, int fooBar) { // expected-note {{here}} | 
 | // CHECK: int x = y ? 1 : 4+fooBar; | 
 |   int x = y ? 1 4+foobar; // expected-error {{expected ':'}} expected-error {{undeclared identifier}} expected-note {{to match}} | 
 | // CHECK: x = y ? ONE : TWO; | 
 |   x = y ? ONE TWO; // expected-error {{':'}} expected-note {{to match}} | 
 |   return x; | 
 | } | 
 |  | 
 | // CHECK: const typedef int int_t; | 
 | const typedef typedef int int_t; // expected-warning {{duplicate 'typedef'}} | 
 |  | 
 | // <rdar://problem/7159693> | 
 | enum Color {  | 
 |   Red // expected-error{{missing ',' between enumerators}} | 
 |   Green = 17 // expected-error{{missing ',' between enumerators}} | 
 |   Blue, | 
 | }; | 
 |  | 
 | // rdar://9295072 | 
 | struct test_struct { | 
 |   // CHECK: struct test_struct *struct_ptr; | 
 |   test_struct *struct_ptr; // expected-error {{must use 'struct' tag to refer to type 'test_struct'}} | 
 | }; | 
 |  | 
 | void removeUnusedLabels(char c) { | 
 |   L0 /*removed comment*/:        c++; // expected-warning {{unused label}} | 
 |   removeUnusedLabels(c); | 
 |   L1: // expected-warning {{unused label}} | 
 |   c++; | 
 |   /*preserved comment*/ L2  :        c++; // expected-warning {{unused label}} | 
 |   LL // expected-warning {{unused label}} | 
 |   : c++; | 
 |   c = c + 3; L4: return; // expected-warning {{unused label}} | 
 | } | 
 |  | 
 | int oopsAComma = 0, // expected-error {{';'}} | 
 | void oopsMoreCommas() { | 
 |   static int a[] = { 0, 1, 2 }, // expected-error {{';'}} | 
 |   static int b[] = { 3, 4, 5 }, // expected-error {{';'}} | 
 |   &a == &b ? oopsMoreCommas() : removeUnusedLabels(a[0]); | 
 | } | 
 |  | 
 | int noSemiAfterLabel(int n) { | 
 |   switch (n) { | 
 |     default: | 
 |       return n % 4; | 
 |     case 0: | 
 |     case 1: | 
 |     case 2: | 
 |     // CHECK: /*FOO*/ case 3: ; | 
 |     /*FOO*/ case 3: // expected-error {{expected statement}} | 
 |   } | 
 |   switch (n) { | 
 |     case 1: | 
 |     case 2: | 
 |       return 0; | 
 |     // CHECK: /*BAR*/ default: ; | 
 |     /*BAR*/ default: // expected-error {{expected statement}} | 
 |   } | 
 |   return 1; | 
 | } |