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>
|
2017-10-18 Keith Seitz <keiths@redhat.com>
|
||||||
|
|
||||||
* dwarf2read.c (dwarf2_add_typedef): Issue a complaint on unhandled
|
* dwarf2read.c (dwarf2_add_typedef): Issue a complaint on unhandled
|
||||||
|
|
10
gdb/c-exp.y
10
gdb/c-exp.y
|
@ -1554,7 +1554,7 @@ oper: OPERATOR NEW
|
||||||
| OPERATOR '>'
|
| OPERATOR '>'
|
||||||
{ $$ = operator_stoken (">"); }
|
{ $$ = operator_stoken (">"); }
|
||||||
| OPERATOR ASSIGN_MODIFY
|
| OPERATOR ASSIGN_MODIFY
|
||||||
{ const char *op = "unknown";
|
{ const char *op = " unknown";
|
||||||
switch ($2)
|
switch ($2)
|
||||||
{
|
{
|
||||||
case BINOP_RSH:
|
case BINOP_RSH:
|
||||||
|
@ -1630,7 +1630,13 @@ oper: OPERATOR NEW
|
||||||
|
|
||||||
c_print_type ($2, NULL, &buf, -1, 0,
|
c_print_type ($2, NULL, &buf, -1, 0,
|
||||||
&type_print_raw_options);
|
&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>
|
2017-10-17 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
* boards/native-stdio-gdbserver.exp: Load "local-board".
|
* boards/native-stdio-gdbserver.exp: Load "local-board".
|
||||||
|
|
|
@ -270,6 +270,7 @@ public:
|
||||||
operator int () const { return 21; } // base::operator int
|
operator int () const { return 21; } // base::operator int
|
||||||
operator fluff* () const { return new fluff (); } // base::operator fluff*
|
operator fluff* () const { return new fluff (); } // base::operator fluff*
|
||||||
operator fluff** () const { return &g_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
|
class base1 : public virtual base
|
||||||
|
@ -448,6 +449,7 @@ test_function (int argc, char* argv[]) // test_function
|
||||||
char* str = a;
|
char* str = a;
|
||||||
fluff* flp = a;
|
fluff* flp = a;
|
||||||
fluff** flpp = a;
|
fluff** flpp = a;
|
||||||
|
fluff const* const* flcpcp = a;
|
||||||
|
|
||||||
CV_f(CV::i);
|
CV_f(CV::i);
|
||||||
|
|
||||||
|
|
|
@ -407,6 +407,10 @@ add {base::operator int} \
|
||||||
{int (const base * const)} \
|
{int (const base * const)} \
|
||||||
- \
|
- \
|
||||||
-
|
-
|
||||||
|
add {base::operator fluff const* const*} \
|
||||||
|
{const fluff * const *(const base * const)} \
|
||||||
|
- \
|
||||||
|
-
|
||||||
|
|
||||||
# Templates
|
# Templates
|
||||||
add {tclass<char>::do_something} \
|
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)" \
|
gdb_test "p CV_f('cpexprs.cc'::CV::t)" \
|
||||||
{ = {int \(int\)} 0x[0-9a-f]+ <CV_f\(int\)>}
|
{ = {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
|
gdb_exit
|
||||||
return 0
|
return 0
|
||||||
|
|
Loading…
Reference in New Issue