From 3d574e5b1f7606112e6b3a54342b651a40fb4539 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 17 Mar 2008 22:52:34 -0400 Subject: [PATCH] re PR c++/35548 (g++ 4.3 miscompile this simple program) 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 | 6 ++++++ gcc/cp/call.c | 3 ++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/init/ref16.C | 23 +++++++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/init/ref16.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c73fd6b25d5..d2ae223aaf3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-03-17 Jason Merrill + + 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 PR c++/35469 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 2ee82371f68..3677262a370 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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] diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9242eca671c..195a779d556 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-03-17 Jason Merrill + + PR c++/35548 + * g++.dg/init/ref16.C: New testcase. + 2008-03-17 Richard Guenther 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 index 00000000000..2d56395cb63 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref16.C @@ -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); +}