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