]> granicus.if.org Git - clang/commitdiff
Don't bind arguments to temporaries if the argument has a reference type.
authorAnders Carlsson <andersca@mac.com>
Fri, 13 Nov 2009 17:04:35 +0000 (17:04 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 13 Nov 2009 17:04:35 +0000 (17:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@88662 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/CodeGenCXX/temporaries.cpp

index 3663f0923d5c9f3826a8319f2518949a8590be88..f20b37d90cdcfa30bc99a6d1539bb83135a4af9e 100644 (file)
@@ -2653,7 +2653,8 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn,
       if (PerformCopyInitialization(Arg, ProtoArgType, "passing"))
         return true;
       
-      Arg = MaybeBindToTemporary(Arg).takeAs<Expr>();
+      if (!ProtoArgType->isReferenceType())
+        Arg = MaybeBindToTemporary(Arg).takeAs<Expr>();
     } else {
       ParmVarDecl *Param = FDecl->getParamDecl(i);
 
index 4f65e462d426e66628344b00527f85029dc6db92..e55027460f0c37ef6efcf054fc73775ddd0cfe71 100644 (file)
@@ -188,3 +188,17 @@ void f9(H h) {
   // CHECK: call void @_ZN1HD1Ev
   f9(h);
 }
+
+void f10(const H&);
+
+void f11(H h) {
+  // CHECK: call void @_ZN1HC1Ev
+  // CHECK: call void @_Z3f10RK1H
+  // CHECK: call void @_ZN1HD1Ev
+  f10(H());
+  
+  // CHECK: call void @_Z3f10RK1H
+  // CHECK-NOT: call void @_ZN1HD1Ev
+  // CHECK: ret void
+  f10(h);
+}
\ No newline at end of file