diff mbox

[Fortran] fortran/lang.opt cleanup

Message ID 547A46EA.1020809@net-b.de
State New
Headers show

Commit Message

Tobias Burnus Nov. 29, 2014, 10:21 p.m. UTC
This patch converts all warnings to Var(), which cleans up options.c 
quite a bit and makes it additionally possible to use the OPT_* with 
common diagnostics, once gfc_warning is converted. I also remove one 
-Wall setting of a warning as it was already enabled by default; 
additionally, I mentioned this fact in the man page.

Build and regtested on x86-64-gnu-linux.
OK for the trunk?

Tobias

Comments

FX Coudert Nov. 29, 2014, 10:42 p.m. UTC | #1
> This patch converts all warnings to Var(), which cleans up options.c quite a bit and makes it additionally possible to use the OPT_* with common diagnostics, once gfc_warning is converted. I also remove one -Wall setting of a warning as it was already enabled by default; additionally, I mentioned this fact in the man page.

Cool stuff! Thanks for doing this, and OK to commit.

FX
Tobias Burnus Nov. 30, 2014, 8:55 a.m. UTC | #2
FX wrote:
> Cool stuff! Thanks for doing this, and OK to commit. FX 

Thanks for the review.

Regarding gfc_warning, what do you think should we do?

a) Mapping gfc_warning to gfc_warning_now as suggested in 
https://gcc.gnu.org/ml/fortran/2014-11/msg00141.html

or

b) Do actual buffering as in 
https://gcc.gnu.org/ml/fortran/2014-11/msg00128.html

Tobias
FX Coudert Nov. 30, 2014, 10:01 a.m. UTC | #3
> Regarding gfc_warning, what do you think should we do?
> a) Mapping gfc_warning to gfc_warning_now as suggested in https://gcc.gnu.org/ml/fortran/2014-11/msg00141.html

I’m not totally convinced that removing buffer for warnings is safe in all cases.
Probably we don’t trigger it in the testsuite, but the testsuite mostly include simple independent syntax elements. In real-life code, who knows…


> b) Do actual buffering as in https://gcc.gnu.org/ml/fortran/2014-11/msg00128.html

I’d rather stick with buffering, it makes more sense in general.


FX
diff mbox

Patch

2014-11-29  Tobias Burnus  <burnus@net-b.de>

	* gfortran.h (gfc_option_t): Remove warn_aliasing, warn_ampersand,
	warn_function_elimination, warn_implicit_interface,
	warn_implicit_procedure, warn_line_truncation,
	warn_surprising, warn_underflow, warn_intrinsic_shadow,
	warn_array_temp, warn_align_commons, warn_real_q_constant,
	warn_unused_dummy_argument, warn_zerotrip, warn_realloc_lhs,
	warn_realloc_lhs_all, warn_compare_reals, warn_target_lifetime.
	* arith.c (check_result, gfc_real2real, gfc_real2complex,
	gfc_complex2real, gfc_complex2complex): Honor changed
	variable names.
	* check.c (gfc_check_transfer): Ditto.
	* expr.c (gfc_check_assign, gfc_check_pointer_assign): Ditto.
	* interface.c (compare_parameter, gfc_procedure_use, gfc_ppc_use,
	gfc_arglist_matches_symbol): Ditto.
	* intrinsic.c (gfc_warn_intrinsic_shadow): Ditto.
	* primary.c (match_real_constant, match_string_constant): Ditto.
	* resolve.c (gfc_resolve_intrinsic, resolve_operator,
	gfc_resolve_iterator, resolve_select, resolve_ordinary_assign,
	resolve_charlen, gfc_resolve_finalizers): Ditto.
	* scanner.c (gfc_next_char_literal): Ditto.
	* simplify.c (simplify_achar_char, gfc_simplify_iachar): Ditto.
	* trans-array.c (gfc_trans_create_temp_array,
	gfc_trans_dummy_array_bias, gfc_conv_array_parameter): Ditto.
	* trans-common.c (translate_common):
	* trans-decl.c (generate_local_decl): Ditto.
	* trans-expr.c (realloc_lhs_warning): Ditto.
	* trans-intrinsic.c (gfc_conv_intrinsic_transfer): Ditto.
	* decl.c (do_warn_intrinsic_shadow): Ditto. Renamed from
	warn_intrinsic_shadow.
	* frontend-passes.c (do_warn_function_elimination): Honor
	changed variable names. Renamed from do_warn_function_elimination.
	* invoke.texi (Wunderflow): Document that it is enabled by default.
	* lang.opt (Waliasing, Walign-commons, Warray-temporaries,
	Wcompare-reals, Wfunction-elimination, Wimplicit-interface,
	Wimplicit-procedure, Wline-truncation, Wreal-q-constant, Wrealloc-lhs,
	Wrealloc-lhs-all, Wtarget-lifetime, Wsurprising, Wunderflow,
	Wintrinsic-shadow, Wunused-dummy-argument, Wzerotrip): Use Var(),
	add Init() and LangEnabledBy() were required.
	(Wmaybe-uninitialized, Wreturn-type, Wuninitialized): Add
	LangEnabledBy.
	* options.c (gfc_init_options, gfc_post_options, gfc_handle_option):
	Remove options handled in lang.opt; handle renaming.
	(set_Wall, set_Wextra): Remove.

diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c
index f8f2ba6..efbe6de 100644
--- a/gcc/fortran/arith.c
+++ b/gcc/fortran/arith.c
@@ -544,7 +544,7 @@  check_result (arith rc, gfc_expr *x, gfc_expr *r, gfc_expr **rp)
 
   if (val == ARITH_UNDERFLOW)
     {
-      if (gfc_option.warn_underflow)
+      if (warn_underflow)
 	gfc_warning (gfc_arith_error (val), &x->where);
       val = ARITH_OK;
     }
@@ -2077,7 +2077,7 @@  gfc_real2real (gfc_expr *src, int kind)
 
   if (rc == ARITH_UNDERFLOW)
     {
-      if (gfc_option.warn_underflow)
+      if (warn_underflow)
 	gfc_warning (gfc_arith_error (rc), &src->where);
       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
     }
@@ -2108,7 +2108,7 @@  gfc_real2complex (gfc_expr *src, int kind)
 
   if (rc == ARITH_UNDERFLOW)
     {
-      if (gfc_option.warn_underflow)
+      if (warn_underflow)
 	gfc_warning (gfc_arith_error (rc), &src->where);
       mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
     }
@@ -2163,7 +2163,7 @@  gfc_complex2real (gfc_expr *src, int kind)
 
   if (rc == ARITH_UNDERFLOW)
     {
-      if (gfc_option.warn_underflow)
+      if (warn_underflow)
 	gfc_warning (gfc_arith_error (rc), &src->where);
       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
     }
@@ -2194,7 +2194,7 @@  gfc_complex2complex (gfc_expr *src, int kind)
 
   if (rc == ARITH_UNDERFLOW)
     {
-      if (gfc_option.warn_underflow)
+      if (warn_underflow)
 	gfc_warning (gfc_arith_error (rc), &src->where);
       mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
     }
@@ -2209,7 +2209,7 @@  gfc_complex2complex (gfc_expr *src, int kind)
 
   if (rc == ARITH_UNDERFLOW)
     {
-      if (gfc_option.warn_underflow)
+      if (warn_underflow)
 	gfc_warning (gfc_arith_error (rc), &src->where);
       mpfr_set_ui (mpc_imagref (result->value.complex), 0, GFC_RND_MODE);
     }
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index 5fea5a8..cea2689 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -5070,7 +5070,7 @@  gfc_check_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
 	return false;
     }
 
-  if (!gfc_option.warn_surprising)
+  if (!warn_surprising)
     return true;
 
   /* If we can't calculate the sizes, we cannot check any more.
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index e7c06f3..f11bcb0 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -5284,7 +5284,7 @@  gfc_match_procedure (void)
    parser-state-stack to find out whether we're in a module.  */
 
 static void
-warn_intrinsic_shadow (const gfc_symbol* sym, bool func)
+do_warn_intrinsic_shadow (const gfc_symbol* sym, bool func)
 {
   bool in_module;
 
@@ -5420,7 +5420,7 @@  gfc_match_function_decl (void)
 	}
 
       /* Warn if this procedure has the same name as an intrinsic.  */
-      warn_intrinsic_shadow (sym, true);
+      do_warn_intrinsic_shadow (sym, true);
 
       return MATCH_YES;
     }
@@ -5851,7 +5851,7 @@  gfc_match_subroutine (void)
     return MATCH_ERROR;
 
   /* Warn if it has the same name as an intrinsic.  */
-  warn_intrinsic_shadow (sym, false);
+  do_warn_intrinsic_shadow (sym, false);
 
   return MATCH_YES;
 }
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index d5b48cf..59f770c 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -3171,7 +3171,7 @@  gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
     }
 
   /* This is possibly a typo: x = f() instead of x => f().  */
