re PR c/67854 (Missing diagnostic for passing bool to va_arg)

PR c/67854
	* gimplify.c (gimplify_va_arg_expr): Use expanded location for the
	"is promoted to" warning.

	* gcc.dg/pr67854.c: New test.

From-SVN: r233891
This commit is contained in:
Marek Polacek 2016-03-02 07:24:19 +00:00 committed by Marek Polacek
parent 1e840f3974
commit bd02f00fcf
4 changed files with 30 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2016-03-02 Marek Polacek <polacek@redhat.com>
PR c/67854
* gimplify.c (gimplify_va_arg_expr): Use expanded location for the
"is promoted to" warning.
2016-03-01 DJ Delorie <dj@redhat.com>
* config.gcc: Deprecate mep-*.

View File

@ -11573,24 +11573,28 @@ gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p,
{
static bool gave_help;
bool warned;
/* Use the expansion point to handle cases such as passing bool (defined
in a system header) through `...'. */
source_location xloc
= expansion_point_location_if_in_system_header (loc);
/* Unfortunately, this is merely undefined, rather than a constraint
violation, so we cannot make this an error. If this call is never
executed, the program is still strictly conforming. */
warned = warning_at (loc, 0,
"%qT is promoted to %qT when passed through %<...%>",
warned = warning_at (xloc, 0,
"%qT is promoted to %qT when passed through %<...%>",
type, promoted_type);
if (!gave_help && warned)
{
gave_help = true;
inform (loc, "(so you should pass %qT not %qT to %<va_arg%>)",
inform (xloc, "(so you should pass %qT not %qT to %<va_arg%>)",
promoted_type, type);
}
/* We can, however, treat "undefined" any way we please.
Call abort to encourage the user to fix the program. */
if (warned)
inform (loc, "if this code is reached, the program will abort");
inform (xloc, "if this code is reached, the program will abort");
/* Before the abort, allow the evaluation of the va_list
expression to exit or longjmp. */
gimplify_and_add (valist, pre_p);

View File

@ -1,3 +1,8 @@
2016-03-02 Marek Polacek <polacek@redhat.com>
PR c/67854
* gcc.dg/pr67854.c: New test.
2016-03-02 Jakub Jelinek <jakub@redhat.com>
PR middle-end/70025

View File

@ -0,0 +1,11 @@
/* PR c/67854 */
/* { dg-do compile } */
#include <stdbool.h>
#include <stdarg.h>
void
foo (va_list ap)
{
va_arg (ap, bool); /* { dg-warning "is promoted to .int. when passed through" } */
}