From: jason Date: Tue, 18 Mar 2008 02:52:34 +0000 (+0000) Subject: PR c++/35548 X-Git-Tag: upstream/4.9.2~43237 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=42a4acf1aa8c11c319f3cae94106910b47b0299d;p=platform%2Fupstream%2Flinaro-gcc.git PR c++/35548 * 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c73fd6b..d2ae223 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 2ee8237..3677262 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 9242eca..195a779 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 0000000..2d56395 --- /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); +}