gcc/fortran/
	* gfortran.h (gfc_option_t): Remove flags moved as Var to .opt.
	(gfc_error_now_1): Renamed from gfc_error_now.
	(gfc_error_now): Renamed from gfc_error_now_2.
	(gfc_warning_now_1): Renamed from gfc_warning_now.
	(gfc_warning_now): Renamed from gfc_warning_now_2.
	* error.c (gfc_error_now_1): Renamed from gfc_error_now.
	(gfc_error_now): Renamed from gfc_error_now_2.
	(gfc_warning_now_1): Renamed from gfc_warning_now.
	(gfc_warning_now): Renamed from gfc_warning_now_2.
	(gfc_get_errors): Include common diagnostic in count.
	* lang.opt (Wc-binding-type, Wconversion, Wconversion-extra,
	Wintrinsics-std): Create a Var for those warnings.
	* check.c (gfc_check_cmplx): Pass warning flag to
	diagnostic function.
	* decl.c (get_proc_name, gfc_verify_c_interop_param, build_sym
	gfc_set_constant_character_len, verify_bind_c_sym): Ditto; use
	_1 for old diagnostic, remove _2 for new diagnostic.
	* expr.c (gfc_check_assign, gfc_check_vardef_context): Ditto.
	* frontend-passes.c (doloop_code, do_function): Ditto.
	* intrinsic.c (gfc_is_intrinsic, gfc_convert_type_warn): Ditto.
	* match.c (gfc_match_common): Ditto.
	* module.c (use_iso_fortran_env_module, gfc_use_module): Ditto.
	* parse.c (decode_statement, decode_gcc_attribute, next_free,
	next_fixed, gfc_check_do_variable): Ditto.
	* resolve.c (resolve_common_vars, resolve_ordinary_assign):
	Ditto.
	* scanner.c (add_path_to_list, skip_free_comments,
	gfc_next_char_literal, gfc_gobble_whitespace, load_line,
	preprocessor_line, load_file): Ditto.
	* symbol.c (gfc_set_default_type, verify_bind_c_derived_type):
	Ditto.
	* options.c (gfc_post_options): Ditto.
	(gfc_init_options, set_Wall, gfc_handle_option): Ditto; remove
	flags which now have a Var.
	* invoke.texi (Wconversion-extra): Make clear that the flag
	does not imply -Wconversion.

gcc/testsuite/
	* gfortran.dg/empty_label.f: Change test to continue testing
	for -fmax-errors=1.
	* gfortran.dg/empty_label.f90: Ditto.
	* gfortran.dg/warnings_are_errors_1.f90: Update dg-*.

diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index 8da59d5..5fea5a8 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -1398,17 +1398,18 @@ gfc_check_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *kind)
   if (!kind_check (kind, 2, BT_COMPLEX))
     return false;
 
-  if (!kind && gfc_option.gfc_warn_conversion
+  if (!kind && warn_conversion
       && x->ts.type == BT_REAL && x->ts.kind > gfc_default_real_kind)
-    gfc_warning_now ("Conversion from %s to default-kind COMPLEX(%d) at %L "
-		     "might lose precision, consider using the KIND argument",
-		     gfc_typename (&x->ts), gfc_default_real_kind, &x->where);
-  else if (y && !kind && gfc_option.gfc_warn_conversion
+    gfc_warning_now (OPT_Wconversion, "Conversion from %s to default-kind "
+		     "COMPLEX(%d) at %L might lose precision, consider using "
+		     "the KIND argument", gfc_typename (&x->ts),
+		     gfc_default_real_kind, &x->where);
+  else if (y && !kind && warn_conversion
 	   && y->ts.type == BT_REAL && y->ts.kind > gfc_default_real_kind)
-    gfc_warning_now ("Conversion from %s to default-kind COMPLEX(%d) at %L "
-		     "might lose precision, consider using the KIND argument",
-		     gfc_typename (&y->ts), gfc_default_real_kind, &y->where);
-
+    gfc_warning_now (OPT_Wconversion, "Conversion from %s to default-kind "
+		     "COMPLEX(%d) at %L might lose precision, consider using "
+		     "the KIND argument", gfc_typename (&y->ts),
+		     gfc_default_real_kind, &y->where);
   return true;
 }
 
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 45e5b6c..e7c06f3 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -898,17 +898,17 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
 	  && sym->attr.proc != 0
 	  && (sym->attr.subroutine || sym->attr.function)
 	  && sym->attr.if_source != IFSRC_UNKNOWN)
-	gfc_error_now ("Procedure '%s' at %C is already defined at %L",
-		       name, &sym->declared_at);
+	gfc_error_now_1 ("Procedure '%s' at %C is already defined at %L",
+			 name, &sym->declared_at);
 
       /* Trap a procedure with a name the same as interface in the
 	 encompassing scope.  */
       if (sym->attr.generic != 0
 	  && (sym->attr.subroutine || sym->attr.function)
 	  && !sym->attr.mod_proc)
