aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-09-20 05:06:26 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2014-09-20 03:06:26 +0000
commit26e82579383ea5d8fcf2149eaba65708893f58dc (patch)
tree2944385c8add22c4bd448d6f39c1915d60932eaf /gcc
parent1acc55917e1afae9eed569f45653a122fd99af99 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/diagnostic-core.h2
-rw-r--r--gcc/diagnostic.c22
-rw-r--r--gcc/ipa-devirt.c83
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);
}
}