diff options
author | Ted Kremenek <kremenek@apple.com> | 2014-03-05 23:38:41 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2014-03-05 23:38:41 +0000 |
commit | 01a39b601f91c66e6f359d160010724afd3254a6 (patch) | |
tree | 6caa6d122c716b44bf3d2e935227c70129460a60 /clang | |
parent | da3f4fd3fe864d4694955448457cb33e6045b238 (diff) | |
download | bcm5719-llvm-01a39b601f91c66e6f359d160010724afd3254a6.tar.gz bcm5719-llvm-01a39b601f91c66e6f359d160010724afd3254a6.zip |
[-Wunreachable-code] include some enum constants in "configuration value" heuristic
llvm-svn: 203026
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Analysis/ReachableCode.cpp | 5 | ||||
-rw-r--r-- | clang/test/Sema/warn-unreachable.c | 18 |
2 files changed, 23 insertions, 0 deletions
diff --git a/clang/lib/Analysis/ReachableCode.cpp b/clang/lib/Analysis/ReachableCode.cpp index f159642db2f..b772145456e 100644 --- a/clang/lib/Analysis/ReachableCode.cpp +++ b/clang/lib/Analysis/ReachableCode.cpp @@ -376,6 +376,11 @@ static bool isConfigurationValue(const Stmt *S) { S = Ex->IgnoreParenCasts(); switch (S->getStmtClass()) { + case Stmt::DeclRefExprClass: { + const DeclRefExpr *DR = cast<DeclRefExpr>(S); + const EnumConstantDecl *ED = dyn_cast<EnumConstantDecl>(DR->getDecl()); + return ED ? isConfigurationValue(ED->getInitExpr()) : false; + } case Stmt::IntegerLiteralClass: return isExpandedFromConfigurationMacro(S); case Stmt::UnaryExprOrTypeTraitExprClass: diff --git a/clang/test/Sema/warn-unreachable.c b/clang/test/Sema/warn-unreachable.c index e8089aaa4f9..a3c49855905 100644 --- a/clang/test/Sema/warn-unreachable.c +++ b/clang/test/Sema/warn-unreachable.c @@ -234,3 +234,21 @@ int sizeof_int() { return 2; // no-warning } +enum MyEnum { + ME_A = CONFIG_CONSTANT, + ME_B = 1 +}; + +int test_MyEnum() { + if (!ME_A) + return 1; // no-warning + if (ME_A) + return 2; // no-warning + if (ME_B) + return 3; + // FIXME: we should only need one diagnostic here. + if (!ME_B) // expected-warning {{will never be executed}} + return 4;// expected-warning {{will never be executed}} + return 5; +} + |