mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-16 13:08:42 +00:00
Enhance -Wreturn-type to not warn when control-flow is most likely limited by a switch statement explicitly covering
all the cases for an enum value. llvm-svn: 113450
This commit is contained in:
parent
b037185b52
commit
50205744c3
@ -108,11 +108,15 @@ static ControlFlowKind CheckFallThrough(AnalysisContext &AC) {
|
||||
bool HasFakeEdge = false;
|
||||
bool HasPlainEdge = false;
|
||||
bool HasAbnormalEdge = false;
|
||||
for (CFGBlock::pred_iterator I=cfg->getExit().pred_begin(),
|
||||
E = cfg->getExit().pred_end();
|
||||
I != E;
|
||||
++I) {
|
||||
CFGBlock& B = **I;
|
||||
|
||||
// Ignore default cases that aren't likely to be reachable because all
|
||||
// enums in a switch(X) have explicit case statements.
|
||||
CFGBlock::FilterOptions FO;
|
||||
FO.IgnoreDefaultsWithCoveredEnums = 1;
|
||||
|
||||
for (CFGBlock::filtered_pred_iterator
|
||||
I = cfg->getExit().filtered_pred_start_end(FO); I.hasMore(); ++I) {
|
||||
const CFGBlock& B = **I;
|
||||
if (!live[B.getBlockID()])
|
||||
continue;
|
||||
if (B.size() == 0) {
|
||||
|
@ -242,3 +242,16 @@ static inline int si_forward() {} // expected-warning{{control reaches end of no
|
||||
// Test warnings on ignored qualifiers on return types.
|
||||
const int ignored_c_quals(); // expected-warning{{'const' type qualifier on return type has no effect}}
|
||||
const volatile int ignored_cv_quals(); // expected-warning{{'const volatile' type qualifiers on return type have no effect}}
|
||||
|
||||
// Test that for switch(enum) that if the switch statement covers all the cases
|
||||
// that we don't consider that for -Wreturn-type.
|
||||
enum Cases { C1, C2, C3, C4 };
|
||||
int test_enum_cases(enum Cases C) {
|
||||
switch (C) {
|
||||
case C1: return 1;
|
||||
case C2: return 2;
|
||||
case C4: return 3;
|
||||
case C3: return 4;
|
||||
}
|
||||
} // no-warning
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user