]> granicus.if.org Git - clang/commitdiff
[-Wunreachable-code] constexpr functions can be used as configuration values.
authorTed Kremenek <kremenek@apple.com>
Thu, 20 Mar 2014 06:07:35 +0000 (06:07 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 20 Mar 2014 06:07:35 +0000 (06:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204308 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ReachableCode.cpp
test/SemaCXX/warn-unreachable.cpp

index c79a94b820c5364852fa863a2c976760b0dfc9ca..ffe576cd0524c72e525030f2aa0325efedd118ca 100644 (file)
@@ -139,6 +139,11 @@ static bool isConfigurationValue(const Stmt *S,
     S = Ex->IgnoreParenCasts();
 
   switch (S->getStmtClass()) {
+    case Stmt::CallExprClass: {
+      const FunctionDecl *Callee =
+        dyn_cast_or_null<FunctionDecl>(cast<CallExpr>(S)->getCalleeDecl());
+      return Callee ? Callee->isConstexpr() : false;
+    }
     case Stmt::DeclRefExprClass: {
       const DeclRefExpr *DR = cast<DeclRefExpr>(S);
       const ValueDecl *D = DR->getDecl();
index abab966c6603299788c06dfe88faa311de01e5a0..9db75926d23e38049cdff66680b1c994dadf1903 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 %s -fcxx-exceptions -fexceptions -fsyntax-only -verify -fblocks -Wunreachable-code-aggressive -Wno-unused-value
+// RUN: %clang_cc1 %s -fcxx-exceptions -fexceptions -fsyntax-only -verify -fblocks -std=c++11 -Wunreachable-code-aggressive -Wno-unused-value
 
 int &halt() __attribute__((noreturn));
 int &live();
@@ -234,3 +234,24 @@ Frobozz test_return_object_control_flow(int flag) {
   return Frobozz(flag ? 42 : 24); // expected-warning {{code will never be executed}}
 }
 
+void somethingToCall();
+
+ static constexpr bool isConstExprConfigValue() { return true; }
+ int test_const_expr_config_value() {
+   if (isConstExprConfigValue()) {
+     somethingToCall();
+     return 0;
+   }
+   somethingToCall(); // no-warning
+   return 1;
+ }
+ int test_const_expr_config_value_2() {
+   if (!isConstExprConfigValue()) {
+     somethingToCall(); // no-warning
+     return 0;
+   }
+   somethingToCall();
+   return 1;
+ }
+