]> git.ipfire.org Git - thirdparty/gcc.git/commit - libcpp/internal.h
libcpp: Fix _Pragma stringification [PR103165]
authorJakub Jelinek <jakub@redhat.com>
Mon, 22 Nov 2021 21:29:20 +0000 (22:29 +0100)
committerJakub Jelinek <jakub@redhat.com>
Mon, 22 Nov 2021 21:29:20 +0000 (22:29 +0100)
commita6e0d593707ae44dec0bdf2bcdc4f539050b46db
treefe7bb778fb701be58becd51ac8c669b2f4bba8a6
parenta944b5dec3adb28ed199234d2116145ca9010d6a
libcpp: Fix _Pragma stringification [PR103165]

As the testcase show, sometimes _Pragma is turned into CPP_PRAGMA
.. CPP_PRAGMA_EOL tokens, even when it might still need to be
stringized later on.  We are then ICEing because we don't handle
stringification of CPP_PRAGMA or CPP_PRAGMA_EOL, but trying to
reconstruct the exact tokens with exact spacing after it has been
lowered is very hard.  So, instead this patch ensures we don't
lower _Pragma during expand_arg calls, but only later when
cpp_get_token_1 is called outside of expand_arg.

2021-11-22  Jakub Jelinek  <jakub@redhat.com>
    Tobias Burnus  <tobias@codesourcery.com>

PR preprocessor/103165
libcpp/
* internal.h (struct lexer_state): Add ignore__Pragma field.
* macro.c (builtin_macro): Don't interpret _Pragma if
pfile->state.ignore__Pragma.
(expand_arg): Temporarily set pfile->state.ignore__Pragma to 1.
gcc/testsuite/
* c-c++-common/gomp/pragma-3.c: New test.
* c-c++-common/gomp/pragma-4.c: New test.
* c-c++-common/gomp/pragma-5.c: New test.

Co-Authored-By: Tobias Burnus <tobias@codesourcery.com>
gcc/testsuite/c-c++-common/gomp/pragma-3.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/pragma-4.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/pragma-5.c [new file with mode: 0644]
libcpp/internal.h
libcpp/macro.c