aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/c-c++-common/cpp/diagnostic-pragma-3.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/gcc/testsuite/c-c++-common/cpp/diagnostic-pragma-3.c b/gcc/testsuite/c-c++-common/cpp/diagnostic-pragma-3.c
new file mode 100644
index 0000000..459dcec
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/diagnostic-pragma-3.c
@@ -0,0 +1,37 @@
+/* This is like diagnostic-pragma-2.c, but handles the case where everything
+ is wrapped inside a macro, which previously caused additional issues tracked
+ in PR preprocessor/82335. */
+
+/* { dg-do compile } */
+/* { dg-additional-options "-save-temps -Wattributes -Wtype-limits" } */
+
+#define B _Pragma("GCC diagnostic push") \
+ _Pragma("GCC diagnostic ignored \"-Wattributes\"")
+#define E _Pragma("GCC diagnostic pop")
+
+#define X() B int __attribute((unknown_attr)) x; E
+#define Y B int __attribute((unknown_attr)) y; E
+#define WRAP(x) x
+
+void test1(void)
+{
+ WRAP(X())
+ WRAP(Y)
+}
+
+/* Additional test provided on the PR. */
+#define PRAGMA(...) _Pragma(#__VA_ARGS__)
+#define PUSH_IGN(X) PRAGMA(GCC diagnostic push) PRAGMA(GCC diagnostic ignored X)
+#define POP() PRAGMA(GCC diagnostic pop)
+#define TEST(X, Y) \
+ PUSH_IGN("-Wtype-limits") \
+ int Y = (__typeof(X))-1 < 0; \
+ POP()
+
+int test2()
+{
+ unsigned x;
+ TEST(x, i1);
+ WRAP(TEST(x, i2))
+ return i1 + i2;
+}