aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2015-09-24 16:37:43 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2015-09-24 16:37:43 +0000
commit3563212292d643dee54ff75771032ea92fe34e78 (patch)
tree65b1cf01a9ae795a5ecb148e8eac6ed626108fc6
parent2af16a7c1e190f54a2d276a1088d39bcc9cbdce4 (diff)
downloadgcc-3563212292d643dee54ff75771032ea92fe34e78.zip
gcc-3563212292d643dee54ff75771032ea92fe34e78.tar.gz
gcc-3563212292d643dee54ff75771032ea92fe34e78.tar.bz2
fdiagnostics-color=never does not disable color for some diagnostics
Actually, I was trying to reject non-warning options as argument to -Werror=. However, the new test fails because -fdiagnostics-color=never is always placed by the driver after the warning options when calling the compiler proper. This patch prunes all -fdiagnostics-color from the command-line but the last one, which is moved to the first position. gcc/ChangeLog: 2015-09-24 Manuel López-Ibáñez <manu@gcc.gnu.org> PR driver/67640 * opts-common.c (prune_options): Discard all -fdiagnostics-color but the last one, which is moved to the front to be processed first. * opts.c (enable_warning_as_error): Reject options that do not control warnings. gcc/testsuite/ChangeLog: 2015-09-24 Manuel López-Ibáñez <manu@gcc.gnu.org> PR driver/67640 * gcc.dg/Werror-13.c: New test. From-SVN: r228094
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/opts-common.c17
-rw-r--r--gcc/opts.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/Werror-13.c8
5 files changed, 43 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 05ff03f..d0893001 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2015-09-24 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR driver/67640
+ * opts-common.c (prune_options): Discard all -fdiagnostics-color
+ but the last one, which is moved to the front to be processed
+ first.
+ * opts.c (enable_warning_as_error): Reject options that do not
+ control warnings.
+
2015-09-24 Jiong Wang <jiong.wang@arm.com>
* config/aarch64/aarch64.c (aarch64_print_operand): Add "CONST" support.
diff --git a/gcc/opts-common.c b/gcc/opts-common.c
index 3bcbaf1..d9bf4d4 100644
--- a/gcc/opts-common.c
+++ b/gcc/opts-common.c
@@ -825,6 +825,7 @@ prune_options (struct cl_decoded_option **decoded_options,
= XNEWVEC (struct cl_decoded_option, old_decoded_options_count);
unsigned int i;
const struct cl_option *option;
+ unsigned int fdiagnostics_color_idx = 0;
/* Remove arguments which are negated by others after them. */
new_decoded_options_count = 0;
@@ -844,6 +845,11 @@ prune_options (struct cl_decoded_option **decoded_options,
case OPT_SPECIAL_input_file:
goto keep;
+ /* Do not save OPT_fdiagnostics_color_, just remember the last one. */
+ case OPT_fdiagnostics_color_:
+ fdiagnostics_color_idx = i;
+ continue;
+
default:
gcc_assert (opt_idx < cl_options_count);
option = &cl_options[opt_idx];
@@ -879,6 +885,17 @@ keep:
}
}
+ if (fdiagnostics_color_idx > 1)
+ {
+ /* We put the last -fdiagnostics-color= at the first position
+ after argv[0] so it can take effect immediately. */
+ memmove (new_decoded_options + 2, new_decoded_options + 1,
+ sizeof (struct cl_decoded_option)
+ * (new_decoded_options_count - 1));
+ new_decoded_options[1] = old_decoded_options[fdiagnostics_color_idx];
+ new_decoded_options_count++;
+ }
+
free (old_decoded_options);
new_decoded_options = XRESIZEVEC (struct cl_decoded_option,
new_decoded_options,
diff --git a/gcc/opts.c b/gcc/opts.c
index f1a9acd..b437114 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -2359,9 +2359,10 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
strcpy (new_option + 1, arg);
option_index = find_opt (new_option, lang_mask);
if (option_index == OPT_SPECIAL_unknown)
- {
- error_at (loc, "-Werror=%s: no option -%s", arg, new_option);
- }
+ error_at (loc, "-Werror=%s: no option -%s", arg, new_option);
+ else if (!(cl_options[option_index].flags & CL_WARNING))
+ error_at (loc, "-Werror=%s: -%s is not an option that controls warnings",
+ arg, new_option);
else
{
const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 912e411..de6131b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-09-24 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR driver/67640
+ * gcc.dg/Werror-13.c: New test.
+
2015-09-24 Szabolcs Nagy <szabolcs.nagy@arm.com>
* gcc.target/aarch64/target_attr_10.c (foo): Use dg-message for note.
diff --git a/gcc/testsuite/gcc.dg/Werror-13.c b/gcc/testsuite/gcc.dg/Werror-13.c
new file mode 100644
index 0000000..e8aa992
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Werror-13.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-Werror=error -Werror=p, -Werror=l, -Werror=fatal-errors" } */
+/* { dg-error "-Wp, is not an option that controls warnings" "" { target *-*-* } 0 } */
+/* { dg-error "-Wl, is not an option that controls warnings" "" { target *-*-* } 0 } */
+/* { dg-error "-Werror is not an option that controls warnings" "" { target *-*-* } 0 } */
+/* { dg-error "-Wfatal-errors is not an option that controls warnings" "" { target *-*-* } 0 } */
+
+int i;