switch-implicit-fallthrough.cpp revision e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3
1e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wimplicit-fallthrough %s 2e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 3e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 4e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithint fallthrough(int n) { 5e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n / 10) { 6e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (n - 1) { 7e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n = 100; 8e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } else if (n - 2) { 9e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n = 101; 10e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } else if (n - 3) { 11e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n = 102; 12e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 13e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 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}} 14e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ; 15e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 0: {// 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}} 16e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 17e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 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}} 18e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 100 ; 19e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 3: // 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}} 20e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (n > 0) 21e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 200; 22e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 4: // 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}} 23e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (n < 0) 24e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ; 25e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 5: // 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}} 26e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n) { 27e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 111: 28e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith break; 29e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 112: 30e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith break; 31e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 113: 32e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith break ; 33e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 34e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 6: // 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}} 35e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 300; 36e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 37e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n / 20) { 38e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 7: 39e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 400; 40e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; 41e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 9: // no warning here, intended fall-through marked with an attribute 42e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 800; 43e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; 44e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith default: { // no warning here, intended fall-through marked with an attribute 45e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (n % 2 == 0) { 46e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return 1; 47e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } else { 48e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; 49e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 50e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 51e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 10: // no warning here, intended fall-through marked with an attribute 52e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (n % 3 == 0) { 53e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n %= 3; 54e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } else { 55e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; 56e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 57e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 110: // expected-warning{{unannotated fall-through between switch labels}} but no fix-it hint as we have one fall-through annotation! 58e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 800; 59e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 60e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n / 30) { 61e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 11: 62e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 12: // no warning here, intended fall-through, no statement between labels 63e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 1600; 64e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 65e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n / 40) { 66e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 13: 67e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (n % 2 == 0) { 68e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return 1; 69e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } else { 70e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return 2; 71e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 72e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 15: // no warning here, there's no fall-through 73e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 3200; 74e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 75e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n / 50) { 76e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 17: { 77e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (n % 2 == 0) { 78e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return 1; 79e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } else { 80e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return 2; 81e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 82e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 83e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 19: { // no warning here, there's no fall-through 84e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 6400; 85e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return 3; 86e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 87e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 21: { // no warning here, there's no fall-through 88e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith break; 89e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 90e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 23: // no warning here, there's no fall-through 91e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 128000; 92e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith break; 93e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 25: // no warning here, there's no fall-through 94e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith break; 95e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 96e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 97e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return n; 98e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith} 99e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 100e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithclass ClassWithDtor { 101e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithpublic: 102e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ~ClassWithDtor() {} 103e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith}; 104e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 105e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithvoid fallthrough2(int n) { 106e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n) { 107e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 0: 108e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 109e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ClassWithDtor temp; 110e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith break; 111e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 112e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith default: // no warning here, there's no fall-through 113e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith break; 114e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 115e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith} 116e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 117e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#define MY_SWITCH(X, Y, Z, U, V) switch (X) { case Y: Z; case U: V; } 118e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#define MY_SWITCH2(X, Y, Z) switch (X) { Y; Z; } 119e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#define MY_CASE(X, Y) case X: Y 120e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#define MY_CASE2(X, Y, U, V) case X: Y; case U: V 121e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 122e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithint fallthrough_macro1(int n) { 123e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith MY_SWITCH(n, 13, n *= 2, 14, break) // expected-warning{{unannotated fall-through between switch labels}} 124e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 125e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n + 1) { 126e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith MY_CASE(33, n += 2); 127e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith MY_CASE(44, break); // expected-warning{{unannotated fall-through between switch labels}} 128e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith MY_CASE(55, n += 3); 129e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 130e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 131e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n + 3) { 132e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith MY_CASE(333, return 333); 133e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith MY_CASE2(444, n += 44, 4444, break); // expected-warning{{unannotated fall-through between switch labels}} 134e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith MY_CASE(555, n += 33); 135e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 136e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 137e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith MY_SWITCH2(n + 4, MY_CASE(17, n *= 3), MY_CASE(19, break)) // expected-warning{{unannotated fall-through between switch labels}} 138e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 139e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith MY_SWITCH2(n + 5, MY_CASE(21, break), MY_CASE2(23, n *= 7, 25, break)) // expected-warning{{unannotated fall-through between switch labels}} 140e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 141e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return n; 142e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith} 143e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 144e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithint fallthrough_position(int n) { 145e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n) { 146e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; // expected-warning{{fallthrough annotation in unreachable code}} 147e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 221: 148e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; // expected-warning{{fallthrough annotation does not directly precede switch label}} 149e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return 1; 150e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; // expected-warning{{fallthrough annotation in unreachable code}} 151e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 222: 152e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; // expected-warning{{fallthrough annotation does not directly precede switch label}} 153e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 400; 154e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 223: // 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}} 155e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; // expected-warning{{fallthrough annotation does not directly precede switch label}} 156e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 157e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return n; 158e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith} 159e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 160e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithint fallthrough_targets(int n) { 161e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; // expected-error{{fallthrough annotation is outside switch statement}} 162e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 163e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]] // expected-error{{fallthrough attribute is only allowed on empty statements}} 164e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith switch (n) { 165e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 121: 166e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 400; 167e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]]; // no warning here, correct target 168e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 123: 169e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]] // expected-error{{fallthrough attribute is only allowed on empty statements}} 170e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 800; 171e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith break; 172e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith [[clang::fallthrough]] // expected-error{{fallthrough attribute is only allowed on empty statements}} expected-note{{did you forget ';'?}} 173e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith case 125: 174e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith n += 1600; 175e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 176e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return n; 177e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith} 178