diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/Expr.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 4 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/temp-1.cpp | 20 |
3 files changed, 23 insertions, 4 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index cfcbca47301..b92ecac6a31 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -800,6 +800,9 @@ Expr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const { case CXXTypeidExprClass: // C++ 5.2.8p1: The result of a typeid expression is an lvalue of ... return LV_Valid; + case CXXBindTemporaryExprClass: + return cast<CXXBindTemporaryExpr>(this)->getSubExpr()-> + isLvalueInternal(Ctx); case ConditionalOperatorClass: { // Complicated handling is only for C++. if (!Ctx.getLangOptions().CPlusPlus) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index d45e54a4a53..2b507fb303a 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -4345,8 +4345,8 @@ Sema::BuildCallToMemberFunction(Scope *S, Expr *MemExprE, if (CheckFunctionCall(Method, TheCall.get())) return true; - - return TheCall.release(); + + return MaybeBindToTemporary(TheCall.release()).release(); } /// BuildCallToObjectOfClassType - Build a call to an object of class diff --git a/clang/test/CodeGenCXX/temp-1.cpp b/clang/test/CodeGenCXX/temp-1.cpp index 21b3e543293..1edcae4acfc 100644 --- a/clang/test/CodeGenCXX/temp-1.cpp +++ b/clang/test/CodeGenCXX/temp-1.cpp @@ -12,7 +12,7 @@ void f1() { A().f(); } -// Calls +// Function calls struct B { B(); ~B(); @@ -21,8 +21,24 @@ struct B { B g(); // RUN: grep "call void @_ZN1BC1Ev" %t | count 0 && -// RUN: grep "call void @_ZN1BD1Ev" %t | count 1 +// RUN: grep "call void @_ZN1BD1Ev" %t | count 1 && void f2() { (void)g(); } +// Member function calls +struct C { + C(); + ~C(); + + C f(); +}; + +// RUN: grep "call void @_ZN1CC1Ev" %t | count 1 && +// RUN: grep "call void @_ZN1CD1Ev" %t | count 2 +void f3() { + C().f(); +} + + + |