public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "cvs-commit at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug preprocessor/102432] [11/12 Regression] ICE in _cpp_lex_direct with function like macro without arguments within "pragma omp" statement
Date: Sat, 04 Dec 2021 10:14:34 +0000	[thread overview]
Message-ID: <bug-102432-4-HCsGL84I9Z@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-102432-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102432

--- Comment #8 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-11 branch has been updated by Jakub Jelinek
<jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:2fdef526a3a8cb4a6f89852979c7ca6437b994f3

commit r11-9354-g2fdef526a3a8cb4a6f89852979c7ca6437b994f3
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Sat Dec 4 11:00:09 2021 +0100

    libcpp: Fix up handling of deferred pragmas [PR102432]

    The https://gcc.gnu.org/pipermail/gcc-patches/2020-November/557903.html
    change broke the following testcases.  The problem is when a pragma
    namespace allows expansion (i.e. p->is_nspace && p->allow_expansion),
    e.g. the omp or acc namespaces do, then when parsing the second pragma
    token we do it with pfile->state.in_directive set,
    pfile->state.prevent_expansion clear and pfile->state.in_deferred_pragma
    clear (the last one because we don't know yet if it will be a deferred
    pragma or not).  If the pragma line only contains a single name
    and newline after it, and there exists a function-like macro with the
    same name, the preprocessor needs to peek in funlike_invocation_p
    the next token whether it isn't ( but in this case it will see a newline.
    As pfile->state.in_directive is set, we don't read anything after the
    newline, pfile->buffer->need_line is set and CPP_EOF is lexed, which
    funlike_invocation_p doesn't push back.  Because name is a function-like
    macro and on the pragma line there is no ( after the name, it isn't
    expanded, and control flow returns to do_pragma.  If name is valid
    deferred pragma, we set pfile->state.in_deferred_pragma (and really
    need it set so that e.g. end_directive later on doesn't eat all the
    tokens from the pragma line).

    Before Nathan's change (which unfortunately didn't contain rationale
    on why it is better to do it like that), this wasn't a problem,
    next _cpp_lex_direct called when we want next token would return
    CPP_PRAGMA_EOF when it saw buffer->need_line, which would turn off
    pfile->state.in_deferred_pragma and following get token would already
    read the next line.  But Nathan's patch replaced it with an assertion
    failure that now triggers and CPP_PRAGMA_EOL is done only when lexing
    the '\n'.  Except for this special case that works fine, but in
    this case it doesn't because when peeking the token we still didn't know
    that it will be a deferred pragma.
    I've tried to fix that up in do_pragma by detecting this and pushing
    CPP_PRAGMA_EOL as lookahead, but that doesn't work because end_directive
    still needs to see pfile->state.in_deferred_pragma set.

    So, this patch affectively reverts part of Nathan's change, CPP_PRAGMA_EOL
    addition isn't done only when parsing the '\n', but is now done in both
    places, in the first one instead of the assertion failure.

    2021-12-04  Jakub Jelinek  <jakub@redhat.com>

            PR preprocessor/102432
            * lex.c (_cpp_lex_direct): If buffer->need_line while
            pfile->state.in_deferred_pragma, return CPP_PRAGMA_EOL token
instead
            of assertion failure.

            * c-c++-common/gomp/pr102432.c: New test.
            * c-c++-common/goacc/pr102432.c: New test.

    (cherry picked from commit 55dfce4d5cb4a366ced7e1194a1c7f04389e3087)

  parent reply	other threads:[~2021-12-04 10:14 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-21 19:17 [Bug c++/102432] New: [11/12 Regression] ICE in _cpp_lex_direct, at libcpp/lex.c:2949 gscfq@t-online.de
2021-09-21 19:38 ` [Bug c++/102432] " pinskia at gcc dot gnu.org
2021-09-21 20:32 ` [Bug preprocessor/102432] " pinskia at gcc dot gnu.org
2021-09-21 20:37 ` [Bug preprocessor/102432] [11/12 Regression] ICE in _cpp_lex_direct with function like macro without arguments within "pragma omp" statement pinskia at gcc dot gnu.org
2021-09-22 11:40 ` jakub at gcc dot gnu.org
2021-12-02  9:50 ` jakub at gcc dot gnu.org
2021-12-02  9:51 ` jakub at gcc dot gnu.org
2021-12-04 10:01 ` cvs-commit at gcc dot gnu.org
2021-12-04 10:14 ` cvs-commit at gcc dot gnu.org [this message]
2021-12-04 10:16 ` jakub at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-102432-4-HCsGL84I9Z@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).