Commit 3f662186 by Neil Booth Committed by Neil Booth

c-opts.c (find_opt): Don't complain about wrong languages here.

	* c-opts.c (find_opt): Don't complain about wrong languages
	here.  Return exact matches even for wrong language.
	(c_common_decode_option): Complain about wrong languages
	here.

From-SVN: r56583
parent 00e3ddda
2002-08-26 Neil Booth <neil@daikokuya.co.uk>
* c-opts.c (find_opt): Don't complain about wrong languages
here. Return exact matches even for wrong language.
(c_common_decode_option): Complain about wrong languages
here.
2002-08-24 Stuart Hastings <stuart@apple.com> 2002-08-24 Stuart Hastings <stuart@apple.com>
* function.h (struct function): Add flag * function.h (struct function): Add flag
......
...@@ -374,7 +374,10 @@ missing_arg (opt_index) ...@@ -374,7 +374,10 @@ missing_arg (opt_index)
Complications arise since some options can be suffixed with an Complications arise since some options can be suffixed with an
argument, and multiple complete matches can occur, e.g. -pedantic argument, and multiple complete matches can occur, e.g. -pedantic
and -pedantic-errors. Also, some options are only accepted by some and -pedantic-errors. Also, some options are only accepted by some
languages. */ languages. If a switch matches for a different language and
doesn't match any alternatives for the true front end, the index of
the matched switch is returned anyway. The caller should check for
this case. */
static size_t static size_t
find_opt (input, lang_flag) find_opt (input, lang_flag)
const char *input; const char *input;
...@@ -382,7 +385,7 @@ find_opt (input, lang_flag) ...@@ -382,7 +385,7 @@ find_opt (input, lang_flag)
{ {
size_t md, mn, mx; size_t md, mn, mx;
size_t opt_len; size_t opt_len;
size_t wrong_lang = N_OPTS; size_t result = N_OPTS;
int comp; int comp;
mn = 0; mn = 0;
...@@ -403,13 +406,7 @@ find_opt (input, lang_flag) ...@@ -403,13 +406,7 @@ find_opt (input, lang_flag)
{ {
/* The switch matches. It it an exact match? */ /* The switch matches. It it an exact match? */
if (input[opt_len] == '\0') if (input[opt_len] == '\0')
{ return md;
exact_match:
if (cl_options[md].flags & lang_flag)
return md;
wrong_lang = md;
break;
}
else else
{ {
mn = md + 1; mn = md + 1;
...@@ -423,9 +420,10 @@ find_opt (input, lang_flag) ...@@ -423,9 +420,10 @@ find_opt (input, lang_flag)
/* Is this switch valid for this front end? */ /* Is this switch valid for this front end? */
if (!(cl_options[md].flags & lang_flag)) if (!(cl_options[md].flags & lang_flag))
{ {
/* If subsequently we don't find a good match, /* If subsequently we don't find a better match,
report this as a bad match. */ return this and let the caller report it as a bad
wrong_lang = md; match. */
result = md;
continue; continue;
} }
...@@ -444,7 +442,7 @@ find_opt (input, lang_flag) ...@@ -444,7 +442,7 @@ find_opt (input, lang_flag)
if (memcmp (input, cl_options[md].opt_text, opt_len)) if (memcmp (input, cl_options[md].opt_text, opt_len))
break; break;
if (input[opt_len] == '\0') if (input[opt_len] == '\0')
goto exact_match; return md;
if (cl_options[md].flags & lang_flag if (cl_options[md].flags & lang_flag
&& cl_options[md].flags & CL_JOINED) && cl_options[md].flags & CL_JOINED)
mx = md; mx = md;
...@@ -455,10 +453,7 @@ find_opt (input, lang_flag) ...@@ -455,10 +453,7 @@ find_opt (input, lang_flag)
} }
} }
if (wrong_lang != N_OPTS) return result;
complain_wrong_lang (wrong_lang);
return N_OPTS;
} }
/* Defer option CODE with argument ARG. */ /* Defer option CODE with argument ARG. */
...@@ -534,7 +529,7 @@ c_common_decode_option (argc, argv) ...@@ -534,7 +529,7 @@ c_common_decode_option (argc, argv)
const char *opt, *arg = 0; const char *opt, *arg = 0;
char *dup = 0; char *dup = 0;
bool on = true; bool on = true;
int result; int result, lang_flag;
const struct cl_option *option; const struct cl_option *option;
enum opt_code code; enum opt_code code;
...@@ -574,7 +569,8 @@ c_common_decode_option (argc, argv) ...@@ -574,7 +569,8 @@ c_common_decode_option (argc, argv)
result = cpp_handle_option (parse_in, argc, argv); result = cpp_handle_option (parse_in, argc, argv);
/* Skip over '-'. */ /* Skip over '-'. */
opt_index = find_opt (opt + 1, lang_flags[(c_language << 1) + flag_objc]); lang_flag = lang_flags[(c_language << 1) + flag_objc];
opt_index = find_opt (opt + 1, lang_flag);
if (opt_index == N_OPTS) if (opt_index == N_OPTS)
goto done; goto done;
...@@ -610,6 +606,15 @@ c_common_decode_option (argc, argv) ...@@ -610,6 +606,15 @@ c_common_decode_option (argc, argv)
} }
} }
/* Complain about the wrong language after we've swallowed any
necessary extra argument. Eventually make this a hard error
after the call to find_opt, and return argc. */
if (!(cl_options[opt_index].flags & lang_flag))
{
complain_wrong_lang (opt_index);
goto done;
}
switch (code = option->opt_code) switch (code = option->opt_code)
{ {
case N_OPTS: /* Shut GCC up. */ case N_OPTS: /* Shut GCC up. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment