On Mon, Apr 1, 2019 at 5:12 PM <apin...@marvell.com> wrote: > > From: Andrew Pinski <apin...@marvell.com> > > Hi, > The problem here is the token->val.node is not saved over > a precompiled header for C++ operator. This can cause an > internal compiler error as we tried to print out the spelling > of the token as we assumed it was valid. > The fix is to have cpp_token_val_index return CPP_TOKEN_FLD_NODE > for operator tokens that have NAMED_OP set. > > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
Ping? It has been a month now. > > Thanks, > Andrew Pinski > > libcpp/ChangeLog: > * lex.c (cpp_token_val_index <case SPELL_OPERATOR>): If tok->flags > has NAMED_OP set, then return CPP_TOKEN_FLD_NODE. > > gcc/testsuite/ChangeLog: > * g++.dg/pch/operator-1.C: New testcase. > * g++.dg/pch/operator-1.Hs: New file. > --- > gcc/testsuite/g++.dg/pch/operator-1.C | 2 ++ > gcc/testsuite/g++.dg/pch/operator-1.Hs | 9 +++++++++ > libcpp/lex.c | 6 +++++- > 3 files changed, 16 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/pch/operator-1.C > create mode 100644 gcc/testsuite/g++.dg/pch/operator-1.Hs > > diff --git a/gcc/testsuite/g++.dg/pch/operator-1.C > b/gcc/testsuite/g++.dg/pch/operator-1.C > new file mode 100644 > index 0000000..290b5f7 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/pch/operator-1.C > @@ -0,0 +1,2 @@ > +#include "operator-1.H" > +int main(void){ major(0);} /* { dg-warning "Did not Work" } */ > diff --git a/gcc/testsuite/g++.dg/pch/operator-1.Hs > b/gcc/testsuite/g++.dg/pch/operator-1.Hs > new file mode 100644 > index 0000000..657dae1 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/pch/operator-1.Hs > @@ -0,0 +1,9 @@ > +# define __glibc_macro_warning1(message) _Pragma (#message) > +# define __glibc_macro_warning(message) \ > + __glibc_macro_warning1 (GCC warning message) > +#define __SYSMACROS_DM1(...) __glibc_macro_warning (#__VA_ARGS__) > + > +#define __SYSMACROS_DM(symbol) __SYSMACROS_DM1 \ > + (Did not Work) > + > +# define major(dev) __SYSMACROS_DM (major) (dev+0) > diff --git a/libcpp/lex.c b/libcpp/lex.c > index eedfcbb..16ded6e 100644 > --- a/libcpp/lex.c > +++ b/libcpp/lex.c > @@ -3756,7 +3756,11 @@ cpp_token_val_index (const cpp_token *tok) > case SPELL_LITERAL: > return CPP_TOKEN_FLD_STR; > case SPELL_OPERATOR: > - if (tok->type == CPP_PASTE) > + /* Operands which were originally spelled as ident keep around > + the node for the exact spelling. */ > + if (tok->flags & NAMED_OP) > + return CPP_TOKEN_FLD_NODE; > + else if (tok->type == CPP_PASTE) > return CPP_TOKEN_FLD_TOKEN_NO; > else > return CPP_TOKEN_FLD_NONE; > -- > 1.8.3.1 >