Canonicalize conversion operators
Consider a conversion operator such as: operator foo const* const* (); There are two small parser problems, highlighted by this test: (gdb) p operator foo const* const* There is no field named operatorfoo const* const * GDB is looking up the symbol "operatorfoo const* const*" -- it is missing a space between the keyword "operator" and the type name "foo const* const*". Additionally, this input of the user-defined type needs to be canonicalized so that different "spellings" of the type are recognized: (gdb) p operator const foo* const * There is no field named operator const foo* const * gdb/ChangeLog: * c-exp.y (oper): Canonicalize conversion operators of user-defined types. Add whitespace to front of type name. gdb/testsuite/ChangeLog: * gdb.cp/cpexprs.cc (base) <operator fluff const* const*>: New method. (main): Call it. * gdb.cp/cpexprs.exp: Add new conversion operator to test matrix. Add additional user-defined conversion operator tests.
This commit is contained in:
parent
3753468682
commit
c8ba13ad37
|
@ -1,3 +1,9 @@
|
|||
2017-11-18 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
* c-exp.y (oper): Canonicalize conversion operators of user-defined
|
||||
types.
|
||||
Add whitespace to front of type name.
|
||||
|
||||
2017-10-18 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
* dwarf2read.c (dwarf2_add_typedef): Issue a complaint on unhandled
|
||||
|
|
|
@ -1630,7 +1630,13 @@ oper: OPERATOR NEW
|
|||
|
||||
c_print_type ($2, NULL, &buf, -1, 0,
|
||||
&type_print_raw_options);
|
||||
$$ = operator_stoken (buf.c_str ());
|
||||
|
||||
/* This also needs canonicalization. */
|
||||
std::string canon
|
||||
= cp_canonicalize_string (buf.c_str ());
|
||||
if (canon.empty ())
|
||||
canon = std::move (buf.string ());
|
||||
$$ = operator_stoken ((" " + canon).c_str ());
|
||||
}
|
||||
;
|
||||
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2017-11-18 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
* gdb.cp/cpexprs.cc (base) <operator fluff const* const*>: New
|
||||
method.
|
||||
(main): Call it.
|
||||
* gdb.cp/cpexprs.exp: Add new conversion operator to test matrix.
|
||||
Add additional user-defined conversion operator tests.
|
||||
|
||||
2017-10-17 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* boards/native-stdio-gdbserver.exp: Load "local-board".
|
||||
|
|
|
@ -270,6 +270,7 @@ public:
|
|||
operator int () const { return 21; } // base::operator int
|
||||
operator fluff* () const { return new fluff (); } // base::operator fluff*
|
||||
operator fluff** () const { return &g_fluff; } // base::operator fluff**
|
||||
operator fluff const* const* () const { return &g_fluff; } // base::operator fluff const* const*
|
||||
};
|
||||
|
||||
class base1 : public virtual base
|
||||
|
@ -448,6 +449,7 @@ test_function (int argc, char* argv[]) // test_function
|
|||
char* str = a;
|
||||
fluff* flp = a;
|
||||
fluff** flpp = a;
|
||||
fluff const* const* flcpcp = a;
|
||||
|
||||
CV_f(CV::i);
|
||||
|
||||
|
|
|
@ -407,6 +407,10 @@ add {base::operator int} \
|
|||
{int (const base * const)} \
|
||||
- \
|
||||
-
|
||||
add {base::operator fluff const* const*} \
|
||||
{const fluff * const *(const base * const)} \
|
||||
- \
|
||||
-
|
||||
|
||||
# Templates
|
||||
add {tclass<char>::do_something} \
|
||||
|
@ -746,5 +750,17 @@ gdb_test "p CV_f(CV::i)" " = 43"
|
|||
gdb_test "p CV_f('cpexprs.cc'::CV::t)" \
|
||||
{ = {int \(int\)} 0x[0-9a-f]+ <CV_f\(int\)>}
|
||||
|
||||
# Make sure conversion operator names are canonicalized and properly
|
||||
# "spelled."
|
||||
gdb_test "p base::operator const fluff * const *" \
|
||||
[get "base::operator fluff const* const*" print] \
|
||||
"canonicalized conversion operator name 1"
|
||||
gdb_test "p base::operator const fluff* const*" \
|
||||
[get "base::operator fluff const* const*" print] \
|
||||
"canonicalized conversion operator name 2"
|
||||
gdb_test "p base::operator derived*" \
|
||||
"There is no field named operator derived\\*" \
|
||||
"undefined conversion operator"
|
||||
|
||||
gdb_exit
|
||||
return 0
|
||||
|
|
Loading…
Reference in New Issue