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