-	gfc_error_now ("Name '%s' at %C is already defined"
-		       " as a generic interface at %L",
-		       name, &sym->declared_at);
+	gfc_error_now_1 ("Name '%s' at %C is already defined"
+			 " as a generic interface at %L",
+			 name, &sym->declared_at);
 
       /* Trap declarations of attributes in encompassing scope.  The
 	 signature for this is that ts.kind is set.  Legitimate
@@ -919,9 +919,9 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
 	  && gfc_current_ns->parent != NULL
 	  && sym->attr.access == 0
 	  && !module_fcn_entry)
-	gfc_error_now ("Procedure '%s' at %C has an explicit interface "
-		       "and must not have attributes declared at %L",
-		       name, &sym->declared_at);
+	gfc_error_now_1 ("Procedure '%s' at %C has an explicit interface "
+			 "and must not have attributes declared at %L",
+			 name, &sym->declared_at);
     }
 
   if (gfc_current_ns->parent == NULL || *result == NULL)
@@ -990,9 +990,9 @@ gfc_verify_c_interop_param (gfc_symbol *sym)
     {
       if (sym->attr.is_bind_c == 0)
         {
-          gfc_error_now_2 ("Procedure %qs at %L must have the BIND(C) "
-			   "attribute to be C interoperable", sym->name,
-			   &(sym->declared_at));
+          gfc_error_now ("Procedure %qs at %L must have the BIND(C) "
+			 "attribute to be C interoperable", sym->name,
+			 &(sym->declared_at));
           return false;
         }
       else
@@ -1029,7 +1029,7 @@ gfc_verify_c_interop_param (gfc_symbol *sym)
 			   "because it is polymorphic",
 			   sym->name, &(sym->declared_at),
 			   sym->ns->proc_name->name);
-	      else if (gfc_option.warn_c_binding_type)
+	      else if (warn_c_binding_type)
 		gfc_warning ("Variable '%s' at %L is a dummy argument of the "
 			     "BIND(C) procedure '%s' but may not be C "
 			     "interoperable",
@@ -1182,9 +1182,9 @@ build_sym (const char *name, gfc_charlen *cl, bool cl_deferred,
       if (sym->common_block != NULL && sym->common_block->is_bind_c == 1
           && sym->ts.is_c_interop != 1)
         {
-          gfc_error_now ("Variable '%s' in common block '%s' at %C "
+          gfc_error_now ("Variable %qs in common block %qs at %C "
                          "must be declared with a C interoperable "
-                         "kind since common block '%s' is BIND(C)",
+                         "kind since common block %qs is BIND(C)",
                          sym->name, sym->common_block->name,
                          sym->common_block->name);
           gfc_clear_error ();
@@ -1224,9 +1224,9 @@ gfc_set_constant_character_len (int len, gfc_expr *expr, int check_len)
 	gfc_wide_memset (&s[slen], ' ', len - slen);
 
       if (warn_character_truncation && slen > len)
-	gfc_warning_now_2 (OPT_Wcharacter_truncation,
-			   "CHARACTER expression at %L is being truncated "
-			   "(%d/%d)", &expr->where, slen, len);
+	gfc_warning_now (OPT_Wcharacter_truncation,
+			 "CHARACTER expression at %L is being truncated "
+			 "(%d/%d)", &expr->where, slen, len);
 
       /* Apply the standard by 'hand' otherwise it gets cleared for
 	 initializers.  */
