diff options
author | Thomas Schwinge <thomas@codesourcery.com> | 2023-04-07 21:50:40 +0200 |
---|---|---|
committer | Thomas Schwinge <thomas_schwinge@mentor.com> | 2023-04-07 21:50:40 +0200 |
commit | 58b047a8de5482a9e111e67b8802072fdc6e5d76 (patch) | |
tree | 209286fc3ab5c78ef4541131b663a53813d98806 /gcc | |
parent | 1dcdf61f9e9706284db0f47da8783cfb841316a6 (diff) | |
parent | 320dc51c2d9969f644885cc1afa0d8a924f0ab87 (diff) | |
download | gcc-58b047a8de5482a9e111e67b8802072fdc6e5d76.zip gcc-58b047a8de5482a9e111e67b8802072fdc6e5d76.tar.gz gcc-58b047a8de5482a9e111e67b8802072fdc6e5d76.tar.bz2 |
Merge commit '320dc51c2d9969f644885cc1afa0d8a924f0ab87' into HEAD [#1540]
Diffstat (limited to 'gcc')
24 files changed, 91 insertions, 24 deletions
diff --git a/gcc/common.opt b/gcc/common.opt index d0371ae..50bcc523 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -582,6 +582,10 @@ Wcast-align=strict Common Var(warn_cast_align,2) Warning Warn about pointer casts which increase alignment. +Wcomplain-wrong-lang +Common Var(warn_complain_wrong_lang) Init(1) Warning +Complain when a command-line option is valid, but not applicable to the current front end. + Wcpp Common Var(warn_cpp) Init(1) Warning Warn when a #warning directive is encountered. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index bcf8510..a7ec1a9 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -343,6 +343,7 @@ Objective-C and Objective-C++ Dialects}. -Wcast-align -Wcast-align=strict -Wcast-function-type -Wcast-qual @gol -Wchar-subscripts @gol -Wclobbered -Wcomment @gol +-Wno-complain-wrong-lang @gol -Wconversion -Wno-coverage-mismatch -Wno-cpp @gol -Wdangling-else -Wdangling-pointer -Wdangling-pointer=@var{n} @gol -Wdate-time @gol @@ -8944,6 +8945,25 @@ programs. Warn for variables that might be changed by @code{longjmp} or @code{vfork}. This warning is also enabled by @option{-Wextra}. +@item -Wno-complain-wrong-lang +@opindex Wcomplain-wrong-lang +@opindex Wno-complain-wrong-lang +By default, language front ends complain when a command-line option is +valid, but not applicable to that front end. +This may be disabled with @option{-Wno-complain-wrong-lang}, +which is mostly useful when invoking a single compiler driver for +multiple source files written in different languages, for example: + +@smallexample +$ g++ -fno-rtti a.cc b.f90 +@end smallexample + +The driver @file{g++} invokes the C++ front end to compile @file{a.cc} +and the Fortran front end to compile @file{b.f90}. +The latter front end diagnoses +@samp{f951: Warning: command-line option '-fno-rtti' is valid for C++/D/ObjC++ but not for Fortran}, +which may be disabled with @option{-Wno-complain-wrong-lang}. + @item -Wconversion @opindex Wconversion @opindex Wno-conversion diff --git a/gcc/opts-common.cc b/gcc/opts-common.cc index c3ede43..23ddcaa 100644 --- a/gcc/opts-common.cc +++ b/gcc/opts-common.cc @@ -1112,7 +1112,8 @@ cancel_option (int opt_idx, int next_opt_idx, int orig_next_opt_idx) return false; } -/* Filter out options canceled by the ones after them. */ +/* Filter out options canceled by the ones after them, and related + rearrangement. */ static void prune_options (struct cl_decoded_option **decoded_options, @@ -1125,6 +1126,8 @@ 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 options_to_prepend = 0; + unsigned int Wcomplain_wrong_lang_idx = 0; unsigned int fdiagnostics_color_idx = 0; /* Remove arguments which are negated by others after them. */ @@ -1146,8 +1149,17 @@ 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. */ + /* Do not handle the following yet, just remember the last one. */ + case OPT_Wcomplain_wrong_lang: + gcc_checking_assert (i != 0); + if (Wcomplain_wrong_lang_idx == 0) + ++options_to_prepend; + Wcomplain_wrong_lang_idx = i; + continue; case OPT_fdiagnostics_color_: + gcc_checking_assert (i != 0); + if (fdiagnostics_color_idx == 0) + ++options_to_prepend; fdiagnostics_color_idx = i; continue; @@ -1191,15 +1203,29 @@ keep: } } - if (fdiagnostics_color_idx >= 1) + /* For those not yet handled, put (only) the last at a front position after + 'argv[0]', so they can take effect immediately. */ + if (options_to_prepend) { - /* 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++; + const unsigned int argv_0 = 1; + memmove (new_decoded_options + argv_0 + options_to_prepend, + new_decoded_options + argv_0, + sizeof (struct cl_decoded_option) + * (new_decoded_options_count - argv_0)); + unsigned int options_prepended = 0; + if (Wcomplain_wrong_lang_idx != 0) + { + new_decoded_options[argv_0 + options_prepended++] + = old_decoded_options[Wcomplain_wrong_lang_idx]; + new_decoded_options_count++; + } + if (fdiagnostics_color_idx != 0) + { + new_decoded_options[argv_0 + options_prepended++] + = old_decoded_options[fdiagnostics_color_idx]; + new_decoded_options_count++; + } + gcc_checking_assert (options_to_prepend == options_prepended); } free (old_decoded_options); diff --git a/gcc/opts-global.cc b/gcc/opts-global.cc index d078384..b7bba23 100644 --- a/gcc/opts-global.cc +++ b/gcc/opts-global.cc @@ -91,6 +91,9 @@ complain_wrong_lang (const struct cl_decoded_option *decoded, char *ok_langs = NULL, *bad_lang = NULL; unsigned int opt_flags = option->flags; + if (!warn_complain_wrong_lang) + return; + if (!lang_hooks.complain_wrong_lang_p (option)) return; diff --git a/gcc/testsuite/g++.dg/abi/empty12.C b/gcc/testsuite/g++.dg/abi/empty12.C index 6568fc62..6d67f8d 100644 --- a/gcc/testsuite/g++.dg/abi/empty12.C +++ b/gcc/testsuite/g++.dg/abi/empty12.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-Wabi=11 -x c" } // { dg-additional-sources "empty12a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty12.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/g++.dg/abi/empty13.C b/gcc/testsuite/g++.dg/abi/empty13.C index 9ec1887..47f1d73 100644 --- a/gcc/testsuite/g++.dg/abi/empty13.C +++ b/gcc/testsuite/g++.dg/abi/empty13.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-x c -fabi-version=11" } // { dg-additional-sources "empty13a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty13.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/g++.dg/abi/empty14.C b/gcc/testsuite/g++.dg/abi/empty14.C index 7deb463..8881beb 100644 --- a/gcc/testsuite/g++.dg/abi/empty14.C +++ b/gcc/testsuite/g++.dg/abi/empty14.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-Wabi=11 -x c" } // { dg-additional-sources "empty14a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty14.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/g++.dg/abi/empty15.C b/gcc/testsuite/g++.dg/abi/empty15.C index fd36194..2474911 100644 --- a/gcc/testsuite/g++.dg/abi/empty15.C +++ b/gcc/testsuite/g++.dg/abi/empty15.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-Wabi=11 -x c" } // { dg-additional-sources "empty15a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty15.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/g++.dg/abi/empty16.C b/gcc/testsuite/g++.dg/abi/empty16.C index 024b00e..6db82a2 100644 --- a/gcc/testsuite/g++.dg/abi/empty16.C +++ b/gcc/testsuite/g++.dg/abi/empty16.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-Wabi=11 -x c" } // { dg-additional-sources "empty16a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty16.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/g++.dg/abi/empty17.C b/gcc/testsuite/g++.dg/abi/empty17.C index a6e58fa..26f3d77 100644 --- a/gcc/testsuite/g++.dg/abi/empty17.C +++ b/gcc/testsuite/g++.dg/abi/empty17.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-Wabi=11 -x c" } // { dg-additional-sources "empty17a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty17.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/g++.dg/abi/empty18.C b/gcc/testsuite/g++.dg/abi/empty18.C index 6e64dae..02e41ca 100644 --- a/gcc/testsuite/g++.dg/abi/empty18.C +++ b/gcc/testsuite/g++.dg/abi/empty18.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-Wabi=11 -x c" } // { dg-additional-sources "empty18a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty18.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/g++.dg/abi/empty19.C b/gcc/testsuite/g++.dg/abi/empty19.C index 8707db8..89b92f1 100644 --- a/gcc/testsuite/g++.dg/abi/empty19.C +++ b/gcc/testsuite/g++.dg/abi/empty19.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-Wabi=11 -x c" } // { dg-additional-sources "empty19a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty19.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/g++.dg/abi/empty22.C b/gcc/testsuite/g++.dg/abi/empty22.C index d3720f8..1502ea0 100644 --- a/gcc/testsuite/g++.dg/abi/empty22.C +++ b/gcc/testsuite/g++.dg/abi/empty22.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-Wabi=11 -x c" } // { dg-additional-sources "empty22a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty22.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/g++.dg/abi/empty25.C b/gcc/testsuite/g++.dg/abi/empty25.C index 50a4c26..bfbaa83 100644 --- a/gcc/testsuite/g++.dg/abi/empty25.C +++ b/gcc/testsuite/g++.dg/abi/empty25.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-Wabi=11 -x c" } // { dg-additional-sources "empty25a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty25.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/g++.dg/abi/empty26.C b/gcc/testsuite/g++.dg/abi/empty26.C index 785cdc7..3a27bf6 100644 --- a/gcc/testsuite/g++.dg/abi/empty26.C +++ b/gcc/testsuite/g++.dg/abi/empty26.C @@ -2,7 +2,7 @@ // { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } // { dg-options "-Wabi=11 -x c" } // { dg-additional-sources "empty26a.c" } -// { dg-prune-output "command-line option" } +// { dg-additional-options -Wno-complain-wrong-lang } #include "empty26.h" extern "C" void fun(struct dummy, struct foo); diff --git a/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-1.c b/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-1.c new file mode 100644 index 0000000..71016e0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-1.c @@ -0,0 +1,2 @@ +/* { dg-options -Wctad-maybe-unsupported } and '-Wcomplain-wrong-lang' enabled by default: + { dg-warning {command-line option '-Wctad-maybe-unsupported' is valid for C\+\+/ObjC\+\+ but not for C} {} { target *-*-* } 0 } */ diff --git a/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-2.c b/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-2.c new file mode 100644 index 0000000..ba2192d --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-2.c @@ -0,0 +1,2 @@ +/* { dg-options {-Wcomplain-wrong-lang -Wctad-maybe-unsupported} } + { dg-warning {command-line option '-Wctad-maybe-unsupported' is valid for C\+\+/ObjC\+\+ but not for C} {} { target *-*-* } 0 } */ diff --git a/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-3.c b/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-3.c new file mode 100644 index 0000000..36bf748 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-3.c @@ -0,0 +1,2 @@ +/* { dg-options {-Wctad-maybe-unsupported -Wno-complain-wrong-lang} } + { dg-bogus {command-line option '-Wctad-maybe-unsupported' is valid for C\+\+/ObjC\+\+ but not for C} {} { target *-*-* } 0 } */ diff --git a/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-4.c b/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-4.c new file mode 100644 index 0000000..af185f8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-4.c @@ -0,0 +1,2 @@ +/* { dg-options {-Wno-complain-wrong-lang -Wctad-maybe-unsupported} } + { dg-bogus {command-line option '-Wctad-maybe-unsupported' is valid for C\+\+/ObjC\+\+ but not for C} {} { target *-*-* } 0 } */ diff --git a/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-5.c b/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-5.c new file mode 100644 index 0000000..dc0a42c --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wcomplain-wrong-lang-5.c @@ -0,0 +1,2 @@ +/* { dg-options {-Wcomplain-wrong-lang -Wctad-maybe-unsupported -Wno-complain-wrong-lang} } + { dg-bogus {command-line option '-Wctad-maybe-unsupported' is valid for C\+\+/ObjC\+\+ but not for C} {} { target *-*-* } 0 } */ diff --git a/gcc/testsuite/gfortran.dg/bind-c-contiguous-1.f90 b/gcc/testsuite/gfortran.dg/bind-c-contiguous-1.f90 index 975f74b..d638dbb 100644 --- a/gcc/testsuite/gfortran.dg/bind-c-contiguous-1.f90 +++ b/gcc/testsuite/gfortran.dg/bind-c-contiguous-1.f90 @@ -1,7 +1,7 @@ ! { dg-do run } ! { dg-additional-sources bind-c-contiguous-1.c } ! { dg-additional-options "-fcheck=all" } -! { dg-prune-output "command-line option '-fcheck=.*' is valid for Fortran but not for C" } +! { dg-additional-options -Wno-complain-wrong-lang } ! Fortran demands that with bind(C), the callee ensure that for ! * 'contiguous' diff --git a/gcc/testsuite/gfortran.dg/bind-c-contiguous-4.f90 b/gcc/testsuite/gfortran.dg/bind-c-contiguous-4.f90 index a58ba20..591c5a7 100644 --- a/gcc/testsuite/gfortran.dg/bind-c-contiguous-4.f90 +++ b/gcc/testsuite/gfortran.dg/bind-c-contiguous-4.f90 @@ -4,7 +4,7 @@ ! ! { dg-additional-sources bind-c-contiguous-4.c } ! { dg-additional-options "-fcheck=all" } -! { dg-prune-output "command-line option '-fcheck=.*' is valid for Fortran but not for C" } +! { dg-additional-options -Wno-complain-wrong-lang } ! Fortran demands that with bind(C), the callee ensure that for ! * 'contiguous' diff --git a/gcc/testsuite/gfortran.dg/bind-c-contiguous-5.f90 b/gcc/testsuite/gfortran.dg/bind-c-contiguous-5.f90 index d1af9f7..58d9a98 100644 --- a/gcc/testsuite/gfortran.dg/bind-c-contiguous-5.f90 +++ b/gcc/testsuite/gfortran.dg/bind-c-contiguous-5.f90 @@ -1,7 +1,7 @@ ! { dg-do run } ! { dg-additional-sources bind-c-contiguous-5.c } ! { dg-additional-options "-fcheck=all" } -! { dg-prune-output "command-line option '-fcheck=.*' is valid for Fortran but not for C" } +! { dg-additional-options -Wno-complain-wrong-lang } ! ---- Same as bind-c-contiguous-1.f90 - but with kind=4 characters ! Fortran demands that with bind(C), the callee ensure that for ! * 'contiguous' diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 59be4fc..839e5a6 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -59,6 +59,10 @@ proc check_compile {basename type contents args} { } else { set options "" } + # Silence "command-line option [...] is valid for [...] but not for [...]" + # that we may easily run into here, if more than one language is involved. + lappend options additional_flags=-Wno-complain-wrong-lang + switch -glob -- $contents { "*/\\* Assembly*" { set src ${basename}[pid].S } "*! Fortran*" { set src ${basename}[pid].f90 } |