]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Add spaceship operator to cp-name-parser.y
authorTom Tromey <tom@tromey.com>
Sat, 20 Apr 2024 22:33:37 +0000 (16:33 -0600)
committerTom Tromey <tom@tromey.com>
Tue, 14 May 2024 19:28:40 +0000 (13:28 -0600)
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>
gdb/cp-name-parser.y

index cf3e8bfd16f0604f401e7263de83d5028299516f..9d0085d27f4605108afad485491bf6abd2eeedd7 100644 (file)
@@ -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<void ()>", "something<  void()  >");
   should_be_the_same ("something<void ()>", "something<void (void)>");
+
+  should_parse ("void whatever::operator<=><int, int>");
 }
 
 #endif