]> granicus.if.org Git - clang/commitdiff
Add MaybeBindToTemporary calls for member call expressions.
authorAnders Carlsson <andersca@mac.com>
Sun, 16 Aug 2009 03:42:12 +0000 (03:42 +0000)
committerAnders Carlsson <andersca@mac.com>
Sun, 16 Aug 2009 03:42:12 +0000 (03:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79171 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Expr.cpp
lib/Sema/SemaOverload.cpp
test/CodeGenCXX/temp-1.cpp

index cfcbca47301d84e41082b9c9e7ac230cf340698f..b92ecac6a316775d539116635219120c5c0283a4 100644 (file)
@@ -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)
index d45e54a4a5378b4674249404f8afbee4b0fddf81..2b507fb303a01018587e8e174e4dae98e02de864 100644 (file)
@@ -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
index 21b3e543293f7c99b889a3ec5f81dc41bb6ee323..1edcae4acfcc51a9b7496c99fc4c03f070cb4295 100644 (file)
@@ -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();
+}
+
+
+