diff options
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 4 | ||||
-rw-r--r-- | clang/test/SemaCXX/constant-expression-cxx11.cpp | 6 |
2 files changed, 8 insertions, 2 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 4908e883b83..58c690d49ff 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/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/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp index 3736685d43d..5ccb398c326 100644 --- a/clang/test/SemaCXX/constant-expression-cxx11.cpp +++ b/clang/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); } +} |