From da3ce5c46e1d5a87f2d3cb90cbc1b67a3b8fbb34 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sat, 20 Apr 2024 16:33:37 -0600 Subject: [PATCH] Add spaceship operator to cp-name-parser.y While debugging gdb, I saw this: During symbol reading: unexpected demangled name 'operator<=>, std::chrono::duration >' This happens because cp-name-parser.y does not handle the spaceship operator. This patch implements this. Approved-By: John Baldwin --- gdb/cp-name-parser.y | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y index cf3e8bfd16f..9d0085d27f4 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++; @@ -2048,6 +2055,14 @@ should_be_the_same (const char *one, const char *two) SELF_CHECK (strcmp (one, two) == 0); } +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 () { @@ -2066,6 +2081,8 @@ canonicalize_tests () should_be_the_same ("something", "something< void() >"); should_be_the_same ("something", "something"); + + should_parse ("void whatever::operator<=>"); } #endif