diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4005,6 +4005,8 @@ HelpText<"Print the paths used for finding ROCm installation">; def print_runtime_dir : Flag<["-", "--"], "print-runtime-dir">, HelpText<"Print the directory pathname containing clangs runtime libraries">; +def print_diagnostic_options : Flag<["-", "--"], "print-diagnostic-options">, + HelpText<"Print all of Clang's warning options">; def private__bundle : Flag<["-"], "private_bundle">; def pthreads : Flag<["-"], "pthreads">; defm pthread : BoolOption<"", "pthread", diff --git a/clang/lib/Basic/DiagnosticIDs.cpp b/clang/lib/Basic/DiagnosticIDs.cpp --- a/clang/lib/Basic/DiagnosticIDs.cpp +++ b/clang/lib/Basic/DiagnosticIDs.cpp @@ -653,7 +653,7 @@ } std::vector DiagnosticIDs::getDiagnosticFlags() { - std::vector Res; + std::vector Res{"-W", "-Wno-"}; for (size_t I = 1; DiagGroupNames[I] != '\0';) { std::string Diag(DiagGroupNames + I + 1, DiagGroupNames[I]); I += DiagGroupNames[I] + 1; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2010,6 +2010,13 @@ return false; } + if (C.getArgs().hasArg(options::OPT_print_diagnostic_options)) { + std::vector Flags = DiagnosticIDs::getDiagnosticFlags(); + for (std::size_t I = 0; I != Flags.size(); I += 2) + llvm::outs() << " " << Flags[I] << "\n " << Flags[I + 1] << "\n\n"; + return false; + } + // FIXME: The following handlers should use a callback mechanism, we don't // know what the client would like to do. if (Arg *A = C.getArgs().getLastArg(options::OPT_print_file_name_EQ)) { diff --git a/clang/test/Driver/print-diagnostic-options.c b/clang/test/Driver/print-diagnostic-options.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/print-diagnostic-options.c @@ -0,0 +1,13 @@ +// Test that -print-diagnostic-options prints warning groups and disablers + +// RUN: %clang -print-diagnostic-options | FileCheck %s + +// CHECK: -W +// CHECK: -Wno- +// CHECK: -W#pragma-messages +// CHECK: -Wno-#pragma-messages +// CHECK: -W#warnings +// CHECK: -Wabi +// CHECK: -Wno-abi +// CHECK: -Wall +// CHECK: -Wno-all