PR c++/59296
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Jun 2014 18:32:35 +0000 (18:32 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Jun 2014 18:32:35 +0000 (18:32 +0000)
* call.c (add_function_candidate): Avoid special 'this' handling
if we have a ref-qualifier.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211854 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/call.c

index b437954..a8bc633 100644 (file)
@@ -1,5 +1,9 @@
 2014-06-20  Jason Merrill  <jason@redhat.com>
 
+       PR c++/59296
+       * call.c (add_function_candidate): Avoid special 'this' handling
+       if we have a ref-qualifier.
+
        PR c++/61556
        * call.c (build_over_call): Call build_this in template path.
 
index da91433..4847c3a 100644 (file)
@@ -2025,9 +2025,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;
+                 /* The special handling of 'this' conversions in compare_ics
+                    does not apply if there is a ref-qualifier.  */
+                 is_this = false;
                }
              else
                {
@@ -8597,10 +8597,11 @@ compare_ics (conversion *ics1, conversion *ics2)
   /* [over.ics.rank]
 
      --S1 and S2 are reference bindings (_dcl.init.ref_) and neither refers
-     to an implicit object parameter, and either S1 binds an lvalue reference
-     to an lvalue and S2 binds an rvalue reference or S1 binds an rvalue
-     reference to an rvalue and S2 binds an lvalue reference
-     (C++0x draft standard, 13.3.3.2)
+     to an implicit object parameter of a non-static member function
+     declared without a ref-qualifier, and either S1 binds an lvalue
+     reference to an lvalue and S2 binds an rvalue reference or S1 binds an
+     rvalue reference to an rvalue and S2 binds an lvalue reference (C++0x
+     draft standard, 13.3.3.2)
 
      --S1 and S2 are reference bindings (_dcl.init.ref_), and the
      types to which the references refer are the same type except for