diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1dd783d7672a5e1926e921fc12cf6acd74b0e3af..d55f0f450fc739eedb2753e380b4ed39c2650066 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* diagnostic.c (diagnostic_classify_diagnostic): Accept zero index and
+	document its semantics.
+	(diagnostic_report_diagnostic): Adjust accordingly.
+
 2013-08-07  David Malcolm  <dmalcolm@redhat.com>
 
 	* config/sparc/sparc.c (insert_pass_work_around_errata): Move
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c
index 3612ca09d7717f09e0d9af0ff006d7b7430fd9a7..dfc11f2647b10ed0270e2f42c037e1de2aecd61a 100644
--- a/gcc/diagnostic.c
+++ b/gcc/diagnostic.c
@@ -554,7 +554,8 @@ default_diagnostic_finalizer (diagnostic_context *context ATTRIBUTE_UNUSED,
 
 /* Interface to specify diagnostic kind overrides.  Returns the
    previous setting, or DK_UNSPECIFIED if the parameters are out of
-   range.  */
+   range.  If OPTION_INDEX is zero, the new setting is for all the
+   diagnostics.  */
 diagnostic_t
 diagnostic_classify_diagnostic (diagnostic_context *context,
 				int option_index,
@@ -563,7 +564,7 @@ diagnostic_classify_diagnostic (diagnostic_context *context,
 {
   diagnostic_t old_kind;
 
-  if (option_index <= 0
+  if (option_index < 0
       || option_index >= context->n_opts
       || new_kind >= DK_LAST_DIAGNOSTIC_KIND)
     return DK_UNSPECIFIED;
@@ -695,9 +696,8 @@ diagnostic_report_diagnostic (diagnostic_context *context,
       /* This tests for #pragma diagnostic changes.  */
       if (context->n_classification_history > 0)
 	{
-	  int i;
 	  /* FIXME: Stupid search.  Optimize later. */
-	  for (i = context->n_classification_history - 1; i >= 0; i --)
+	  for (int i = context->n_classification_history - 1; i >= 0; i --)
 	    {
 	      if (linemap_location_before_p
 		  (line_table,
@@ -709,7 +709,9 @@ diagnostic_report_diagnostic (diagnostic_context *context,
 		      i = context->classification_history[i].option;
 		      continue;
 		    }
-		  if (context->classification_history[i].option == diagnostic->option_index)
+		  int option = context->classification_history[i].option;
+		  /* The option 0 is for all the diagnostics.  */
+		  if (option == 0 || option == diagnostic->option_index)
 		    {
 		      diag_class = context->classification_history[i].kind;
 		      if (diag_class != DK_UNSPECIFIED)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ef030b0662585276e17cb130888bb641f74ed8d0..ffa5fcac832bd681d4c4f20605aa1baaf6e0363f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2013-08-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* gnat.dg/warn9.adb: New test.
+
 2013-08-07  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	PR c++/46206
diff --git a/gcc/testsuite/gnat.dg/warn9.adb b/gcc/testsuite/gnat.dg/warn9.adb
new file mode 100644
index 0000000000000000000000000000000000000000..38f9d71e4101e3967830f449f8859892513e74a9
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/warn9.adb
@@ -0,0 +1,10 @@
+-- { dg-do compile }
+-- { dg-options "-Wuninitialized" }
+
+pragma Warnings (Off);
+
+function Warn9 return Integer is
+  I : Integer;
+begin
+  return I;
+end;