]> granicus.if.org Git - clang/commitdiff
Fixed isConstantInitializer for __builtin_choose_expr.
authorAbramo Bagnara <abramo.bagnara@gmail.com>
Mon, 27 Sep 2010 07:13:32 +0000 (07:13 +0000)
committerAbramo Bagnara <abramo.bagnara@gmail.com>
Mon, 27 Sep 2010 07:13:32 +0000 (07:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114820 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Expr.cpp
test/Sema/compound-literal.c

index b31ec2314dc12f8ae4860e7d0456644471be113c..dbfe2d52b88405301c6b53e3f5e91aea48e0b379 100644 (file)
@@ -1764,6 +1764,9 @@ bool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef) const {
   case ParenExprClass:
     return cast<ParenExpr>(this)->getSubExpr()
       ->isConstantInitializer(Ctx, IsForRef);
+  case ChooseExprClass:
+    return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx)
+      ->isConstantInitializer(Ctx, IsForRef);
   case UnaryOperatorClass: {
     const UnaryOperator* Exp = cast<UnaryOperator>(this);
     if (Exp->getOpcode() == UO_Extension)
index aade4641ace08ad1befb76e80d72eedaafdf7c1c..41307625999e6534997964002f0e2c6a0f6edb08 100644 (file)
@@ -3,9 +3,10 @@
 struct foo { int a, b; };
 
 static struct foo t = (struct foo){0,0};
-static struct foo t2 = {0,0}; 
+static struct foo t1 = __builtin_choose_expr(0, (struct foo){0,0}, (struct foo){0,0});
+static struct foo t2 = {0,0};
 static struct foo t3 = t2; // -expected-error {{initializer element is not a compile-time constant}}
-static int *p = (int []){2,4}; 
+static int *p = (int []){2,4};
 static int x = (int){1};
 
 static int *p2 = (int []){2,x}; // -expected-error {{initializer element is not a compile-time constant}}