1*4f902c7eSRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wimplicit-fallthrough -DCLANG_PREFIX -DCOMMAND_LINE_FALLTHROUGH=[[clang::fallthrough]] -DUNCHOSEN=[[fallthrough]] %s
2*4f902c7eSRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wimplicit-fallthrough -DCOMMAND_LINE_FALLTHROUGH=[[fallthrough]] %s
3*4f902c7eSRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z -Wimplicit-fallthrough -DCLANG_PREFIX -DCOMMAND_LINE_FALLTHROUGH=[[clang::fallthrough]] %s
4*4f902c7eSRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z -Wimplicit-fallthrough -DCOMMAND_LINE_FALLTHROUGH=[[clang::fallthrough]] %s
5*4f902c7eSRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z -Wimplicit-fallthrough -DCOMMAND_LINE_FALLTHROUGH=[[fallthrough]] -DUNCHOSEN=[[clang::fallthrough]] %s
6e61e5625SAlexander Kornienko 
fallthrough_compatibility_macro_from_command_line(int n)7e61e5625SAlexander Kornienko int fallthrough_compatibility_macro_from_command_line(int n) {
8e61e5625SAlexander Kornienko   switch (n) {
9e61e5625SAlexander Kornienko     case 0:
10e61e5625SAlexander Kornienko       n = n * 10;
11e61e5625SAlexander Kornienko     case 1: // expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert 'COMMAND_LINE_FALLTHROUGH;' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}}
12e61e5625SAlexander Kornienko       ;
13e61e5625SAlexander Kornienko   }
14e61e5625SAlexander Kornienko   return n;
15e61e5625SAlexander Kornienko }
16e61e5625SAlexander Kornienko 
17*4f902c7eSRichard Smith #ifdef CLANG_PREFIX
18e61e5625SAlexander Kornienko #define COMPATIBILITY_FALLTHROUGH   [ [ /* test */  clang /* test */ \
19e61e5625SAlexander Kornienko     ::  fallthrough  ]  ]    // testing whitespace and comments in macro definition
20*4f902c7eSRichard Smith #else
21*4f902c7eSRichard Smith #define COMPATIBILITY_FALLTHROUGH   [ [ /* test */  /* test */ \
22*4f902c7eSRichard Smith     fallthrough  ]  ]    // testing whitespace and comments in macro definition
23e61e5625SAlexander Kornienko #endif
24e61e5625SAlexander Kornienko 
fallthrough_compatibility_macro_from_source(int n)25e61e5625SAlexander Kornienko int fallthrough_compatibility_macro_from_source(int n) {
26e61e5625SAlexander Kornienko   switch (n) {
27e61e5625SAlexander Kornienko     case 0:
28e61e5625SAlexander Kornienko       n = n * 20;
29e61e5625SAlexander Kornienko     case 1: // expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert 'COMPATIBILITY_FALLTHROUGH;' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}}
30e61e5625SAlexander Kornienko       ;
31e61e5625SAlexander Kornienko   }
32e61e5625SAlexander Kornienko   return n;
33e61e5625SAlexander Kornienko }
34e61e5625SAlexander Kornienko 
35e61e5625SAlexander Kornienko // Deeper macro substitution
36*4f902c7eSRichard Smith #ifdef CLANG_PREFIX
37e61e5625SAlexander Kornienko #define M1 [[clang::fallthrough]]
38*4f902c7eSRichard Smith #else
39*4f902c7eSRichard Smith #define M1 [[fallthrough]]
40*4f902c7eSRichard Smith #endif
41e61e5625SAlexander Kornienko #ifdef __clang__
42e61e5625SAlexander Kornienko #define M2 M1
43e61e5625SAlexander Kornienko #else
44e61e5625SAlexander Kornienko #define M2
45e61e5625SAlexander Kornienko #endif
46e61e5625SAlexander Kornienko 
47e61e5625SAlexander Kornienko #define WRONG_MACRO1 clang::fallthrough
48e61e5625SAlexander Kornienko #define WRONG_MACRO2 [[clang::fallthrough]
49e61e5625SAlexander Kornienko #define WRONG_MACRO3 [[clang::fall through]]
50e61e5625SAlexander Kornienko #define WRONG_MACRO4 [[clang::fallthrough]]]
51e61e5625SAlexander Kornienko 
fallthrough_compatibility_macro_in_macro(int n)52e61e5625SAlexander Kornienko int fallthrough_compatibility_macro_in_macro(int n) {
53e61e5625SAlexander Kornienko   switch (n) {
54e61e5625SAlexander Kornienko     case 0:
55e61e5625SAlexander Kornienko       n = n * 20;
56e61e5625SAlexander Kornienko     case 1: // expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert 'M1;' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}}
57e61e5625SAlexander Kornienko                                                                           // there was an idea that this ^ should be M2
58e61e5625SAlexander Kornienko       ;
59e61e5625SAlexander Kornienko   }
60e61e5625SAlexander Kornienko   return n;
61e61e5625SAlexander Kornienko }
62e61e5625SAlexander Kornienko 
63e61e5625SAlexander Kornienko #undef M1
64e61e5625SAlexander Kornienko #undef M2
65e61e5625SAlexander Kornienko #undef COMPATIBILITY_FALLTHROUGH
66e61e5625SAlexander Kornienko #undef COMMAND_LINE_FALLTHROUGH
67*4f902c7eSRichard Smith #undef UNCHOSEN
68e61e5625SAlexander Kornienko 
fallthrough_compatibility_macro_undefined(int n)69e61e5625SAlexander Kornienko int fallthrough_compatibility_macro_undefined(int n) {
70e61e5625SAlexander Kornienko   switch (n) {
71e61e5625SAlexander Kornienko     case 0:
72e61e5625SAlexander Kornienko       n = n * 20;
73*4f902c7eSRichard Smith #if __cplusplus <= 201402L
74e61e5625SAlexander Kornienko     case 1: // expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert '[[clang::fallthrough]];' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}}
75*4f902c7eSRichard Smith #else
76*4f902c7eSRichard Smith     case 1: // expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert '[[fallthrough]];' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}}
77*4f902c7eSRichard Smith #endif
78e61e5625SAlexander Kornienko       ;
79e61e5625SAlexander Kornienko   }
80e61e5625SAlexander Kornienko #define TOO_LATE [[clang::fallthrough]]
81e61e5625SAlexander Kornienko   return n;
82e61e5625SAlexander Kornienko }
83e61e5625SAlexander Kornienko #undef TOO_LATE
84e61e5625SAlexander Kornienko 
85e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY 11111111
86e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY
87e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY [[clang::fallthrough]]
88e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY
89e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY 2222222
90e61e5625SAlexander Kornienko 
fallthrough_compatibility_macro_history(int n)91e61e5625SAlexander Kornienko int fallthrough_compatibility_macro_history(int n) {
92e61e5625SAlexander Kornienko   switch (n) {
93e61e5625SAlexander Kornienko     case 0:
94e61e5625SAlexander Kornienko       n = n * 20;
95e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY
96*4f902c7eSRichard Smith #if __cplusplus <= 201402L
97e61e5625SAlexander Kornienko     case 1: // expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert '[[clang::fallthrough]];' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}}
98*4f902c7eSRichard Smith #else
99*4f902c7eSRichard Smith     case 1: // expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert '[[fallthrough]];' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}}
100*4f902c7eSRichard Smith #endif
101e61e5625SAlexander Kornienko       ;
102e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY [[clang::fallthrough]]
103e61e5625SAlexander Kornienko   }
104e61e5625SAlexander Kornienko   return n;
105e61e5625SAlexander Kornienko }
106e61e5625SAlexander Kornienko 
107e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY
108e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY 11111111
109e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY
110e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY [[clang::fallthrough]]
111e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY
112e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY 2222222
113e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY
114e61e5625SAlexander Kornienko 
fallthrough_compatibility_macro_history2(int n)115e61e5625SAlexander Kornienko int fallthrough_compatibility_macro_history2(int n) {
116e61e5625SAlexander Kornienko   switch (n) {
117e61e5625SAlexander Kornienko     case 0:
118e61e5625SAlexander Kornienko       n = n * 20;
119e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY [[clang::fallthrough]]
120e61e5625SAlexander Kornienko     case 1: // expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert 'MACRO_WITH_HISTORY;' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}}
121e61e5625SAlexander Kornienko       ;
122e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY
123e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY 3333333
124e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY
125e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY 4444444
126e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY
127e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY 5555555
128e61e5625SAlexander Kornienko   }
129e61e5625SAlexander Kornienko   return n;
130e61e5625SAlexander Kornienko }
131e61e5625SAlexander Kornienko 
132e61e5625SAlexander Kornienko template<const int N>
fallthrough_compatibility_macro_history_template(int n)133e61e5625SAlexander Kornienko int fallthrough_compatibility_macro_history_template(int n) {
134e61e5625SAlexander Kornienko   switch (N * n) {
135e61e5625SAlexander Kornienko     case 0:
136e61e5625SAlexander Kornienko       n = n * 20;
137e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY2 [[clang::fallthrough]]
138e61e5625SAlexander Kornienko     case 1: // expected-warning{{unannotated fall-through between switch labels}} expected-note{{insert 'MACRO_WITH_HISTORY2;' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}}
139e61e5625SAlexander Kornienko       ;
140e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY2
141e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY2 3333333
142e61e5625SAlexander Kornienko   }
143e61e5625SAlexander Kornienko   return n;
144e61e5625SAlexander Kornienko }
145e61e5625SAlexander Kornienko 
146e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY2
147e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY2 4444444
148e61e5625SAlexander Kornienko #undef MACRO_WITH_HISTORY2
149e61e5625SAlexander Kornienko #define MACRO_WITH_HISTORY2 5555555
150e61e5625SAlexander Kornienko 
f()151e61e5625SAlexander Kornienko void f() {
152e61e5625SAlexander Kornienko   fallthrough_compatibility_macro_history_template<1>(0); // expected-note{{in instantiation of function template specialization 'fallthrough_compatibility_macro_history_template<1>' requested here}}
153e61e5625SAlexander Kornienko }
154