<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/89878>89878</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Flang's CompilerInvocation.cpp should not copy->paste->edit from Clang's CompilerInvocation.cpp
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            flang:driver
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          jeffhammond
      </td>
    </tr>
</table>

<pre>
    Consider `parseShowColorsArgs` from flang/lib/Frontend/CompilerInvocation.cpp  and clang/lib/Frontend/CompilerInvocation.cpp.  The function has been copied almost verbatim except:
- Flang doesn't rely on `using namespace llvm::opt;`
- whitespace
- `showColors` and `value` follows a different case convention
- variable named `opt` instead of `O`
- default argument different, comment about it

Using copy->paste->edit like this tedious and error-prone.  Any bugs in the Clang driver code will need to be fixed manually a second time in Flang.  Due to the syntax changes that have no impact on code generation, this won't be as trivial because the patch to Flang will have to use the new variable names.

This code should be properly abstracted and reused.

Furthermore, Flang should follow https://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly.

```diff
< static bool parseShowColorsArgs(const llvm::opt::ArgList &args,
< bool defaultColor = true) {
<   // Color diagnostics default to auto ("on" if terminal supports) in the
<   // compiler driver `flang-new` but default to off in the frontend driver
< // `flang-new -fc1`, needing an explicit OPT_fdiagnostics_color.
---
> static bool parseShowColorsArgs(const ArgList &Args, bool DefaultColor) {
>   // Color diagnostics default to auto ("on" if terminal supports) in the driver
>   // but default to off in cc1, needing an explicit OPT_fdiagnostics_color.
12,27c10,24
<   } showColors = defaultColor ? Colors_Auto : Colors_Off;
<
<   for (auto *a : args) {
<     const llvm::opt::Option &opt = a->getOption();
<     if (opt.matches(clang::driver::options::OPT_fcolor_diagnostics)) {
< showColors = Colors_On;
<     } else if (opt.matches(clang::driver::options::OPT_fno_color_diagnostics)) {
< showColors = Colors_Off;
<     } else if (opt.matches(clang::driver::options::OPT_fdiagnostics_color_EQ)) {
< llvm::StringRef value(a->getValue());
<       if (value == "always")
<         showColors = Colors_On;
<       else if (value == "never")
<         showColors = Colors_Off;
<       else if (value == "auto")
<         showColors = Colors_Auto;
---
>   } ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
>   for (auto *A : Args) {
> const Option &O = A->getOption();
>     if (O.matches(options::OPT_fcolor_diagnostics)) {
>       ShowColors = Colors_On;
>     } else if (O.matches(options::OPT_fno_color_diagnostics)) {
>       ShowColors = Colors_Off;
>     } else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
>       StringRef Value(A->getValue());
>       if (Value == "always")
> ShowColors = Colors_On;
>       else if (Value == "never")
> ShowColors = Colors_Off;
>       else if (Value == "auto")
> ShowColors = Colors_Auto;
30,32c27,28
<
<   return showColors == Colors_On ||
<          (showColors == Colors_Auto &&
---
>   return ShowColors == Colors_On ||
>          (ShowColors == Colors_Auto &&
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0V12P4rgS_TXmpQQKDs3HAw8MDdKVrtT3bs_Oa8txKsSzjh3ZDjT_flVO0s1Xf83sSmgG0q5Tp07VsWPhvdoZxCW7-8bu7geiCaV1y59YFKWoKmvyQWbz43JtjVc5OmDTpBbO42NpD2urrfMrt_NsmkDhbAWFFmbH-FarjPHt1lkT0OSMb9e2qpVG9x-zt1IEZc1I1jWAMDnIrwWNAL6XCEVjJD2CUnjIEA1IWyvMQejK-gB7dJkIqgJ8llgHlq5Ycs-S1RC2lA9yi94wPgvgUB_BGqqt8crswIgKfS0kgtb7iiLTlSWIb2ya9CiHUoV2Vf-ETRP_IgtJQsWxabIXusEokdXaHjwIyFVRoEMTQAqPIK3Zo6Fqeqy9cEpkGiOXiEIEpgko4wOKHGxBDx9OCOVYiEYHEG7XVAT9koTxNUhbxYcis00AFdqo9t8_Y9XS1schSze18AHpC-YqgFZ_IYRSeQiYK9v4WBU6Z92wdtbgCGBljpA1Ow_KQCgR1q3ATu3RgbQ5wkFpDQYxh2AhQyjUM-ZQCdMIrY8gwKO0JoegKiSU2KIRwH2DFEGg_miCeAZZCrNDD6EUAUqxRzAWVFULGaiHMdsODbo4L1R5JH-wba8zBOEhOLVXQkOGUjQeI34tgiwpWTsekXHEDxb6NQYP553xo1Mdv1OmyMCXttE5ZaudrdFRjZkPTshAE2pycNh4zM_Ct40LJbrKOiTeLY8OqR0dKEOoPQ0k35Jh9L4aWUfeya300TG5MrvHIEwuXO5HZag04ylRHYZjjX7Y28YP-0L8UJh8iKapSDTr_LDnfMaOJi1-aKy6R-kafBBBScis1XBrZ-BzaY0Pl06iLyu3-6_yARifirh0_Qob8bqJjmjA0nsIrkHGF8Bm316XArRqQLsuV2JnrA9K-hdLBAuiCRYYnzPOaRQ4qAICukoZocE3dW1d8ITdzvANeNntRv1gs2kSt7uhwQM5M2vCaUJbFL0fim5L6yJfsTvkUyQYFnJMQvN1NAw5UxjA51orqQI8_O_7U3FS45OkqrtODYfDHnzz6c6ctKF93ql_f6L-heibf0f0C31OstzWVsrxL8k05oyv-UyOSWU-Oev17B5eN_E4dBdT2JXsn1axuHTV_34oCjoherBT1IIi-byTYyViWDvzV8MM8KZhHup44DE-tXWI3ATt0zsM7V-i0otTEhFPFZTc1mFU0R6HsfXxzI2oneh9KtobunSkYdTt6URJynDJ-kKxXhBzRYXkRe3x9zgZ-_Q7tM779A_yupq3p83_b_F6be1jcMrs_sAC2pcEPu87-qP73cZfEe67GsOoOiqQcS70QRw945yCLiLg832CUzUucxgkDb6W4obm7-Ygq3wtBdnxJcfZRti29_E86v6XXL25NvMqrl5dm3nTGfnVtQ8x8-p9z25OuvtwMoW_ZM1NJ9njx43f3DLC-wQ-58MPOFzp-0USnzPdC4kXw_UGW31kuM2Z4X58wnCbz-t9ZoJL7BtGexP6hozvYl8b7C3oM2OldGSmXPIZHZ3zm6edw9A4c2HTMxmAzdb0ubI2MX0zrrUmn9Lnlsu7vI-fzrs5y_tm3FXel1fhQb5M80W6EANcjmfjdJEuJotkUC4THC_upEhwMRPzu5nMZ_Nskk0nkzRdzHPBB2rJEz5JJnySTMfzcTK6m6SpmN0tMF8sBMeCTRKshNKj_iV_oLxvcDlfzGfzgRYZah9v7ZwX3fnUHU6c003eLSlwSNcyNkm08sG_QgUVNC637b175uGN23l39zA2vHE5jHf-9Qcwg8bp5fnFZadC2WQjaavuFtP9RzePnygD49tYLV1pYsF_BwAA__-4sh0j">