[PATCH 1/2] RFC: Add test coverage for _Pragma (PR preprocessor 69126, 69543, 69558)

David Malcolm dmalcolm@redhat.com
Sat Feb 20 16:24:00 GMT 2016


We had some regressions in the ability for _Pragma to disable a warning
(PR preprocessor/69126, PR preprocessor/69543, PR preprocessor/69558).

This patch attempts to add more test coverage for this, for the
various combinations of:
  - various warnings:
    -Wunused-variable
    -Wuninitialized
    -Wdeprecated-declarations
  - various combinations of location of _Pragma relative to location of
    the warning:
     - _Pragma is in a macro, warning isn't a macro
     - neither is in a macro
     - _Pragma isnt't in a macro, warning is in a macro
     - in different macros
     - both in the same macro
  - C vs C++ frontend.

It adds some XFAILs:
  - pr69543-1.c for C++ (fixed in the followup patch)
  - pr69543-3.c for both C and C++
  - pr69543-4.c for both C and C++
  - pr69558.c for C++ (moving it from gcc.dg to c-c++-common,
    marking it as xfail for C++ for now)

I've also tested the new cases on gcc 5.  The only regression we
currently have in trunk relative to gcc 5 is
c-c++-common/pr69543-1.c lines 19, which the followup patch fixes.

Successfully bootstrapped&regrtested on x86_64-pc-linux-gnu in
combination with the followup patch.

OK for trunk?

gcc/testsuite/ChangeLog:
	PR preprocessor/69126
	PR preprocessor/69543
	PR preprocessor/69558
	* c-c++-common/pr69126.c (MACRO_1, test_1): New.
	(f): Rename to...
	(test_2): ...this, and add leading comment.
	(MACRO_3, test_3): New.
	(MACRO_4A, MACRO_4B, test_4): New.
	(MACRO): Rename to...
	(MACRO_5): ...this.
	(g): Rename to...
	(test_5): ...this, updating for renaming of MACRO, and
	add leading comment.
	* c-c++-common/pr69543-1.c: New.
	* c-c++-common/pr69543-2.c: New.
	* c-c++-common/pr69543-3.c: New.
	* c-c++-common/pr69543-4.c: New.
	* c-c++-common/pr69558-1.c: New.
	* c-c++-common/pr69558-2.c: New.
	* c-c++-common/pr69558-3.c: New.
	* c-c++-common/pr69558-4.c: New.
	* gcc.dg/pr69558.c: Move to...
	* c-c++-common/pr69558.c: ...here.  Add dg-bogus directives, with
	xfail for c++.
---
 gcc/testsuite/c-c++-common/pr69126.c   | 65 +++++++++++++++++++++++++++++++---
 gcc/testsuite/c-c++-common/pr69543-1.c | 21 +++++++++++
 gcc/testsuite/c-c++-common/pr69543-2.c | 14 ++++++++
 gcc/testsuite/c-c++-common/pr69543-3.c | 20 +++++++++++
 gcc/testsuite/c-c++-common/pr69543-4.c | 25 +++++++++++++
 gcc/testsuite/c-c++-common/pr69558-1.c | 21 +++++++++++
 gcc/testsuite/c-c++-common/pr69558-2.c | 16 +++++++++
 gcc/testsuite/c-c++-common/pr69558-3.c | 19 ++++++++++
 gcc/testsuite/c-c++-common/pr69558-4.c | 23 ++++++++++++
 gcc/testsuite/c-c++-common/pr69558.c   | 19 ++++++++++
 gcc/testsuite/gcc.dg/pr69558.c         | 17 ---------
 11 files changed, 239 insertions(+), 21 deletions(-)
 create mode 100644 gcc/testsuite/c-c++-common/pr69543-1.c
 create mode 100644 gcc/testsuite/c-c++-common/pr69543-2.c
 create mode 100644 gcc/testsuite/c-c++-common/pr69543-3.c
 create mode 100644 gcc/testsuite/c-c++-common/pr69543-4.c
 create mode 100644 gcc/testsuite/c-c++-common/pr69558-1.c
 create mode 100644 gcc/testsuite/c-c++-common/pr69558-2.c
 create mode 100644 gcc/testsuite/c-c++-common/pr69558-3.c
 create mode 100644 gcc/testsuite/c-c++-common/pr69558-4.c
 create mode 100644 gcc/testsuite/c-c++-common/pr69558.c
 delete mode 100644 gcc/testsuite/gcc.dg/pr69558.c

diff --git a/gcc/testsuite/c-c++-common/pr69126.c b/gcc/testsuite/c-c++-common/pr69126.c
index fb4dcfb..52c96eb 100644
--- a/gcc/testsuite/c-c++-common/pr69126.c
+++ b/gcc/testsuite/c-c++-common/pr69126.c
@@ -1,22 +1,79 @@
 /* { dg-options "-Wunused-variable" } */
 
