In the following piece of code, I use the standard [[fallthrough]]
attribute from C++1z to document that a fallthrough is desired:
#include <iostream>
int main() {
switch (0) {
case 0:
std::cout << "a\n";
[[fallthrough]]
case 1:
std::cout << "b\n";
break;
}
}
With GCC 7.1, the code compiles without an error. However, the compiler still warns me about a fallthrough:
warning: this statement may fall through [-Wimplicit-fallthrough=]
std::cout << "a\n";
~~~~~~~~~~^~~~~~~~
Why?
You are missing a semicolon after the attribute:
case 0:
std::cout << "a\n";
[[fallthrough]];
// ^
case 1:
The [[fallthrough]]
attribute is to be applied to an empty statement (see P0188R1). The current Clang trunk gives a helpful error in this case:
error: fallthrough attribute is only allowed on empty statements
[[fallthrough]]
^
note: did you forget ';'?
[[fallthrough]]
^
;
Update: Cody Gray reported this issue to the GCC team.