166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wimplicit-fallthrough -DCOMMAND_LINE_FALLTHROUGH=[[clang::fallthrough]] %s 266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienkoint fallthrough_compatibility_macro_from_command_line(int n) { 466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko switch (n) { 566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko case 0: 666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko n = n * 10; 766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander 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}} 866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko ; 966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko } 1066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko return n; 1166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko} 1266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 1366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#ifdef __clang__ 1466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough") 1566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define COMPATIBILITY_FALLTHROUGH [ [ /* test */ clang /* test */ \ 1666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko :: fallthrough ] ] // testing whitespace and comments in macro definition 1766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#endif 1866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#endif 1966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 2066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#ifndef COMPATIBILITY_FALLTHROUGH 2166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define COMPATIBILITY_FALLTHROUGH do { } while (0) 2266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#endif 2366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 2466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienkoint fallthrough_compatibility_macro_from_source(int n) { 2566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko switch (n) { 2666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko case 0: 2766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko n = n * 20; 2866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander 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}} 2966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko ; 3066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko } 3166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko return n; 3266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko} 3366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 3466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko// Deeper macro substitution 3566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define M1 [[clang::fallthrough]] 3666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#ifdef __clang__ 3766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define M2 M1 3866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#else 3966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define M2 4066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#endif 4166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 4266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define WRONG_MACRO1 clang::fallthrough 4366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define WRONG_MACRO2 [[clang::fallthrough] 4466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define WRONG_MACRO3 [[clang::fall through]] 4566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define WRONG_MACRO4 [[clang::fallthrough]]] 4666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 4766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienkoint fallthrough_compatibility_macro_in_macro(int n) { 4866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko switch (n) { 4966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko case 0: 5066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko n = n * 20; 5166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander 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}} 5266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko // there was an idea that this ^ should be M2 5366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko ; 5466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko } 5566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko return n; 5666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko} 5766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 5866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef M1 5966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef M2 6066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef COMPATIBILITY_FALLTHROUGH 6166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef COMMAND_LINE_FALLTHROUGH 6266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 6366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienkoint fallthrough_compatibility_macro_undefined(int n) { 6466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko switch (n) { 6566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko case 0: 6666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko n = n * 20; 6766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander 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}} 6866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko ; 6966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko } 7066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define TOO_LATE [[clang::fallthrough]] 7166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko return n; 7266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko} 7366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef TOO_LATE 7466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 7566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY 11111111 7666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY 7766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY [[clang::fallthrough]] 7866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY 7966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY 2222222 8066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 8166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienkoint fallthrough_compatibility_macro_history(int n) { 8266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko switch (n) { 8366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko case 0: 8466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko n = n * 20; 8566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY 8666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander 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}} 8766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko ; 8866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY [[clang::fallthrough]] 8966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko } 9066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko return n; 9166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko} 9266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 9366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY 9466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY 11111111 9566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY 9666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY [[clang::fallthrough]] 9766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY 9866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY 2222222 9966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY 10066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 10166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienkoint fallthrough_compatibility_macro_history2(int n) { 10266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko switch (n) { 10366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko case 0: 10466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko n = n * 20; 10566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY [[clang::fallthrough]] 10666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander 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}} 10766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko ; 10866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY 10966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY 3333333 11066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY 11166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY 4444444 11266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY 11366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY 5555555 11466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko } 11566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko return n; 11666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko} 11766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 11866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienkotemplate<const int N> 11966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienkoint fallthrough_compatibility_macro_history_template(int n) { 12066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko switch (N * n) { 12166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko case 0: 12266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko n = n * 20; 12366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY2 [[clang::fallthrough]] 12466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander 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}} 12566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko ; 12666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY2 12766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY2 3333333 12866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko } 12966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko return n; 13066da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko} 13166da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 13266da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY2 13366da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY2 4444444 13466da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#undef MACRO_WITH_HISTORY2 13566da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko#define MACRO_WITH_HISTORY2 5555555 13666da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko 13766da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienkovoid f() { 13866da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko fallthrough_compatibility_macro_history_template<1>(0); // expected-note{{in instantiation of function template specialization 'fallthrough_compatibility_macro_history_template<1>' requested here}} 13966da0abf7ab7cd449bb1d5134b2ef97d9d34d812Alexander Kornienko} 140