-  if (gfc_option.warn_surprising
+  if (warn_surprising
       && rvalue->expr_type == EXPR_FUNCTION && gfc_expr_attr (rvalue).pointer)
     gfc_warning ("POINTER-valued function appears on right-hand side of "
 		 "assignment at %L", &rvalue->where);
@@ -3197,7 +3197,7 @@  gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
     {
       int rc;
-      if (gfc_option.warn_surprising)
+      if (warn_surprising)
         gfc_warning ("BOZ literal at %L is bitwise transferred "
                      "non-integer symbol '%s'", &rvalue->where,
                      lvalue->symtree->n.sym->name);
@@ -3750,7 +3750,7 @@  gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
     }
 
   /* Warn if it is the LHS pointer may lives longer than the RHS target.  */
-  if (gfc_option.warn_target_lifetime
+  if (warn_target_lifetime
       && rvalue->expr_type == EXPR_VARIABLE
       && !rvalue->symtree->n.sym->attr.save
       && !attr.pointer && !rvalue->symtree->n.sym->attr.host_assoc
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index 9b96f29..799d2fe 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -546,7 +546,7 @@  create_var (gfc_expr * e)
       result->ref->u.ar.where = e->where;
       result->ref->u.ar.as = symbol->ts.type == BT_CLASS
 			     ? CLASS_DATA (symbol)->as : symbol->as;
-      if (gfc_option.warn_array_temp)
+      if (warn_array_temporaries)
 	gfc_warning ("Creating array temporary at %L", &(e->where));
     }
 
@@ -565,7 +565,7 @@  create_var (gfc_expr * e)
 /* Warn about function elimination.  */
 
 static void
-warn_function_elimination (gfc_expr *e)
+do_warn_function_elimination (gfc_expr *e)
 {
   if (e->expr_type != EXPR_FUNCTION)
     return;
@@ -618,8 +618,8 @@  cfe_expr_0 (gfc_expr **e, int *walk_subtrees,
 	      if (newvar == NULL)
 		newvar = create_var (*ei);
 
-	      if (gfc_option.warn_function_elimination)
-		warn_function_elimination (*ej);
+	      if (warn_function_elimination)
+		do_warn_function_elimination (*ej);
 
 	      free (*ej);
 	      *ej = gfc_copy_expr (newvar);
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 095d526..1058502 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -2442,24 +2442,6 @@  typedef struct
   int dump_fortran_original;
   int dump_fortran_optimized;
 
-  int warn_aliasing;
-  int warn_ampersand;
-  int warn_function_elimination;
-  int warn_implicit_interface;
-  int warn_implicit_procedure;
-  int warn_line_truncation;
-  int warn_surprising;
-  int warn_underflow;
-  int warn_intrinsic_shadow;
-  int warn_array_temp;
-  int warn_align_commons;
-  int warn_real_q_constant;
-  int warn_unused_dummy_argument;
-  int warn_zerotrip;
-  int warn_realloc_lhs;
-  int warn_realloc_lhs_all;
-  int warn_compare_reals;
-  int warn_target_lifetime;
   int max_errors;
 
   int flag_all_intrinsics;
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 1980ddf..2429fd2 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -66,6 +66,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 "match.h"
 #include "arith.h"
@@ -2145,8 +2146,7 @@  compare_parameter (gfc_symbol *formal, gfc_expr *actual,
 		       formal->name);
 	    return 0;
 	}
-      else if (gfc_option.warn_surprising && where
-	       && formal->attr.intent != INTENT_IN)
+      else if (warn_surprising && where && formal->attr.intent != INTENT_IN)
 	gfc_warning ("Passing coarray at %L to allocatable, noncoarray dummy "
 		     "argument '%s', which is invalid if the allocation status"
 		     " is modified",  &actual->where, formal->name);
@@ -3260,11 +3260,10 @@  gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
 		     sym->name, where);
 	  return false;
 	}
-      if (gfc_option.warn_implicit_interface)
+      if (warn_implicit_interface)
 	gfc_warning ("Procedure '%s' called with an implicit interface at %L",
 		     sym->name, where);
-      else if (gfc_option.warn_implicit_procedure
-	       && sym->attr.proc == PROC_UNKNOWN)
+      else if (warn_implicit_procedure && sym->attr.proc == PROC_UNKNOWN)
 	gfc_warning ("Procedure '%s' called at %L is not explicitly declared",
 		     sym->name, where);
     }
@@ -3357,7 +3356,7 @@  gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
   if (!check_intents (dummy_args, *ap))
     return false;
 
-  if (gfc_option.warn_aliasing)
+  if (warn_aliasing)
     check_some_aliasing (dummy_args, *ap);
 
   return true;
@@ -3374,7 +3373,7 @@  gfc_ppc_use (gfc_component *comp, gfc_actual_arglist **ap, locus *where)
   /* Warn about calls with an implicit interface.  Special case
      for calling a ISO_C_BINDING because c_loc and c_funloc
      are pseudo-unknown.  */
