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

    <tr>
        <th>Summary</th>
        <td>
            clang-diagnostics: -Wswitch-default and -Wcovered-switch-default contradictory warnings
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    When having both `-Wswitch-default` and `-Wcovered-switch-default` this generates contradictory warnings.

[Example](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:5,endLineNumber:9,positionColumn:5,positionLineNumber:9,selectionStartColumn:5,selectionStartLineNumber:9,startColumn:5,startLineNumber:9),source:'%23include+%3Ccstdint%3E%0A%0Aenum+class+ETest+:+std::uint8_t%0A%7B%0A++++TEST1,%0A++++TEST2,%0A%7D%3B%0A%0Aauto+main()+-%3E+int%0A%7B%0A++++ETest+test+%3D+ETest::TEST2%3B%0A++++%5B%5Bmaybe_unused%5D%5D%0A++++int+++a+%7B%7D%3B%0A%0A++++switch+(test)%0A++++%7B%0A++++++++case+ETest::TEST1:+a+%3D+1%3B+break%3B%0A++++++++case+ETest::TEST2:+a+%3D+2%3B+break%3B%0A++++++++//+default:+++++++++++a+%3D+99%3B+break%3B%0A++++%7D%0A%0A++++return+0%3B%0A%7D'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:33.333333333333336,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:clang_trunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,libs:!(),options:'-std%3Dc%2B%2B23+-Wall+-Wextra+-Wpedantic+-Wswitch-default+-Wcovered-switch-default',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+x86-64+clang+(trunk)+(Editor+%231)',t:'0')),k:33.333333333333336,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:output,i:(compilerName:'AVR+gcc+13.2.0',editorid:1,fontScale:14,fontUsePx:'0',j:1,wrap:'1'),l:'5',n:'0',o:'Output+of+x86-64+clang+(trunk)+(Compiler+%231)',t:'0')),k:33.33333333333333,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)

```c++
#include <cstdint>

enum class ETest : std::uint8_t
{
    TEST1,
 TEST2,
};

auto main() -> int
{
    ETest test = ETest::TEST2;
    [[maybe_unused]]
    int   a {};

    switch (test)
    {
        case ETest::TEST1: a = 1; break;
        case ETest::TEST2: a = 2; break;
        // default:           a = 99; break;
    }

    return 0;
}
```

What I would expect is that `-Wswitch-default` is suppressed when dealing with enums and every case is covered, but active otherwise.

The way it is now, you will miss out on at least one of those three possible cases that require a warning:

- A switch statement that is not handling an enum doesn't have a default case (which is bad)
- A switch statement that is dealing with an enum is fully defined but has a default case (which is bad)
- A switch statement that is dealing with an enum is not fully defined and doesn't have a default case (which is bad)

This was not the case in earlier versions of clang, which handled this correctly.

My version is

