On Mon, 2026-08-31 at 06:26 +0000, Torbjörn Svensson via Sourceware
Forge wrote:
> From: Torbjörn SVENSSON <[email protected]>
> 
> Newlib, picolibc, and probably other libc implementations, use
> 
>   #define O_CREAT  _FCREAT
>   #define O_TRUNC  _FTRUNC
>   #define O_EXCL   _FEXCL
> 
> In r17-177-g9a5f89005dc49d, support was added to identify redundant
> flags, but the implementation requires that the value of the macros
> O_CREAT, O_EXCL, O_RDWR to be a number.  This patch extends the
> support
> to also allow macro aliases.  It will follow up to 8 levels of macros
> in
> order to reach the number.
> 
> This change fixes
> 
> FAIL: gcc.dg/analyzer/mkostemp-1.c  (test for warnings, line 109)
> FAIL: gcc.dg/analyzer/mkostemp-1.c  (test for warnings, line 115)
> FAIL: gcc.dg/analyzer/mkostemps-1.c  (test for warnings, line 115)
> FAIL: gcc.dg/analyzer/mkostemps-1.c  (test for warnings, line 121)
> 
> Regtested with arm-none-eabi (with newlib) on r17-3738-
> gaaa0f6b1e87bc6.
> 
> gcc/c/ChangeLog:
> 
>       PR analyzer/125265
>       * c-parser.cc: Follow, up to eight, macro alias to get the
> value
>       for a named constant.
> 
> Signed-off-by: Torbjörn SVENSSON <[email protected]>
> ---
> Ok for trunk?

Thanks for this patch; various notes inline below...

> 
> I'm unsure if this should also go into releases/gcc-16, WDYT?
> 
> --
> 
> 
> 
> This is a forge pull request published on the gcc-patches mailing
> list mailing list
> as requested by Torbjörn Svensson via Sourceware Forge
> <[email protected]>.
> Forge discussion: https://forge.sourceware.org/gcc/gcc/pulls/226
> 
> Get it locally using:
> ```
> git fetch forge-upstream
> "+refs/versioned_pull/226/*:refs/versioned_pull/226/*"
> git switch -c "pr-226-v1" "refs/versioned_pull/226/1/head"
> ```
> Or, download the patch at:
> https://forge.sourceware.org/gcc/gcc/pulls/226.diff
> Created on: 2026-08-31 06:26:23+00:00
> Latest update: 2026-08-31 06:26:55+00:00
> Changes: 1 changed files, 20 additions, 3 deletions
> Head revision: azoff/gcc ref pr/macro-aliases commit
> 650c07cdb28058525967b479fb10934f44f12d1d 
> Base revision: gcc/gcc ref trunk commit
> aaa0f6b1e87bc62ea15da6eab431af6dcebf6414 r17-3738-gaaa0f6b1e87bc6
> Merge base: aaa0f6b1e87bc62ea15da6eab431af6dcebf6414
> Requested Reviewers: dmalcolm
> 
> Changed files:
> - M: gcc/c/c-parser.cc
> 
>  gcc/c/c-parser.cc | 23 ++++++++++++++++++++---
>  1 file changed, 20 insertions(+), 3 deletions(-)
> 
> diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
> index 9dc5ba1e3a13f..afa3b79d8a340 100644
> --- a/gcc/c/c-parser.cc
> +++ b/gcc/c/c-parser.cc
> @@ -2019,9 +2019,13 @@ private:
>         #define NAME 42
>       and other bases but not negative numbers, parentheses or e.g.
>         #define NAME 1 << 7
> -     as doing so would require a parser.  */
> -  tree consider_macro (cpp_macro *macro) const
> +     as doing so would require a parser.
> +     Also handle the case where MACRO's definition is a single
> identifier
> +     that is itself a macro name (e.g. "#define O_CREAT _FCREAT"),
> by
> +     following the chain of aliases up to MAX_ALIAS_DEPTH deep.  */
> +  tree consider_macro (cpp_macro *macro, unsigned int depth = 0)
> const
>    {
> +    const unsigned int MAX_ALIAS_DEPTH = 8;

I'm slightly nervous about introducing a magic constant here (we
normally have params for this); where did the value of 8 come from?

Otherwise the patch looks good to me (with my "analyzer maintainer" hat
on, since this is ana::c_translation_unit within the C frontend).

Dave

>      if (macro->paramc > 0)
>        return NULL_TREE;
>      if (macro->kind != cmk_macro)
> @@ -2029,7 +2033,20 @@ private:
>      if (macro->count != 1)
>        return NULL_TREE;
>      const cpp_token &tok = macro->exp.tokens[0];
> -    if (tok.type != CPP_NUMBER)
> +    if (tok.type == CPP_NAME)
> +      {
> +     /* Limit recursion.  */
> +     if (depth >= MAX_ALIAS_DEPTH)
> +       return NULL_TREE;
> +
> +     cpp_hashnode *alias = tok.val.node.node;
> +     if (cpp_macro_p (alias))
> +       return consider_macro (alias->value.macro, depth + 1);
> +
> +     /* Not a simple alias.  */
> +     return NULL_TREE;
> +      }
> +    else if (tok.type != CPP_NUMBER)
>        return NULL_TREE;
>  
>      cpp_reader *old_parse_in = parse_in;

Reply via email to