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

    <tr>
        <th>Summary</th>
        <td>
            Unable to compile LLVM with GCC 8.1
        </td>
    </tr>

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

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

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

<pre>
    I am currently unable to compile LLVM using GCC 8.1.0. The failure comes from `llvm/lib/Support/APFloat.cpp`, where some versions of GCC do not consider an enum a valid constant expression. This only seems to be a problem with GCC 8.1 and 8.2, but these are both supported compilers according to <https://llvm.org/docs/GettingStarted.html#host-c-toolchain-both-compiler-and-standard-library>.

Below is the build failure with LLVM 17, although I see looking at `main` that the same code exists and will have the same problem.

<details>

```
..../llvm-src/lib/Support/APFloat.cpp:127:61: error: 'const llvm::fltSemantics{15, -14, 11, 16, IEEE754, IEEE}' is not a constant expression
 static constexpr fltSemantics semIEEEhalf = {15, -14, 11, 16};
 ^
..../llvm-src/lib/Support/APFloat.cpp:128:60: error: 'const llvm::fltSemantics{127, -126, 8, 16, IEEE754, IEEE}' is not a constant expression
 static constexpr fltSemantics semBFloat = {127, -126, 8, 16};
 ^
..../llvm-src/lib/Support/APFloat.cpp:129:65: error: 'const llvm::fltSemantics{127, -126, 24, 32, IEEE754, IEEE}' is not a constant expression
 static constexpr fltSemantics semIEEEsingle = {127, -126, 24, 32};
 ^
..../llvm-src/lib/Support/APFloat.cpp:130:67: error: 'const llvm::fltSemantics{1023, -1022, 53, 64, IEEE754, IEEE}' is not a constant expression
 static constexpr fltSemantics semIEEEdouble = {1023, -1022, 53, 64};
 ^
..../llvm-src/lib/Support/APFloat.cpp:131:69: error: 'const llvm::fltSemantics{16383, -16382, 113, 128, IEEE754, IEEE}' is not a constant expression
 static constexpr fltSemantics semIEEEquad = {16383, -16382, 113, 128};
 ^
..../llvm-src/lib/Support/APFloat.cpp:132:61: error: 'const llvm::fltSemantics{15, -14, 3, 8, IEEE754, IEEE}' is not a constant expression
 static constexpr fltSemantics semFloat8E5M2 = {15, -14, 3, 8};
 ^
..../llvm-src/lib/Support/APFloat.cpp:141:64: error: 'const llvm::fltSemantics{127, -126, 11, 19, IEEE754, IEEE}' is not a constant expression
 static constexpr fltSemantics semFloatTF32 = {127, -126, 11, 19};
 ^
..../llvm-src/lib/Support/APFloat.cpp:142:76: error: 'const llvm::fltSemantics{16383, -16382, 64, 80, IEEE754, IEEE}' is not a constant expression
 static constexpr fltSemantics semX87DoubleExtended = {16383, -16382, 64, 80};
 ^
..../llvm-src/lib/Support/APFloat.cpp:143:53: error: 'const llvm::fltSemantics{0, 0, 0, 0, IEEE754, IEEE}' is not a constant expression
 static constexpr fltSemantics semBogus = {0, 0, 0, 0};
 ^
..../llvm-src/lib/Support/APFloat.cpp:154:66: error: 'const llvm::fltSemantics{-1, 0, 0, 128, IEEE754, IEEE}' is not a constant expression
 static constexpr fltSemantics semPPCDoubleDouble = {-1, 0, 0, 128};
 ^
..../llvm-src/lib/Support/APFloat.cpp:181:71: error: 'const llvm::fltSemantics{1023, -969, 106, 128, IEEE754, IEEE}' is not a constant expression
                                                           53 + 53, 128};
 ^
[ 25%] Building CXX object lib/Support/CMakeFiles/LLVMSupport.dir/Chrono.cpp.o
[ 25%] Building CXX object lib/Support/CMakeFiles/LLVMSupport.dir/COM.cpp.o
[ 25%] Building CXX object lib/Support/CMakeFiles/LLVMSupport.dir/CodeGenCoverage.cpp.o
..../llvm-src/lib/Support/APFloat.cpp: In instantiation of 'void llvm::detail::IEEEFloat::initFromIEEEAPInt(const llvm::APInt&) [with const llvm::fltSemantics& S = llvm::semIEEEquad]':
..../llvm-src/lib/Support/APFloat.cpp:3818:37: required from here
..../llvm-src/lib/Support/APFloat.cpp:3788:10: error: in argument to unary !
         (!significand_mask ||
 ^~~~~~~~~~~~~~~~~
..../llvm-src/lib/Support/APFloat.cpp: In instantiation of 'void llvm::detail::IEEEFloat::initFromIEEEAPInt(const llvm::APInt&) [with const llvm::fltSemantics& S = llvm::semIEEEdouble]':
..../llvm-src/lib/Support/APFloat.cpp:3822:39: required from here
..../llvm-src/lib/Support/APFloat.cpp:3788:10: error: in argument to unary !
..../llvm-src/lib/Support/APFloat.cpp: In instantiation of 'void llvm::detail::IEEEFloat::initFromIEEEAPInt(const llvm::APInt&) [with const llvm::fltSemantics& S = llvm::semIEEEsingle]':
..../llvm-src/lib/Support/APFloat.cpp:3826:39: required from here
..../llvm-src/lib/Support/APFloat.cpp:3788:10: error: in argument to unary !
..../llvm-src/lib/Support/APFloat.cpp: In instantiation of 'void llvm::detail::IEEEFloat::initFromIEEEAPInt(const llvm::APInt&) [with const llvm::fltSemantics& S = llvm::semBFloat]':
..../llvm-src/lib/Support/APFloat.cpp:3830:35: required from here
..../llvm-src/lib/Support/APFloat.cpp:3788:10: error: in argument to unary !
..../llvm-src/lib/Support/APFloat.cpp: In instantiation of 'void llvm::detail::IEEEFloat::initFromIEEEAPInt(const llvm::APInt&) [with const llvm::fltSemantics& S = llvm::semIEEEhalf]':
..../llvm-src/lib/Support/APFloat.cpp:3834:37: required from here
..../llvm-src/lib/Support/APFloat.cpp:3788:10: error: in argument to unary !
..../llvm-src/lib/Support/APFloat.cpp: In instantiation of 'void llvm::detail::IEEEFloat::initFromIEEEAPInt(const llvm::APInt&) [with const llvm::fltSemantics& S = llvm::semFloat8E5M2]':
..../llvm-src/lib/Support/APFloat.cpp:3838:39: required from here
..../llvm-src/lib/Support/APFloat.cpp:3788:10: error: in argument to unary !
..../llvm-src/lib/Support/APFloat.cpp: In instantiation of 'void llvm::detail::IEEEFloat::initFromIEEEAPInt(const llvm::APInt&) [with const llvm::fltSemantics& S = llvm::semFloatTF32]':
..../llvm-src/lib/Support/APFloat.cpp:3858:38: required from here
..../llvm-src/lib/Support/APFloat.cpp:3788:10: error: in argument to unary !
[ 25%] Building CXX object lib/Support/CMakeFiles/LLVMSupport.dir/CommandLine.cpp.o
```