```text
Ubuntu clang version 19.0.0 (++20240222031214+307409a8872f-1~exp1~20240222151237.1514)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWEuv4ygW_jVkgxLZEOexyCJO7h21NNM1mrrdtSxhc2LThSED-CbZ9G8fAU5i51F9u1UjdWQ59uG8ge8czKwVlQJYoSxH2XbEWldrs3plstT_ADMqND-tvtSgcM3ehapwoV2N0SwZf7EH4cp6zGHHWunQLMFM8ThU6ncwwMf3LK4WFlegwDAHFpdaOcO4KJ02J3xgRglV2QlKtihZd_csfzmyZi8BZVtEFrVze4voGpFXRF4rzQst3USbKhBoFYZSRBaILJ6_1IiuS83hhQunDSIbEUYXOyFBsQbC2zxFZI7IZqeV-1wy6anptCP8YuHfx8iWRLbf_DAiG8mUt1UikpG8u20sSCid0CraAcU3WraNf80Q2YDi_xQKfm6bAgyi6yUim722wksMGM_EO-6Lgc-OGTeQGQ7dS94LPOILrLo1ZZccHxkVqpQtBxQCpZvSOi6U888viGTJOtxAtQ0ieSmZtYjkL29gnZfwanLruH-g61Yot_jqzmLzvHvKL9fby-c3n-CHA-Q6kM233oP86gFrnUYkb5hQYf6XiOTjzss8OvzM6Nlb1zlNMrq9kIPjnfWrwbx3ZVm8NexUwNdWtRa4J2zPt6FA8KV7ZlFB8Okuor5Q3GbheRHdXD7y5EFw_atkFu4DS-MssV7oaedKXhhg354F_keKyb1i8icVRwhAJD8DDP0O6zCpwd5y-SGDMfkP8m7AtUYhkieDyfHs87hfZNwqWQQINYALHd82fZjIuw0WCbTDH9eX63biN0TXlE7o4De7mpx-x2R88SCaPNC-eYyVzV5I6CHlhULXpUe8r8606psHRyEdmAjRi2JgvxCKmdMAWyPpU_EblG4wUOqmAeU-KXka6OBQtNWGSWkH7BwapioJQ15hPPC9gx2Q4Qhl64YYL5QDOeCSojDMnDaaD5U6I5q-qE_ZTrLK_irg8GkP6ofXDikK25sQb1DvPZ53YY09hvo13RMj1EPcFyZl-IejMyw87YEz5UQZXm4KtCc9qd1x_byDMYLDrTffKW7pg-KWPipu6bPilj4vbvdD95L3Ao_4BsUt_fDmRSQ_Lmbj2TSWN1V1IBy3wjK-nXuMy55e_m22tW7dvnX3m_rnSwu0_vU_iORV6ddLSidkct5DISjBu6T-yWV-MGx_u4c-kO5Pnbu53n0o85sLav3l3P-I1PeiI3-o5JHwOxgbd9fUE_rd8SyJV9lVpUi9NGYYXZsy-tKX9E0ZDi0ZDpUZI7rGd81YFJh3ejHG-NKERcql9eo4t4jmfTO-88LXvguPEX3B3pt7zdENF33Z4vt-occbjivDpirb-uvCIZTDGDPsTdx55RkiwOFez3TV3nfL_3wLc-uQ74y8frrFKaI5jj0E_YAkuUqS55Kxu8HX3gZff1F4uXws7eO9CTa2Kji55uHCc15BfZEvNXP4J3zQreQYjnsoHRYWO09-cvgTFtt2vzdgLXB88EdGDkz6M-NBuBr79WbDERHewZxiYoQ_AoZ6g8gGF63DLNRrrF0N5iAsDM6CbzXgAzthEbxR-uClTrrFByElboS1WLcOa4WZwxKY9c-A9Q67WlvArjYAeK-tFYWE4EIXlIH_tsIAZudDqJ-tnuUxXp8XjHXMgW9NomRwxOGaKR6CZSqEirkGqxCZ-6F3r7jLVQwckcWhFmXtxQvGL6vvu3YG-TzbERbvWilPXr9QwEMWa2b_rxZ9xEOrfmL_WsjnqRUWH1hU7Wro1ofCwIwUYHCHgdbPZgf4GxwVhtwDjx8XSm180ydPg5Xzr9NZARb2IYA6OHag9EvRKtdGIxepdDlJJgkOKOaBliRkmhBCEpoSX_BymsynyZItFnOyG6e_w3Gf_n5mSrOU0PkkzdIrfr8xU0HY1sfF7OtsOt6XYylUexxXqj3nxADjuNE8tKZ-4YpjHPpJWcekBL4VvoPxYNFag8hrIdRNYCO-onxJl2wEq3SeLJaUTLPZqF5NeQK7jE4hoxmdLgpGIS2ydMoTlnLC5iOx6gKYJXMyp7PJbg58TvhusUinJStmaJpAw4ScSPneTLSpRsLaFlYLspwlI8kKkDZ8WSJEwQGHQUQIyrYjs_Iy46KtLJomUlhnr1qccBJWYQLGXLBKaetE6csrvoWesPCeda1Pvi-NWiNXN9-RhKvbYlLqBpFX70f3N94bHY4m5DV4bxF5DdH9LwAA__98a2RA">