summaryrefslogtreecommitdiff
path: root/gdb/c-exp.y
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2017-10-18 11:05:45 -0700
committerKeith Seitz <keiths@redhat.com>2017-10-18 11:26:02 -0700
commitc8ba13ad37c98262b94f99cc4f84ac0066c48cc2 (patch)
tree7c6f2cf2c229f58fa48e034cde0ef4f4e6abce27 /gdb/c-exp.y
parent3753468682a9c7982b6eba0fca58fbfc1cd5b9fb (diff)
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.
Diffstat (limited to 'gdb/c-exp.y')
-rw-r--r--gdb/c-exp.y10
1 files changed, 8 insertions, 2 deletions
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 7c050b4ce7..18c74d8a17 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -1554,7 +1554,7 @@ oper: OPERATOR NEW
| OPERATOR '>'
{ $$ = operator_stoken (">"); }
| OPERATOR ASSIGN_MODIFY
- { const char *op = "unknown";
+ { const char *op = " unknown";
switch ($2)
{
case BINOP_RSH:
@@ -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 ());
}
;