]> granicus.if.org Git - clang/commitdiff
fix logic for member expr codegen.
authorChris Lattner <sabre@nondot.org>
Sun, 2 Dec 2007 18:52:07 +0000 (18:52 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 2 Dec 2007 18:52:07 +0000 (18:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44520 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGExpr.cpp

index e7bd712f31376aa4664e127d45c34bf880bd0339..5d563e19b969be0d91a5e704dc382eac73fa69a7 100644 (file)
@@ -389,19 +389,15 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
 
   Expr *BaseExpr = E->getBase();
   llvm::Value *BaseValue = NULL;
-  if (BaseExpr->isLvalue() == Expr::LV_Valid) {
+  
+  // If this is s.x, emit s as an lvalue.  If it is s->x, emit s as a scalar.
+  if (E->isArrow())
+    BaseValue = EmitScalarExpr(BaseExpr);
+  else {
     LValue BaseLV = EmitLValue(BaseExpr);
+    // FIXME: this isn't right for bitfields.
     BaseValue = BaseLV.getAddress();
-    
-    if (E->isArrow()) {
-      QualType Ty = BaseExpr->getType();
-      Ty = cast<PointerType>(Ty.getCanonicalType())->getPointeeType();
-      BaseValue =  
-        Builder.CreateBitCast(BaseValue, 
-                              llvm::PointerType::get(ConvertType(Ty)), "tmp");
-    }
-  } else
-    BaseValue = EmitScalarExpr(BaseExpr);
+  }
 
   FieldDecl *Field = E->getMemberDecl();
   unsigned idx = CGM.getTypes().getLLVMFieldNo(Field);