Skip to content

Commit 47a2b1b

Browse files
committed
[Clang][Driver] New parameter allow-unrecognized-arguments
This parameter is used to suppress the ``Unknown argument '...'`` error that clang will emit whenever it encounters an unknown argument. This is probably an error to make sure the user fixes it's mistake by either removing the argument or renaming it, but there are some cases where it's not possible to fix the issue. For instance, CMake now injects gcc-specific arguments in the clang-tidy command that breaks static-analysis (https://gitlab.kitware.com/cmake/cmake/-/issues/26283) This will also allow users to run clang-tidy / clangd on a gcc-based project without the need to maintain two separate build commands to run llvm-based tools. By enabling this parameter, the user is able to downgrade the error to a warning (unknown-argument) that he can further silence using the ``-Qunused-arguments`` flag if needed. Fixes: #108455
1 parent 1d65d9c commit 47a2b1b

File tree

4 files changed

+40
-29
lines changed

4 files changed

+40
-29
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,9 @@ def : Flag<["-"], "Xcompiler">, IgnoredGCCCompat;
10111011
def Z_Flag : Flag<["-"], "Z">, Group<Link_Group>;
10121012
def all__load : Flag<["-"], "all_load">;
10131013
def allowable__client : Separate<["-"], "allowable_client">;
1014+
def allow_unrecognized_arguments : Flag<["--"], "allow-unrecognized-arguments">,
1015+
Visibility<[ClangOption, CLOption]>,
1016+
HelpText<"Ignore unrecognized command-line arguments instead of reporting an error.">;
10141017
def ansi : Flag<["-", "--"], "ansi">, Group<CompileOnly_Group>;
10151018
def arch__errors__fatal : Flag<["-"], "arch_errors_fatal">;
10161019
def arch : Separate<["-"], "arch">, Flags<[NoXarchOption,TargetSpecific]>;

clang/lib/Driver/Driver.cpp

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -303,29 +303,31 @@ InputArgList Driver::ParseArgStrings(ArrayRef<const char *> ArgStrings,
303303
}
304304
}
305305

306-
for (const Arg *A : Args.filtered(options::OPT_UNKNOWN)) {
307-
unsigned DiagID;
308-
auto ArgString = A->getAsString(Args);
309-
std::string Nearest;
310-
if (getOpts().findNearest(ArgString, Nearest, VisibilityMask) > 1) {
311-
if (!IsCLMode() &&
312-
getOpts().findExact(ArgString, Nearest,
313-
llvm::opt::Visibility(options::CC1Option))) {
314-
DiagID = diag::err_drv_unknown_argument_with_suggestion;
315-
Diags.Report(DiagID) << ArgString << "-Xclang " + Nearest;
306+
if (!Args.hasArg(options::OPT_allow_unrecognized_arguments)) {
307+
for (const Arg *A : Args.filtered(options::OPT_UNKNOWN)) {
308+
unsigned DiagID;
309+
auto ArgString = A->getAsString(Args);
310+
std::string Nearest;
311+
if (getOpts().findNearest(ArgString, Nearest, VisibilityMask) > 1) {
312+
if (!IsCLMode() &&
313+
getOpts().findExact(ArgString, Nearest,
314+
llvm::opt::Visibility(options::CC1Option))) {
315+
DiagID = diag::err_drv_unknown_argument_with_suggestion;
316+
Diags.Report(DiagID) << ArgString << "-Xclang " + Nearest;
317+
} else {
318+
DiagID = IsCLMode() ? diag::warn_drv_unknown_argument_clang_cl
319+
: diag::err_drv_unknown_argument;
320+
Diags.Report(DiagID) << ArgString;
321+
}
316322
} else {
317-
DiagID = IsCLMode() ? diag::warn_drv_unknown_argument_clang_cl
318-
: diag::err_drv_unknown_argument;
319-
Diags.Report(DiagID) << ArgString;
323+
DiagID = IsCLMode()
324+
? diag::warn_drv_unknown_argument_clang_cl_with_suggestion
325+
: diag::err_drv_unknown_argument_with_suggestion;
326+
Diags.Report(DiagID) << ArgString << Nearest;
320327
}
321-
} else {
322-
DiagID = IsCLMode()
323-
? diag::warn_drv_unknown_argument_clang_cl_with_suggestion
324-
: diag::err_drv_unknown_argument_with_suggestion;
325-
Diags.Report(DiagID) << ArgString << Nearest;
328+
ContainsError |= Diags.getDiagnosticLevel(DiagID, SourceLocation()) >
329+
DiagnosticsEngine::Warning;
326330
}
327-
ContainsError |= Diags.getDiagnosticLevel(DiagID, SourceLocation()) >
328-
DiagnosticsEngine::Warning;
329331
}
330332

331333
for (const Arg *A : Args.filtered(options::OPT_o)) {

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4991,15 +4991,17 @@ bool CompilerInvocation::CreateFromArgsImpl(
49914991
Diags.Report(diag::err_drv_missing_argument)
49924992
<< Args.getArgString(MissingArgIndex) << MissingArgCount;
49934993

4994-
// Issue errors on unknown arguments.
4995-
for (const auto *A : Args.filtered(OPT_UNKNOWN)) {
4996-
auto ArgString = A->getAsString(Args);
4997-
std::string Nearest;
4998-
if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
4999-
Diags.Report(diag::err_drv_unknown_argument) << ArgString;
5000-
else
5001-
Diags.Report(diag::err_drv_unknown_argument_with_suggestion)
5002-
<< ArgString << Nearest;
4994+
if (!Args.hasArg(options::OPT_allow_unrecognized_arguments)) {
4995+
// Issue errors on unknown arguments.
4996+
for (const auto *A : Args.filtered(OPT_UNKNOWN)) {
4997+
auto ArgString = A->getAsString(Args);
4998+
std::string Nearest;
4999+
if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5000+
Diags.Report(diag::err_drv_unknown_argument) << ArgString;
5001+
else
5002+
Diags.Report(diag::err_drv_unknown_argument_with_suggestion)
5003+
<< ArgString << Nearest;
5004+
}
50035005
}
50045006

50055007
ParseFileSystemArgs(Res.getFileSystemOpts(), Args, Diags);

clang/test/Driver/unsupported-option.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,7 @@
3232
// RUN: not %clang -c -Qunused-arguments --target=aarch64-- -mfpu=crypto-neon-fp-armv8 %s 2>&1 \
3333
// RUN: | FileCheck %s --check-prefix=QUNUSED_ARGUMENTS
3434
// QUNUSED_ARGUMENTS: error: unsupported option '-mfpu=' for target 'aarch64--'
35+
36+
// RUN: %clang %s -invalid --allow-unrecognized-arguments -### 2>&1 | \
37+
// RUN: FileCheck %s --check-prefix=UNKNOWN_ARGUMENT
38+
// UNKNOWN_ARGUMENT: warning: argument unused during compilation: '-invalid'

0 commit comments

Comments
 (0)