Commit bd02f00f by Marek Polacek Committed by Marek Polacek

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
parent 1e840f39
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> 2016-03-01 DJ Delorie <dj@redhat.com>
* config.gcc: Deprecate mep-*. * config.gcc: Deprecate mep-*.
......
...@@ -11573,24 +11573,28 @@ gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p, ...@@ -11573,24 +11573,28 @@ gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p,
{ {
static bool gave_help; static bool gave_help;
bool warned; 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 /* Unfortunately, this is merely undefined, rather than a constraint
violation, so we cannot make this an error. If this call is never violation, so we cannot make this an error. If this call is never
executed, the program is still strictly conforming. */ executed, the program is still strictly conforming. */
warned = warning_at (loc, 0, warned = warning_at (xloc, 0,
"%qT is promoted to %qT when passed through %<...%>", "%qT is promoted to %qT when passed through %<...%>",
type, promoted_type); type, promoted_type);
if (!gave_help && warned) if (!gave_help && warned)
{ {
gave_help = true; 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); promoted_type, type);
} }
/* We can, however, treat "undefined" any way we please. /* We can, however, treat "undefined" any way we please.
Call abort to encourage the user to fix the program. */ Call abort to encourage the user to fix the program. */
if (warned) 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 /* Before the abort, allow the evaluation of the va_list
expression to exit or longjmp. */ expression to exit or longjmp. */
gimplify_and_add (valist, pre_p); gimplify_and_add (valist, pre_p);
......
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> 2016-03-02 Jakub Jelinek <jakub@redhat.com>
PR middle-end/70025 PR middle-end/70025
......
/* 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" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment