Fix rdar://6095061 - gcc allows __builtin_choose_expr as an lvalue



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60924 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index b5f966d..728b135 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -467,6 +467,13 @@
   }
   case CompoundLiteralExprClass: // C99 6.5.2.5p5
     return LV_Valid;
+  case ChooseExprClass:
+    // __builtin_choose_expr is an lvalue if the selected operand is.
+    if (cast<ChooseExpr>(this)->isConditionTrue(Ctx))
+      return cast<ChooseExpr>(this)->getLHS()->isLvalue(Ctx);
+    else
+      return cast<ChooseExpr>(this)->getRHS()->isLvalue(Ctx);
+
   case ExtVectorElementExprClass:
     if (cast<ExtVectorElementExpr>(this)->containsDuplicateElements())
       return LV_DuplicateVectorComponents;
@@ -476,7 +483,7 @@
   case ObjCPropertyRefExprClass: // FIXME: check if read-only property.
     return LV_Valid;
   case ObjCKVCRefExprClass: // FIXME: check if read-only property.
-      return LV_Valid;
+    return LV_Valid;
   case PredefinedExprClass:
     return LV_Valid;
   case VAArgExprClass:
@@ -1213,8 +1220,7 @@
   return getCond()->getIntegerConstantExprValue(C) != 0;
 }
 
-static int64_t evaluateOffsetOf(ASTContext& C, const Expr *E)
-{
+static int64_t evaluateOffsetOf(ASTContext& C, const Expr *E) {
   if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
     QualType Ty = ME->getBase()->getType();