__real__ and __imag__ can be lvalues.  Add support to ast and codegen for them.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43525 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/Expr.cpp b/AST/Expr.cpp
index 0c631df..b21aad2 100644
--- a/AST/Expr.cpp
+++ b/AST/Expr.cpp
@@ -278,6 +278,7 @@
 ///  - e->name
 ///  - *e, the type of e cannot be a function type
 ///  - string-constant
+///  - (__real__ e) and (__imag__ e) where e is an lvalue  [GNU extension]
 ///  - reference type [C++ [expr]]
 ///
 Expr::isLvalueResult Expr::isLvalue() const {
@@ -307,9 +308,13 @@
     const MemberExpr *m = cast<MemberExpr>(this);
     return m->isArrow() ? LV_Valid : m->getBase()->isLvalue();
   }
-  case UnaryOperatorClass: // C99 6.5.3p4
+  case UnaryOperatorClass:
     if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Deref)
-      return LV_Valid;
+      return LV_Valid; // C99 6.5.3p4
+
+    if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Real ||
+        cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Imag)
+      return cast<UnaryOperator>(this)->getSubExpr()->isLvalue();  // GNU.
     break;
   case ParenExprClass: // C99 6.5.1p5
     return cast<ParenExpr>(this)->getSubExpr()->isLvalue();