On Mon, Aug 31, 2026 at 7:42 AM Léo Hardt <[email protected]> wrote:
>
> fix(libcpp): Don't ICE parsing __has_include outside directive.
> cc: libcpp maintainers.
>
> Fixes an ICE wherein 'glue_header_name' is called outside
> parsing a preprocessor directive, causing an entire file to
> be read and presumed to be a header name. Then, on the next
> read (the closing '>' or ')'), the parser ICEs since the input
> has already come to an end.
>
> Affects __has_include and __has_embed when used outside directives.
> Minimal reproducible crash has two tokens (both gcc and g++):
>
>    __has_include<
>
> Given glue_header_name was written for usage inside preprocessor
> parsing, we could either change it or not call it in case of errors.
> I opted to bail out early on an error case, since there is no chance
> it could influence valid code parsing.
>
> See more on https://gcc.gnu.org/PR121508.
>
>    PR preprocessor/121508
>    PR preprocessor/123339
>
> libcpp/ChangeLog:
>
>         * macro.cc (builtin_has_include_1): Bail early if
>         not on a preprocessor directive.

Ok.

>
> Signed-off-by: Léo Hardt <[email protected]>
> ---
>   libcpp/macro.cc | 7 +++++--
>   1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/libcpp/macro.cc b/libcpp/macro.cc
> index 736c360336d..064df1d4134 100644
> --- a/libcpp/macro.cc
> +++ b/libcpp/macro.cc
> @@ -392,8 +392,11 @@ builtin_has_include_1 (cpp_reader *pfile, const char
> *name, bool *paren,
>                        bool *bracket, location_t *loc)
>   {
>     if (!pfile->state.in_directive)
> -    cpp_error (pfile, CPP_DL_ERROR,
> -              "%qs used outside of preprocessing directive", name);
> +    {
> +      cpp_error (pfile, CPP_DL_ERROR,
> +                "%qs used outside of preprocessing directive", name);
> +      return NULL;
> +    }
>
>     pfile->state.angled_headers = true;
>     const auto sav_padding = pfile->state.directive_wants_padding;
> --
> 2.47.3
>
>

Reply via email to