+/* Verify that ignoring -Wunused-variable works, for various placements
+   of the variable and the _Pragma.  */
+
+/* Test 1: the _Pragma is in a macro, but the affected code isn't.  */
+
+#pragma GCC diagnostic push
+
+#define MACRO_1 \
+    _Pragma("GCC diagnostic ignored \"-Wunused-variable\"")
+
+int test_1()
+{
+    _Pragma("GCC diagnostic ignored \"-Wunused-variable\"")
+    int x;
+    return 0;
+}
+#pragma GCC diagnostic pop
+
+
+/* Test 2: neither the _Pragma nor the affected code are in a macro.  */
+
+#pragma GCC diagnostic push
+int test_2()
+{
+    _Pragma("GCC diagnostic ignored \"-Wunused-variable\"")
+    int x;
+    return 0;
+}
+#pragma GCC diagnostic pop
+
+
+/* Test 3: the _Pragma isn't in a macro, but the affected code is.  */
+
+#define MACRO_3 \
+    int x;
+
 #pragma GCC diagnostic push
-int f()
+int test_3()
 {
     _Pragma("GCC diagnostic ignored \"-Wunused-variable\"")
+    MACRO_3
+    return 0;
+}
+#pragma GCC diagnostic pop
+
+
+/* Test 4: the _Pragma and the affected code are in different macros.  */
+
+#pragma GCC diagnostic push
+#define MACRO_4A \
+    _Pragma("GCC diagnostic ignored \"-Wunused-variable\"")
+
+#define MACRO_4B \
     int x;
+
+int test_4()
+{
+    MACRO_4A;
+    MACRO_4B
     return 0;
 }
 #pragma GCC diagnostic pop
 
+
+/* Test 5: both the _Pragma and the affected code are in the same macro.  */
+
 #pragma GCC diagnostic push
-#define MACRO \
+#define MACRO_5 \
     _Pragma("GCC diagnostic ignored \"-Wunused-variable\"") \
     int x;
 
-int g()
+int test_5()
 {
-    MACRO;
+    MACRO_5;
     return 0;
 }
 #pragma GCC diagnostic pop
