PR c++/35548
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Mar 2008 02:52:34 +0000 (02:52 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Mar 2008 02:52:34 +0000 (02:52 +0000)
        * call.c (reference_binding): Check LOOKUP_NO_TEMP_BIND when binding
        a temp directly to a reference as per DR391.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@133299 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/ref16.C [new file with mode: 0644]

index c73fd6b..d2ae223 100644 (file)
@@ -1,3 +1,9 @@
+2008-03-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/35548
+       * call.c (reference_binding): Check LOOKUP_NO_TEMP_BIND when binding
+       a temp directly to a reference as per DR391.
+
 2008-03-12  Richard Guenther  <rguenther@suse.de>
 
        PR c++/35469
index 2ee8237..3677262 100644 (file)
@@ -1145,7 +1145,8 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags)
      const and rvalue references to rvalues of compatible class type. */
   if (compatible_p
       && (lvalue_p
-         || ((CP_TYPE_CONST_NON_VOLATILE_P(to) || TYPE_REF_IS_RVALUE (rto))
+         || (!(flags & LOOKUP_NO_TEMP_BIND)
+             && (CP_TYPE_CONST_NON_VOLATILE_P(to) || TYPE_REF_IS_RVALUE (rto))
              && CLASS_TYPE_P (from))))
     {
       /* [dcl.init.ref]
index 9242eca..195a779 100644 (file)
@@ -1,3 +1,8 @@
+2008-03-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/35548
+       * g++.dg/init/ref16.C: New testcase.
+
 2008-03-17  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/19637
diff --git a/gcc/testsuite/g++.dg/init/ref16.C b/gcc/testsuite/g++.dg/init/ref16.C
new file mode 100644 (file)
index 0000000..2d56395
--- /dev/null
@@ -0,0 +1,23 @@
+// PR c++/35548
+// { dg-do run }
+
+int c;
+struct A
+{
+  A() { ++c; }
+  A(const A&) { ++c; }
+  ~A() { --c; }
+};
+
+A f()
+{
+  return A();
+}
+
+int i;
+const A* ap;
+int main()
+{
+  const A& ar = i ? *ap : f();
+  return (c == 0);
+}