зеркало из https://github.com/microsoft/clang.git
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:
Родитель
f3eaf45bf3
Коммит
33fd1fc181
|
@ -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; }
|
||||
|
|
Загрузка…
Ссылка в новой задаче