mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
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>
This commit is contained in:
parent
3b099df59c
commit
da3ce5c46e
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user