diff options
author | David Malcolm <dmalcolm@redhat.com> | 2016-02-23 17:39:16 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2016-02-23 17:39:16 +0000 |
commit | 1d3121af3ad1eb7eb240b0b949d4b57415497463 (patch) | |
tree | 2b0e5b41b39ca244918d39ae1b70451ff04f3ed9 | |
parent | 5f6dd5930f5fc05b5727dd435a6604cb2dace883 (diff) | |
download | gcc-1d3121af3ad1eb7eb240b0b949d4b57415497463.zip gcc-1d3121af3ad1eb7eb240b0b949d4b57415497463.tar.gz gcc-1d3121af3ad1eb7eb240b0b949d4b57415497463.tar.bz2 |
Add test coverage for _Pragma (PR preprocessor 69126, 69543, 69558)
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++.
From-SVN: r233637
-rw-r--r-- | gcc/testsuite/ChangeLog | 27 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr69126.c | 65 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr69543-1.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr69543-2.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr69543-3.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr69543-4.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr69558-1.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr69558-2.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr69558-3.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr69558-4.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr69558.c (renamed from gcc/testsuite/gcc.dg/pr69558.c) | 8 |
11 files changed, 252 insertions, 7 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 17cf40c..96007ce 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,30 @@ +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 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/gcc.dg/pr69558.c b/gcc/testsuite/c-c++-common/pr69558.c index 3be8cf9..102d72c 100644 --- a/gcc/testsuite/gcc.dg/pr69558.c +++ b/gcc/testsuite/c-c++-common/pr69558.c @@ -2,6 +2,8 @@ /* { 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\"") @@ -9,9 +11,9 @@ _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++ } } } */ |