</details>

I can reproduce this reliably outside of LLVM with GCC 8.1 and 8.2, this seems to be isolated to these versions as GCC 7.5 and GCC 8.3 both work. See https://godbolt.org/z/7d68GK45n. I can make this work again by casting to and from an int, see https://godbolt.org/z/qTP3G31v8.

I also confirmed that this fix works in LLVM using the following patch.

```
--- a/llvm-src/lib/Support/APFloat.cpp
+++ b/llvm-src/lib/Support/APFloat.cpp
@@ -112,9 +112,9 @@ struct fltSemantics {
   /* Number of bits actually used in the semantics. */
   unsigned int sizeInBits;
-  fltNonfiniteBehavior nonFiniteBehavior = fltNonfiniteBehavior::IEEE754;
+  fltNonfiniteBehavior nonFiniteBehavior = fltNonfiniteBehavior(int(fltNonfiniteBehavior::IEEE754));
- fltNanEncoding nanEncoding = fltNanEncoding::IEEE;
+  fltNanEncoding nanEncoding = fltNanEncoding(int(fltNanEncoding::IEEE));
   // Returns true if any number described by this semantics can be precisely
   // represented by the specified semantics. Does not take into account
   // the value of fltNonfiniteBehavior.
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWt9v2zgS_muYl4EFibJ--MEPdhIXwbV7xbV36NuBksYWNxTpklTS7MP97YehbMfOJt2mtruHvQaCIonS8OP3zQxFjYVzcqURpyybs-zqQvS-NXb6q6isaEWXFBeVaR6mNyA6qHtrUXv1AL0WlULwBmrTraVCePv2X--gd1Kv4M3lJZRREsURfGwRlkKq3iLdiQ6W1nTA8lipu47xhZIV44sP_XptrGd8MXu_UEb4qF6vWR4zfgn3LVoEZzqEO7ROGu3ALEMnjQFtPNRGO9mgBaEBdd-BgDuhZBMavNAe8MvaoqNnCZJ0YLR6AIfYORpDhSBgbU2lsIN76dvtEEDoBsqIE46q9-BbdAjCIlTGt-AG2NhsWbAORF0b2xAN3gBLL1vv146lM8YXNFx110XGrhhfNKZ2jC_eoPdSrz54QYai1neK8bQ1zo_qkTdG1a2QekT9jba9jIRuRjSyRthmpGRlhX1g6XXE4isWz4b9HJW5B-kINFS9VM1OiTDEIFhS0NCE8q3pVy3cECegjLmlAQhPQnVCapbH4FsRCAAnOhKzQcAv0nkXSLqXSkEr7vDxlg2hB6BYetmgF1I5ll4fNOTxZgunURRFG7pGztZ_4CjpLOEFS2d5wtIZoLXG0gHjRfAACL6Wzlg6Wyr_ATuhvawdK-ZJRsMfJWP6lyRhn9P-5vr6usjG20NWXDFeEJnkb-I5xxpwg_PCy3q4gRphv0dw2JG5VqglsPQKXoRQXLF0vjHJsuvvJaUkUuLXksKLARIPVJQ_gpV5wL3j5HkEJyJlQqRkx5HCAwkpP7-vUEZV-AIzOxinoSYlV8mL11IT83QAFfNASBZO8_H5yWlMX-2R8yKQE9FD6SWfvJaePC03sPK05EOYhwsUn2en6HMvmh1BX4VyIpL40Yk43QX9-agJmMvr7B1_NhFvIJyGknHwm_FxGWczNUx-AC0fFyl_IeHsUJyIGXKWIj8-ooZkU8bnZedTWVyFjHP9xaNu8GuBtUN0IqZSls6y9JVMBT6e7M44iZtV77aU_K7r0_CQURjlr_WYUXKI5uyZ9_37y8FTrg5mqOdwnIaXknJM8eq0u50xJ3lILEmcn4Ke7__LUmB8vpm4X2SHZXPgGeMZy65gTksbWq5cfvoEpvoVaw9Pybp8J25xIRXSiosWPpumqJGWmltrtCEqI3OmHv7-7qzmTYNvUF-aO7RihftdvdaT4EaDHISVwkujabHNeHFnZLPnSMMqbjgm5wgmhlOppV9YE94-Zu9vtGe8fOqHm-s54xNg2TwsSL_qqzyHDyGKHtv3XnBYRq5Jl79rzGmZ0EopDW--Fj_30mIzfKlo0eJ3Gi1KMpocLr-kBmFXfYfagzfQa2EfgPHkSeQwisDEyZWWS1kL3fy7E-4WWHFJ2y4c_vPk7_9E8uG1_2jROb19pJM_W_S_vFzDEvZ4ufKfcp1bruE7zNFShQ8JafZTqjNHVivU8nixxv8Tc99fWqzHzw3Hy1X-TIM_RK6Pi_R4tbKgVvlnq3X6BUfXCd28lfpgsfGkirOr-TC-eL7scwO10GBxbU3T1wi-lQ4sKikq9QCm9042SJ4SqlUvlebCU_vVPOmMEh4bOh1qdrvSoXDBQhFlwcJgLR3qeffG3kbwAREOq3Yr01RG-U3h7jfGF0WTl2_-Ns50BMMQOnG7QU9GQKyE1FA9QC2c3xQDqbsgvaBI8ATcfUNXnz--T9-kyV0ZHRInlDPk20tpOxrpUJ6TDpbySwDhyCf2yrK-RVgapcw9na2Fr9voKyW40WgE4tv9cjDB58MG1WufHMdsHMMoSUjRCTA-3x0OTc7bvvaHX1pYMd8tnAJ_M_il7yq05DKV9A5E7Xuh1AP0DhsiJJQntwYiYDwQvzXS61ANpzs9OPkb3ui59G73DWIEBOAXYl1Lj3NsxZ00FrTRi8MrlFOeu_UxtRXZeGeXKDvaMi-DW5V_3C2f0PY4KHpC6Gtdm5AX9N7xtrfHS4-mfg__243sg33W9iHGrcAL-Af63moH3vYIcglCP4AeRG_Q1VZW2FDkbZLC1lUoSCuEtcVaOlQPT81SDkKH2m-fRnBrrOVSYrPvMFcGhw9gniJeagrsuja99k8tkok7ofqQv57TJHoSdxfNNG0m6URc4DQp4iLl-aScXLTTZV6N-XhS1WKZTxKRJLngcVHmGecTsRyPL-SUx3wc87hICj4ZT6KqadJ0GVdxIeI4XlIAYSekirY_QLiQzvU4LZM4SS-UqFC58AsQzjXeQ2hknKa_CzsNcVz1K8fGsZLOu0crXnqF038-_2uQ_XR90Vs1fZLqpG_7KqpNt8kV25SxtobmJMYXAQfNQAHnfwMAAP__yhaFnw">