diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2014-09-20 05:06:26 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2014-09-20 03:06:26 +0000 |
commit | 26e82579383ea5d8fcf2149eaba65708893f58dc (patch) | |
tree | 2944385c8add22c4bd448d6f39c1915d60932eaf /gcc | |
parent | 1acc55917e1afae9eed569f45653a122fd99af99 (diff) | |
download | gcc-26e82579383ea5d8fcf2149eaba65708893f58dc.zip gcc-26e82579383ea5d8fcf2149eaba65708893f58dc.tar.gz gcc-26e82579383ea5d8fcf2149eaba65708893f58dc.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/diagnostic-core.h | 2 | ||||
-rw-r--r-- | gcc/diagnostic.c | 22 | ||||
-rw-r--r-- | gcc/ipa-devirt.c | 83 |
4 files changed, 95 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ad43536..4c03408 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 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 * ipa.c (symbol_table::remove_unreachable_nodes): Fix ordering issue in setting body_removed flag. diff --git a/gcc/diagnostic-core.h b/gcc/diagnostic-core.h index 2ff8404..a8245de8 100644 --- a/gcc/diagnostic-core.h +++ b/gcc/diagnostic-core.h @@ -58,6 +58,8 @@ extern void internal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2) ATTRIBUTE_NORETURN; /* 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_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 *, ...) ATTRIBUTE_GCC_DIAG(3,4); extern void error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2); diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index 73666d6..881da0b 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -997,6 +997,28 @@ warning_at (location_t location, int opt, const char *gmsgid, ...) 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 -pedantic-errors was given on the command line, in which case it issues an error. Use this for diagnostics required by the relevant diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 61e87e8..774275b 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -4137,12 +4137,31 @@ ipa_devirt (void) if (final_warning_records->type_warnings[i].count) { tree type = final_warning_records->type_warnings[i].type; - warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (type)), - OPT_Wsuggest_final_types, - "Declaring type %qD final " - "would enable devirtualization of %i calls", - type, - final_warning_records->type_warnings[i].count); + int count = final_warning_records->type_warnings[i].count; + long long dyn_count + = final_warning_records->type_warnings[i].dyn_count; + + if (!dyn_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) { tree decl = decl_warnings_vec[i]->decl; int count = decl_warnings_vec[i]->count; - - if (DECL_CXX_DESTRUCTOR_P (decl)) - warning_at (DECL_SOURCE_LOCATION (decl), - OPT_Wsuggest_final_methods, - "Declaring virtual destructor of %qD final " - "would enable devirtualization of %i calls", - DECL_CONTEXT (decl), count); - else - warning_at (DECL_SOURCE_LOCATION (decl), - OPT_Wsuggest_final_methods, - "Declaring method %qD final " - "would enable devirtualization of %i calls", - decl, count); + long long dyn_count = decl_warnings_vec[i]->dyn_count; + + if (!dyn_count) + 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", + "Declaring virtual destructor of %qD final " + "would enable devirtualization of %i calls", + DECL_CONTEXT (decl), count); + else + 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); } } |