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)
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++.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233637
138bc75d-0d04-0410-961f-
82ee72b054a4
+2016-02-23 David Malcolm <dmalcolm@redhat.com>
+
+ 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++.
+
2016-02-23 Thomas Schwinge <thomas@codesourcery.com>
* c-c++-common/goacc/kernels-counter-vars-function-scope.c: Adjust
/* { 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
--- /dev/null
+/* { 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
+}
--- /dev/null
+/* { 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")
+}
--- /dev/null
+/* { 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")
+}
--- /dev/null
+/* { 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
+}
--- /dev/null
+/* 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
+}
--- /dev/null
+/* 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")
+}
--- /dev/null
+/* 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")
+}
--- /dev/null
+/* 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
+}
/* { 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\"")
_Pragma ("GCC diagnostic pop")
#define C(x) \
A \
- static inline void bar (void) { x (); } \
+ static inline void bar (void) { x (); } /* { dg-bogus "in definition of|deprecated" "" { xfail { c++ } } } */ \
B
-__attribute__((deprecated)) void foo (void); /* { dg-bogus "declared here" } */
+__attribute__((deprecated)) void foo (void); /* { dg-bogus "declared here" "" { xfail { c++ } } } */
-C (foo) /* { dg-bogus "is deprecated" } */
+C (foo) /* { dg-bogus "is deprecated" "" { xfail { c++ } } } */