diff options
author | Jakub Jelinek <jakub@redhat.com> | 2021-11-22 22:29:20 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2021-11-22 22:29:20 +0100 |
commit | a6e0d593707ae44dec0bdf2bcdc4f539050b46db (patch) | |
tree | fe7bb778fb701be58becd51ac8c669b2f4bba8a6 /libcpp/internal.h | |
parent | a944b5dec3adb28ed199234d2116145ca9010d6a (diff) | |
download | gcc-a6e0d593707ae44dec0bdf2bcdc4f539050b46db.zip gcc-a6e0d593707ae44dec0bdf2bcdc4f539050b46db.tar.gz gcc-a6e0d593707ae44dec0bdf2bcdc4f539050b46db.tar.bz2 |
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>
Diffstat (limited to 'libcpp/internal.h')
-rw-r--r-- | libcpp/internal.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/libcpp/internal.h b/libcpp/internal.h index 0ce0246..b72d616 100644 --- a/libcpp/internal.h +++ b/libcpp/internal.h @@ -287,6 +287,9 @@ struct lexer_state /* Nonzero if the deferred pragma being handled allows macro expansion. */ unsigned char pragma_allow_expansion; + + /* Nonzero if _Pragma should not be interpreted. */ + unsigned char ignore__Pragma; }; /* Special nodes - identifiers with predefined significance. */ |