aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2024-04-20 16:33:37 -0600
committerTom Tromey <tom@tromey.com>2024-05-14 13:28:40 -0600
commitda3ce5c46e1d5a87f2d3cb90cbc1b67a3b8fbb34 (patch)
tree76ae5e17642bb4ba6ce9a1e47ef4ec4442e14314 /gdb
parent3b099df59c47c4f09da0941c096098dde00a87dc (diff)
downloadgdb-da3ce5c46e1d5a87f2d3cb90cbc1b67a3b8fbb34.zip
gdb-da3ce5c46e1d5a87f2d3cb90cbc1b67a3b8fbb34.tar.gz
gdb-da3ce5c46e1d5a87f2d3cb90cbc1b67a3b8fbb34.tar.bz2
Add spaceship operator to cp-name-parser.y
While debugging gdb, I saw this: During symbol reading: unexpected demangled name 'operator<=><std::chrono::_V2::system_clock, std::chrono::duration<long int>, std::chrono::duration<long int> >' This happens because cp-name-parser.y does not handle the spaceship operator. This patch implements this. Approved-By: John Baldwin <jhb@FreeBSD.org>
Diffstat (limited to 'gdb')
-rw-r--r--gdb/cp-name-parser.y19
1 files changed, 18 insertions, 1 deletions
diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y
index cf3e8bf..9d0085d 100644
--- a/gdb/cp-name-parser.y
+++ b/gdb/cp-name-parser.y
@@ -297,7 +297,7 @@ static void yyerror (cpname_state *, const char *);
%left '^'
%left '&'
%left EQUAL NOTEQUAL
-%left '<' '>' LEQ GEQ
+%left '<' '>' LEQ GEQ SPACESHIP
%left LSH RSH
%left '@'
%left '+' '-'
@@ -451,6 +451,8 @@ oper : OPERATOR NEW
{ $$ = state->make_operator ("<=", 2); }
| OPERATOR GEQ
{ $$ = state->make_operator (">=", 2); }
+ | OPERATOR SPACESHIP
+ { $$ = state->make_operator ("<=>", 2); }
| OPERATOR ANDAND
{ $$ = state->make_operator ("&&", 2); }
| OPERATOR OROR
@@ -1077,6 +1079,10 @@ exp : exp GEQ exp
{ $$ = state->d_binary (">=", $1, $3); }
;
+exp : exp SPACESHIP exp
+ { $$ = state->d_binary ("<=>", $1, $3); }
+ ;
+
exp : exp '<' exp
{ $$ = state->d_binary ("<", $1, $3); }
;
@@ -1779,6 +1785,7 @@ yylex (YYSTYPE *lvalp, cpname_state *state)
return c;
case '<':
HANDLE_TOKEN3 ("<<=", ASSIGN_MODIFY);
+ HANDLE_TOKEN3 ("<=>", SPACESHIP);
HANDLE_TOKEN2 ("<=", LEQ);
HANDLE_TOKEN2 ("<<", LSH);
state->lexptr++;
@@ -2049,6 +2056,14 @@ should_be_the_same (const char *one, const char *two)
}
static void
+should_parse (const char *name)
+{
+ std::string err;
+ auto parsed = cp_demangled_name_to_comp (name, &err);
+ SELF_CHECK (parsed != nullptr);
+}
+
+static void
canonicalize_tests ()
{
should_be_the_same ("short int", "short");
@@ -2066,6 +2081,8 @@ canonicalize_tests ()
should_be_the_same ("something<void ()>", "something< void() >");
should_be_the_same ("something<void ()>", "something<void (void)>");
+
+ should_parse ("void whatever::operator<=><int, int>");
}
#endif