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

    <tr>
        <th>Summary</th>
        <td>
            Unable to use clang header with GCC <9.3 with `-Werror`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    Due to a bug in GCC, any compilation with GCC older than 9.3 that uses `clang/Basic/PointerAuthOptions.h` throws a warning:

"‘clang::PointerAuthSchema::DiscriminationKind’ is too small to hold all values of ‘enum class clang::PointerAuthSchema::Discrimination’"

The [GCC Bug](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51242) was fixed in 9.3 (also 8.4), the following shows the issue with various compilers: https://godbolt.org/z/Ko48cbj1T. 

While this is only a warning, it is now impossible to compile code with `-Werror`, because there is no separate warning flag for this warning. So the warning cannot be turned off and it cannot be marked `-Wno-error=...`.

This is a regression in clang 19, caused by https://github.com/llvm/llvm-project/pull/93906.

The following patch can be applied to `clang/Basic/PointerAuthOptions.h` and is sufficient to workaround the issue, and I strongly feel this should be included in a point release

```patch
@@ -63,17 +63,17 @@
   };
 
 private:
-  Kind TheKind : 2;
+  unsigned TheKind : 2;
   unsigned IsAddressDiscriminated : 1;
   unsigned IsIsaPointer : 1;
   unsigned AuthenticatesNullValues : 1;
-  PointerAuthenticationMode SelectedAuthenticationMode : 2;
-  Discrimination DiscriminationKind : 2;
+  unsigned SelectedAuthenticationMode : 2;
+  unsigned DiscriminationKind : 2;
   unsigned Key : 2;
   unsigned ConstantDiscriminator : 16;
 
 public:
-  PointerAuthSchema() : TheKind(Kind::None) {}
+  PointerAuthSchema() : TheKind(llvm::to_underlying(Kind::None)) {}
 
   PointerAuthSchema(
       ARM8_3Key Key, bool IsAddressDiscriminated,
@@ -81,11 +81,11 @@
       Discrimination OtherDiscrimination,
       std::optional<uint16_t> ConstantDiscriminatorOrNone = std::nullopt,
       bool IsIsaPointer = false, bool AuthenticatesNullValues = false)
-      : TheKind(Kind::ARM8_3), IsAddressDiscriminated(IsAddressDiscriminated),
+      : TheKind(llvm::to_underlying(Kind::ARM8_3)), IsAddressDiscriminated(IsAddressDiscriminated),
         IsIsaPointer(IsIsaPointer),
         AuthenticatesNullValues(AuthenticatesNullValues),
-        SelectedAuthenticationMode(AuthenticationMode),
-        DiscriminationKind(OtherDiscrimination), Key(llvm::to_underlying(Key)) {
+        SelectedAuthenticationMode(llvm::to_underlying(AuthenticationMode)),
+        DiscriminationKind(llvm::to_underlying(OtherDiscrimination)), Key(llvm::to_underlying(Key)) {
     assert((getOtherDiscrimination() != Discrimination::Constant ||
             ConstantDiscriminatorOrNone) &&
            "constant discrimination requires a constant!");
@@ -103,7 +103,7 @@
                           OtherDiscrimination, ConstantDiscriminatorOrNone,
                           IsIsaPointer, AuthenticatesNullValues) {}
 
-  Kind getKind() const { return TheKind; }
+  Kind getKind() const { return Kind(TheKind); }
 
   explicit operator bool() const { return isEnabled(); }
 
@@ -130,7 +130,7 @@
 
   Discrimination getOtherDiscrimination() const {
     assert(getKind() != Kind::None);
-    return DiscriminationKind;
+    return Discrimination(DiscriminationKind);
   }
 
   uint16_t getConstantDiscrimination() const {
@@ -149,7 +149,7 @@
   }
 
   PointerAuthenticationMode getAuthenticationMode() const {
-    return SelectedAuthenticationMode;
+    return PointerAuthenticationMode(SelectedAuthenticationMode);
   }
 
   ARM8_3Key getARM8_3Key() const {

```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykWF-TmzgS_zTyS9dQIDwMPPhhbMdXqdRuri6528eUgDYoK0s-Sczs5NNfSfwx2OBMbinXWEbqf7_u_kkaZgyvJOKGPG7J437FGlsrvfnOcs1qdoqeVrkq3zb7BsEqYJA3FXAJ_9jtCN0Bk29QqNOZC2a5kvDKbe3mQIkSNdiaSciC2A0sNAYNkCQsBJMVoYctM7wg9PBPxaVF_dzY-vPZqTFBTZIQbK3VqwEGr0xLLisSP5NwT8L-L6XkAyVpSLK0VRk_k_h5pO1LUeOJta_33BSan7j0jn7isuyFM-AGrFJgTkwIF2WtRAlu_MJEgwbUEQZLKJsTFIIZA79qdDDoPB8F8rVGII9bB9u2qcjjntC0tvZsnBJ6IPRQFUVQySZQ2uGWN9UPLgQj9GBq9fotb6qgqDiJD7wk8f4xomtKaAavzMCR_4WlS5jLAqEpE0ZBGqwJzVz-bI1wVEKoVy4rcNqMf8eNabDN5gvTXDWmSzNq5xVcuafKXAnbufeD0MMntU6L_Hv0NYBxpH_UXCDYmhuHuZLibZRdugNu3XupXoGfzsoYngtfdp1tKFTZeUWS8OEP1FppkoRONMeCNcYpR42tFjB4ZppZ7E3AUbAKjkq3LnRvA_iifND9qoJJqSzkCLbREktQxyMwWTr3LnMnpv_EsnVEqofWl3gfBAFJwmCa3zZeBhorjca4TuGyrR-IfCK88yXkb9fQcls3eVCoE6EHIV76r4ezVt-xsIQezo0QhB6yOAuT4LquLsk9M1vUzn_nPDufBcfSYfsLDekxMGCa45EXHKV18q9K_8m0amR5qZyWGkr4CMZqJSvxBkdE0cJuatWI0nnBZSGasq1PBmdnFTQKZAYnjZ6E7ceH0L1bh2QdwkMSE7qLnoDQ7TD0U-0yACBPexJvu5_d11nzF2ZxIJQHAMcI8LVG_-1KnA5ShG4BGul5cmkNjFZ8NM9l6fI8an9sBaIFgY-GdaDfWebygdLyglk0vzdC_Kelp6nEA8Aof916ruRvrne-oMDCYjkzNY3nAWBKXnBLoHdherelqdhPrYwB-YRvd2Z3ShrLpB2pVB28yW1FNLngxbggbimdpo5VnYKuBghN_Zfn-t-VRD__tHUld4ntfYp8b3tFVn1rZIlavHlWvDVxbQWG2GdN9ZPuef7Xb-m32OH2Cd88bSolFgqW0N2019LINVjkem0YTnvNPVdl89kR8tU-2CvuJIzt4lOebJgg8a7h0kbJN0viD_OJ_KwdGkDi_UVeNkKos73W38U46bE9HJkwOECw3FvDymwoDfcslUGLcLe9LgGbLk1kF9Bd6dwaek-ZjFz4u15A_4zh85LjnzPrF_AkNF2cuWh56LUsk8hU0fByRsfMwY-ms1XpwfJ9cQ9mNz-04DRVP3F4WelCKDPVsBDPsuqlSP_fYL0PzBjU1vNYWqGdtdFyHI1cB13NeVt9VwN52rnPtH7cc6fvW92J-9zIEUqLXnc5JSON_224RncU65c4D6k7Ll82pI7uotAdKPzRYhje0t3cM8959-OZA2D6THtut9xis7tDf8Sp0HY14xZ6FNxy0OgOuwPTxFuY7mLvEe7mBrbKJmou2xT-dRa84BbUGbXflR0HL2nl5oNkucDO7JzOIWVxOKSsH45TNnhwtUndreHBobkGmCLSlfvtjj06VkEf10wjx1NGmV1IaDpHAdn4DDSDeb-hulhnCnEx3AHadTZA2w9vD9rL55GrM2CFdpYjZzwYY3aHX-exW_SA0PQeWf8MzstBykXS_1iAcHqLWZWbuMzijK1wEz3RJMmi5DFd1Zt0jVkYPz5heMyzJGJxkUXHMGMsy8IyQrbiGxrSdZhFKQ3jdZQGjKWYR0USJusyjmNK1iGeGBeBo3R3HV_569gmCrMooyvBchSm_0-P3viLZN5UhqxDwY01FznLrcDNv33juVueu1q399UaWYn68p8eEu-yIJ65la8aLTa_fJv1DhtCD53PLxv6vwAAAP__lnW0eg">