]> granicus.if.org Git - clang/commitdiff
[Sema] Discarded statment should be an evaluatable context.
authorErik Pilkington <erik.pilkington@gmail.com>
Tue, 3 Jul 2018 22:15:36 +0000 (22:15 +0000)
committerErik Pilkington <erik.pilkington@gmail.com>
Tue, 3 Jul 2018 22:15:36 +0000 (22:15 +0000)
The constexpr evaluator was erroring out because these templates weren't
defined. Despite being used in a discarded statement, we still need to constexpr
evaluate them, which means that we need to instantiate them. Fixes PR37585.

Differential revision: https://reviews.llvm.org/D48322

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@336233 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/SemaCXX/constant-expression-cxx1z.cpp

index a713136b6406ce9f45f5748204ae2c7eb14a61c7..820e5a95531c74319b9a95630377d97c180faaea 100644 (file)
@@ -14237,13 +14237,13 @@ static bool isEvaluatableContext(Sema &SemaRef) {
   switch (SemaRef.ExprEvalContexts.back().Context) {
     case Sema::ExpressionEvaluationContext::Unevaluated:
     case Sema::ExpressionEvaluationContext::UnevaluatedAbstract:
-    case Sema::ExpressionEvaluationContext::DiscardedStatement:
       // Expressions in this context are never evaluated.
       return false;
 
     case Sema::ExpressionEvaluationContext::UnevaluatedList:
     case Sema::ExpressionEvaluationContext::ConstantEvaluated:
     case Sema::ExpressionEvaluationContext::PotentiallyEvaluated:
+    case Sema::ExpressionEvaluationContext::DiscardedStatement:
       // Expressions in this context could be evaluated.
       return true;
 
index a48c9b11b886ba9b6490ddf3b7ac83b7de44ad56..2b366adf2e914868574fc8ed113b86ad30986256 100644 (file)
@@ -46,3 +46,16 @@ namespace Cxx17CD_NB_GB19 {
   const int &r = 0;
   constexpr int n = r;
 }
+
+namespace PR37585 {
+template <class T> struct S { static constexpr bool value = true; };
+template <class T> constexpr bool f() { return true; }
+template <class T> constexpr bool v = true;
+
+void test() {
+  if constexpr (true) {}
+  else if constexpr (f<int>()) {}
+  else if constexpr (S<int>::value) {}
+  else if constexpr (v<int>) {}
+}
+}