re PR driver/44076 (-MT <target> behaves different as -MT<target> (w/o space))
authorJoseph Myers <joseph@codesourcery.com>
Thu, 2 Sep 2010 11:41:22 +0000 (12:41 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Thu, 2 Sep 2010 11:41:22 +0000 (12:41 +0100)
PR driver/44076
* opts.h (struct cl_option): Add alias_arg, neg_alias_arg and
alias_target fields.
* opt-functions.awk (opt_sanitized_name): Don't handle
finline-limit=, Wlarger-than= and ftemplate-depth= specially.
* optc-gen.awk: Generate alias fields.
* opth-gen.awk: Explicitly give values for OPT_* enum constants.
Don't generate such constants for aliases.
* opts-common.c (generate_canonical_option): New.
(decode_cmdline_option): Handle aliases.  Use
generate_canonical_option for known options instead of copying the
input option text.
* doc/options.texi (Alias): Document.
* common.opt (W, Wlarger-than-, aux-info=, finline-limit-,
fstack-check, specs): Mark as aliases.
* gcc.c (driver_handle_option): Canonicalize -L options to joined
arguments.
(driver_handle_option): Don't handle OPT_specs.
* opts.c (common_handle_option): Don't handle options marked as
aliases.
(enable_warning_as_error): Handle aliases.
* stor-layout.c (layout_decl): Use OPT_Wlarger_than_ instead of
OPT_Wlarger_than_eq.
* tree-optimize.c (tree_rest_of_compilation): Use
OPT_Wlarger_than_ instead of OPT_Wlarger_than_eq.

c-family:
* c.opt (Wcomments, Werror-implicit-function-declaration,
ftemplate-depth-, std=c89, std=c9x, std=gnu89, std=gnu9x,
std=iso9899:1990, std=iso9899:1999, std=iso9899:199x): Mark as
aliases.
* c-common.c (option_codes): Use OPT_Wcomment instead of
OPT_Wcomments.
* c-opts.c (warning_as_error_callback, c_common_handle_option):
Don't handle options marked as aliases.

java:
* lang.opt (CLASSPATH, bootclasspath, classpath, encoding,
fCLASSPATH=): Mark as Java options and as aliases.
* jvspec.c (jvgenmain_spec): Don't handle -fCLASSPATH*.
(lang_specific_driver): Don't handle options marked as aliases.
* lang.c (java_handle_option): Don't handle OPT_fCLASSPATH_.

testsuite:
* gcc.dg/cpp/warn-comments-3.c: New.  Based on warn-comments-2.c
but using -Werror=comment.
* gcc.dg/cpp/warn-comments.c, gcc.dg/cpp/warn-comments-2.c: Adjust
expected error messages.

From-SVN: r163770

24 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c-family/c-opts.c
gcc/c-family/c.opt
gcc/common.opt
gcc/doc/options.texi
gcc/gcc.c
gcc/java/ChangeLog
gcc/java/jvspec.c
gcc/java/lang.c
gcc/java/lang.opt
gcc/opt-functions.awk
gcc/optc-gen.awk
gcc/opth-gen.awk
gcc/opts-common.c
gcc/opts.c
gcc/opts.h
gcc/stor-layout.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/warn-comments-2.c
gcc/testsuite/gcc.dg/cpp/warn-comments-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/warn-comments.c
gcc/tree-optimize.c

index 41ceb7b79b1854828d0b74c8997a7fa6185bc74d..3baa67ace2574569c7343b8a5b6c04b8d48c85d8 100644 (file)
@@ -1,3 +1,31 @@
+2010-09-02  Joseph Myers  <joseph@codesourcery.com>
+
+       PR driver/44076
+       * opts.h (struct cl_option): Add alias_arg, neg_alias_arg and
+       alias_target fields.
+       * opt-functions.awk (opt_sanitized_name): Don't handle
+       finline-limit=, Wlarger-than= and ftemplate-depth= specially.
+       * optc-gen.awk: Generate alias fields.
+       * opth-gen.awk: Explicitly give values for OPT_* enum constants.
+       Don't generate such constants for aliases.
+       * opts-common.c (generate_canonical_option): New.
+       (decode_cmdline_option): Handle aliases.  Use
+       generate_canonical_option for known options instead of copying the
+       input option text.
+       * doc/options.texi (Alias): Document.
+       * common.opt (W, Wlarger-than-, aux-info=, finline-limit-,
+       fstack-check, specs): Mark as aliases.
+       * gcc.c (driver_handle_option): Canonicalize -L options to joined
+       arguments.
+       (driver_handle_option): Don't handle OPT_specs.
+       * opts.c (common_handle_option): Don't handle options marked as
+       aliases.
+       (enable_warning_as_error): Handle aliases.
+       * stor-layout.c (layout_decl): Use OPT_Wlarger_than_ instead of
+       OPT_Wlarger_than_eq.
+       * tree-optimize.c (tree_rest_of_compilation): Use
+       OPT_Wlarger_than_ instead of OPT_Wlarger_than_eq.
+
 2010-09-02  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (nonmemory_operand): New mode attribute.
index 165ec2032b5474d0f3a5da0a96c293c45eec3a64..dac0bf4684eca1f401a8eda649ad2e52dca8c3a3 100644 (file)
@@ -1,3 +1,14 @@
+2010-09-02  Joseph Myers  <joseph@codesourcery.com>
+
+       * c.opt (Wcomments, Werror-implicit-function-declaration,
+       ftemplate-depth-, std=c89, std=c9x, std=gnu89, std=gnu9x,
+       std=iso9899:1990, std=iso9899:1999, std=iso9899:199x): Mark as
+       aliases.
+       * c-common.c (option_codes): Use OPT_Wcomment instead of
+       OPT_Wcomments.
+       * c-opts.c (warning_as_error_callback, c_common_handle_option):
+       Don't handle options marked as aliases.
+
 2010-08-25  Richard Guenther  <rguenther@suse.de>
 
        * c-common.c (c_common_get_alias_set): Remove special
index 3a79968b202af354363658556df407d1b728e979..6b9a9676af037abbe72e1b2ce38c11bab07e83a2 100644 (file)
@@ -8150,7 +8150,7 @@ struct reason_option_codes_t
 
 static const struct reason_option_codes_t option_codes[] = {
   {CPP_W_DEPRECATED,                   OPT_Wdeprecated},
-  {CPP_W_COMMENTS,                     OPT_Wcomments},
+  {CPP_W_COMMENTS,                     OPT_Wcomment},
   {CPP_W_TRIGRAPHS,                    OPT_Wtrigraphs},
   {CPP_W_MULTICHAR,                    OPT_Wmultichar},
   {CPP_W_TRADITIONAL,                  OPT_Wtraditional},
index b46b0a04908ff505ffb66581d2af9ded8698e093..d9b212c4e2b2e0353e91c9df3a681f42da99290c 100644 (file)
@@ -161,7 +161,6 @@ warning_as_error_callback (int option_index)
        break;
 
       case OPT_Wcomment:
-      case OPT_Wcomments:
        cpp_opts->warn_comments = 1;
        break;
 
@@ -493,7 +492,6 @@ c_common_handle_option (size_t scode, const char *arg, int value,
       break;
 
     case OPT_Wcomment:
-    case OPT_Wcomments:
       cpp_opts->warn_comments = value;
       break;
 
@@ -521,13 +519,6 @@ c_common_handle_option (size_t scode, const char *arg, int value,
       global_dc->warning_as_error_requested = value;
       break;
 
-    case OPT_Werror_implicit_function_declaration:
-      /* For backward compatibility, this is the same as
-        -Werror=implicit-function-declaration.  */
-      enable_warning_as_error ("implicit-function-declaration", value,
-                              CL_C | CL_ObjC, handlers);
-      break;
-
     case OPT_Wformat:
       set_Wformat (value);
       break;
@@ -752,8 +743,6 @@ c_common_handle_option (size_t scode, const char *arg, int value,
       break;
 
     case OPT_ftemplate_depth_:
-      /* Kept for backwards compatibility.  */
-    case OPT_ftemplate_depth_eq:
       max_tinst_depth = value;
       break;
 
@@ -865,30 +854,23 @@ c_common_handle_option (size_t scode, const char *arg, int value,
        set_std_cxx0x (code == OPT_std_c__0x /* ISO */);
       break;
 
-    case OPT_std_c89:
     case OPT_std_c90:
-    case OPT_std_iso9899_1990:
     case OPT_std_iso9899_199409:
       if (!preprocessing_asm_p)
        set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
       break;
 
-    case OPT_std_gnu89:
     case OPT_std_gnu90:
       if (!preprocessing_asm_p)
        set_std_c89 (false /* c94 */, false /* ISO */);
       break;
 
     case OPT_std_c99:
-    case OPT_std_c9x:
-    case OPT_std_iso9899_1999:
-    case OPT_std_iso9899_199x:
       if (!preprocessing_asm_p)
        set_std_c99 (true /* ISO */);
       break;
 
     case OPT_std_gnu99:
-    case OPT_std_gnu9x:
       if (!preprocessing_asm_p)
        set_std_c99 (false /* ISO */);
       break;
index 05fedd66f027c55d683d02af364fe120be0f3342..5cba0ded57a7b74a5c73b165d7c2b5148b6c0b85 100644 (file)
@@ -164,7 +164,7 @@ C ObjC C++ ObjC++ Warning
 Warn about possibly nested block comments, and C++ comments spanning more than one physical line
 
 Wcomments
-C ObjC C++ ObjC++ Warning
+C ObjC C++ ObjC++ Warning Alias(Wcomment)
 Synonym for -Wcomment
 
 Wconversion
@@ -216,7 +216,7 @@ C ObjC C++ ObjC++
 ; Documented in common.opt
 
 Werror-implicit-function-declaration
-C ObjC RejectNegative Warning
+C ObjC RejectNegative Warning Alias(Werror=, implicit-function-declaration)
 This switch is deprecated; use -Werror=implicit-function-declaration instead
 
 Wfloat-equal
@@ -804,7 +804,7 @@ C ObjC C++ ObjC++ Joined RejectNegative UInteger
 -ftabstop=<number>     Distance between tab stops for column reporting
 
 ftemplate-depth-
-C++ ObjC++ Joined RejectNegative UInteger Undocumented
+C++ ObjC++ Joined RejectNegative Undocumented Alias(ftemplate-depth=)
 
 ftemplate-depth=
 C++ ObjC++ Joined RejectNegative UInteger
@@ -972,7 +972,7 @@ C ObjC
 Conform to the ISO 201X C standard draft (experimental and incomplete support)
 
 std=c89
-C ObjC
+C ObjC Alias(std=c90)
 Conform to the ISO 1990 C standard
 
 std=c90
@@ -984,7 +984,7 @@ C ObjC
 Conform to the ISO 1999 C standard
 
 std=c9x
-C ObjC
+C ObjC Alias(std=c99)
 Deprecated in favor of -std=c99
 
 std=gnu++98
@@ -1003,7 +1003,7 @@ C ObjC
 Conform to the ISO 201X C standard draft with GNU extensions (experimental and incomplete support)
 
 std=gnu89
-C ObjC
+C ObjC Alias(std=gnu90)
 Conform to the ISO 1990 C standard with GNU extensions
 
 std=gnu90
@@ -1015,11 +1015,11 @@ C ObjC
 Conform to the ISO 1999 C standard with GNU extensions
 
 std=gnu9x
-C ObjC
+C ObjC Alias(std=gnu99)
 Deprecated in favor of -std=gnu99
 
 std=iso9899:1990
-C ObjC
+C ObjC Alias(std=c90)
 Conform to the ISO 1990 C standard
 
 std=iso9899:199409
@@ -1027,11 +1027,11 @@ C ObjC
 Conform to the ISO 1990 C standard as amended in 1994
 
 std=iso9899:1999
-C ObjC
+C ObjC Alias(std=c99)
 Conform to the ISO 1999 C standard
 
 std=iso9899:199x
-C ObjC
+C ObjC Alias(std=c99)
 Deprecated in favor of -std=iso9899:1999
 
 traditional-cpp
index 2147be83e64dd87d8463dacaf9e6e8d100220a76..d30e41c86515e0dcad94a2b0628cd3325b358942 100644 (file)
@@ -88,7 +88,7 @@ S
 Driver
 
 W
-Common RejectNegative Var(extra_warnings) Warning
+Common RejectNegative Warning Alias(Wextra)
 This switch is deprecated; use -Wextra instead
 
 Wa,
@@ -153,7 +153,7 @@ Common Var(warn_inline) Warning
 Warn when an inlined function cannot be inlined
 
 Wlarger-than-
-Common RejectNegative Joined UInteger Warning Undocumented
+Common RejectNegative Joined Warning Undocumented Alias(Wlarger-than=)
 
 Wlarger-than=
 Common RejectNegative Joined UInteger Warning
@@ -301,7 +301,7 @@ Common Separate
 -aux-info <file>       Emit declaration information into <file>
 
 aux-info=
-Common Joined
+Common Joined Alias(aux-info)
 
 auxbase
 Common Separate RejectDriver
@@ -750,7 +750,7 @@ Common Report Var(flag_inline_functions_called_once) Init(1) Optimization
 Integrate functions called once into their callers
 
 finline-limit-
-Common RejectNegative Joined UInteger
+Common RejectNegative Joined Alias(finline-limit=)
 
 finline-limit=
 Common RejectNegative Joined UInteger
@@ -1259,7 +1259,7 @@ Common Report RejectNegative Joined
 -fstack-check=[no|generic|specific]    Insert stack checking code into the program
 
 fstack-check
-Common Report
+Common Alias(fstack-check=, specific, no)
 Insert stack checking code into the program.  Same as -fstack-check=specific
 
 fstack-limit
@@ -1755,7 +1755,7 @@ shared-libgcc
 Driver
 
 specs
-Driver Separate
+Driver Separate Alias(specs=)
 
 specs=
 Driver Joined
index aac638bd1feac98e854353cca03fefdead94fc2e..46610f03ad5f9b500bc632cd0e5601bb61bf2840 100644 (file)
@@ -247,6 +247,32 @@ The main purpose of this property is to support synonymous options.
 The first option should use @samp{Mask(@var{name})} and the others
 should use @samp{Mask(@var{name}) MaskExists}.
 
+@item Alias(@var{opt})
+@itemx Alias(@var{opt}, @var{arg})
+@itemx Alias(@var{opt}, @var{posarg}, @var{negarg})
+The option is an alias for @option{-@var{opt}}.  In the first form,
+any argument passed to the alias is considered to be passed to
+@option{-@var{opt}}, and @option{-@var{opt}} is considered to be
+negated if the alias is used in negated form.  In the second form, the
+alias may not be negated or have an argument, and @var{posarg} is
+considered to be passed as an argument to @option{-@var{opt}}.  In the
+third form, the alias may not have an argument, if the alias is used
+in the positive form then @var{posarg} is considered to be passed to
+@option{-@var{opt}}, and if the alias is used in the negative form
+then @var{negarg} is considered to be passed to @option{-@var{opt}}.
+
+Aliases should not specify @code{Var} or @code{Mask} or
+@code{UInteger}.  Aliases should normally specify the same languages
+as the target of the alias; the flags on the target will be used to
+determine any diagnostic for use of an option for the wrong language,
+while those on the alias will be used to identify what command-line
+text is the option and what text is any argument to that option.
+
+When an @code{Alias} definition is used for an option, driver specs do
+not need to handle it and no @samp{OPT_} enumeration value is defined
+for it; only the canonical form of the option will be seen in those
+places.
+
 @item Report
 The state of the option should be printed by @option{-fverbose-asm}.
 
index ea49ec748e64edda784113851647f21aee1fdb91..61afb74224f1bf4a1630a61211f054b85f94c06a 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -3742,6 +3742,12 @@ driver_handle_option (const struct cl_decoded_option *decoded,
       do_save = false;
       break;
 
+    case OPT_L:
+      /* Similarly, canonicalize -L for linkers that may not accept
+        separate arguments.  */
+      save_switch (concat ("-L", arg, NULL), 0, NULL, validated);
+      return true;
+
     case OPT_save_temps:
       save_temps_flag = SAVE_TEMPS_CWD;
       validated = true;
@@ -3772,7 +3778,6 @@ driver_handle_option (const struct cl_decoded_option *decoded,
         processing.  */
       break;
 
-    case OPT_specs:
     case OPT_specs_:
       {
        struct user_specs *user = XNEW (struct user_specs);
index ca9a8d27857587a97d6e29a3887f20d6bce626ee..f6022e055b379ebd5c8126bb0167706774e33f6a 100644 (file)
@@ -1,3 +1,11 @@
+2010-09-02  Joseph Myers  <joseph@codesourcery.com>
+
+       * lang.opt (CLASSPATH, bootclasspath, classpath, encoding,
+       fCLASSPATH=): Mark as Java options and as aliases.
+       * jvspec.c (jvgenmain_spec): Don't handle -fCLASSPATH*.
+       (lang_specific_driver): Don't handle options marked as aliases.
+       * lang.c (java_handle_option): Don't handle OPT_fCLASSPATH_.
+
 2010-08-22  Joseph Myers  <joseph@codesourcery.com>
 
        * Make-lang.in (jvspec.o): Update dependencies.
index cb8c1469ea7befe920e542145290dae585c15bd4..792dda0dad5e2065fd70f00c66d55f6ffd3ea7b5 100644 (file)
@@ -69,7 +69,7 @@ static const char jvgenmain_spec[] =
                   %<fuse-boehm-gc %<fhash-synchronization %<fjni\
                   %<findirect-dispatch %<fnew-verifier\
                   %<fno-store-check %<foutput-class-dir\
-                  %<fclasspath* %<fCLASSPATH* %<fbootclasspath*\
+                  %<fclasspath* %<fbootclasspath*\
                   %<fextdirs*\
                   %<fuse-divide-subroutine %<fno-use-divide-subroutine\
                   %<fuse-atomic-builtins %<fno-use-atomic-builtins\
@@ -299,10 +299,8 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
          saw_o = 1;
          break;
 
-       case OPT_classpath:
-       case OPT_bootclasspath:
-       case OPT_CLASSPATH:
-       case OPT_encoding:
+       case OPT_fclasspath_:
+       case OPT_fbootclasspath_:
        case OPT_extdirs:
          added -= 1;
          break;
@@ -514,15 +512,11 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
          --j;
          continue;
 
-       case OPT_classpath:
-       case OPT_CLASSPATH:
-       case OPT_fCLASSPATH_:
        case OPT_fclasspath_:
          jcf_path_classpath_arg (decoded_options[i].arg);
          --j;
          continue;
 
-       case OPT_bootclasspath:
        case OPT_fbootclasspath_:
          jcf_path_bootclasspath_arg (decoded_options[i].arg);
          --j;
@@ -533,11 +527,6 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
          --j;
          continue;
 
-       case OPT_encoding:
-         generate_option (OPT_fencoding_, decoded_options[i].arg, 1,
-                          CL_DRIVER, &new_decoded_options[j]);
-         continue;
-
        case OPT_L:
          if (spec_file == NULL)
            spec_file = find_spec_file (decoded_options[i].arg);
index 06edd5ee6f38ca159d1ef2454e6a4958e3b3ea98..1633c02194b389cc445dc6dadf37b12a8f9a264f 100644 (file)
@@ -261,7 +261,6 @@ java_handle_option (size_t scode, const char *arg, int value,
 
     case OPT_faux_classpath:
     case OPT_fclasspath_:
-    case OPT_fCLASSPATH_:
       jcf_path_classpath_arg (arg);
       break;
 
index 3d6e902f622bcd9399cfa99c42b658559d780c6b..af1dff1c0f46769b52a0e3ea3437544b3f2962be 100644 (file)
@@ -29,7 +29,7 @@ Driver
 ; Java driver option in fact distinct from C-family option with the same name.
 
 CLASSPATH
-Driver Separate
+Java Separate Alias(fclasspath=)
 
 D
 Driver Joined Separate
@@ -88,19 +88,19 @@ Java Var(flag_redundant)
 Warn if modifiers are specified when not necessary
 
 bootclasspath
-Driver Separate
+Java Separate Alias(fbootclasspath=)
 
 classpath
-Driver Separate
+Java Separate Alias(fclasspath=)
 
 encoding
-Driver Separate
+Java Separate Alias(fencoding=)
 
 extdirs
 Driver Separate
 
 fCLASSPATH=
-Java JoinedOrMissing RejectNegative
+Java JoinedOrMissing RejectNegative Alias(fclasspath=)
 --CLASSPATH    Deprecated; use --classpath instead
 
 faux-classpath
index 01a06e84f56d06caa8467c76a93ee860fa3a2a92..c57a7694de319828b09ffcb8eb192e1ab67a8ba6 100644 (file)
@@ -201,9 +201,6 @@ function var_ref(name, flags)
 # Given the option called NAME return a sanitized version of its name.
 function opt_sanitized_name(name)
 {
-       if (name == "finline-limit=" || name == "Wlarger-than=" \
-           || name == "ftemplate-depth=")
-               name = name "eq"
        if (name == "gdwarf+")
                name = "gdwarfplus"
        gsub ("[^A-Za-z0-9]", "_", name)
index d0a07f8a5d3f3ea37bb296d2ca686fa5c601044d..4376d72dedd4bc1c9023c111e93f76ef634de61e 100644 (file)
@@ -201,6 +201,36 @@ for (i = 0; i < n_opts; i++) {
        else
                missing_arg_error = quote missing_arg_error quote
 
+       alias_arg = opt_args("Alias", flags[i])
+       if (alias_arg == "") {
+               alias_data = "NULL, NULL, N_OPTS"
+       } else {
+               alias_opt = nth_arg(0, alias_arg)
+               alias_posarg = nth_arg(1, alias_arg)
+               alias_negarg = nth_arg(2, alias_arg)
+
+               if (var_ref(opts[i], flags[i]) != "0")
+                       print "#error Alias setting variable"
+
+               if (alias_posarg != "" && alias_negarg == "") {
+                       if (!flag_set_p("RejectNegative", flags[i]) \
+                           && opts[i] ~ "^[Wfm]")
+                               print "#error Alias with single argument " \
+                                       "allowing negative form"
+               }
+
+               alias_opt = opt_enum(alias_opt)
+               if (alias_posarg == "")
+                       alias_posarg = "NULL"
+               else
+                       alias_posarg = quote alias_posarg quote
+               if (alias_negarg == "")
+                       alias_negarg = "NULL"
+               else
+                       alias_negarg = quote alias_negarg quote
+               alias_data = alias_posarg ", " alias_negarg ", " alias_opt
+       }
+
        neg = opt_args("Negative", flags[i]);
        if (neg != "")
                idx = indices[neg]
@@ -216,9 +246,9 @@ for (i = 0; i < n_opts; i++) {
        }
        # Split the printf after %u to work around an ia64-hp-hpux11.23
        # awk bug.
-       printf("  { %c-%s%c,\n    %s,\n    %s,\n    %s, %u,",
+       printf("  { %c-%s%c,\n    %s,\n    %s,\n    %s, %s, %u,",
               quote, opts[i], quote, hlp, missing_arg_error,
-              back_chain[i], len)
+              alias_data, back_chain[i], len)
        printf(" %d,\n", idx)
        condition = opt_args("Condition", flags[i])
        cl_flags = switch_flags(flags[i])
index 19af0ef0f0c6bd9c69be6fa357c818c8e46d9e91..cfeccfe47aad9d40061025e01fb0fe7f77713d5d 100644 (file)
@@ -321,6 +321,7 @@ print "{"
 for (i = 0; i < n_opts; i++)
        back_chain[i] = "N_OPTS";
 
+enum_value = 0
 for (i = 0; i < n_opts; i++) {
        # Combine the flags of identical switches.  Switches
        # appear many times if they are handled by many front
@@ -332,6 +333,12 @@ for (i = 0; i < n_opts; i++) {
 
        len = length (opts[i]);
        enum = opt_enum(opts[i])
+       enum_string = enum " = " enum_value ","
+
+       # Aliases do not get enumeration names.
+       if (flag_set_p("Alias.*", flags[i])) {
+               enum_string = "/* " enum_string " */"
+       }
 
        # If this switch takes joined arguments, back-chain all
        # subsequent switches to it for which it is a prefix.  If
@@ -346,7 +353,8 @@ for (i = 0; i < n_opts; i++) {
                }
        }
 
-       s = substr("                                         ", length (enum))
+       s = substr("                                          ",
+                  length (enum_string))
        if (i + 1 == n_opts)
                comma = ""
 
@@ -355,7 +363,8 @@ for (i = 0; i < n_opts; i++) {
        else
                hlp = "N_(\"" help[i] "\")";
 
-       print "  " enum "," s "/* -" opts[i] " */"
+       print "  " enum_string s "/* -" opts[i] " */"
+       enum_value++
 }
 
 print "  N_OPTS,"
index 871e4662d3b91af3a748018a94adfe58f7669f14..07758967e6d6e7c86ac33825cc1808685e08afdb 100644 (file)
@@ -144,6 +144,58 @@ option_ok_for_language (const struct cl_option *option,
   return true;
 }
 
+
+/* Fill in the canonical option part of *DECODED with an option
+   described by OPT_INDEX, ARG and VALUE.  */
+
+static void
+generate_canonical_option (size_t opt_index, const char *arg, int value,
+                          struct cl_decoded_option *decoded)
+{
+  const struct cl_option *option = &cl_options[opt_index];
+  const char *opt_text = option->opt_text;
+
+  if (value == 0
+      && !(option->flags & CL_REJECT_NEGATIVE)
+      && (opt_text[1] == 'W' || opt_text[1] == 'f' || opt_text[1] == 'm'))
+    {
+      char *t = XNEWVEC (char, option->opt_len + 5);
+      t[0] = '-';
+      t[1] = opt_text[1];
+      t[2] = 'n';
+      t[3] = 'o';
+      t[4] = '-';
+      memcpy (t + 5, opt_text + 2, option->opt_len);
+      opt_text = t;
+    }
+
+  decoded->canonical_option[2] = NULL;
+  decoded->canonical_option[3] = NULL;
+
+  if (arg)
+    {
+      if (option->flags & CL_SEPARATE)
+       {
+         decoded->canonical_option[0] = opt_text;
+         decoded->canonical_option[1] = arg;
+         decoded->canonical_option_num_elements = 2;
+       }
+      else
+       {
+         gcc_assert (option->flags & CL_JOINED);
+         decoded->canonical_option[0] = concat (opt_text, arg, NULL);
+         decoded->canonical_option[1] = NULL;
+         decoded->canonical_option_num_elements = 1;
+       }
+    }
+  else
+    {
+      decoded->canonical_option[0] = opt_text;
+      decoded->canonical_option[1] = NULL;
+      decoded->canonical_option_num_elements = 1;
+    }
+}
+
 /* Decode the switch beginning at ARGV for the language indicated by
    LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into
    the structure *DECODED.  Returns the number of switches
@@ -245,13 +297,64 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask,
        result = 1;
     }
 
+  if (arg == NULL && (separate_arg_flag || joined_arg_flag))
+    errors |= CL_ERR_MISSING_ARG;
+
+  /* Is this option an alias?  */
+  if (option->alias_target != N_OPTS)
+    {
+      size_t new_opt_index = option->alias_target;
+      const struct cl_option *new_option = &cl_options[new_opt_index];
+
+      /* The new option must not be an alias itself.  */
+      gcc_assert (new_option->alias_target == N_OPTS);
+
+      if (option->neg_alias_arg)
+       {
+         gcc_assert (option->alias_arg != NULL);
+         gcc_assert (arg == NULL);
+         if (value)
+           arg = option->alias_arg;
+         else
+           arg = option->neg_alias_arg;
+         value = 1;
+       }
+      else if (option->alias_arg)
+       {
+         gcc_assert (value == 1);
+         gcc_assert (arg == NULL);
+         arg = option->alias_arg;
+       }
+
+      opt_index = new_opt_index;
+      option = new_option;
+
+      if (value == 0)
+       gcc_assert (!(option->flags & CL_REJECT_NEGATIVE));
+
+      /* Recompute what arguments are allowed.  */
+      separate_arg_flag = ((option->flags & CL_SEPARATE)
+                          && !((option->flags & CL_NO_DRIVER_ARG)
+                               && (lang_mask & CL_DRIVER)));
+      joined_arg_flag = (option->flags & CL_JOINED) != 0;
+
+      if (!(errors & CL_ERR_MISSING_ARG))
+       {
+         if (separate_arg_flag || joined_arg_flag)
+           gcc_assert (arg != NULL);
+         else
+           gcc_assert (arg == NULL);
+       }
+
+      /* Recheck for disabled options.  */
+      if (option->flags & CL_DISABLED)
+       errors |= CL_ERR_DISABLED;
+    }
+
   /* Check if this is a switch for a different front end.  */
   if (!option_ok_for_language (option, lang_mask))
     errors |= CL_ERR_WRONG_LANG;
 
-  if (arg == NULL && (separate_arg_flag || joined_arg_flag))
-    errors |= CL_ERR_MISSING_ARG;
-
   /* If the switch takes an integer, convert it.  */
   if (arg && (option->flags & CL_UINTEGER))
     {
@@ -296,12 +399,17 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask,
     {
       if (i < result)
        {
-         decoded->canonical_option[i] = argv[i];
+         if (opt_index == OPT_SPECIAL_unknown)
+           decoded->canonical_option[i] = argv[i];
+         else
+           decoded->canonical_option[i] = NULL;
          total_len += strlen (argv[i]) + 1;
        }
       else
        decoded->canonical_option[i] = NULL;
     }
+  if (opt_index != OPT_SPECIAL_unknown)
+    generate_canonical_option (opt_index, arg, value, decoded);
   decoded->orig_option_with_args_text = p = XNEWVEC (char, total_len);
   for (i = 0; i < result; i++)
     {
@@ -571,39 +679,26 @@ generate_option (size_t opt_index, const char *arg, int value,
 
   decoded->opt_index = opt_index;
   decoded->arg = arg;
-  decoded->canonical_option[2] = NULL;
-  decoded->canonical_option[3] = NULL;
   decoded->value = value;
   decoded->errors = (option_ok_for_language (option, lang_mask)
                     ? 0
                     : CL_ERR_WRONG_LANG);
 
-  if (arg)
+  generate_canonical_option (opt_index, arg, value, decoded);
+  switch (decoded->canonical_option_num_elements)
     {
-      if (option->flags & CL_SEPARATE)
-       {
-         decoded->orig_option_with_args_text = concat (option->opt_text, " ",
-                                                       arg, NULL);
-         decoded->canonical_option[0] = option->opt_text;
-         decoded->canonical_option[1] = arg;
-         decoded->canonical_option_num_elements = 2;
-       }
-      else
-       {
-         gcc_assert (option->flags & CL_JOINED);
-         decoded->orig_option_with_args_text = concat (option->opt_text, arg,
-                                                       NULL);
-         decoded->canonical_option[0] = decoded->orig_option_with_args_text;
-         decoded->canonical_option[1] = NULL;
-         decoded->canonical_option_num_elements = 1;
-       }
-    }
-  else
-    {
-      decoded->orig_option_with_args_text = option->opt_text;
-      decoded->canonical_option[0] = option->opt_text;
-      decoded->canonical_option[1] = NULL;
-      decoded->canonical_option_num_elements = 1;
+    case 1:
+      decoded->orig_option_with_args_text = decoded->canonical_option[0];
+      break;
+
+    case 2:
+      decoded->orig_option_with_args_text
+       = concat (decoded->canonical_option[0], " ",
+                 decoded->canonical_option[1], NULL);
+      break;
+
+    default:
+      gcc_unreachable ();
     }
 }
 
index 7425fa4c34eed037a9cfdf94f5e7f35f79bee0b8..ab7b45d5244183d00ccb8def02a33ae698dd7a6e 100644 (file)
@@ -1598,11 +1598,6 @@ common_handle_option (const struct cl_decoded_option *decoded,
       break;
 
     case OPT_Wlarger_than_:
-      /* This form corresponds to -Wlarger-than-.
-        Kept for backward compatibility.
-        Don't use it as the first argument of warning().  */
-
-    case OPT_Wlarger_than_eq:
       larger_than_size = value;
       warn_larger_than = value != -1;
       break;
@@ -1643,7 +1638,6 @@ common_handle_option (const struct cl_decoded_option *decoded,
       break;
 
     case OPT_aux_info:
-    case OPT_aux_info_:
       aux_info_file_name = arg;
       flag_gen_aux_info = 1;
       break;
@@ -1754,7 +1748,6 @@ common_handle_option (const struct cl_decoded_option *decoded,
       break;
 
     case OPT_finline_limit_:
-    case OPT_finline_limit_eq:
       set_param_value ("max-inline-insns-single", value / 2);
       set_param_value ("max-inline-insns-auto", value / 2);
       break;
@@ -1943,18 +1936,6 @@ common_handle_option (const struct cl_decoded_option *decoded,
        warning (0, "unknown stack check parameter \"%s\"", arg);
       break;
 
-    case OPT_fstack_check:
-      /* This is the same as the "specific" mode above.  */
-      if (value)
-       flag_stack_check = STACK_CHECK_BUILTIN
-                          ? FULL_BUILTIN_STACK_CHECK
-                          : STACK_CHECK_STATIC_BUILTIN
-                            ? STATIC_BUILTIN_STACK_CHECK
-                            : GENERIC_STACK_CHECK;
-      else
-       flag_stack_check = NO_STACK_CHECK;
-      break;
-
     case OPT_fstack_limit:
       /* The real switch is -fno-stack-limit.  */
       if (value)
@@ -2377,8 +2358,11 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
     }
   else
     {
+      const struct cl_option *option = &cl_options[option_index];
       const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
 
+      if (option->alias_target != N_OPTS)
+       option_index = option->alias_target;
       diagnostic_classify_diagnostic (global_dc, option_index, kind,
                                      UNKNOWN_LOCATION);
       if (kind == DK_ERROR)
index b2ff86c637b26808bfffac40945070b1914f1135..f3e01440a08b577f700437c6ee1891ab85b9c33a 100644 (file)
@@ -45,6 +45,9 @@ struct cl_option
   const char *opt_text;
   const char *help;
   const char *missing_argument_error;
+  const char *alias_arg;
+  const char *neg_alias_arg;
+  unsigned short alias_target;
   unsigned short back_chain;
   unsigned char opt_len;
   int neg_index;
index 09bb594eb2bbe2a49d9369c8d31505006ad5bb58..7ffef4d849199c07b31acf7851c7393cc00b9593 100644 (file)
@@ -675,9 +675,9 @@ layout_decl (tree decl, unsigned int known_align)
          int size_as_int = TREE_INT_CST_LOW (size);
 
          if (compare_tree_int (size, size_as_int) == 0)
-           warning (OPT_Wlarger_than_eq, "size of %q+D is %d bytes", decl, size_as_int);
+           warning (OPT_Wlarger_than_, "size of %q+D is %d bytes", decl, size_as_int);
          else
-           warning (OPT_Wlarger_than_eq, "size of %q+D is larger than %wd bytes",
+           warning (OPT_Wlarger_than_, "size of %q+D is larger than %wd bytes",
                      decl, larger_than_size);
        }
     }
index 95a0b8b05e3e87b4d242db7fcfa175b60f1cf09e..83c17e4b56f69654b91255ae9d9a8fd42dd24368 100644 (file)
@@ -1,3 +1,10 @@
+2010-09-02  Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.dg/cpp/warn-comments-3.c: New.  Based on warn-comments-2.c
+       but using -Werror=comment.
+       * gcc.dg/cpp/warn-comments.c, gcc.dg/cpp/warn-comments-2.c: Adjust
+       expected error messages.
+
 2010-09-02  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc.dg/stack-usage-1.c: Adjust on i386/Darwin.
index 17cc9f1ce15b96e502d676f285a52e2a7986fab1..492b99cb956eff092c78565a1bd84f64f13a23ea 100644 (file)
@@ -1,7 +1,7 @@
 // { dg-do preprocess }
 // { dg-options "-std=gnu99 -fdiagnostics-show-option -Werror=comments" }
 /* { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 } */
-/* /* */  // { dg-error "\"\.\*\" within comment .-Werror=comments." }
+/* /* */  // { dg-error "\"\.\*\" within comment .-Werror=comment." }
 
 // \
-          // { dg-error "multi-line comment .-Werror=comments." "multi-line" { target *-*-* } 6 }
+          // { dg-error "multi-line comment .-Werror=comment." "multi-line" { target *-*-* } 6 }
diff --git a/gcc/testsuite/gcc.dg/cpp/warn-comments-3.c b/gcc/testsuite/gcc.dg/cpp/warn-comments-3.c
new file mode 100644 (file)
index 0000000..639fa10
--- /dev/null
@@ -0,0 +1,7 @@
+// { dg-do preprocess }
+// { dg-options "-std=gnu99 -fdiagnostics-show-option -Werror=comment" }
+/* { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 } */
+/* /* */  // { dg-error "\"\.\*\" within comment .-Werror=comment." }
+
+// \
+          // { dg-error "multi-line comment .-Werror=comment." "multi-line" { target *-*-* } 6 }
index 6f3d5a56fa730c4885c0e94b69126c94148faa67..1cdf75cf273957896f43cb76c65241b296da28c0 100644 (file)
@@ -1,7 +1,7 @@
 // { dg-do preprocess }
 // { dg-options "-std=gnu99 -fdiagnostics-show-option -Wcomments" }
 
-/* /* */  // { dg-warning "\"\.\*\" within comment .-Wcomments." }
+/* /* */  // { dg-warning "\"\.\*\" within comment .-Wcomment." }
 
 // \
-          // { dg-warning "multi-line comment .-Wcomments." "multi-line" { target *-*-* } 6 }
+          // { dg-warning "multi-line comment .-Wcomment." "multi-line" { target *-*-* } 6 }
index 5df3fdb75cf5b4421135ec58cec9a1d03ffb6032..ce18d6f1febf82fb0aafa6b1ec51abd766c997e2 100644 (file)
@@ -477,10 +477,10 @@ tree_rest_of_compilation (tree fndecl)
            = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (ret_type));
 
          if (compare_tree_int (TYPE_SIZE_UNIT (ret_type), size_as_int) == 0)
-           warning (OPT_Wlarger_than_eq, "size of return value of %q+D is %u bytes",
+           warning (OPT_Wlarger_than_, "size of return value of %q+D is %u bytes",
                      fndecl, size_as_int);
          else
-           warning (OPT_Wlarger_than_eq, "size of return value of %q+D is larger than %wd bytes",
+           warning (OPT_Wlarger_than_, "size of return value of %q+D is larger than %wd bytes",
                      fndecl, larger_than_size);
        }
     }