@@ -4029,7 +4029,7 @@ verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
     {
       tmp_sym = tmp_sym->result;
       /* Make sure it wasn't an implicitly typed result.  */
-      if (tmp_sym->attr.implicit_type && gfc_option.warn_c_binding_type)
+      if (tmp_sym->attr.implicit_type && warn_c_binding_type)
 	{
 	  gfc_warning ("Implicitly declared BIND(C) function '%s' at "
                        "%L may not be C interoperable", tmp_sym->name,
@@ -4050,7 +4050,7 @@ verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
       if (!gfc_verify_c_interop (&(tmp_sym->ts)))
 	{
 	  /* See if we're dealing with a sym in a common block or not.	*/
-	  if (is_in_common == 1 && gfc_option.warn_c_binding_type)
+	  if (is_in_common == 1 && warn_c_binding_type)
 	    {
 	      gfc_warning ("Variable '%s' in common block '%s' at %L "
                            "may not be a C interoperable "
@@ -4064,7 +4064,7 @@ verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
                 gfc_error ("Type declaration '%s' at %L is not C "
                            "interoperable but it is BIND(C)",
                            tmp_sym->name, &(tmp_sym->declared_at));
-              else if (gfc_option.warn_c_binding_type)
+              else if (warn_c_binding_type)
                 gfc_warning ("Variable '%s' at %L "
                              "may not be a C interoperable "
                              "kind but it is bind(c)",
@@ -4130,8 +4130,8 @@ verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
       && tmp_sym->binding_label)
       /* Use gfc_warning_now because we won't say that the symbol fails
 	 just because of this.	*/
-      gfc_warning_now ("Symbol '%s' at %L is marked PRIVATE but has been "
-		       "given the binding label '%s'", tmp_sym->name,
+      gfc_warning_now ("Symbol %qs at %L is marked PRIVATE but has been "
+		       "given the binding label %qs", tmp_sym->name,
 		       &(tmp_sym->declared_at), tmp_sym->binding_label);
 
   return retval;
diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c
index 202dd88..a0ad2ad 100644
--- a/gcc/fortran/error.c
+++ b/gcc/fortran/error.c
@@ -933,10 +933,11 @@ gfc_notify_std (int std, const char *gmsgid, ...)
 
 
 /* Immediate warning (i.e. do not buffer the warning).  */
-/* Use gfc_warning_now_2 instead, unless gmsgid contains a %L.  */
+/* Use gfc_warning_now instead, unless two locations are used in the same
+   warning or for scanner.c, if the location is not properly set up.  */
 
 void
-gfc_warning_now (const char *gmsgid, ...)
+gfc_warning_now_1 (const char *gmsgid, ...)
 {
   va_list argp;
   int i;
@@ -1094,10 +1095,12 @@ gfc_diagnostic_finalizer (diagnostic_context *context,
 }
 
 /* Immediate warning (i.e. do not buffer the warning).  */
-/* This function uses the common diagnostics, but does not support %L, yet.  */
+/* This function uses the common diagnostics, but does not support
+   two locations; when being used in scanner.c, ensure that the location
+   is properly setup. Otherwise, use gfc_warning_now_1.   */
 
 bool
-gfc_warning_now_2 (int opt, const char *gmsgid, ...)
+gfc_warning_now (int opt, const char *gmsgid, ...)
 {
   va_list argp;
   diagnostic_info diagnostic;
@@ -1113,10 +1116,12 @@ gfc_warning_now_2 (int opt, const char *gmsgid, ...)
 }
 
 /* Immediate warning (i.e. do not buffer the warning).  */
-/* This function uses the common diagnostics, but does not support %L, yet.  */
+/* This function uses the common diagnostics, but does not support
+   two locations; when being used in scanner.c, ensure that the location
+   is properly setup. Otherwise, use gfc_warning_now_1.   */
 
 bool
-gfc_warning_now_2 (const char *gmsgid, ...)
+gfc_warning_now (const char *gmsgid, ...)
 {
   va_list argp;
   diagnostic_info diagnostic;
@@ -1132,10 +1137,12 @@ gfc_warning_now_2 (const char *gmsgid, ...)
 
 
 /* Immediate error (i.e. do not buffer).  */
-/* This function uses the common diagnostics, but does not support %L, yet.  */
+/* This function uses the common diagnostics, but does not support
+   two locations; when being used in scanner.c, ensure that the location
+   is properly setup. Otherwise, use gfc_error_now_1.   */
 
 void
-gfc_error_now_2 (const char *gmsgid, ...)
+gfc_error_now (const char *gmsgid, ...)
 {
   va_list argp;
   diagnostic_info diagnostic;
@@ -1241,10 +1248,11 @@ warning:
 
 
 /* Immediate error.  */
-/* Use gfc_error_now_2 instead, unless gmsgid contains a %L.  */
+/* Use gfc_error_now instead, unless two locations are used in the same
+   warning or for scanner.c, if the location is not properly set up.  */
 
 void
-gfc_error_now (const char *gmsgid, ...)
+gfc_error_now_1 (const char *gmsgid, ...)
 {
   va_list argp;
   int i;
@@ -1382,9 +1390,9 @@ void
 gfc_get_errors (int *w, int *e)
 {
   if (w != NULL)
-    *w = warnings;
+    *w = warnings + warningcount + werrorcount;
   if (e != NULL)
-    *e = errors;
+    *e = errors + errorcount + sorrycount + werrorcount;
 }
 
 
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 1bd62fa..d5b48cf 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -21,6 +21,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
+#include "flags.h"
 #include "gfortran.h"
 #include "arith.h"
 #include "match.h"
@@ -3227,7 +3228,7 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
   if (rvalue->expr_type == EXPR_CONSTANT && lvalue->ts.type == rvalue->ts.type
       && (lvalue->ts.type == BT_REAL || lvalue->ts.type == BT_COMPLEX))
     {
-      if (lvalue->ts.kind < rvalue->ts.kind && gfc_option.gfc_warn_conversion)
+      if (lvalue->ts.kind < rvalue->ts.kind && warn_conversion)
 	{
 	  /* As a special bonus, don't warn about REAL rvalues which are not
 	     changed by the conversion if -Wconversion is specified.  */
@@ -3258,8 +3259,7 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
 			 gfc_typename (&lvalue->ts), &rvalue->where);
 
 	}
-      else if (gfc_option.warn_conversion_extra
-	       && lvalue->ts.kind > rvalue->ts.kind)
+      else if (warn_conversion_extra && lvalue->ts.kind > rvalue->ts.kind)
 	{
 	  gfc_warning ("Conversion from %s to %s at %L",
 		       gfc_typename (&rvalue->ts),
@@ -4971,11 +4971,12 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj,
 			  if (gfc_dep_compare_expr (ec, en) == 0)
 			    {
 			      if (context)
-				gfc_error_now ("Elements with the same value at %L"
-					       " and %L in vector subscript"
-					       " in a variable definition"
-					       " context (%s)", &(ec->where),
-					     &(en->where), context);
+				gfc_error_now_1 ("Elements with the same value "
+						 "at %L and %L in vector "
+						 "subscript in a variable "
+						 "definition context (%s)",
+						 &(ec->where), &(en->where),
+						 context);
 			      return false;
 			    }
 			}
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index 97a9164..9b96f29 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -1708,17 +1708,19 @@ doloop_code (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED,
 		  && a->expr->symtree->n.sym == do_sym)
 		{
 		  if (f->sym->attr.intent == INTENT_OUT)
-		    gfc_error_now("Variable '%s' at %L set to undefined value "
-				  "inside loop  beginning at %L as INTENT(OUT) "
-				  "argument to subroutine '%s'", do_sym->name,
-				  &a->expr->where, &doloop_list[i]->loc,
-				  co->symtree->n.sym->name);
+		    gfc_error_now_1 ("Variable '%s' at %L set to undefined "
+				     "value inside loop  beginning at %L as "
+				     "INTENT(OUT) argument to subroutine '%s'",
+				     do_sym->name, &a->expr->where,
+				     &doloop_list[i]->loc,
+				     co->symtree->n.sym->name);
 		  else if (f->sym->attr.intent == INTENT_INOUT)
-		    gfc_error_now("Variable '%s' at %L not definable inside loop "
-				  "beginning at %L as INTENT(INOUT) argument to "
-				  "subroutine '%s'", do_sym->name,
-				  &a->expr->where, &doloop_list[i]->loc,
-				  co->symtree->n.sym->name);
+		    gfc_error_now_1 ("Variable '%s' at %L not definable inside "
+				     "loop beginning at %L as INTENT(INOUT) "
+				     "argument to subroutine '%s'",
+				     do_sym->name, &a->expr->where,
+				     &doloop_list[i]->loc,
+				     co->symtree->n.sym->name);
 		}
 	    }
 	  a = a->next;
@@ -1778,17 +1780,17 @@ do_function (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED,
 	      && a->expr->symtree->n.sym == do_sym)
 	    {
 	      if (f->sym->attr.intent == INTENT_OUT)
-		gfc_error_now("Variable '%s' at %L set to undefined value "
-			      "inside loop beginning at %L as INTENT(OUT) "
-			      "argument to function '%s'", do_sym->name,
-			      &a->expr->where, &doloop_list[i]->loc,
-			      expr->symtree->n.sym->name);
+		gfc_error_now_1 ("Variable '%s' at %L set to undefined value "
+				 "inside loop beginning at %L as INTENT(OUT) "
+				 "argument to function '%s'", do_sym->name,
+				 &a->expr->where, &doloop_list[i]->loc,
+				 expr->symtree->n.sym->name);
 	      else if (f->sym->attr.intent == INTENT_INOUT)
-		gfc_error_now("Variable '%s' at %L not definable inside loop "
-			      "beginning at %L as INTENT(INOUT) argument to "
-			      "function '%s'", do_sym->name,
-			      &a->expr->where, &doloop_list[i]->loc,
-			      expr->symtree->n.sym->name);
+		gfc_error_now_1 ("Variable '%s' at %L not definable inside loop"
+				 " beginning at %L as INTENT(INOUT) argument to"
+				 " function '%s'", do_sym->name,
+				 &a->expr->where, &doloop_list[i]->loc,
+				 expr->symtree->n.sym->name);
 	    }
 	}
       a = a->next;
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 1b26028..095d526 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -2444,9 +2444,6 @@ typedef struct
 
   int warn_aliasing;
   int warn_ampersand;
-  int gfc_warn_conversion;
-  int warn_c_binding_type;
-  int warn_conversion_extra;
   int warn_function_elimination;
   int warn_implicit_interface;
   int warn_implicit_procedure;
@@ -2454,7 +2451,6 @@ typedef struct
   int warn_surprising;
   int warn_underflow;
   int warn_intrinsic_shadow;
-  int warn_intrinsics_std;
   int warn_array_temp;
   int warn_align_commons;
   int warn_real_q_constant;
@@ -2695,16 +2691,16 @@ void gfc_buffer_error (int);
 const char *gfc_print_wide_char (gfc_char_t);
 
 void gfc_warning (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
-void gfc_warning_now (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
-bool gfc_warning_now_2 (const char *gmsgid, ...) ATTRIBUTE_GCC_GFC(1,2);
-bool gfc_warning_now_2 (int opt, const char *gmsgid, ...) ATTRIBUTE_GCC_GFC(2,3);
+void gfc_warning_now_1 (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
+bool gfc_warning_now (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
+bool gfc_warning_now (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
 
 void gfc_clear_warning (void);
 void gfc_warning_check (void);
 
 void gfc_error (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
+void gfc_error_now_1 (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
 void gfc_error_now (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
-void gfc_error_now_2 (const char *gmsgid, ...) ATTRIBUTE_GCC_GFC(1,2);
 void gfc_fatal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
 void gfc_internal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
 void gfc_clear_error (void);
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
index 9bc9b3c..8cbcac98 100644
--- a/gcc/fortran/intrinsic.c
+++ b/gcc/fortran/intrinsic.c
@@ -1050,11 +1050,10 @@ gfc_is_intrinsic (gfc_symbol* sym, int subroutine_flag, locus loc)
   if (!gfc_check_intrinsic_standard (isym, &symstd, false, loc)
       && !sym->attr.artificial)
     {
-      if (sym->attr.proc == PROC_UNKNOWN
-	  && gfc_option.warn_intrinsics_std)
-	gfc_warning_now ("The intrinsic '%s' at %L is not included in the"
-			 " selected standard but %s and '%s' will be"
-			 " treated as if declared EXTERNAL.  Use an"
+      if (sym->attr.proc == PROC_UNKNOWN && warn_intrinsics_std)
+	gfc_warning_now (OPT_Wintrinsics_std, "The intrinsic %qs at %L is not "
+			 "included in the selected standard but %s and %qs will"
+			 " be treated as if declared EXTERNAL.  Use an"
 			 " appropriate -std=* option or define"
 			 " -fall-intrinsics to allow this intrinsic.",
 			 sym->name, &loc, symstd, sym->name);
@@ -4652,14 +4651,14 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
 	  /* Larger kinds can hold values of smaller kinds without problems.
 	     Hence, only warn if target kind is smaller than the source
 	     kind - or if -Wconversion-extra is specified.  */
-	  if (gfc_option.warn_conversion_extra)
-	    gfc_warning_now ("Conversion from %s to %s at %L",
+	  if (warn_conversion && from_ts.kind > ts->kind)
+	    gfc_warning_now (OPT_Wconversion, "Possible change of value in "
+			     "conversion from %s to %s at %L",
 			     gfc_typename (&from_ts), gfc_typename (ts),
 			     &expr->where);
-	  else if (gfc_option.gfc_warn_conversion
-		   && from_ts.kind > ts->kind)
-	    gfc_warning_now ("Possible change of value in conversion "
-			     "from %s to %s at %L", gfc_typename (&from_ts),
+	  else if (warn_conversion_extra)
+	    gfc_warning_now (OPT_Wconversion_extra, "Conversion from %s to %s "
+			     "at %L", gfc_typename (&from_ts),
 			     gfc_typename (ts), &expr->where);
 	}
       else if ((from_ts.type == BT_REAL && ts->type == BT_INTEGER)
@@ -4668,18 +4667,17 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
 	{
 	  /* Conversion from REAL/COMPLEX to INTEGER or COMPLEX to REAL
 	     usually comes with a loss of information, regardless of kinds.  */
-	  if (gfc_option.warn_conversion_extra
-	      || gfc_option.gfc_warn_conversion)
-	    gfc_warning_now ("Possible change of value in conversion "
-			     "from %s to %s at %L", gfc_typename (&from_ts),
-			     gfc_typename (ts), &expr->where);
+	  if (warn_conversion)
+	    gfc_warning_now (OPT_Wconversion, "Possible change of value in "
+			     "conversion from %s to %s at %L",
+			     gfc_typename (&from_ts), gfc_typename (ts),
+			     &expr->where);
 	}
       else if (from_ts.type == BT_HOLLERITH || ts->type == BT_HOLLERITH)
 	{
 	  /* If HOLLERITH is involved, all bets are off.  */
-	  if (gfc_option.warn_conversion_extra
-	      || gfc_option.gfc_warn_conversion)
-	    gfc_warning_now ("Conversion from %s to %s at %L",
+	  if (warn_conversion)
+	    gfc_warning_now (OPT_Wconversion, "Conversion from %s to %s at %L",
 			     gfc_typename (&from_ts), gfc_typename (ts),
 			     &expr->where);
 	}
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 69c3655..8782f12 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -803,7 +803,8 @@ the expression after conversion. Implied by @option{-Wall}.
 @opindex @code{Wconversion-extra}
 @cindex warnings, conversion
 @cindex conversion
-Warn about implicit conversions between different types and kinds.
+Warn about implicit conversions between different types and kinds. This
+option does @emph{not} imply @option{-Wconversion}.
 
 @item -Wextra
 @opindex @code{Wextra}
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index bac7dce..1d6cdde 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -210,7 +210,7 @@ Fortran Warning
 Warn about creation of array temporaries
 
 Wc-binding-type
-Fortran Warning
+Fortran Var(warn_c_binding_type) Warning LangEnabledBy(Fortran,Wall)
 Warn if the type of a variable might be not interoperable with C
 
 Wdate-time
@@ -226,11 +226,11 @@ Fortran Warning
 Warn about equality comparisons involving REAL or COMPLEX expressions
 
 Wconversion
-Fortran Warning
+Fortran Var(warn_conversion) Warning LangEnabledBy(Fortran,Wall)
 ; Documented in C
 
 Wconversion-extra
-Fortran Warning
+Fortran Var(warn_conversion_extra) Warning
 Warn about most implicit conversions
 
 Wextra
@@ -254,7 +254,7 @@ Fortran Warning
 Warn about truncated source lines
 
 Wintrinsics-std
-Fortran Warning
+Fortran Var(warn_intrinsics_std) Warning LangEnabledBy(Fortran,Wall)
 Warn on intrinsics not part of the selected standard
 
 Wmissing-include-dirs
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index a157fe7..bf3cd80 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -4299,18 +4299,18 @@ gfc_match_common (void)
                   /* If we find an error, just print it and continue,
                      cause it's just semantic, and we can see if there
                      are more errors.  */
-                  gfc_error_now ("Variable '%s' at %L in common block '%s' "
-                                 "at %C must be declared with a C "
-                                 "interoperable kind since common block "
-                                 "'%s' is bind(c)",
-                                 sym->name, &(sym->declared_at), t->name,
-                                 t->name);
+                  gfc_error_now_1 ("Variable '%s' at %L in common block '%s' "
+				   "at %C must be declared with a C "
+				   "interoperable kind since common block "
+				   "'%s' is bind(c)",
+				   sym->name, &(sym->declared_at), t->name,
+				   t->name);
                 }
 
               if (sym->attr.is_bind_c == 1)
-                gfc_error_now ("Variable '%s' in common block "
-                               "'%s' at %C can not be bind(c) since "
-                               "it is not global", sym->name, t->name);
+                gfc_error_now ("Variable %qs in common block %qs at %C can not "
+                               "be bind(c) since it is not global", sym->name,
+			       t->name);
             }
 
 	  if (sym->attr.in_common)
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index b88e669..2449bbc 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -6602,7 +6602,7 @@ use_iso_fortran_env_module (void)
 		gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named "
 				 "constant from intrinsic module "
 				 "ISO_FORTRAN_ENV at %L is incompatible with "
-				 "option %s", &u->where,
+				 "option %qs", &u->where,
 				 gfc_option.flag_default_integer
 				   ? "-fdefault-integer-8"
 				   : "-fdefault-real-8");
@@ -6745,8 +6745,8 @@ gfc_use_module (gfc_use_list *module)
   current_intmod = INTMOD_NONE;
 
   if (!only_flag)
-    gfc_warning_now_2 (OPT_Wuse_without_only,
-		       "USE statement at %C has no ONLY qualifier");
+    gfc_warning_now (OPT_Wuse_without_only,
+		     "USE statement at %C has no ONLY qualifier");
 
   filename = XALLOCAVEC (char, strlen (module_name) + strlen (MODULE_EXTENSION)
 			       + 1);
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index 0dd0118..d8ba798 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -96,16 +96,12 @@ gfc_init_options (unsigned int decoded_options_count,
   gfc_option.warn_aliasing = 0;
   gfc_option.warn_ampersand = 0;
   gfc_option.warn_array_temp = 0;
-  gfc_option.warn_c_binding_type = 0;
-  gfc_option.gfc_warn_conversion = 0;
-  gfc_option.warn_conversion_extra = 0;
   gfc_option.warn_function_elimination = 0;
   gfc_option.warn_implicit_interface = 0;
   gfc_option.warn_line_truncation = 0;
   gfc_option.warn_surprising = 0;
   gfc_option.warn_underflow = 1;
   gfc_option.warn_intrinsic_shadow = 0;
-  gfc_option.warn_intrinsics_std = 0;
   gfc_option.warn_align_commons = 1;
   gfc_option.warn_real_q_constant = 0;
   gfc_option.warn_unused_dummy_argument = 0;
@@ -359,8 +355,8 @@ gfc_post_options (const char **pfilename)
       if (gfc_current_form == FORM_UNKNOWN)
 	{
 	  gfc_current_form = FORM_FREE;
-	  gfc_warning_now_2 ("Reading file %qs as free form", 
-			     (filename[0] == '\0') ? "<stdin>" : filename);
+	  gfc_warning_now ("Reading file %qs as free form", 
+			   (filename[0] == '\0') ? "<stdin>" : filename);
 	}
     }
 
@@ -369,10 +365,10 @@ gfc_post_options (const char **pfilename)
   if (gfc_current_form == FORM_FREE)
     {
       if (gfc_option.flag_d_lines == 0)
-	gfc_warning_now_2 ("%<-fd-lines-as-comments%> has no effect "
+	gfc_warning_now ("%<-fd-lines-as-comments%> has no effect "
 			   "in free form");
       else if (gfc_option.flag_d_lines == 1)
-	gfc_warning_now_2 ("%<-fd-lines-as-code%> has no effect in free form");
+	gfc_warning_now ("%<-fd-lines-as-code%> has no effect in free form");
     }
 
   /* If -pedantic, warn about the use of GNU extensions.  */
@@ -390,20 +386,20 @@ gfc_post_options (const char **pfilename)
 
   if (!gfc_option.flag_automatic && gfc_option.flag_max_stack_var_size != -2
       && gfc_option.flag_max_stack_var_size != 0)
-    gfc_warning_now_2 ("Flag %<-fno-automatic%> overwrites %<-fmax-stack-var-size=%d%>",
+    gfc_warning_now ("Flag %<-fno-automatic%> overwrites %<-fmax-stack-var-size=%d%>",
 		       gfc_option.flag_max_stack_var_size);
   else if (!gfc_option.flag_automatic && gfc_option.flag_recursive)
-    gfc_warning_now_2 ("Flag %<-fno-automatic%> overwrites %<-frecursive%>");
+    gfc_warning_now ("Flag %<-fno-automatic%> overwrites %<-frecursive%>");
   else if (!gfc_option.flag_automatic && gfc_option.gfc_flag_openmp)
-    gfc_warning_now_2 ("Flag %<-fno-automatic%> overwrites %<-frecursive%> implied by "
+    gfc_warning_now ("Flag %<-fno-automatic%> overwrites %<-frecursive%> implied by "
 		       "%<-fopenmp%>");
   else if (gfc_option.flag_max_stack_var_size != -2
 	   && gfc_option.flag_recursive)
-    gfc_warning_now_2 ("Flag %<-frecursive%> overwrites %<-fmax-stack-var-size=%d%>",
+    gfc_warning_now ("Flag %<-frecursive%> overwrites %<-fmax-stack-var-size=%d%>",
 		       gfc_option.flag_max_stack_var_size);
   else if (gfc_option.flag_max_stack_var_size != -2
 	   && gfc_option.gfc_flag_openmp)
-    gfc_warning_now_2 ("Flag %<-fmax-stack-var-size=%d%> overwrites %<-frecursive%> "
+    gfc_warning_now ("Flag %<-fmax-stack-var-size=%d%> overwrites %<-frecursive%> "
 		       "implied by %<-fopenmp%>", 
 		     gfc_option.flag_max_stack_var_size);
 
@@ -452,13 +448,10 @@ set_Wall (int setting)
 {
   gfc_option.warn_aliasing = setting;
   gfc_option.warn_ampersand = setting;
-  gfc_option.warn_c_binding_type = setting;
-  gfc_option.gfc_warn_conversion = setting;
   gfc_option.warn_line_truncation = setting;
   gfc_option.warn_surprising = setting;
   gfc_option.warn_underflow = setting;
   gfc_option.warn_intrinsic_shadow = setting;
-  gfc_option.warn_intrinsics_std = setting;
   gfc_option.warn_real_q_constant = setting;
   gfc_option.warn_unused_dummy_argument = setting;
   gfc_option.warn_target_lifetime = setting;
@@ -657,22 +650,10 @@ gfc_handle_option (size_t scode, const char *arg, int value,
       gfc_option.warn_array_temp = value;
       break;
 
-    case OPT_Wc_binding_type:
-      gfc_option.warn_c_binding_type = value;
-      break;
-
     case OPT_Wcompare_reals:
       gfc_option.warn_compare_reals = value;
       break;
 
-    case OPT_Wconversion:
-      gfc_option.gfc_warn_conversion = value;
-      break;
-
-    case OPT_Wconversion_extra:
-      gfc_option.warn_conversion_extra = value;
-      break;
-
     case OPT_Wextra:
       set_Wextra (value);
       break;
@@ -1063,10 +1044,6 @@ gfc_handle_option (size_t scode, const char *arg, int value,
       gfc_option.warn_std = 0;
       break;
 
-    case OPT_Wintrinsics_std:
-      gfc_option.warn_intrinsics_std = value;
-      break;
-
     case OPT_fshort_enums:
       /* Handled in language-independent code.  */
       break;
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index f9c1683..540424f 100644
--- a/gcc/fortran/parse.c
+++ b/gcc/fortran/parse.c
@@ -550,7 +550,7 @@ decode_statement (void)
      stored an error message of some sort.  */
 
   if (gfc_error_check () == 0)
-    gfc_error_now_2 ("Unclassifiable statement at %C");
+    gfc_error_now ("Unclassifiable statement at %C");
 
   reject_statement ();
 
@@ -797,7 +797,7 @@ decode_gcc_attribute (void)
      stored an error message of some sort.  */
 
   if (gfc_error_check () == 0)
-    gfc_error_now_2 ("Unclassifiable GCC directive at %C");
+    gfc_error_now ("Unclassifiable GCC directive at %C");
 
   reject_statement ();
 
@@ -836,17 +836,17 @@ next_free (void)
 	  gfc_match_small_literal_int (&i, &cnt);
 
 	  if (cnt > 5)
-	    gfc_error_now_2 ("Too many digits in statement label at %C");
+	    gfc_error_now ("Too many digits in statement label at %C");
 
 	  if (i == 0)
-	    gfc_error_now_2 ("Zero is not a valid statement label at %C");
+	    gfc_error_now ("Zero is not a valid statement label at %C");
 
 	  do
 	    c = gfc_next_ascii_char ();
 	  while (ISDIGIT(c));
 
 	  if (!gfc_is_whitespace (c))
-	    gfc_error_now_2 ("Non-numeric character in statement label at %C");
+	    gfc_error_now ("Non-numeric character in statement label at %C");
 
 	  return ST_NONE;
 	}
@@ -858,7 +858,7 @@ next_free (void)
 
 	  if (at_bol && gfc_peek_ascii_char () == ';')
 	    {
-	      gfc_error_now_2 ("Semicolon at %C needs to be preceded by "
+	      gfc_error_now ("Semicolon at %C needs to be preceded by "
 			     "statement");
 	      gfc_next_ascii_char (); /* Eat up the semicolon.  */
 	      return ST_NONE;
@@ -917,8 +917,8 @@ next_free (void)
   if (at_bol && c == ';')
     {
       if (!(gfc_option.allow_std & GFC_STD_F2008))
-	gfc_error_now_2 ("Fortran 2008: Semicolon at %C without preceding "
-			 "statement");
+	gfc_error_now ("Fortran 2008: Semicolon at %C without preceding "
+		       "statement");
       gfc_next_ascii_char (); /* Eat up the semicolon.  */
       return ST_NONE;
     }
@@ -1017,7 +1017,7 @@ next_fixed (void)
   if (digit_flag)
     {
       if (label == 0)
-	gfc_warning_now_2 ("Zero is not a valid statement label at %C");
+	gfc_warning_now ("Zero is not a valid statement label at %C");
       else
 	{
 	  /* We've found a valid statement label.  */
@@ -3505,8 +3505,8 @@ gfc_check_do_variable (gfc_symtree *st)
   for (s=gfc_state_stack; s; s = s->previous)
     if (s->do_variable == st)
       {
-	gfc_error_now("Variable '%s' at %C cannot be redefined inside "
-		      "loop beginning at %L", st->name, &s->head->loc);
+	gfc_error_now_1 ("Variable '%s' at %C cannot be redefined inside "
+			 "loop beginning at %L", st->name, &s->head->loc);
 	return 1;
       }
 
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 6dc1585..08bbda4 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -924,7 +924,7 @@ resolve_common_vars (gfc_symbol *sym, bool named_common)
 	}
 
       if (UNLIMITED_POLY (csym))
-	gfc_error_now ("'%s' in cannot appear in COMMON at %L "
+	gfc_error_now ("%qs in cannot appear in COMMON at %L "
 		       "[F2008:C5100]", csym->name, &csym->declared_at);
 
       if (csym->ts.type != BT_DERIVED)
@@ -932,15 +932,15 @@ resolve_common_vars (gfc_symbol *sym, bool named_common)
 
       if (!(csym->ts.u.derived->attr.sequence
 	    || csym->ts.u.derived->attr.is_bind_c))
-	gfc_error_now ("Derived type variable '%s' in COMMON at %L "
+	gfc_error_now ("Derived type variable %qs in COMMON at %L "
 		       "has neither the SEQUENCE nor the BIND(C) "
 		       "attribute", csym->name, &csym->declared_at);
       if (csym->ts.u.derived->attr.alloc_comp)
-	gfc_error_now ("Derived type variable '%s' in COMMON at %L "
+	gfc_error_now ("Derived type variable %qs in COMMON at %L "
 		       "has an ultimate component that is "
 		       "allocatable", csym->name, &csym->declared_at);
       if (gfc_has_default_initializer (csym->ts.u.derived))
-	gfc_error_now ("Derived type variable '%s' in COMMON at %L "
+	gfc_error_now ("Derived type variable %qs in COMMON at %L "
 		       "may not have default initializer", csym->name,
 		       &csym->declared_at);
 
@@ -9224,10 +9224,10 @@ resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
 	rlen = mpz_get_si (rhs->ts.u.cl->length->value.integer);
 
       if (rlen && llen && rlen > llen)
-	gfc_warning_now_2 (OPT_Wcharacter_truncation,
-			   "CHARACTER expression will be truncated "
-			   "in assignment (%d/%d) at %L",
-			   llen, rlen, &code->loc);
+	gfc_warning_now (OPT_Wcharacter_truncation,
+			 "CHARACTER expression will be truncated "
+			 "in assignment (%d/%d) at %L",
+			 llen, rlen, &code->loc);
     }
 
   /* Ensure that a vector index expression for the lvalue is evaluated
diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index e0b9a3b..884fe70 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -324,16 +324,16 @@ add_path_to_list (gfc_directorylist **list, const char *path,
   if (stat (q, &st))
     {
       if (errno != ENOENT)
-	gfc_warning_now_2 ("Include directory %qs: %s", path,
-			   xstrerror(errno));
+	gfc_warning_now ("Include directory %qs: %s", path,
+			 xstrerror(errno));
       else if (warn)
-	gfc_warning_now_2 (OPT_Wmissing_include_dirs,
-			   "Nonexistent include directory %qs", path);
+	gfc_warning_now (OPT_Wmissing_include_dirs,
+			 "Nonexistent include directory %qs", path);
       return;
     }
   else if (!S_ISDIR (st.st_mode))
     {
-      gfc_warning_now_2 ("%qs is not a directory", path);
+      gfc_warning_now ("%qs is not a directory", path);
       return;
     }
 
@@ -775,10 +775,10 @@ skip_free_comments (void)
 				}
 			    }
 			  else
-			    gfc_warning_now ("!$OMP at %C starts a commented "
-					     "line as it neither is followed "
-					     "by a space nor is a "
-					     "continuation line");
+			    gfc_warning_now_1 ("!$OMP at %C starts a commented "
+					       "line as it neither is followed "
+					       "by a space nor is a "
+					       "continuation line");
 			}
 		      gfc_current_locus = old_loc;
 		      next_char ();
@@ -1056,7 +1056,7 @@ restart:
 
 	  gfc_current_locus.lb->truncated = 0;
 	  gfc_current_locus.nextc =  gfc_current_locus.lb->line + maxlen;
-	  gfc_warning_now ("Line truncated at %L", &gfc_current_locus);
+	  gfc_warning_now_1 ("Line truncated at %L", &gfc_current_locus);
 	  gfc_current_locus.nextc = current_nextc;
 	}
 
@@ -1194,7 +1194,7 @@ restart:
 	  && gfc_current_locus.lb->truncated)
 	{
 	  gfc_current_locus.lb->truncated = 0;
-	  gfc_warning_now ("Line truncated at %L", &gfc_current_locus);
+	  gfc_warning_now_1 ("Line truncated at %L", &gfc_current_locus);
 	}
 
       prev_openmp_flag = openmp_flag;
@@ -1388,7 +1388,7 @@ gfc_gobble_whitespace (void)
 	  if (cur_linenum != linenum)
 	    {
 	      linenum = cur_linenum;
-	      gfc_warning_now ("Nonconforming tab character at %C");
+	      gfc_warning_now_1 ("Nonconforming tab character at %C");
 	    }
 	}
     }
@@ -1476,11 +1476,11 @@ load_line (FILE *input, gfc_char_t **pbuf, int *pbuflen, const int *first_char)
 	      && !seen_printable && seen_ampersand)
 	    {
 	      if (pedantic)
-		gfc_error_now_2 ("%<&%> not allowed by itself in line %d",
-				   current_line);
+		gfc_error_now ("%<&%> not allowed by itself in line %d",
+			       current_line);
 	      else
-		gfc_warning_now_2 ("%<&%> not allowed by itself in line %d",
-				     current_line);
+		gfc_warning_now ("%<&%> not allowed by itself in line %d",
+				 current_line);
 	    }
 	  break;
 	}
@@ -1537,9 +1537,9 @@ load_line (FILE *input, gfc_char_t **pbuf, int *pbuflen, const int *first_char)
 	  if (warn_tabs && seen_comment == 0 && current_line != linenum)
 	    {
 	      linenum = current_line;
-	      gfc_warning_now_2 (OPT_Wtabs,
-				 "Nonconforming tab character in column %d "
-				 "of line %d", i+1, linenum);
+	      gfc_warning_now (OPT_Wtabs,
+			       "Nonconforming tab character in column %d "
+			       "of line %d", i+1, linenum);
 	    }
 
 	  while (i < 6)
@@ -1763,9 +1763,9 @@ preprocessor_line (gfc_char_t *c)
       if (!current_file->up
 	  || filename_cmp (current_file->up->filename, filename) != 0)
 	{
-	  gfc_warning_now ("%s:%d: file %s left but not entered",
-			   current_file->filename, current_file->line,
-			   filename);
+	  gfc_warning_now_1 ("%s:%d: file %s left but not entered",
+			     current_file->filename, current_file->line,
+			     filename);
 	  if (unescape)
 	    free (wide_filename);
 	  free (filename);
@@ -1797,7 +1797,7 @@ preprocessor_line (gfc_char_t *c)
   return;
 
  bad_cpp_line:
-  gfc_warning_now ("%s:%d: Illegal preprocessor directive",
+  gfc_warning_now_1 ("%s:%d: Illegal preprocessor directive",
 		   current_file->filename, current_file->line);
   current_file->line++;
 }
@@ -1922,7 +1922,7 @@ load_file (const char *realfilename, const char *displayedname, bool initial)
 	input = gfc_open_file (realfilename);
       if (input == NULL)
 	{
-	  gfc_error_now_2 ("Can't open file %qs", filename);
+	  gfc_error_now ("Can't open file %qs", filename);
 	  return false;
 	}
     }
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index 3eb58f4..aeb7dce 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -270,11 +270,12 @@ gfc_set_default_type (gfc_symbol *sym, int error_flag, gfc_namespace *ns)
 	   && !gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as))
     return false;
 
-  if (sym->attr.is_bind_c == 1 && gfc_option.warn_c_binding_type)
+  if (sym->attr.is_bind_c == 1 && warn_c_binding_type)
     {
       /* BIND(C) variables should not be implicitly declared.  */
-      gfc_warning_now ("Implicitly declared BIND(C) variable '%s' at %L may "
-                       "not be C interoperable", sym->name, &sym->declared_at);
+      gfc_warning_now (OPT_Wc_binding_type, "Implicitly declared BIND(C) "
+		       "variable %qs at %L may not be C interoperable",
+		       sym->name, &sym->declared_at);
       sym->ts.f90_type = sym->ts.type;
     }
 
@@ -284,14 +285,15 @@ gfc_set_default_type (gfc_symbol *sym, int error_flag, gfc_namespace *ns)
 	  && (sym->ns->proc_name->attr.subroutine != 0
 	      || sym->ns->proc_name->attr.function != 0)
 	  && sym->ns->proc_name->attr.is_bind_c != 0
-	  && gfc_option.warn_c_binding_type)
+	  && warn_c_binding_type)
         {
           /* Dummy args to a BIND(C) routine may not be interoperable if
              they are implicitly typed.  */
-          gfc_warning_now ("Implicitly declared variable '%s' at %L may not "
-                           "be C interoperable but it is a dummy argument to "
-                           "the BIND(C) procedure '%s' at %L", sym->name,
-                           &(sym->declared_at), sym->ns->proc_name->name,
+          gfc_warning_now (OPT_Wc_binding_type, "Implicitly declared variable "
+			   "%qs at %L may not be C interoperable but it is a "
+			   "dummy argument to the BIND(C) procedure %qs at %L",
+			   sym->name, &(sym->declared_at),
+			   sym->ns->proc_name->name,
                            &(sym->ns->proc_name->declared_at));
           sym->ts.f90_type = sym->ts.type;
         }
@@ -3854,7 +3856,7 @@ verify_bind_c_derived_type (gfc_symbol *derived_sym)
   if (derived_sym->attr.is_bind_c != 1)
     {
       derived_sym->ts.is_c_interop = 0;
-      gfc_error_now ("Derived type '%s' declared at %L must have the BIND "
+      gfc_error_now ("Derived type %qs declared at %L must have the BIND "
                      "attribute to be C interoperable", derived_sym->name,
                      &(derived_sym->declared_at));
       retval = false;
@@ -3949,8 +3951,7 @@ verify_bind_c_derived_type (gfc_symbol *derived_sym)
 		 recompiles with different flags (e.g., -m32 and -m64 on
 		 x86_64 and using integer(4) to claim interop with a
 		 C_LONG).  */
-	      if (derived_sym->attr.is_bind_c == 1
-		  && gfc_option.warn_c_binding_type)
+	      if (derived_sym->attr.is_bind_c == 1 && warn_c_binding_type)
 		/* If the derived type is bind(c), all fields must be
 		   interop.  */
 		gfc_warning ("Component '%s' in derived type '%s' at %L "
@@ -3958,7 +3959,7 @@ verify_bind_c_derived_type (gfc_symbol *derived_sym)
                              "derived type '%s' is BIND(C)",
                              curr_comp->name, derived_sym->name,
                              &(curr_comp->loc), derived_sym->name);
-	      else if (gfc_option.warn_c_binding_type)
+	      else if (warn_c_binding_type)
 		/* If derived type is param to bind(c) routine, or to one
 		   of the iso_c_binding procs, it must be interoperable, so
 		   all fields must interop too.	 */
diff --git a/gcc/testsuite/gfortran.dg/empty_label.f b/gcc/testsuite/gfortran.dg/empty_label.f
index 5abf9d9..fe16652 100644
--- a/gcc/testsuite/gfortran.dg/empty_label.f
+++ b/gcc/testsuite/gfortran.dg/empty_label.f
@@ -1,6 +1,7 @@
 C { dg-do compile }
 C { dg-options "-Werror -fmax-errors=1" }
-100   ! { dg-warning "empty statement" }
+100   ! { dg-error "empty statement" }
       end
-C { dg-error "count reached limit" "" { target *-*-* } 0 }
-C { dg-excess-errors "compilation terminated" }
+subroutine foo ! Not checked ...
+end function ! ... but an error
+C { dg-excess-errors "warnings being treated as errors" }
diff --git a/gcc/testsuite/gfortran.dg/empty_label.f90 b/gcc/testsuite/gfortran.dg/empty_label.f90
index d7f4a8f..af067b5 100644
--- a/gcc/testsuite/gfortran.dg/empty_label.f90
+++ b/gcc/testsuite/gfortran.dg/empty_label.f90
@@ -1,6 +1,7 @@
 ! { dg-do compile }
 ! { dg-options "-Werror -fmax-errors=1" }
-100   ! { dg-warning "empty statement" }
+100   ! { dg-error "empty statement" }
 end
-! { dg-error "count reached limit" "" { target *-*-* } 0 }
-! { dg-excess-errors "compilation terminated" }
+subroutine foo ! Not checked ...
+end function ! ... but an error
+! { dg-excess-errors "warnings being treated as errors" }
diff --git a/gcc/testsuite/gfortran.dg/warnings_are_errors_1.f90 b/gcc/testsuite/gfortran.dg/warnings_are_errors_1.f90
index 0a0883c..8ce4699 100644
--- a/gcc/testsuite/gfortran.dg/warnings_are_errors_1.f90
+++ b/gcc/testsuite/gfortran.dg/warnings_are_errors_1.f90
@@ -21,6 +21,7 @@
       cplx = 20.
 
 ! gfc_warning_now:
- 1 ! { dg-warning "Ignoring statement label in empty statement" }
+ 1 ! { dg-error "Ignoring statement label in empty statement" }
        end
 ! { dg-final { output-exists-not } }
+! { dg-excess-errors "warnings being treated as errors" }
