re PR c++/35548 (g++ 4.3 miscompile this simple program)
authorJason Merrill <jason@redhat.com>
Tue, 18 Mar 2008 02:52:34 +0000 (22:52 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 18 Mar 2008 02:52:34 +0000 (22:52 -0400)
        PR c++/35548
        * call.c (reference_binding): Check LOOKUP_NO_TEMP_BIND when binding
        a temp directly to a reference as per DR391.

From-SVN: r133299

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

index c73fd6b25d520d4b3d711ea498d0b3afa03f5112..d2ae223aaf32447e807196e6fb8eb71c66be06aa 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 2ee82371f68baaf7674eef58bf5de1f29ebde1a0..3677262a370d5be945e58f61eee9e2d445ce6eb6 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 9242eca671cd7997edc08df8adba6d21e94388d0..195a779d5561aa76d7f2633c439d76cc1ff38c41 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);
+}