diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 37671990b4e80cb989c1943375b5dec268732332..5760eece241395bec8f43057bba11a87abebedcb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2005-05-03  DJ Delorie  <dj@redhat.com>
+
+	* common.opt (fdiagnostics-show-option): No variable is needed.
+	* diagnostic.h (diagnostic_context): Add show_option_requested flag.
+	* diagnostic.c (diagnostic_initialize): Initialize show_option_requested.
+	(diagnostic_report_diagnostic): Test for enabled diagnostics here.
+	Save and restore original message format.  Use flag in context
+	instead of global.
+	(warning): Don't test for enabled warnings here.
+	* opts.c (common_handle_option): Handle -fdiagnostics-show-option
+	here.
+
 2005-05-04  Kelley Cook  <kcook@gcc.gnu.org>
 
 	* config/m32r/xm-m32r.h: Don't define HOST_WORDS_BIG_ENDIAN.
diff --git a/gcc/common.opt b/gcc/common.opt
index 466077cb6ff6d7e9c157b8d02ea3fdeabee5d4b2..ab0129fb3286afef16ecc8810de6eb898864f678 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -337,7 +337,7 @@ Common Joined RejectNegative
 -fdiagnostics-show-location=[once|every-line]	How often to emit source location at the beginning of line-wrapped diagnostics
 
 fdiagnostics-show-option
-Common Var(diagnostics_show_options)
+Common
 Amend appropriate diagnostic messages with the command line option that controls them.
 
 fdump-
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c
index b50fb1410c44e0863537eb5b125dfc3a106c0a8e..e48133299af734884a47a2a601f466c4c95342c6 100644
--- a/gcc/diagnostic.c
+++ b/gcc/diagnostic.c
@@ -102,6 +102,7 @@ diagnostic_initialize (diagnostic_context *context)
   memset (context->diagnostic_count, 0, sizeof context->diagnostic_count);
   context->issue_warnings_are_errors_message = true;
   context->warning_as_error_requested = false;
+  context->show_option_requested = false;
   context->abort_on_error = false;
   context->internal_error = NULL;
   diagnostic_starter (context) = default_diagnostic_starter;
@@ -331,11 +332,17 @@ diagnostic_report_diagnostic (diagnostic_context *context,
 	error_recursion (context);
     }
 
+  if (diagnostic->option_index
+      && ! option_enabled (diagnostic->option_index))
+    return;
+
   context->lock++;
 
   if (diagnostic_count_diagnostic (context, diagnostic))
     {
-      if (diagnostics_show_options && diagnostic->option_index)
+      const char *saved_format_spec = diagnostic->message.format_spec;
+
+      if (context->show_option_requested && diagnostic->option_index)
 	diagnostic->message.format_spec
 	  = ACONCAT ((diagnostic->message.format_spec,
 		      " [", cl_options[diagnostic->option_index].opt_text, "]", NULL));
@@ -347,6 +354,7 @@ diagnostic_report_diagnostic (diagnostic_context *context,
       (*diagnostic_finalizer (context)) (context, diagnostic);
       pp_flush (context->printer);
       diagnostic_action_after_output (context, diagnostic);
+      diagnostic->message.format_spec = saved_format_spec;
     }
 
   context->lock--;
@@ -424,9 +432,6 @@ warning (int opt, const char *msgid, ...)
   diagnostic_info diagnostic;
   va_list ap;
 
-  if (opt && ! option_enabled (opt))
-    return;
-
   va_start (ap, msgid);
   diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_WARNING);
   diagnostic.option_index = opt;
diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h
index 37cded711806b9c73abef4400fe5e2c4993152df..5bbb135ac34faa5c47cf86d6299723397571fcd2 100644
--- a/gcc/diagnostic.h
+++ b/gcc/diagnostic.h
@@ -73,6 +73,10 @@ struct diagnostic_context
   /* True if it has been requested that warnings be treated as errors.  */
   bool warning_as_error_requested;
 
+  /* True if we should print the command line option which controls
+     each diagnostic, if known.  */
+  bool show_option_requested;
+
   /* True if we should raise a SIGABRT on errors.  */
   bool abort_on_error;
 
diff --git a/gcc/opts.c b/gcc/opts.c
index 4311f4ced13e54ac61208dd04a72dad0c344295d..97f89314fb1e2e37a11d90dedf71ef3b706f1516 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -818,6 +818,10 @@ common_handle_option (size_t scode, const char *arg, int value)
 	return 0;
       break;
 
+    case OPT_fdiagnostics_show_option:
+      global_dc->show_option_requested = true;
+      break;
+
     case OPT_fdump_:
       if (!dump_switch_p (arg))
 	return 0;