From a6e0d593707ae44dec0bdf2bcdc4f539050b46db Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 22 Nov 2021 22:29:20 +0100 Subject: 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 Tobias Burnus 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 --- libcpp/internal.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'libcpp/internal.h') 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. */ -- cgit v1.1