Fix overload resolution involving rvalue references and cv qualifiers.
authorKeith Seitz <keiths@redhat.com>
Thu, 27 Apr 2017 22:55:26 +0000 (15:55 -0700)
committerKeith Seitz <keiths@redhat.com>
Thu, 27 Apr 2017 22:58:54 +0000 (15:58 -0700)
commite15c3eb45bdc8bd5717fd5ceddcc30c3de07b58f
tree56889ea84864e52062ebec7bfa090119c52ff871
parent5b66fac4bad619766fb1a5f5179c08b67d48a8c5
Fix overload resolution involving rvalue references and cv qualifiers.

The following patch fixes several outstanding overload resolution problems
with rvalue references and cv qualifiers in the test suite. The tests for
these problems typically passed with one compiler version and failed with
another. This behavior occurs because of the ordering of the overloaded
functions in the debug info. So the first best match "won out" over the
a subsequent better match.

One of the bugs addressed by this patch is the failure of rank_one_type to
account for type equality of two overloads based on CV qualifiers.  This was
leading directly to problems evaluating rvalue reference overload quality,
but it is also highlighted in gdb.cp/oranking.exp, where two test KFAIL as
a result of this shortcoming.

I found the overload resolution code committed with the rvalue reference
patch (f9aeb8d49) needlessly over-complicated, and I have greatly simplified
it. This fixes some KFAILing tests in gdb.exp/rvalue-ref-overload.exp.

gdb/ChangeLog

* gdbtypes.c (LVALUE_REFERENCE_TO_RVALUE_BINDING_BADNESS)
DIFFERENT_REFERENCE_TYPE_BADNESS): Remove.
(CV_CONVERSION_BADNESS): Define.
(rank_one_type): Remove overly restrictive rvalue reference
rank checks.
Add cv-qualifier checks and subranks for type equality.
* gdbtypes.h (REFERENCE_CONVERSION_RVALUE,
REFERENCE_CONVERSION_CONST_LVALUE, CV_CONVERSION_BADNESS,
CV_CONVERSION_CONST, CV_CONVERSION_VOLATILE): Declare.

gdb/testsuite/ChangeLog

* gdb.cp/oranking.cc (test15): New function.
(main): Call test15 and declare additional variables for testing.
* gdb.cp/oranking.exp: Remove kfail status for "p foo4(&a)" and
"p foo101('abc')" tests.
* gdb.cp/rvalue-ref-overloads.exp: Remove kfail status for
"lvalue reference overload" test.
* gdb.cp/rvalue-ref-params.exp: Remove kfail status for
"print value of f1 on Child&& in f2" test.
gdb/ChangeLog
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/oranking.cc
gdb/testsuite/gdb.cp/oranking.exp
gdb/testsuite/gdb.cp/rvalue-ref-overload.exp
gdb/testsuite/gdb.cp/rvalue-ref-params.exp
This page took 0.034545 seconds and 4 git commands to generate.