On 06/19/2014 12:12 AM, Jason Merrill wrote:
We were treating a const & member function like a normal const reference, and binding an rvalue object argument to it. But it doesn't work that way.
In 4.9 we also need to set LOOKUP_NO_TEMP_BIND.
commit 48ca9803695872d984b0f4efa56f7f58987d0928 Author: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Wed Jun 18 22:13:51 2014 +0000 PR c++/59296 * call.c (add_function_candidate): Set LOOKUP_NO_RVAL_BIND |LOOKUP_NO_TEMP_BIND for ref-qualifier handling. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 2c3d4ac..fc65b97 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -1999,6 +1999,9 @@ add_function_candidate (struct z_candidate **candidates, object parameter has reference type. */ bool rv = FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (fn)); parmtype = cp_build_reference_type (parmtype, rv); + /* Don't bind an rvalue to a const lvalue ref-qualifier. */ + if (!rv) + lflags |= LOOKUP_NO_RVAL_BIND|LOOKUP_NO_TEMP_BIND; } else { diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual15.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual15.C new file mode 100644 index 0000000..ca333c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual15.C @@ -0,0 +1,13 @@ +// PR c++/59296 +// { dg-do compile { target c++11 } } + +struct Type +{ + void get() const& { } + void get() const&& { } +}; + +int main() +{ + Type{}.get(); +}