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
This commit is contained in:
David Malcolm 2016-02-23 17:39:16 +00:00 committed by David Malcolm
parent 5f6dd5930f
commit 1d3121af3a
11 changed files with 255 additions and 10 deletions

View File

@ -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

View File

@ -1,7 +1,16 @@
/* { 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
int f()
#define MACRO_1 \
_Pragma("GCC diagnostic ignored \"-Wunused-variable\"")
int test_1()
{
_Pragma("GCC diagnostic ignored \"-Wunused-variable\"")
int x;
@ -9,14 +18,62 @@ int f()
}
#pragma GCC diagnostic pop
#pragma GCC diagnostic push
#define MACRO \
_Pragma("GCC diagnostic ignored \"-Wunused-variable\"") \
int x;
int g()
/* Test 2: neither the _Pragma nor the affected code are in a macro. */
#pragma GCC diagnostic push
int test_2()
{
MACRO;
_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 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_5 \
_Pragma("GCC diagnostic ignored \"-Wunused-variable\"") \
int x;
int test_5()
{
MACRO_5;
return 0;
}
#pragma GCC diagnostic pop

View File

@ -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
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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
}

View File

@ -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++ } } } */