-  if (gfc_option.warn_implicit_interface
+  if (warn_implicit_interface
       && comp->attr.if_source == IFSRC_UNKNOWN
       && !comp->attr.is_iso_c)
     gfc_warning ("Procedure pointer component '%s' called with an implicit "
@@ -3403,7 +3402,7 @@  gfc_ppc_use (gfc_component *comp, gfc_actual_arglist **ap, locus *where)
     return;
 
   check_intents (comp->ts.interface->formal, *ap);
-  if (gfc_option.warn_aliasing)
+  if (warn_aliasing)
     check_some_aliasing (comp->ts.interface->formal, *ap);
 }
 
@@ -3426,7 +3425,7 @@  gfc_arglist_matches_symbol (gfc_actual_arglist** args, gfc_symbol* sym)
   if (compare_actual_formal (args, dummy_args, r, !r, NULL))
     {
       check_intents (dummy_args, *args);
-      if (gfc_option.warn_aliasing)
+      if (warn_aliasing)
 	check_some_aliasing (dummy_args, *args);
       return true;
     }
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
index 6b874a4..5dd4092 100644
--- a/gcc/fortran/intrinsic.c
+++ b/gcc/fortran/intrinsic.c
@@ -4807,7 +4807,7 @@  gfc_warn_intrinsic_shadow (const gfc_symbol* sym, bool in_module, bool func)
   gfc_intrinsic_sym* isym;
 
   /* If the warning is disabled, do nothing at all.  */
-  if (!gfc_option.warn_intrinsic_shadow)
+  if (!warn_intrinsic_shadow)
     return;
 
   /* Try to find an intrinsic of the same name.  */
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 8782f12..70d5b5c 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -886,7 +886,7 @@  is active for @option{-pedantic}, @option{-std=f95}, @option{-std=f2003},
 @cindex warnings, underflow
 @cindex underflow
 Produce a warning when numerical constant expressions are
-encountered, which yield an UNDERFLOW during compilation.
+encountered, which yield an UNDERFLOW during compilation. Enabled by default.
 
 @item -Wintrinsic-shadow
 @opindex @code{Wintrinsic-shadow}
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index 1d6cdde..c297817 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -194,19 +194,19 @@  Fortran
 ; Documented in C
 
 Waliasing
-Fortran Warning
+Fortran Warning Var(warn_aliasing) LangEnabledBy(Fortran,Wall)
 Warn about possible aliasing of dummy arguments
 
 Walign-commons
-Fortran Warning
+Fortran Warning Var(warn_align_commons) Init(1)
 Warn about alignment of COMMON blocks
 
 Wampersand
-Fortran Warning
+Fortran Warning Var(warn_ampersand) LangEnabledBy(Fortran,Wall || Wpedantic)
 Warn about missing ampersand in continued character constants
 
 Warray-temporaries
-Fortran Warning
+Fortran Warning Var(warn_array_temporaries)
 Warn about creation of array temporaries
 
 Wc-binding-type
@@ -222,7 +222,7 @@  Fortran Var(warn_character_truncation) Warning LangEnabledBy(Fortran,Wall)
 Warn about truncated character expressions
 
 Wcompare-reals
-Fortran Warning
+Fortran Warning Var(warn_compare_reals) LangEnabledBy(Fortran,Wextra)
 Warn about equality comparisons involving REAL or COMPLEX expressions
 
 Wconversion
@@ -235,28 +235,32 @@  Warn about most implicit conversions
 
 Wextra
 Fortran Warning
-Print extra (possibly unwanted) warnings
+; Documented in common
 
 Wfunction-elimination
-Fortran Warning
+Fortran Warning Var(warn_function_elimination)
 Warn about function call elimination
 
 Wimplicit-interface
-Fortran Warning
+Fortran Warning Var(warn_implicit_interface)
 Warn about calls with implicit interface
 
 Wimplicit-procedure
-Fortran Warning
+Fortran Warning Var(warn_implicit_procedure)
 Warn about called procedures not explicitly declared
 
 Wline-truncation
-Fortran Warning
+Fortran Warning Var(warn_line_truncation) LangEnabledBy(Fortran,Wall)
 Warn about truncated source lines
 
 Wintrinsics-std
 Fortran Var(warn_intrinsics_std) Warning LangEnabledBy(Fortran,Wall)
 Warn on intrinsics not part of the selected standard
 
+Wmaybe-uninitialized
+Fortran LangEnabledBy(Fortran,Wall)
+; Documented in common.opt
+
 Wmissing-include-dirs
 Fortran
 ; Documented in C/C++
@@ -274,27 +278,27 @@  Fortran
 ; Documented in common.opt
 
 Wreal-q-constant
-Fortran Warning
+Fortran Warning Var(warn_real_q_constant) LangEnabledBy(Fortran,Wall)
 Warn about real-literal-constants with 'q' exponent-letter
 
 Wrealloc-lhs
-Fortran Warning
+Fortran Warning Var(warn_realloc_lhs) LangEnabledBy(Fortran,Wrealloc-lhs-all)
 Warn when a left-hand-side array variable is reallocated
 
 Wrealloc-lhs-all
-Fortran Warning
+Fortran Warning Var(warn_realloc_lhs_all)
 Warn when a left-hand-side variable is reallocated
 
 Wtarget-lifetime
-Fortran Warning
+Fortran Warning Var(warn_target_lifetime) LangEnabledBy(Fortran,Wall)
 Warn if the pointer in a pointer assignment might outlive its target
 
 Wreturn-type
-Fortran Warning
+Fortran Warning LangEnabledBy(Fortran,Wall)
 ; Documented in C
 
 Wsurprising
-Fortran Warning
+Fortran Warning Var(warn_surprising) LangEnabledBy(Fortran,Wall)
 Warn about \"suspicious\" constructs
 
 Wtabs
@@ -302,19 +306,27 @@  Fortran Warning Var(warn_tabs) LangEnabledBy(Fortran,Wall || Wpedantic)
 Permit nonconforming uses of the tab character
 
 Wunderflow
-Fortran Warning
+Fortran Warning Var(warn_underflow) Init(1)
 Warn about underflow of numerical constant expressions
 
+Wuninitialized
+Fortran LangEnabledBy(Fortran,Wall)
+; Documented in common.opt
+
 Wintrinsic-shadow
-Fortran Warning
+Fortran Warning Var(warn_intrinsic_shadow) LangEnabledBy(Fortran,Wall)
 Warn if a user-procedure has the same name as an intrinsic
 
+Wunused
+LangEnabledBy(Fortran,Wall)
+; Documented in common.opt
+
 Wunused-dummy-argument
-Fortran Warning
+Fortran Warning Var(warn_unused_dummy_argument) LangEnabledBy(Fortran,Wall)
 Warn about unused dummy arguments.
 
 Wzerotrip
-Fortran Warning
+Fortran Warning Var(warn_zerotrip) LangEnabledBy(Fortran,Wall)
 Warn about zero-trip DO loops
 
 cpp
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index d8ba798..af71ded 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -93,23 +93,6 @@  gfc_init_options (unsigned int decoded_options_count,
   gfc_option.dump_fortran_original = 0;
   gfc_option.dump_fortran_optimized = 0;
 
-  gfc_option.warn_aliasing = 0;
-  gfc_option.warn_ampersand = 0;
-  gfc_option.warn_array_temp = 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_align_commons = 1;
-  gfc_option.warn_real_q_constant = 0;
-  gfc_option.warn_unused_dummy_argument = 0;
-  gfc_option.warn_zerotrip = 0;
-  gfc_option.warn_realloc_lhs = 0;
-  gfc_option.warn_realloc_lhs_all = 0;
-  gfc_option.warn_compare_reals = 0;
-  gfc_option.warn_target_lifetime = 0;
   gfc_option.max_errors = 25;
 
   gfc_option.flag_all_intrinsics = 0;
@@ -423,53 +406,18 @@  gfc_post_options (const char **pfilename)
   if (!gfc_option.flag_automatic)
     gfc_option.flag_max_stack_var_size = 0;
   
-  if (pedantic)
-    gfc_option.warn_ampersand = 1;
-
   /* Optimization implies front end optimization, unless the user
      specified it directly.  */
 
   if (gfc_option.flag_frontend_optimize == -1)
     gfc_option.flag_frontend_optimize = optimize;
 
-  if (gfc_option.warn_realloc_lhs_all)
-    gfc_option.warn_realloc_lhs = 1;
-
   gfc_cpp_post_options ();
 
   return gfc_cpp_preprocess_only ();
 }
 
 
-/* Set the options for -Wall.  */
-
-static void
-set_Wall (int setting)
-{
-  gfc_option.warn_aliasing = setting;
-  gfc_option.warn_ampersand = 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_real_q_constant = setting;
-  gfc_option.warn_unused_dummy_argument = setting;
-  gfc_option.warn_target_lifetime = setting;
-  gfc_option.warn_zerotrip = setting;
-
-  warn_return_type = setting;
-  warn_uninitialized = setting;
-  warn_maybe_uninitialized = setting;
-}
-
-/* Set the options for -Wextra.  */
-
-static void
-set_Wextra (int setting)
-{
-  gfc_option.warn_compare_reals = setting;
-}
-
 static void
 gfc_handle_module_path_options (const char *arg)
 {
@@ -630,94 +578,6 @@  gfc_handle_option (size_t scode, const char *arg, int value,
       result = false;
       break;
 
-    case OPT_Wall:
-      handle_generated_option (&global_options, &global_options_set,
-			       OPT_Wunused, NULL, value,
-			       gfc_option_lang_mask (), kind, loc,
-			       handlers, global_dc);
-      set_Wall (value);
-      break;
-
-    case OPT_Waliasing:
-      gfc_option.warn_aliasing = value;
-      break;
-
-    case OPT_Wampersand:
-      gfc_option.warn_ampersand = value;
-      break;
-
-    case OPT_Warray_temporaries:
-      gfc_option.warn_array_temp = value;
-      break;
-
-    case OPT_Wcompare_reals:
-      gfc_option.warn_compare_reals = value;
-      break;
-
-    case OPT_Wextra:
-      set_Wextra (value);
-      break;
-
-    case OPT_Wfunction_elimination:
-      gfc_option.warn_function_elimination = value;
-      break;
-
-    case OPT_Wimplicit_interface:
-      gfc_option.warn_implicit_interface = value;
-      break;
-
-    case OPT_Wimplicit_procedure:
-      gfc_option.warn_implicit_procedure = value;
-      break;
-
-    case OPT_Wline_truncation:
-      gfc_option.warn_line_truncation = value;
-      break;
-
-    case OPT_Wrealloc_lhs:
-      gfc_option.warn_realloc_lhs = value;
-      break;
-
-    case OPT_Wrealloc_lhs_all:
-      gfc_option.warn_realloc_lhs_all = value;
-      break;
-
-    case OPT_Wreturn_type:
-      warn_return_type = value;
-      break;
-
-    case OPT_Wsurprising:
-      gfc_option.warn_surprising = value;
-      break;
-
-    case OPT_Wtarget_lifetime:
-      gfc_option.warn_target_lifetime = value;
-      break;
-
-    case OPT_Wunderflow:
-      gfc_option.warn_underflow = value;
-      break;
-
-    case OPT_Wintrinsic_shadow:
-      gfc_option.warn_intrinsic_shadow = value;
-      break;
-
-    case OPT_Walign_commons:
-      gfc_option.warn_align_commons = value;
-      break;
-
-    case OPT_Wreal_q_constant:
-      gfc_option.warn_real_q_constant = value;
-      break;
-
-    case OPT_Wunused_dummy_argument:
-      gfc_option.warn_unused_dummy_argument = value;
-      break;
-
-    case OPT_Wzerotrip:
-      gfc_option.warn_zerotrip = value;
-      break;
-
     case OPT_fall_intrinsics:
       gfc_option.flag_all_intrinsics = 1;
       break;
@@ -1003,7 +863,7 @@  gfc_handle_option (size_t scode, const char *arg, int value,
       gfc_option.max_continue_fixed = 19;
       gfc_option.max_continue_free = 39;
       gfc_option.max_identifier_length = 31;
-      gfc_option.warn_ampersand = 1;
+      warn_ampersand = 1;
       warn_tabs = 1;
       break;
 
@@ -1012,7 +872,7 @@  gfc_handle_option (size_t scode, const char *arg, int value,
 	| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F2008_OBS;
       gfc_option.warn_std = GFC_STD_F95_OBS;
       gfc_option.max_identifier_length = 63;
-      gfc_option.warn_ampersand = 1;
+      warn_ampersand = 1;
       warn_tabs = 1;
       break;
 
@@ -1021,7 +881,7 @@  gfc_handle_option (size_t scode, const char *arg, int value,
 	| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F2008 | GFC_STD_F2008_OBS;
       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS;
       gfc_option.max_identifier_length = 63;
-      gfc_option.warn_ampersand = 1;
+      warn_ampersand = 1;
       warn_tabs = 1;
       break;
 
@@ -1031,7 +891,7 @@  gfc_handle_option (size_t scode, const char *arg, int value,
 	| GFC_STD_F2008_TS;
       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS;
       gfc_option.max_identifier_length = 63;
-      gfc_option.warn_ampersand = 1;
+      warn_ampersand = 1;
       warn_tabs = 1;
       break;
 
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index bbaa517..a7a26a1 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -557,7 +557,7 @@  match_real_constant (gfc_expr **result, int signflag)
       if (!gfc_notify_std (GFC_STD_GNU, "exponent-letter 'q' in "
 			   "real-literal-constant at %C"))
 	return MATCH_ERROR;
-      else if (gfc_option.warn_real_q_constant)
+      else if (warn_real_q_constant)
 	gfc_warning("Extension: exponent-letter 'q' in real-literal-constant "
 		    "at %C");
     }
@@ -726,7 +726,7 @@  done:
       goto cleanup;
 
     case ARITH_UNDERFLOW:
-      if (gfc_option.warn_underflow)
+      if (warn_underflow)
 	gfc_warning ("Real constant underflows its kind at %C");
       mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
       break;
@@ -951,7 +951,7 @@  static match
 match_string_constant (gfc_expr **result)
 {
   char name[GFC_MAX_SYMBOL_LEN + 1], peek;
-  int i, kind, length, warn_ampersand, ret;
+  int i, kind, length, save_warn_ampersand, ret;
   locus old_locus, start_locus;
   gfc_symbol *sym;
   gfc_expr *e;
@@ -1071,8 +1071,8 @@  got_delim:
 
   /* We disable the warning for the following loop as the warning has already
      been printed in the loop above.  */
-  warn_ampersand = gfc_option.warn_ampersand;
-  gfc_option.warn_ampersand = 0;
+  save_warn_ampersand = warn_ampersand;
+  warn_ampersand = 0;
 
   p = e->value.character.string;
   for (i = 0; i < length; i++)
@@ -1091,7 +1091,7 @@  got_delim:
     }
 
   *p = '\0';	/* TODO: C-style string is for development/debug purposes.  */
-  gfc_option.warn_ampersand = warn_ampersand;
+  warn_ampersand = save_warn_ampersand;
 
   next_string_char (delimiter, &ret);
   if (ret != -1)
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 08bbda4..9d7d3c2 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -1643,7 +1643,7 @@  gfc_resolve_intrinsic (gfc_symbol *sym, locus *loc)
 
   if (isym && !sym->attr.subroutine)
     {
-      if (sym->ts.type != BT_UNKNOWN && gfc_option.warn_surprising
+      if (sym->ts.type != BT_UNKNOWN && warn_surprising
 	  && !sym->attr.implicit_type)
 	gfc_warning ("Type specified for intrinsic function '%s' at %L is"
 		      " ignored", sym->name, &sym->declared_at);
@@ -3571,7 +3571,7 @@  resolve_operator (gfc_expr *e)
 	  e->ts.type = BT_LOGICAL;
 	  e->ts.kind = gfc_default_logical_kind;
 
-	  if (gfc_option.warn_compare_reals)
+	  if (warn_compare_reals)
 	    {
 	      gfc_intrinsic_op op = e->value.op.op;
 
@@ -6331,8 +6331,7 @@  gfc_resolve_iterator (gfc_iterator *iter, bool real_ok, bool own_scope)
 	  sgn = mpfr_sgn (iter->step->value.real);
 	  cmp = mpfr_cmp (iter->end->value.real, iter->start->value.real);
 	}
-      if (gfc_option.warn_zerotrip &&
-	  ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0)))
+      if (warn_zerotrip && ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0)))
 	gfc_warning ("DO loop at %L will be executed zero times"
 		     " (use -Wno-zerotrip to suppress)",
 		     &iter->step->where);
@@ -7709,7 +7708,7 @@  resolve_select (gfc_code *code, bool select_type)
 	      && cp->low != cp->high
 	      && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
 	    {
-	      if (gfc_option.warn_surprising)
+	      if (warn_surprising)
 		gfc_warning ("Range specification at %L can never "
 			     "be matched", &cp->where);
 
@@ -7811,8 +7810,7 @@  resolve_select (gfc_code *code, bool select_type)
 
   /* More than two cases is legal but insane for logical selects.
      Issue a warning for it.  */
-  if (gfc_option.warn_surprising && type == BT_LOGICAL
-      && ncases > 2)
+  if (warn_surprising && type == BT_LOGICAL && ncases > 2)
     gfc_warning ("Logical SELECT CASE block at %L has more that two cases",
 		 &code->loc);
 }
@@ -9182,7 +9180,7 @@  resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
   if (rhs->is_boz && lhs->ts.type != BT_INTEGER)
     {
       int rc;
-      if (gfc_option.warn_surprising)
+      if (warn_surprising)
 	gfc_warning ("BOZ literal at %L is bitwise transferred "
 		     "non-integer symbol '%s'", &code->loc,
 		     lhs->symtree->n.sym->name);
@@ -10483,7 +10481,7 @@  resolve_charlen (gfc_charlen *cl)
      value, the length of character entities declared is zero."  */
   if (cl->length && !gfc_extract_int (cl->length, &i) && i < 0)
     {
-      if (gfc_option.warn_surprising)
+      if (warn_surprising)
 	gfc_warning_now ("CHARACTER variable at %L has negative length %d,"
 			 " the length has been set to zero",
 			 &cl->length->where, i);
@@ -11499,7 +11497,7 @@  gfc_resolve_finalizers (gfc_symbol* derived, bool *finalizable)
 	}
 
       /* Warn if the procedure is non-scalar and not assumed shape.  */
-      if (gfc_option.warn_surprising && arg->as && arg->as->rank != 0
+      if (warn_surprising && arg->as && arg->as->rank != 0
 	  && arg->as->type != AS_ASSUMED_SHAPE)
 	gfc_warning ("Non-scalar FINAL procedure at %L should have assumed"
 		     " shape argument", &arg->declared_at);
@@ -11558,7 +11556,7 @@  error:
   /* Warn if we haven't seen a scalar finalizer procedure (but we know there
      were nodes in the list, must have been for arrays.  It is surely a good
      idea to have a scalar version there if there's something to finalize.  */
-  if (gfc_option.warn_surprising && result && !seen_scalar)
+  if (warn_surprising && result && !seen_scalar)
     gfc_warning ("Only array FINAL procedures declared for derived type '%s'"
 		 " defined at %L, suggest also scalar one",
 		 derived->name, &derived->declared_at);
diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index ec7e8ae..8222b7e 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -1048,7 +1048,7 @@  restart:
 	}
 
       /* Check to see if the continuation line was truncated.  */
-      if (gfc_option.warn_line_truncation && gfc_current_locus.lb != NULL
+      if (warn_line_truncation && gfc_current_locus.lb != NULL
 	  && gfc_current_locus.lb->truncated)
 	{
 	  int maxlen = gfc_option.free_line_length;
@@ -1154,7 +1154,7 @@  restart:
 	  if (in_string)
 	    {
 	      gfc_current_locus.nextc--;
-	      if (gfc_option.warn_ampersand && in_string == INSTRING_WARN)
+	      if (warn_ampersand && in_string == INSTRING_WARN)
 		gfc_warning ("Missing '&' in continued character "
 			     "constant at %C");
 	    }
@@ -1190,7 +1190,7 @@  restart:
 	goto done;
 
       /* Check to see if the continuation line was truncated.  */
-      if (gfc_option.warn_line_truncation && gfc_current_locus.lb != NULL
+      if (warn_line_truncation && gfc_current_locus.lb != NULL
 	  && gfc_current_locus.lb->truncated)
 	{
 	  gfc_current_locus.lb->truncated = 0;
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 3a73867..7ccabc7 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -715,8 +715,7 @@  simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
       return &gfc_bad_expr;
     }
 
-  if (ascii && gfc_option.warn_surprising
-      && mpz_cmp_si (e->value.integer, 127) > 0)
+  if (ascii && warn_surprising && mpz_cmp_si (e->value.integer, 127) > 0)
     gfc_warning ("Argument of %s function at %L outside of range [0,127]",
 		 name, &e->where);
 
@@ -2505,7 +2504,7 @@  gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
 
   index = e->value.character.string[0];
 
-  if (gfc_option.warn_surprising && index > 127)
+  if (warn_surprising && index > 127)
     gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
 		 &e->where);
 
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index a70aa07..47364da 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -1041,7 +1041,7 @@  gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_ss * ss,
   gcc_assert (ss->dimen > 0);
   gcc_assert (ss->loop->dimen == ss->dimen);
 
-  if (gfc_option.warn_array_temp && where)
+  if (warn_array_temporaries && where)
     gfc_warning ("Creating array temporary at %L", where);
 
   /* Set the lower bound to zero.  */
@@ -5921,7 +5921,7 @@  gfc_trans_dummy_array_bias (gfc_symbol * sym, tree tmpdesc,
 
       stride = gfc_index_one_node;
 
-      if (gfc_option.warn_array_temp)
+      if (warn_array_temporaries)
 	gfc_warning ("Creating array temporary at %L", &loc);
     }
 
@@ -7202,7 +7202,7 @@  gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
 	}
 
       /* Repack the array.  */
-      if (gfc_option.warn_array_temp)
+      if (warn_array_temporaries)
 	{
 	  if (fsym)
 	    gfc_warning ("Creating array temporary at %L for argument '%s'",
diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
index 0620341..0b4f5e6 100644
--- a/gcc/fortran/trans-common.c
+++ b/gcc/fortran/trans-common.c
@@ -1133,7 +1133,7 @@  translate_common (gfc_common_head *common, gfc_symbol *var_list)
 	      /* The required offset conflicts with previous alignment
 		 requirements.  Insert padding immediately before this
 		 segment.  */
-	      if (gfc_option.warn_align_commons)
+	      if (warn_align_commons)
 		{
 		  if (strcmp (common->name, BLANK_COMMON_NAME))
 		    gfc_warning ("Padding of %d bytes required before '%s' in "
@@ -1167,7 +1167,7 @@  translate_common (gfc_common_head *common, gfc_symbol *var_list)
       return;
     }
 
-  if (common_segment->offset != 0 && gfc_option.warn_align_commons)
+  if (common_segment->offset != 0 && warn_align_commons)
     {
       if (strcmp (common->name, BLANK_COMMON_NAME))
 	gfc_warning ("COMMON '%s' at %L requires %d bytes of padding; "
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index eefd9bc..713f969 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -4989,8 +4989,7 @@  generate_local_decl (gfc_symbol * sym)
       else if (sym->attr.dummy && !sym->attr.in_namelist)
 	{
 	  /* INTENT(out) dummy arguments are likely meant to be set.  */
-	  if (gfc_option.warn_unused_dummy_argument
-	      && sym->attr.intent == INTENT_OUT)
+	  if (warn_unused_dummy_argument && sym->attr.intent == INTENT_OUT)
 	    {
 	      if (sym->ts.type != BT_DERIVED)
 		gfc_warning ("Dummy argument '%s' at %L was declared "
@@ -5005,7 +5004,7 @@  generate_local_decl (gfc_symbol * sym)
 	      if (sym->backend_decl != NULL_TREE)
 		TREE_NO_WARNING(sym->backend_decl) = 1;
 	    }
-	  else if (gfc_option.warn_unused_dummy_argument)
+	  else if (warn_unused_dummy_argument)
 	    {
 	      gfc_warning ("Unused dummy argument '%s' at %L", sym->name,
 			 &sym->declared_at);
@@ -5121,7 +5120,7 @@  generate_local_decl (gfc_symbol * sym)
 	{
 	  if (!sym->attr.referenced)
 	    {
-	      if (gfc_option.warn_unused_dummy_argument)
+	      if (warn_unused_dummy_argument)
 		gfc_warning ("Unused dummy argument '%s' at %L", sym->name,
 			     &sym->declared_at);
 	    }
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index af7e8cf..f8e4df8 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -1111,11 +1111,10 @@  assign:
 static void
 realloc_lhs_warning (bt type, bool array, locus *where)
 {
-  if (array && type != BT_CLASS && type != BT_DERIVED
-      && gfc_option.warn_realloc_lhs)
+  if (array && type != BT_CLASS && type != BT_DERIVED && warn_realloc_lhs)
     gfc_warning ("Code for reallocating the allocatable array at %L will "
 		 "be added", where);
-  else if (gfc_option.warn_realloc_lhs_all)
+  else if (warn_realloc_lhs_all)
     gfc_warning ("Code for reallocating the allocatable variable at %L "
 		 "will be added", where);
 }
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 6bf1f74..c13502e 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -6146,7 +6146,7 @@  gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr)
 	{
 	  tmp = gfc_build_addr_expr (NULL_TREE, argse.expr);
 
-	  if (gfc_option.warn_array_temp)
+	  if (warn_array_temporaries)
 	    gfc_warning ("Creating array temporary at %L", &expr->where);
 
 	  source = build_call_expr_loc (input_location,