Fix crash in calling convention code expanding an struct with a complex member.
llvm-svn: 144612
This commit is contained in:
parent
14b66375a9
commit
95ff70021c
|
@ -1513,7 +1513,10 @@ void CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
|
|||
llvm::Value *EltAddr = Builder.CreateConstGEP2_32(Addr, 0, Elt);
|
||||
LValue LV = MakeAddrLValue(EltAddr, EltTy);
|
||||
RValue EltRV;
|
||||
if (CodeGenFunction::hasAggregateLLVMType(EltTy))
|
||||
if (EltTy->isAnyComplexType())
|
||||
// FIXME: Volatile?
|
||||
EltRV = RValue::getComplex(LoadComplexFromAddr(LV.getAddress(), false));
|
||||
else if (CodeGenFunction::hasAggregateLLVMType(EltTy))
|
||||
EltRV = RValue::getAggregate(LV.getAddress());
|
||||
else
|
||||
EltRV = EmitLoadOfLValue(LV);
|
||||
|
@ -1531,13 +1534,16 @@ void CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
|
|||
// FIXME: What are the right qualifiers here?
|
||||
LValue LV = EmitLValueForField(Addr, FD, 0);
|
||||
RValue FldRV;
|
||||
if (CodeGenFunction::hasAggregateLLVMType(FT))
|
||||
if (FT->isAnyComplexType())
|
||||
// FIXME: Volatile?
|
||||
FldRV = RValue::getComplex(LoadComplexFromAddr(LV.getAddress(), false));
|
||||
else if (CodeGenFunction::hasAggregateLLVMType(FT))
|
||||
FldRV = RValue::getAggregate(LV.getAddress());
|
||||
else
|
||||
FldRV = EmitLoadOfLValue(LV);
|
||||
ExpandTypeToArgs(FT, FldRV, Args, IRFuncTy);
|
||||
}
|
||||
} else if (isa<ComplexType>(Ty)) {
|
||||
} else if (Ty->isAnyComplexType()) {
|
||||
ComplexPairTy CV = RV.getComplexVal();
|
||||
Args.push_back(CV.first);
|
||||
Args.push_back(CV.second);
|
||||
|
|
|
@ -275,3 +275,8 @@ void f56(char a0, struct s56_0 a1,
|
|||
f56_0(1, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9,
|
||||
a10, a11, a12, a13);
|
||||
}
|
||||
|
||||
// CHECK: define void @f57(i32 %x.0, i32 %x.1)
|
||||
// CHECK: call void @f57(
|
||||
struct s57 { _Complex int x; };
|
||||
void f57(struct s57 x) {} void f57a(void) { f57((struct s57){1}); }
|
||||
|
|
Loading…
Reference in New Issue