From 5d9db0b54ba7b55142b2f840a99c1756e1926bda Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Sat, 15 Mar 2014 06:47:45 +0000 Subject: [PATCH] -Wunreachable-code: treat 'const bool' locals as control values. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204001 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ReachableCode.cpp | 7 ++++++- test/SemaCXX/warn-unreachable.cpp | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/Analysis/ReachableCode.cpp b/lib/Analysis/ReachableCode.cpp index d297d03775..71d41bb283 100644 --- a/lib/Analysis/ReachableCode.cpp +++ b/lib/Analysis/ReachableCode.cpp @@ -236,7 +236,12 @@ static bool isConfigurationValue(const Stmt *S, // We could generalize this to local variables, but it isn't // clear if those truly represent configuration values that // gate unreachable code. - return !VD->hasLocalStorage(); + if (!VD->hasLocalStorage()) + return true; + + // As a heuristic, locals that have been marked 'const' explicitly + // can be treated as configuration values as well. + return VD->getType().isLocalConstQualified(); } return false; } diff --git a/test/SemaCXX/warn-unreachable.cpp b/test/SemaCXX/warn-unreachable.cpp index 17f0b9bf52..2370fe0da2 100644 --- a/test/SemaCXX/warn-unreachable.cpp +++ b/test/SemaCXX/warn-unreachable.cpp @@ -199,3 +199,22 @@ int test_arithmetic() { return 2; // expected-warning {{never be executed}} } +int test_treat_const_bool_local_as_config_value() { + const bool controlValue = false; + if (!controlValue) + return 1; + test_treat_const_bool_local_as_config_value(); // no-warning + return 0; +} + +int test_treat_non_const_bool_local_as_non_config_value() { + bool controlValue = false; + if (!controlValue) + return 1; + // There is no warning here because 'controlValue' isn't really + // a control value at all. The CFG will not treat this + // branch as unreachable. + test_treat_non_const_bool_local_as_non_config_value(); // no-warning + return 0; +} + -- 2.40.0