]> granicus.if.org Git - clang/commitdiff
The value of a case statement is a potentially evaluated context. Found by inspection.
authorEli Friedman <eli.friedman@gmail.com>
Wed, 18 Jan 2012 02:54:10 +0000 (02:54 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 18 Jan 2012 02:54:10 +0000 (02:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148373 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/SemaCXX/constant-expression-cxx11.cpp

index 4908e883b83642ebf79cab93cd179e2178042cf9..58c690d49ff3111060d3f3c694e94b166e350e68 100644 (file)
@@ -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());
index 3736685d43de5842882f8467e07d59df7c57ed02..5ccb398c32619e7c36dd41789d4814f07e8258f4 100644 (file)
@@ -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); }
+}