[clang] Add --start-no-unused-arguments/--end-no-unused-arguments to silence some unused argument warnings

When passing a set of flags to configure defaults for a specific
target (similar to the cmake settings `CLANG_DEFAULT_RTLIB`,
`CLANG_DEFAULT_UNWINDLIB`, `CLANG_DEFAULT_CXX_STDLIB` and
`CLANG_DEFAULT_LINKER`, but without hardcoding them in the binary),
some of the flags may cause warnings (e.g. `-stdlib=` when compiling C
code). Allow requesting selectively ignoring unused arguments among
some of the arguments on the command line, without needing to resort
to `-Qunused-arguments` or `-Wno-unused-command-line-argument`.

Fix up the existing diagnostics.c testcase. It was added in
response to PR12181 to fix handling of
`-Werror=unused-command-line-argument`, but the command line option
in the test (`-fzyzzybalubah`) now triggers "error: unknown argument"
instead of the intended warning. Change it into a linker input
(`-lfoo`) which triggers the intended diagnostic. Extend the
existing test case to check more cases and make sure that it keeps
testing the intended case.

Add testing of the new option to this existing test.

Differential Revision: https://reviews.llvm.org/D116503
This commit is contained in:
Martin Storsjö 2022-01-01 15:54:29 +02:00
parent 04867c3c51
commit 50ec1306d0
4 changed files with 75 additions and 6 deletions

View file

@ -212,6 +212,10 @@ Enable linker job to emit a static library.
Trivial automatic variable initialization to zero is only here for benchmarks, it'll eventually be removed, and I'm OK with that because I'm only using it to benchmark
.. option:: --end-no-unused-arguments
Start emitting warnings for unused driver arguments
.. option:: -exported\_symbols\_list <arg>
.. option:: -faligned-new=<arg>
@ -663,6 +667,10 @@ Dynamically link the sanitizer runtime
.. option:: -single\_module
.. option:: --start-no-unused-arguments
Don't emit warnings about unused arguments for the following arguments
.. option:: -static-libgcc
.. option:: -static-libsan

View file

@ -1076,6 +1076,8 @@ def emit_interface_stubs : Flag<["-"], "emit-interface-stubs">, Flags<[CC1Option
def emit_merged_ifs : Flag<["-"], "emit-merged-ifs">,
Flags<[CC1Option]>, Group<Action_Group>,
HelpText<"Generate Interface Stub Files, emit merged text not binary.">;
def end_no_unused_arguments : Flag<["--"], "end-no-unused-arguments">, Flags<[CoreOption]>,
HelpText<"Start emitting warnings for unused driver arguments">;
def interface_stub_version_EQ : JoinedOrSeparate<["-"], "interface-stub-version=">, Flags<[CC1Option]>;
def exported__symbols__list : Separate<["-"], "exported_symbols_list">;
def e : JoinedOrSeparate<["-"], "e">, Flags<[LinkerInput]>, Group<Link_Group>;
@ -3913,6 +3915,8 @@ def shared : Flag<["-", "--"], "shared">, Group<Link_Group>;
def single__module : Flag<["-"], "single_module">;
def specs_EQ : Joined<["-", "--"], "specs=">, Group<Link_Group>;
def specs : Separate<["-", "--"], "specs">, Flags<[Unsupported]>;
def start_no_unused_arguments : Flag<["--"], "start-no-unused-arguments">, Flags<[CoreOption]>,
HelpText<"Don't emit warnings about unused arguments for the following arguments">;
def static_libgcc : Flag<["-"], "static-libgcc">;
def static_libstdcxx : Flag<["-"], "static-libstdc++">;
def static : Flag<["-", "--"], "static">, Group<Link_Group>, Flags<[NoArgumentUnused]>;

View file

@ -367,7 +367,20 @@ DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const {
bool HasNostdlib = Args.hasArg(options::OPT_nostdlib);
bool HasNostdlibxx = Args.hasArg(options::OPT_nostdlibxx);
bool HasNodefaultlib = Args.hasArg(options::OPT_nodefaultlibs);
bool IgnoreUnused = false;
for (Arg *A : Args) {
if (IgnoreUnused)
A->claim();
if (A->getOption().matches(options::OPT_start_no_unused_arguments)) {
IgnoreUnused = true;
continue;
}
if (A->getOption().matches(options::OPT_end_no_unused_arguments)) {
IgnoreUnused = false;
continue;
}
// Unfortunately, we have to parse some forwarding options (-Xassembler,
// -Xlinker, -Xpreprocessor) because we either integrate their functionality
// (assembler and preprocessor), or bypass a previous driver ('collect2').

View file

@ -1,9 +1,53 @@
// Parse diagnostic arguments in the driver
// PR12181
// RUN: not %clang -target x86_64-apple-darwin10 \
// RUN: -fsyntax-only -fzyzzybalubah \
// RUN: -Werror=unused-command-line-argument %s
// Exactly which arguments are warned about and which aren't differ based
// on what target is selected. -stdlib= and -fuse-ld= emit diagnostics when
// compiling C code, for e.g. *-linux-gnu. Linker inputs, like -lfoo, emit
// diagnostics when only compiling for all targets.
// RUN: not %clang -target x86_64-apple-darwin10 \
// RUN: -fsyntax-only -fzyzzybalubah -Werror %s
// This is normally a non-fatal warning:
// RUN: %clang --target=x86_64-apple-darwin10 \
// RUN: -fsyntax-only -lfoo %s 2>&1 | FileCheck %s
// Either with a specific -Werror=unused.. or a blanket -Werror, this
// causes the command to fail.
// RUN: not %clang --target=x86_64-apple-darwin10 \
// RUN: -fsyntax-only -lfoo \
// RUN: -Werror=unused-command-line-argument %s 2>&1 | FileCheck %s
// RUN: not %clang --target=x86_64-apple-darwin10 \
// RUN: -fsyntax-only -lfoo -Werror %s 2>&1 | FileCheck %s
// With a specific -Wno-..., no diagnostic should be printed.
// RUN: %clang --target=x86_64-apple-darwin10 \
// RUN: -fsyntax-only -lfoo -Werror \
// RUN: -Wno-unused-command-line-argument %s 2>&1 | count 0
// With -Qunused-arguments, no diagnostic should be printed.
// RUN: %clang --target=x86_64-apple-darwin10 \
// RUN: -fsyntax-only -lfoo -Werror \
// RUN: -Qunused-arguments %s 2>&1 | count 0
// With the argument enclosed in --{start,end}-no-unused-arguments,
// there's no diagnostic.
// RUN: %clang --target=x86_64-apple-darwin10 -fsyntax-only \
// RUN: --start-no-unused-arguments -lfoo --end-no-unused-arguments \
// RUN: -Werror %s 2>&1 | count 0
// With --{start,end}-no-unused-argument around a different argument, it
// still warns about the unused argument.
// RUN: not %clang --target=x86_64-apple-darwin10 \
// RUN: --start-no-unused-arguments -fsyntax-only --end-no-unused-arguments \
// RUN: -lfoo -Werror %s 2>&1 | FileCheck %s
// Test clang-cl warning about unused linker options.
// RUN: not %clang_cl -fsyntax-only /WX %s \
// RUN: -link 2>&1 | FileCheck %s --check-prefix=CL-WARNING
// Test clang-cl ignoring the warning with --start-no-unused-arguments.
// RUN: %clang_cl -fsyntax-only /WX %s \
// RUN: --start-no-unused-arguments -link --end-no-unused-arguments 2>&1 | count 0
// CHECK: -lfoo: 'linker' input unused
// CL-WARNING: argument unused during compilation: '-link'