diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-14 01:30:44 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-14 01:30:44 +0000 |
commit | 283e4d59b8fe63e93f20b6ffb3a623a4f60a85ea (patch) | |
tree | 0a62837310f7b09b7f6dc58346f79129d8b08fef /lib/Sema/SemaExprCXX.cpp | |
parent | b9ea0b53d323cdca2b8284ff986a878e195cb97f (diff) |
If a function call returns a reference, don't bind it to a temporary.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81743 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index a060e47067..a6bf82b590 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -1778,6 +1778,15 @@ Sema::OwningExprResult Sema::MaybeBindToTemporary(Expr *E) { if (RD->hasTrivialDestructor()) return Owned(E); + if (CallExpr *CE = dyn_cast<CallExpr>(E)) { + QualType Ty = CE->getCallee()->getType(); + if (const PointerType *PT = Ty->getAs<PointerType>()) + Ty = PT->getPointeeType(); + + const FunctionType *FTy = Ty->getAsFunctionType(); + if (FTy->getResultType()->isReferenceType()) + return Owned(E); + } CXXTemporary *Temp = CXXTemporary::Create(Context, RD->getDestructor(Context)); ExprTemporaries.push_back(Temp); |