diff options
author | Tom Tromey <tom@tromey.com> | 2024-04-20 16:33:37 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2024-05-14 13:28:40 -0600 |
commit | da3ce5c46e1d5a87f2d3cb90cbc1b67a3b8fbb34 (patch) | |
tree | 76ae5e17642bb4ba6ce9a1e47ef4ec4442e14314 /gdb | |
parent | 3b099df59c47c4f09da0941c096098dde00a87dc (diff) | |
download | gdb-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.y | 19 |
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 |