]> granicus.if.org Git - clang/commitdiff
Handle non LValue base expressions.
authorDevang Patel <dpatel@apple.com>
Fri, 26 Oct 2007 18:15:21 +0000 (18:15 +0000)
committerDevang Patel <dpatel@apple.com>
Fri, 26 Oct 2007 18:15:21 +0000 (18:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43387 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGExpr.cpp
test/CodeGen/struct.c

index b03caaa66663f8f88e2296239cda3859b98b96c9..1c8eda1f6076617f1e53ac60f2e76afba6a372e1 100644 (file)
@@ -394,21 +394,18 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
   }
 
   llvm::Value *BaseValue = NULL;
-  if (const CallExpr *CE = dyn_cast<CallExpr>(BaseExpr)) {
-    RValue Base = EmitCallExpr(CE);
-    BaseValue = Base.getScalarVal();
-  }
-  else {
+  if (BaseExpr->isLvalue() == Expr::LV_Valid) {
     LValue BaseLV = EmitLValue(BaseExpr);
     BaseValue = BaseLV.getAddress();
-
+    
     if (E->isArrow()) {
       QualType PTy = cast<PointerType>(BaseExpr->getType())->getPointeeType();
       BaseValue =  Builder.CreateBitCast(BaseValue, 
-                                      llvm::PointerType::get(ConvertType(PTy)),
+                                         llvm::PointerType::get(ConvertType(PTy)),
                                          "tmp");
     }
-  }
+  } else
+    BaseValue = EmitScalarExpr(BaseExpr);
 
   FieldDecl *Field = E->getMemberDecl();
   unsigned idx = CGM.getTypes().getLLVMFieldNo(Field);
index 4e73cd47af01ba4a651e8d1f13265b6e2f86bb9d..443fc33ccb30f89ca70ba6af0145932d0a740332 100644 (file)
@@ -59,3 +59,7 @@ extern NB *f3();
 void f4() {
   f3()->d1 = 42;
 }
+
+void f5() {
+  (f3())->d1 = 42;
+}