Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -1354,9 +1354,9 @@ HelpText<"Attempt to match the ABI of Clang ">; def fclasspath_EQ : Joined<["-"], "fclasspath=">, Group; defm color_diagnostics : OptInCC1FFlag<"color-diagnostics", "Enable", "Disable", " colors in diagnostics", - [CoreOption, FlangOption]>; -def : Flag<["-"], "fdiagnostics-color">, Group, Flags<[CoreOption]>, Alias; -def : Flag<["-"], "fno-diagnostics-color">, Group, Flags<[CoreOption]>, Alias; + [CoreOption, FlangOption, FC1Option]>; +def : Flag<["-"], "fdiagnostics-color">, Group, Flags<[CoreOption, FlangOption, FC1Option]>, Alias; +def : Flag<["-"], "fno-diagnostics-color">, Group, Flags<[CoreOption, FlangOption, FC1Option]>, Alias; def fdiagnostics_color_EQ : Joined<["-"], "fdiagnostics-color=">, Group; def fansi_escape_codes : Flag<["-"], "fansi-escape-codes">, Group, Flags<[CoreOption, CC1Option]>, HelpText<"Use ANSI escape codes for diagnostics">, Index: clang/lib/Driver/ToolChains/Flang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Flang.cpp +++ clang/lib/Driver/ToolChains/Flang.cpp @@ -47,7 +47,9 @@ Args.AddAllArgs(CmdArgs, {options::OPT_module_dir, options::OPT_fdebug_module_writer, options::OPT_fintrinsic_modules_path, options::OPT_pedantic, - options::OPT_std_EQ, options::OPT_W_Joined}); + options::OPT_std_EQ, options::OPT_W_Joined, + options::OPT_fcolor_diagnostics, + options::OPT_fno_color_diagnostics}); } void Flang::ConstructJob(Compilation &C, const JobAction &JA, Index: flang/include/flang/Frontend/FrontendOptions.h =================================================================== --- flang/include/flang/Frontend/FrontendOptions.h +++ flang/include/flang/Frontend/FrontendOptions.h @@ -214,7 +214,7 @@ struct FrontendOptions { FrontendOptions() : showHelp(false), showVersion(false), instrumentedParse(false), - needProvenanceRangeToCharBlockMappings(false) {} + needProvenanceRangeToCharBlockMappings(false), showColors(false) {} /// Show the -help text. unsigned showHelp : 1; @@ -230,6 +230,9 @@ /// compilation. unsigned needProvenanceRangeToCharBlockMappings : 1; + /// Enable color diagnostics. + unsigned showColors : 1; + /// Input values from `-fget-definition` struct GetDefinitionVals { unsigned line; Index: flang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- flang/lib/Frontend/CompilerInvocation.cpp +++ flang/lib/Frontend/CompilerInvocation.cpp @@ -497,6 +497,9 @@ } } + res.getFrontendOpts().showColors = + parseShowColorsArgs(args, /*defaultDiagColor=*/true); + return diags.getNumErrors() == numErrorsBefore; } Index: flang/lib/Frontend/TextDiagnosticPrinter.cpp =================================================================== --- flang/lib/Frontend/TextDiagnosticPrinter.cpp +++ flang/lib/Frontend/TextDiagnosticPrinter.cpp @@ -46,14 +46,16 @@ // We only emit diagnostics in contexts that lack valid source locations. assert(!info.getLocation().isValid() && - "Diagnostics with valid source location are not supported"); + "Diagnostics with valid source location are not supported"); - Fortran::frontend::TextDiagnostic::printDiagnosticLevel(os, level, - diagOpts->ShowColors); + clang::DiagnosticsEngine &diagsEngine = + const_cast(*info.getDiags()); + Fortran::frontend::TextDiagnostic::printDiagnosticLevel( + os, level, diagsEngine.getShowColors()); Fortran::frontend::TextDiagnostic::printDiagnosticMessage( os, /*IsSupplemental=*/level == clang::DiagnosticsEngine::Note, - diagMessageStream.str(), diagOpts->ShowColors); + diagMessageStream.str(), diagsEngine.getShowColors()); os.flush(); return; Index: flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp =================================================================== --- flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -158,6 +158,11 @@ return false; } + // Honor color diagnostics. + if (flang->getFrontendOpts().showColors) { + flang->getDiagnostics().setShowColors(true); + } + // Create and execute the frontend action. std::unique_ptr act(createFrontendAction(*flang)); if (!act) Index: flang/test/Driver/driver-help.f90 =================================================================== --- flang/test/Driver/driver-help.f90 +++ flang/test/Driver/driver-help.f90 @@ -83,6 +83,7 @@ ! HELP-FC1-NEXT: -falternative-parameter-statement ! HELP-FC1-NEXT: Enable the old style PARAMETER statement ! HELP-FC1-NEXT: -fbackslash Specify that backslash in string introduces an escape character +! HELP-FC1-NEXT: -fcolor-diagnostics Enable colors in diagnostics ! HELP-FC1-NEXT: -fdebug-dump-all Dump symbols and the parse tree after the semantic checks ! HELP-FC1-NEXT: -fdebug-dump-parse-tree-no-sema ! HELP-FC1-NEXT: Dump the parse tree (skips the semantic checks) @@ -119,6 +120,7 @@ ! HELP-FC1-NEXT: -fno-analyzed-objects-for-unparse ! HELP-FC1-NEXT: Do not use the analyzed objects when unparsing ! HELP-FC1-NEXT: -fno-automatic Implies the SAVE attribute for non-automatic local objects in subprograms unless RECURSIVE +! HELP-FC1-NEXT: -fno-color-diagnostics Disable colors in diagnostics ! HELP-FC1-NEXT: -fno-reformat Dump the cooked character stream in -E mode ! HELP-FC1-NEXT: -fopenacc Enable OpenACC ! HELP-FC1-NEXT: -fopenmp Parse OpenMP pragmas and generate parallel code.