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