When returning from a function that has a reference return type, use

EmitReferenceBindingToExpr() rather than assuming we have an
lvalue. This is just the lowest hanging fruit for PR6024, which still
requires a bit of work.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99447 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Douglas Gregor 2010-03-24 23:14:04 +00:00
Родитель f3eaf45bf3
Коммит 33fd1fc181
2 изменённых файлов: 9 добавлений и 1 удалений

Просмотреть файл

@ -607,7 +607,8 @@ void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) {
} else if (FnRetTy->isReferenceType()) {
// If this function returns a reference, take the address of the expression
// rather than the value.
Builder.CreateStore(EmitLValue(RV).getAddress(), ReturnValue);
RValue Result = EmitReferenceBindingToExpr(RV, false);
Builder.CreateStore(Result.getScalarVal(), ReturnValue);
} else if (!hasAggregateLLVMType(RV->getType())) {
Builder.CreateStore(EmitScalarExpr(RV), ReturnValue);
} else if (RV->getType()->isAnyComplexType()) {

Просмотреть файл

@ -147,3 +147,10 @@ void f(int &a) {
struct s0;
struct s1 { struct s0 &s0; };
void f0(s1 a) { s1 b = a; }
// PR6024
// CHECK: @_Z2f2v()
// CHECK: alloca
// CHECK: store
// CHECK: load
const int &f2() { return 0; }