diff options
author | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2019-12-09 17:07:47 +0100 |
---|---|---|
committer | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2019-12-09 18:27:51 +0100 |
commit | 330f1d3825daa0d9e8d6c54f4fcf6fa5800e5664 (patch) | |
tree | af9082e08796d7fc0de30d257f67d91a30f6da49 /gdb/guile | |
parent | b43315e206362a09ae70da71a6631bb5e2770554 (diff) | |
download | gdb-330f1d3825daa0d9e8d6c54f4fcf6fa5800e5664.zip gdb-330f1d3825daa0d9e8d6c54f4fcf6fa5800e5664.tar.gz gdb-330f1d3825daa0d9e8d6c54f4fcf6fa5800e5664.tar.bz2 |
gdb: rank an lvalue argument incompatible for an rvalue parameter
Passing an lvalue argument to a function that takes an rvalue parameter
is not allowed per C++ rules. Consider this function:
int g (int &&x) { return x; }
Calling g as in
int i = 5;
int j = g (i);
is illegal. For instance, GCC 9.2.1 yields
~~~
test.cpp: In function ‘int main()’:
test.cpp:6:14: error: cannot bind rvalue reference of type ‘int&&’ to
lvalue of type ‘int’
6 | int j = g (i);
| ^
~~~
GDB currently allows this function call:
~~~
(gdb) print g(i)
$1 = 5
~~~
Fix this by ranking an lvalue argument incompatible with an rvalue
parameter. The behavior after this patch is:
~~~
(gdb) print g(i)
Cannot resolve function g to any overloaded instance
~~~
Tested with GCC 9.2.1.
gdb/ChangeLog:
2019-12-09 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* gdbtypes.c (rank_one_type): Return INCOMPATIBLE_TYPE_BADNESS
when ranking an lvalue argument for an rvalue parameter.
gdb/testsuite/ChangeLog:
2019-12-09 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* gdb.cp/rvalue-ref-overload.cc (g): New function that takes
an rvalue parameter.
* gdb.cp/rvalue-ref-overload.exp: Test calling it with an lvalue
parameter.
Change-Id: I4a6dfc7dac63efa1e3b9f8f391e4b736fbdccdc1
Diffstat (limited to 'gdb/guile')
0 files changed, 0 insertions, 0 deletions