'GCC -Wimplicit-fallthrough is not warning when I miss [[fallthrough]]
I am using GCC version 8.3 and have a switch statement:
#include <iostream>
enum class Type : char
{
Value1 = 'A',
Value2,
Value3,
Value4,
};
int main()
{
Type t;
switch(t)
{
case Type::Value1:
case Type::Value2:
case Type::Value3:
std::cout << "hw" << std::endl;
case Type::Value4:
break;
}
}
I want to be forced to use [[fallthrough]]
otherwise generate a warning.
I added gcc flags to detect missing enums and implict fallthrough:
g++ -o main.cc -O3 -Wswitch-enum -Wimplicit-fallthrough -std=c++1z
The new flags have been detected because I now get warnings I'm missing enums. I fixed those but I still receive no warnings about implicit fallthrough.
I've put the code here:
https://godbolt.org/z/rj5sTPWz4
Am I missing something? I was expecting to be warned?
UPDATE:
I changed the code to this:
struct Object
{
int a;
};
int main()
{
Type t;
Object o;
switch(t)
{
case Type::Value1:
case Type::Value2:
case Type::Value3:
case Type::Value4:
o.a = 5;
break;
}
}
and it still doesn't generate a warning.
Solution 1:[1]
I don't think it's considered fallthrough if you've got no statements in between the labels—that's just multiple case labels on a statement.
Gcc doesn't even warn on
case Type::Value1:
x++; //real fallthrough here
case Type::Value2:
case Type::Value3:
case Type::Value4:
break;
though (unlike clang), but it does warn on
case Type::Value1:
x++; //real fallthrough here
case Type::Value2:
x++;
case Type::Value3:
case Type::Value4:
break;
https://godbolt.org/z/s8Ka84Gq6
so it seems you need both actual fallthrough (on both gcc and clang) and into something that has an effect in order to elicit the warning (on gcc).
Solution 2:[2]
case Type::Value4:
break;
Because there is just break there, there is no difference, if you fall through or not. Add something there.
case Type::Value3:
std::cout << "something";
case Type::Value4:
std::cout << "actually something else";
break;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | KamilCuk |