aboutsummaryrefslogtreecommitdiff
path: root/libcpp/include
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2021-10-29 22:55:32 +0200
committerTobias Burnus <tobias@codesourcery.com>2021-10-29 22:55:32 +0200
commit0078a058a569387153419876acca080142873b65 (patch)
treec377b39a4e8626b7fc4909f3bcd59029d990ea36 /libcpp/include
parentebfc3a2304383edf7ccd50a327e380ee6a8afa43 (diff)
downloadgcc-0078a058a569387153419876acca080142873b65.zip
gcc-0078a058a569387153419876acca080142873b65.tar.gz
gcc-0078a058a569387153419876acca080142873b65.tar.bz2
libcpp: Fix _Pragma expansion [PR102409]
Both #pragma and _Pragma ended up as CPP_PRAGMA. Presumably since r131819 (2008, GCC 4.3) for PR34692, pragmas are not expanded in macro arguments but are output as is before. From the old bug report, that was to fix usage like FOO ( #pragma GCC diagnostic ) However, that change also affected _Pragma such that BAR ( "1"; _Pragma("omp ..."); ) yielded #pragma omp ... followed by what BAR expanded too, possibly including '"1";'. This commit adds a flag, PRAGMA_OP, to tokens to make the two distinguishable - and include again _Pragma in the expanded arguments. libcpp/ChangeLog: PR c++/102409 * directives.c (destringize_and_run): Add PRAGMA_OP to the CPP_PRAGMA token's flags to mark is as coming from _Pragma. * include/cpplib.h (PRAGMA_OP): #define, to be used with token flags. * macro.c (collect_args): Only handle CPP_PRAGMA special if PRAGMA_OP is set. gcc/testsuite/ChangeLog: * c-c++-common/gomp/pragma-1.c: New test. * c-c++-common/gomp/pragma-2.c: New test.
Diffstat (limited to 'libcpp/include')
-rw-r--r--libcpp/include/cpplib.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 6e2fcb6..56b07ac 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -198,6 +198,7 @@ struct GTY(()) cpp_string {
operator, or before this token
after a # operator. */
#define NO_EXPAND (1 << 10) /* Do not macro-expand this token. */
+#define PRAGMA_OP (1 << 11) /* _Pragma token. */
/* Specify which field, if any, of the cpp_token union is used. */