aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-01-18 02:54:10 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-01-18 02:54:10 +0000
commit6b3014b07c40a6ed8b0c8ed63950df02eeb82c28 (patch)
tree8b7f17e7cee28a0492334cb7b5ad3eb90a1669e7
parent7cdfe298ae49e381f6d78fc93855c372e5173dd0 (diff)
The value of a case statement is a potentially evaluated context. Found by inspection.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148373 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/TreeTransform.h4
-rw-r--r--test/SemaCXX/constant-expression-cxx11.cpp6
2 files changed, 8 insertions, 2 deletions
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index 4908e883b8..58c690d49f 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -4984,8 +4984,8 @@ StmtResult
TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
ExprResult LHS, RHS;
{
- // The case value expressions are not potentially evaluated.
- EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
+ EnterExpressionEvaluationContext Unevaluated(SemaRef,
+ Sema::ConstantEvaluated);
// Transform the left-hand case value.
LHS = getDerived().TransformExpr(S->getLHS());
diff --git a/test/SemaCXX/constant-expression-cxx11.cpp b/test/SemaCXX/constant-expression-cxx11.cpp
index 3736685d43..5ccb398c32 100644
--- a/test/SemaCXX/constant-expression-cxx11.cpp
+++ b/test/SemaCXX/constant-expression-cxx11.cpp
@@ -1022,3 +1022,9 @@ namespace ComplexConstexpr {
typedef _Complex float fcomplex;
constexpr fcomplex test7 = fcomplex();
}
+
+namespace InstantiateCaseStmt {
+ template<int x> constexpr int f() { return x; }
+ template<int x> int g(int c) { switch(c) { case f<x>(): return 1; } return 0; }
+ int gg(int c) { return g<4>(c); }
+}