diff options
| author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-09-04 20:18:05 +0000 |
|---|---|---|
| committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-09-04 20:18:05 +0000 |
| commit | 611ca89a42e7562251af3343e9922bc8d59eaf74 (patch) | |
| tree | b8e61e3eed80ab5a4bfb8bd4b19c07b43f0f5fb8 | |
| parent | ecce391740b84bfa5f666614fa34707e867cad04 (diff) | |
| download | ppe42-gcc-611ca89a42e7562251af3343e9922bc8d59eaf74.tar.gz ppe42-gcc-611ca89a42e7562251af3343e9922bc8d59eaf74.zip | |
PR c++/31419
* call.c (reference_binding): Don't look for user-defined conversions
to the same type.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128102 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
| -rw-r--r-- | gcc/cp/call.c | 7 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/conversion/self1.C | 15 |
3 files changed, 25 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e517f89d112..ab7cb5ffea4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2007-09-04 Jason Merrill <jason@redhat.com> + PR c++/31419 + * call.c (reference_binding): Don't look for user-defined conversions + to the same type. + PR c++/31411 * except.c (initialize_handler_parm): Put a CLEANUP_POINT_EXPR inside the MUST_NOT_THROW_EXPR. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 8fb818b64a6..dd41b9d8168 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -1200,7 +1200,12 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags) return conv; } - else if (CLASS_TYPE_P (from) && !(flags & LOOKUP_NO_CONVERSION)) + /* [class.conv.fct] A conversion function is never used to convert a + (possibly cv-qualified) object to the (possibly cv-qualified) same + object type (or a reference to it), to a (possibly cv-qualified) base + class of that type (or a reference to it).... */ + else if (CLASS_TYPE_P (from) && !related_p + && !(flags & LOOKUP_NO_CONVERSION)) { /* [dcl.init.ref] diff --git a/gcc/testsuite/g++.dg/conversion/self1.C b/gcc/testsuite/g++.dg/conversion/self1.C new file mode 100644 index 00000000000..f36500a9fa5 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/self1.C @@ -0,0 +1,15 @@ +// PR c++/31419 + +struct B +{ + template<typename T> + operator T const& () const + { + return 42; + } +}; + +B f() +{ + return B(); +} |

