]> granicus.if.org Git - clang/commitdiff
Copy construction of non-trivial properties must not
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 20 May 2010 16:46:55 +0000 (16:46 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 20 May 2010 16:46:55 +0000 (16:46 +0000)
be turned into a setter call (fixes radar 8008649).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104235 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprAgg.cpp
lib/CodeGen/CGExprCXX.cpp

index da2100df940dd17317b4e060c8abeeec7bcf8b8b..3bf2f8a52025f58fbf1a94cd52c73b365436bb8a 100644 (file)
@@ -761,8 +761,7 @@ void CodeGenFunction::EmitAggregateCopy(llvm::Value *DestPtr,
     if (const RecordType *RT = Ty->getAs<RecordType>()) {
       CXXRecordDecl *Record = cast<CXXRecordDecl>(RT->getDecl());
       assert((Record->hasTrivialCopyConstructor() || 
-              Record->hasTrivialCopyAssignment() ||
-              /*FIXME!*/getContext().getLangOptions().ObjC1) &&
+              Record->hasTrivialCopyAssignment()) &&
              "Trying to aggregate-copy a type without a trivial copy "
              "constructor or assignment operator");
       // Ignore empty classes in C++.
index bfe967dc2d7f296723d7caabf5d66bb7d83c4137..eccb6e6aab5c8d94fa1ac913ce7d8f95fc0cb6e2 100644 (file)
@@ -255,7 +255,6 @@ CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
                                                ReturnValueSlot ReturnValue) {
   assert(MD->isInstance() &&
          "Trying to emit a member call expr on a static method!");
-
   if (MD->isCopyAssignment()) {
     const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(MD->getDeclContext());
     if (ClassDecl->hasTrivialCopyAssignment()) {
@@ -287,11 +286,9 @@ CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
   LValue LV = EmitLValue(E->getArg(0));
   llvm::Value *This;
   if (LV.isPropertyRef()) {
-    llvm::Value *AggLoc  = CreateMemTemp(E->getArg(1)->getType());
-    EmitAggExpr(E->getArg(1), AggLoc, false /*VolatileDest*/);
-    EmitObjCPropertySet(LV.getPropertyRefExpr(),
-                        RValue::getAggregate(AggLoc, false /*VolatileDest*/));
-    return RValue::getAggregate(0, false);
+    RValue RV = EmitLoadOfPropertyRefLValue(LV, E->getArg(0)->getType());
+    assert (!RV.isScalar() && "EmitCXXOperatorMemberCallExpr");
+    This = RV.getAggregateAddr();
   }
   else
     This = LV.getAddress();