Index: gcc/opts.c
===================================================================
--- gcc/opts.c	(revision 187096)
+++ gcc/opts.c	(working copy)
@@ -815,29 +815,18 @@
                            opts->x_param_values, opts_set->x_param_values);
 
   /* This replaces set_Wunused.  */
-  if (opts->x_warn_unused_function == -1)
-    opts->x_warn_unused_function = opts->x_warn_unused;
-  if (opts->x_warn_unused_label == -1)
-    opts->x_warn_unused_label = opts->x_warn_unused;
   /* Wunused-parameter is enabled if both -Wunused -Wextra are enabled.  */
   if (opts->x_warn_unused_parameter == -1)
     opts->x_warn_unused_parameter = (opts->x_warn_unused
 				     && opts->x_extra_warnings);
-  if (opts->x_warn_unused_variable == -1)
-    opts->x_warn_unused_variable = opts->x_warn_unused;
   /* Wunused-but-set-parameter is enabled if both -Wunused -Wextra are
      enabled.  */
   if (opts->x_warn_unused_but_set_parameter == -1)
     opts->x_warn_unused_but_set_parameter = (opts->x_warn_unused
 					     && opts->x_extra_warnings);
-  if (opts->x_warn_unused_but_set_variable == -1)
-    opts->x_warn_unused_but_set_variable = opts->x_warn_unused;
-  if (opts->x_warn_unused_value == -1)
-    opts->x_warn_unused_value = opts->x_warn_unused;
-
-  /* This replaces set_Wextra.  */
-  if (opts->x_warn_uninitialized == -1)
-    opts->x_warn_uninitialized = opts->x_extra_warnings;
+  /* This is an auto-generated function. It should do most of the
+     above in the future.  */
+  finish_options_generated (opts);
 }
 
 #define LEFT_COLUMN	27
Index: gcc/optc-gen.awk
===================================================================
--- gcc/optc-gen.awk	(revision 187096)
+++ gcc/optc-gen.awk	(working copy)
@@ -324,4 +324,25 @@
 
 print "};"
 
+print "\n\n"
+print "void finish_options_generated(struct gcc_options *opts)\n{"
+for (i = 0; i < n_opts; i++) {
+    opt_var_name = var_name(flags[i])
+    enabledby_arg = opt_args("EnabledBy", flags[i])
+    for (j = 0; nth_arg(j, enabledby_arg) != ""; j++) {
+        enabledby_name = nth_arg(j, enabledby_arg);
+        enabledby_index = find_flags_by_name(enabledby_name, opts, n_opts);
+        if (enabledby_index == "-1") {
+            print "#error Enabledby: " enabledby_name 
+        } else {
+            enabledby_var_name = var_name(flags[enabledby_index])
+            print "   /* " opts[i] " is enabled by " enabledby_name ".  */"
+            print "   if (opts->x_" opt_var_name " == -1)"
+            print "   {"
+            print "     opts->x_" opt_var_name " = opts->x_" enabledby_var_name ";"
+            print "   }"
+        }
+    }
 }
+print "}"
+}
Index: gcc/opth-gen.awk
===================================================================
--- gcc/opth-gen.awk	(revision 187096)
+++ gcc/opth-gen.awk	(working copy)
@@ -293,6 +293,8 @@
 print "";
 print "/* Print target option variables from a structure.  */";
 print "extern void cl_target_option_print (FILE *, int, struct cl_target_option *);";
+print "";
+print "void finish_options_generated(struct gcc_options *opts);";
 print "#endif";
 print "";
 
Index: gcc/common.opt
===================================================================
--- gcc/common.opt	(revision 187096)
+++ gcc/common.opt	(working copy)
@@ -650,7 +650,7 @@
 Warn if a comparison is always true or always false due to the limited range of the data type
 
 Wuninitialized
-Common Var(warn_uninitialized) Init(-1) Warning
+Common Var(warn_uninitialized) Init(-1) Warning EnabledBy(Wextra)
 Warn about uninitialized automatic variables
 
 Wmaybe-uninitialized
@@ -670,15 +670,15 @@
 Warn when a function parameter is only set, otherwise unused
 
 Wunused-but-set-variable
-Common Var(warn_unused_but_set_variable) Init(-1) Warning
+Common Var(warn_unused_but_set_variable) Init(-1) Warning EnabledBy(Wunused)
 Warn when a variable is only set, otherwise unused
 
 Wunused-function
-Common Var(warn_unused_function) Init(-1) Warning
+Common Var(warn_unused_function) Init(-1) Warning EnabledBy(Wunused)
 Warn when a function is unused
 
 Wunused-label
-Common Var(warn_unused_label) Init(-1) Warning
+Common Var(warn_unused_label) Init(-1) Warning EnabledBy(Wunused)
 Warn when a label is unused
 
 Wunused-parameter
@@ -686,11 +686,11 @@
 Warn when a function parameter is unused
 
 Wunused-value
-Common Var(warn_unused_value) Init(-1) Warning
+Common Var(warn_unused_value) Init(-1) Warning EnabledBy(Wunused)
 Warn when an expression value is unused
 
 Wunused-variable
-Common Var(warn_unused_variable) Init(-1) Warning
+Common Var(warn_unused_variable) Init(-1) Warning EnabledBy(Wunused)
 Warn when a variable is unused
 
 Wcoverage-mismatch
Index: gcc/opt-functions.awk
===================================================================
--- gcc/opt-functions.awk	(revision 187096)
+++ gcc/opt-functions.awk	(working copy)
@@ -287,3 +287,11 @@
 {
 	return "OPT_" opt_sanitized_name(name)
 }
+
+function find_flags_by_name (name, opts, n_opts)
+{
+    for (k = 0; k < n_opts; k++) {
+        if (opts[k] == name) return k
+    }
+    return "-1"
+}
\ No newline at end of file
