Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -826,7 +826,7 @@ HelpText<"Pass to the linker">, MetaVarName<"">, Group; def Xoffload_linker : JoinedAndSeparate<["-"], "Xoffload-linker">, - HelpText<"Pass to the offload linkers or the ones idenfied by -">, + HelpText<"Pass to the offload linkers or the ones idenfied by -">, MetaVarName<" ">, Group; def Xpreprocessor : Separate<["-"], "Xpreprocessor">, Group, HelpText<"Pass to the preprocessor">, MetaVarName<"">; @@ -3996,6 +3996,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", Index: clang/lib/Basic/DiagnosticIDs.cpp =================================================================== --- clang/lib/Basic/DiagnosticIDs.cpp +++ 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; Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ clang/lib/Driver/Driver.cpp @@ -2006,6 +2006,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)) { Index: clang/test/Driver/print-diagnostic-options.c =================================================================== --- /dev/null +++ clang/test/Driver/print-diagnostic-options.c @@ -0,0 +1,13 @@ +// Test that -print-diagnostic-options prints all warning groups + +// 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