diff options
author | Jason Merrill <jason@redhat.com> | 2008-03-17 22:52:34 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2008-03-17 22:52:34 -0400 |
commit | 3d574e5b1f7606112e6b3a54342b651a40fb4539 (patch) | |
tree | 306f38a313a14d6dd697eed309e8d10e52cc9790 | |
parent | a5728e4006219546ce97e0db987377ef386557fa (diff) | |
download | gcc-3d574e5b1f7606112e6b3a54342b651a40fb4539.zip gcc-3d574e5b1f7606112e6b3a54342b651a40fb4539.tar.gz gcc-3d574e5b1f7606112e6b3a54342b651a40fb4539.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/ref16.C | 23 |
4 files changed, 36 insertions, 1 deletions
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 <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 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 <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 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); +} |