Commit 26e82579 by Jan Hubicka Committed by Jan Hubicka

diagnostic.c (warning_n): New function.


	* diagnostic.c (warning_n): New function.
	* diagnostic-core.h (warning_n): Declare.
	* ipa-devirt.c (ipa_devirt): Handle singulars correctly;
	output dynamic counts when available.

From-SVN: r215416
parent 1acc5591
2014-09-19 Jan Hubicka <hubicka@ucw.cz> 2014-09-19 Jan Hubicka <hubicka@ucw.cz>
* diagnostic.c (warning_n): New function.
* diagnostic-core.h (warning_n): Declare.
* ipa-devirt.c (ipa_devirt): Handle singulars correctly;
output dynamic counts when available.
2014-09-19 Jan Hubicka <hubicka@ucw.cz>
PR tree-optimization/63255 PR tree-optimization/63255
* ipa.c (symbol_table::remove_unreachable_nodes): Fix ordering * ipa.c (symbol_table::remove_unreachable_nodes): Fix ordering
issue in setting body_removed flag. issue in setting body_removed flag.
...@@ -58,6 +58,8 @@ extern void internal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2) ...@@ -58,6 +58,8 @@ extern void internal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2)
ATTRIBUTE_NORETURN; ATTRIBUTE_NORETURN;
/* Pass one of the OPT_W* from options.h as the first parameter. */ /* Pass one of the OPT_W* from options.h as the first parameter. */
extern bool warning (int, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3); extern bool warning (int, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
extern bool warning_n (location_t, int, int, const char *, const char *, ...)
ATTRIBUTE_GCC_DIAG(4,6) ATTRIBUTE_GCC_DIAG(5,6);
extern bool warning_at (location_t, int, const char *, ...) extern bool warning_at (location_t, int, const char *, ...)
ATTRIBUTE_GCC_DIAG(3,4); ATTRIBUTE_GCC_DIAG(3,4);
extern void error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2); extern void error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2);
......
...@@ -997,6 +997,28 @@ warning_at (location_t location, int opt, const char *gmsgid, ...) ...@@ -997,6 +997,28 @@ warning_at (location_t location, int opt, const char *gmsgid, ...)
return ret; return ret;
} }
/* A warning at LOCATION. Use this for code which is correct according to the
relevant language specification but is likely to be buggy anyway.
Returns true if the warning was printed, false if it was inhibited. */
bool
warning_n (location_t location, int opt, int n, const char *singular_gmsgid,
const char *plural_gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
bool ret;
va_start (ap, plural_gmsgid);
diagnostic_set_info_translated (&diagnostic,
ngettext (singular_gmsgid, plural_gmsgid, n),
&ap, location, DK_WARNING);
diagnostic.option_index = opt;
ret = report_diagnostic (&diagnostic);
va_end (ap);
return ret;
}
/* A "pedantic" warning at LOCATION: issues a warning unless /* A "pedantic" warning at LOCATION: issues a warning unless
-pedantic-errors was given on the command line, in which case it -pedantic-errors was given on the command line, in which case it
issues an error. Use this for diagnostics required by the relevant issues an error. Use this for diagnostics required by the relevant
......
...@@ -4137,12 +4137,31 @@ ipa_devirt (void) ...@@ -4137,12 +4137,31 @@ ipa_devirt (void)
if (final_warning_records->type_warnings[i].count) if (final_warning_records->type_warnings[i].count)
{ {
tree type = final_warning_records->type_warnings[i].type; tree type = final_warning_records->type_warnings[i].type;
warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (type)), int count = final_warning_records->type_warnings[i].count;
OPT_Wsuggest_final_types, long long dyn_count
"Declaring type %qD final " = final_warning_records->type_warnings[i].dyn_count;
"would enable devirtualization of %i calls",
type, if (!dyn_count)
final_warning_records->type_warnings[i].count); warning_n (DECL_SOURCE_LOCATION (TYPE_NAME (type)),
OPT_Wsuggest_final_types, count,
"Declaring type %qD final "
"would enable devirtualization of %i call",
"Declaring type %qD final "
"would enable devirtualization of %i calls",
type,
count);
else
warning_n (DECL_SOURCE_LOCATION (TYPE_NAME (type)),
OPT_Wsuggest_final_types, count,
"Declaring type %qD final "
"would enable devirtualization of %i call "
"executed %lli times",
"Declaring type %qD final "
"would enable devirtualization of %i calls "
"executed %lli times",
type,
count,
dyn_count);
} }
} }
...@@ -4157,19 +4176,45 @@ ipa_devirt (void) ...@@ -4157,19 +4176,45 @@ ipa_devirt (void)
{ {
tree decl = decl_warnings_vec[i]->decl; tree decl = decl_warnings_vec[i]->decl;
int count = decl_warnings_vec[i]->count; int count = decl_warnings_vec[i]->count;
long long dyn_count = decl_warnings_vec[i]->dyn_count;
if (DECL_CXX_DESTRUCTOR_P (decl))
warning_at (DECL_SOURCE_LOCATION (decl), if (!dyn_count)
OPT_Wsuggest_final_methods, if (DECL_CXX_DESTRUCTOR_P (decl))
"Declaring virtual destructor of %qD final " warning_n (DECL_SOURCE_LOCATION (decl),
"would enable devirtualization of %i calls", OPT_Wsuggest_final_methods, count,
DECL_CONTEXT (decl), count); "Declaring virtual destructor of %qD final "
else "would enable devirtualization of %i call",
warning_at (DECL_SOURCE_LOCATION (decl), "Declaring virtual destructor of %qD final "
OPT_Wsuggest_final_methods, "would enable devirtualization of %i calls",
"Declaring method %qD final " DECL_CONTEXT (decl), count);
"would enable devirtualization of %i calls", else
decl, count); warning_n (DECL_SOURCE_LOCATION (decl),
OPT_Wsuggest_final_methods, count,
"Declaring method %qD final "
"would enable devirtualization of %i call",
"Declaring method %qD final "
"would enable devirtualization of %i calls",
decl, count);
else if (DECL_CXX_DESTRUCTOR_P (decl))
warning_n (DECL_SOURCE_LOCATION (decl),
OPT_Wsuggest_final_methods, count,
"Declaring virtual destructor of %qD final "
"would enable devirtualization of %i call "
"executed %lli times",
"Declaring virtual destructor of %qD final "
"would enable devirtualization of %i calls "
"executed %lli times",
DECL_CONTEXT (decl), count, dyn_count);
else
warning_n (DECL_SOURCE_LOCATION (decl),
OPT_Wsuggest_final_methods, count,
"Declaring method %qD final "
"would enable devirtualization of %i call "
"executed %lli times",
"Declaring method %qD final "
"would enable devirtualization of %i calls "
"executed %lli times",
decl, count, dyn_count);
} }
} }
......
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