diff --git a/gcc/testsuite/c-c++-common/pr69543-1.c b/gcc/testsuite/c-c++-common/pr69543-1.c
new file mode 100644
index 0000000..bfb5270
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr69543-1.c
@@ -0,0 +1,21 @@
+/* { dg-options "-Wuninitialized" } */
+
+/* Verify disabling a warning, where the _Pragma is within
+   a macro, but the affected code is *not* in a macro.  */
+
+/* TODO: XFAIL: why does g++ still emit a warning here? (works for C).  */
+
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN	\
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+    _Pragma ("GCC diagnostic pop")
+
+void test (char yylval)
+{
+  char *yyvsp;
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  *++yyvsp = yylval; /* { dg-bogus "used uninitialized" "" { xfail { c++ } } } */
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
diff --git a/gcc/testsuite/c-c++-common/pr69543-2.c b/gcc/testsuite/c-c++-common/pr69543-2.c
new file mode 100644
index 0000000..4099fb2
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr69543-2.c
@@ -0,0 +1,14 @@
+/* { dg-options "-Wuninitialized" } */
+
+/* Verify disabling a warning, where both the _Pragma and the
+   affected code are *not* in a macro.  */
+
+void test (char yylval)
+{
+  char *yyvsp;
+  _Pragma ("GCC diagnostic push")
+  _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
+  _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+  *++yyvsp = yylval;
+  _Pragma ("GCC diagnostic pop")
+}
diff --git a/gcc/testsuite/c-c++-common/pr69543-3.c b/gcc/testsuite/c-c++-common/pr69543-3.c
new file mode 100644
index 0000000..fcf750c
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr69543-3.c
@@ -0,0 +1,20 @@
+/* { dg-options "-Wuninitialized" } */
+
+/* Verify disabling a warning, where the _Pragma is in regular code,
+   but the affected code is within a macro.  */
+
+/* TODO: XFAIL: both C and C++ erroneously fail to suppress the warning
+   The warning is reported at the macro definition location, rather than
+   the macro expansion location.  */
+
+#define WARNABLE_CODE *++yyvsp = yylval; /* { dg-bogus "used uninitialized" "" { xfail *-*-* } } */
+
+void test (char yylval)
+{
+  char *yyvsp; /* { dg-bogus "declared here" "" { xfail *-*-* } } */
+  _Pragma ("GCC diagnostic push")
+  _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
+  _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+  WARNABLE_CODE
+  _Pragma ("GCC diagnostic pop")
+}
diff --git a/gcc/testsuite/c-c++-common/pr69543-4.c b/gcc/testsuite/c-c++-common/pr69543-4.c
new file mode 100644
index 0000000..cd71e7e
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr69543-4.c
@@ -0,0 +1,25 @@
+/* { dg-options "-Wuninitialized" } */
+
+/* Verify disabling a warning, where both the _Pragma and the
+   affected code are within (different) macros.  */
+
+/* TODO: XFAIL: both C and C++ erroneously fail to suppress the warning
+   The warning is reported at the macro definition location, rather than
+   the macro expansion location.  */
+
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN	\
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+    _Pragma ("GCC diagnostic pop")
+
+#define WARNABLE_CODE *++yyvsp = yylval; /* { dg-bogus "used uninitialized" "" { xfail *-*-* } } */
+
+void test (char yylval)
+{
+  char *yyvsp; /* { dg-bogus "declared here" "" { xfail *-*-* } } */
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  WARNABLE_CODE
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
diff --git a/gcc/testsuite/c-c++-common/pr69558-1.c b/gcc/testsuite/c-c++-common/pr69558-1.c
new file mode 100644
index 0000000..57ac490
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr69558-1.c
@@ -0,0 +1,21 @@
+/* PR c/69558 */
+/* { dg-do compile } */
+/* { dg-options "-Wdeprecated-declarations" } */
+
+/* Verify disabling -Wdeprecated-declarations, where the _Pragma is in a
+   macro, but the affected code is *not* in a macro.  */
+
+#define A \
+  _Pragma ("GCC diagnostic push") \
+  _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+#define B \
+  _Pragma ("GCC diagnostic pop")
+
+__attribute__((deprecated)) void foo (void);
+
+void bar (void)
+{
+  A
+  foo ();
+  B
+}
diff --git a/gcc/testsuite/c-c++-common/pr69558-2.c b/gcc/testsuite/c-c++-common/pr69558-2.c
new file mode 100644
index 0000000..83ae647
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr69558-2.c
@@ -0,0 +1,16 @@
+/* PR c/69558 */
+/* { dg-do compile } */
+/* { dg-options "-Wdeprecated-declarations" } */
+
+/* Verify disabling -Wdeprecated-declarations, where neither the _Pragma nor
+   the affected code are in macros.  */
+
+__attribute__((deprecated)) void foo (void);
+
+void bar (void)
+{
+  _Pragma ("GCC diagnostic push")
+  _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+  foo ();
+  _Pragma ("GCC diagnostic pop")
+}
diff --git a/gcc/testsuite/c-c++-common/pr69558-3.c b/gcc/testsuite/c-c++-common/pr69558-3.c
new file mode 100644
index 0000000..45c38a9
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr69558-3.c
@@ -0,0 +1,19 @@
+/* PR c/69558 */
+/* { dg-do compile } */
+/* { dg-options "-Wdeprecated-declarations" } */
+
+/* Verify disabling -Wdeprecated-declarations, where the _Pragma is not
+   in a macro, but the affected code *is*.  */
+
+#define C \
+  foo ();
+
+__attribute__((deprecated)) void foo (void);
+
+void bar (void)
+{
+  _Pragma ("GCC diagnostic push")
+  _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+  C
+  _Pragma ("GCC diagnostic pop")
+}
diff --git a/gcc/testsuite/c-c++-common/pr69558-4.c b/gcc/testsuite/c-c++-common/pr69558-4.c
new file mode 100644
index 0000000..02d526e
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr69558-4.c
@@ -0,0 +1,23 @@
+/* PR c/69558 */
+/* { dg-do compile } */
+/* { dg-options "-Wdeprecated-declarations" } */
+
+/* Verify disabling -Wdeprecated-declarations, where the _Pragma and the
+   affected code are in different macros.  */
+
+#define A \
+  _Pragma ("GCC diagnostic push") \
+  _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+#define B \
+  _Pragma ("GCC diagnostic pop")
+#define C \
+  foo ();
+
+__attribute__((deprecated)) void foo (void);
+
+void bar (void)
+{
+  A
+  C
+  B
+}
diff --git a/gcc/testsuite/c-c++-common/pr69558.c b/gcc/testsuite/c-c++-common/pr69558.c
new file mode 100644
index 0000000..102d72c
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr69558.c
@@ -0,0 +1,19 @@
+/* PR c/69558 */
+/* { dg-do compile } */
+/* { dg-options "-Wdeprecated-declarations" } */
+
+/* TODO: XFAIL for g++ (works for C).  */
+
+#define A \
+  _Pragma ("GCC diagnostic push") \
+  _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+#define B \
+  _Pragma ("GCC diagnostic pop")
+#define C(x) \
+  A \
+  static inline void bar (void) { x (); } /* { dg-bogus "in definition of|deprecated" "" { xfail { c++ } } } */ \
+  B
+
+__attribute__((deprecated)) void foo (void); /* { dg-bogus "declared here" "" { xfail { c++ } } } */
+
+C (foo) /* { dg-bogus "is deprecated"  "" { xfail { c++ } } } */
diff --git a/gcc/testsuite/gcc.dg/pr69558.c b/gcc/testsuite/gcc.dg/pr69558.c
deleted file mode 100644
index 3be8cf9..0000000
--- a/gcc/testsuite/gcc.dg/pr69558.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* PR c/69558 */
-/* { dg-do compile } */
-/* { dg-options "-Wdeprecated-declarations" } */
-
-#define A \
-  _Pragma ("GCC diagnostic push") \
-  _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
-#define B \
-  _Pragma ("GCC diagnostic pop")
-#define C(x) \
-  A \
-  static inline void bar (void) { x (); } \
-  B
-
-__attribute__((deprecated)) void foo (void); /* { dg-bogus "declared here" } */
-
-C (foo) /* { dg-bogus "is deprecated" } */
-- 
1.8.5.3



More information about the Gcc-patches mailing list