aboutsummaryrefslogtreecommitdiff
path: root/libcpp/internal.h
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-11-22 22:29:20 +0100
committerJakub Jelinek <jakub@redhat.com>2021-11-22 22:29:20 +0100
commita6e0d593707ae44dec0bdf2bcdc4f539050b46db (patch)
treefe7bb778fb701be58becd51ac8c669b2f4bba8a6 /libcpp/internal.h
parenta944b5dec3adb28ed199234d2116145ca9010d6a (diff)
downloadgcc-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.h3
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. */