Since the 'is aliased' bit is critical for correctness in C++, it
really shouldn't be optional. Fix the remaining place where a temporary was being passed as potentially-aliased memory. Fixes PR10756. llvm-svn: 138627
This commit is contained in:
parent
f3b6507e26
commit
46759f4f46
|
@ -444,7 +444,8 @@ void AggExprEmitter::VisitBinAssign(const BinaryOperator *E) {
|
|||
LValue RHS = CGF.EmitLValue(E->getRHS());
|
||||
LValue LHS = CGF.EmitLValue(E->getLHS());
|
||||
Dest = AggValueSlot::forLValue(LHS, AggValueSlot::IsDestructed,
|
||||
needsGC(E->getLHS()->getType()));
|
||||
needsGC(E->getLHS()->getType()),
|
||||
AggValueSlot::IsAliased);
|
||||
EmitFinalDestCopy(E, RHS, true);
|
||||
return;
|
||||
}
|
||||
|
@ -469,7 +470,8 @@ void AggExprEmitter::VisitBinAssign(const BinaryOperator *E) {
|
|||
// Codegen the RHS so that it stores directly into the LHS.
|
||||
AggValueSlot LHSSlot =
|
||||
AggValueSlot::forLValue(LHS, AggValueSlot::IsDestructed,
|
||||
needsGC(E->getLHS()->getType()));
|
||||
needsGC(E->getLHS()->getType()),
|
||||
AggValueSlot::IsAliased);
|
||||
CGF.EmitAggExpr(E->getRHS(), LHSSlot, false);
|
||||
EmitFinalDestCopy(E, LHS, true);
|
||||
}
|
||||
|
@ -1052,7 +1054,8 @@ LValue CodeGenFunction::EmitAggExprToLValue(const Expr *E) {
|
|||
llvm::Value *Temp = CreateMemTemp(E->getType());
|
||||
LValue LV = MakeAddrLValue(Temp, E->getType());
|
||||
EmitAggExpr(E, AggValueSlot::forLValue(LV, AggValueSlot::IsNotDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers));
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased));
|
||||
return LV;
|
||||
}
|
||||
|
||||
|
|
|
@ -705,7 +705,8 @@ static void StoreAnyExprIntoOneUnit(CodeGenFunction &CGF, const CXXNewExpr *E,
|
|||
AggValueSlot Slot
|
||||
= AggValueSlot::forAddr(NewPtr, AllocType.getQualifiers(),
|
||||
AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers);
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased);
|
||||
CGF.EmitAggExpr(Init, Slot);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -383,7 +383,7 @@ public:
|
|||
static AggValueSlot forAddr(llvm::Value *addr, Qualifiers quals,
|
||||
IsDestructed_t isDestructed,
|
||||
NeedsGCBarriers_t needsGC,
|
||||
IsAliased_t isAliased = IsAliased,
|
||||
IsAliased_t isAliased,
|
||||
IsZeroed_t isZeroed = IsNotZeroed) {
|
||||
AggValueSlot AV;
|
||||
AV.Addr = addr;
|
||||
|
@ -397,7 +397,7 @@ public:
|
|||
|
||||
static AggValueSlot forLValue(LValue LV, IsDestructed_t isDestructed,
|
||||
NeedsGCBarriers_t needsGC,
|
||||
IsAliased_t isAliased = IsAliased,
|
||||
IsAliased_t isAliased,
|
||||
IsZeroed_t isZeroed = IsNotZeroed) {
|
||||
return forAddr(LV.getAddress(), LV.getQuals(),
|
||||
isDestructed, needsGC, isAliased, isZeroed);
|
||||
|
|
|
@ -5,3 +5,16 @@ void f(bool flag) {
|
|||
|
||||
(flag ? a : b) = 3;
|
||||
}
|
||||
|
||||
// PR10756
|
||||
namespace test0 {
|
||||
struct A {
|
||||
A(const A &);
|
||||
A &operator=(const A &);
|
||||
A sub() const;
|
||||
void foo() const;
|
||||
};
|
||||
void foo(bool cond, const A &a) {
|
||||
(cond ? a : a.sub()).foo();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue