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

Reply via email to