On Tue, Apr 08, 2025 at 10:19:58AM +0200, Jakub Jelinek wrote: > Hi! > > The following testcase ICEs after emitting one pedwarn (about using > __VA_ARGS__ in a place where it shouldn't be used) and one error. > The error is emitted by _cpp_save_parameter where it sees the node > has been used already earlier. But unlike the other _cpp_save_parameter > caller which does goto out; if it returns false, this call with explicit > __VA_ARGS__ doesn't and if it increments number of parameters etc. after > the error, we then try to unsave it twice. > > The following patch fixes it by doing the goto out in that case too, > the macro will then not be considered as variable arguments macro, > but for error recovery I think that is fine. > The other option would be before the other _cpp_save_parameter caller > check if the node is pfile->spec_nodes.n__VA_ARGS__ and in that case > also error and goto out, but that seems more expensive than this for > the common case that the macro definition is correct. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK, thanks. > 2025-04-08 Jakub Jelinek <ja...@redhat.com> > > PR preprocessor/118674 > * macro.cc (parse_params): If _cpp_save_parameter failed for Maybe add "<case CPP_ELLIPSIS>". > __VA_ARGS__, goto out. > > * gcc.dg/cpp/pr118674.c: New test. > > --- libcpp/macro.cc.jj 2025-01-02 11:47:49.413954299 +0100 > +++ libcpp/macro.cc 2025-04-07 10:44:50.351400123 +0200 > @@ -3610,9 +3610,10 @@ parse_params (cpp_reader *pfile, unsigne > if (!prev_ident) > { > /* An ISO bare ellipsis. */ > - _cpp_save_parameter (pfile, nparms, > - pfile->spec_nodes.n__VA_ARGS__, > - pfile->spec_nodes.n__VA_ARGS__); > + if (!_cpp_save_parameter (pfile, nparms, > + pfile->spec_nodes.n__VA_ARGS__, > + pfile->spec_nodes.n__VA_ARGS__)) > + goto out; > nparms++; > pfile->state.va_args_ok = 1; > if (! CPP_OPTION (pfile, c99) > --- gcc/testsuite/gcc.dg/cpp/pr118674.c.jj 2025-04-07 10:52:49.997718759 > +0200 > +++ gcc/testsuite/gcc.dg/cpp/pr118674.c 2025-04-07 10:53:34.026105696 > +0200 > @@ -0,0 +1,5 @@ > +/* PR preprocessor/118674 */ > +/* { dg-do preprocess } */ > +#define M(__VA_ARGS__, ...) > +/* { dg-error "'__VA_ARGS__' can only appear in the expansion of a C99 > variadic macro" "" { target *-*-* } .-1 } */ > +/* { dg-error "duplicate macro parameter '__VA_ARGS__'" "" { target *-*-* } > .-2 } */ Marek