Repository: compiler-explorer/compiler-explorer
Pull request #6688 (2024-07-05 16:06:14)

Add LDC 1.39.0 and make it the default D compiler
infra: https://github.com/compiler-explorer/infra/pull/1356


Patch:
diff --git a/app.ts b/app.ts
index 92ba44195..a7837100c 100755
--- a/app.ts
+++ b/app.ts
@@ -538,10 +538,16 @@ async function main() {
     if (opts.prediscovered) {
         const prediscoveredCompilersJson = await fs.readFile(opts.prediscovered, 'utf8');
         initialCompilers = JSON.parse(prediscoveredCompilersJson);
-        await compilerFinder.loadPrediscovered(initialCompilers);
+        const prediscResult = await compilerFinder.loadPrediscovered(initialCompilers);
+        if (prediscResult.length === 0) {
+            throw new Error('Unexpected failure, no compilers found!');
+        }
     } else {
         const initialFindResults = await compilerFinder.find();
         initialCompilers = initialFindResults.compilers;
+        if (initialCompilers.length === 0) {
+            throw new Error('Unexpected failure, no compilers found!');
+        }
         if (defArgs.ensureNoCompilerClash) {
             logger.warn('Ensuring no compiler ids clash');
             if (initialFindResults.foundClash) {
@@ -642,7 +648,10 @@ async function main() {
             }),
         )
         // Handle healthchecks at the root, as they're not expected from the outside world
-        .use('/healthcheck', new healthCheck.HealthCheckHandler(compilationQueue, healthCheckFilePath).handle)
+        .use(
+            '/healthcheck',
+            new healthCheck.HealthCheckHandler(compilationQueue, healthCheckFilePath, compileHandler).handle,
+        )
         .use(httpRoot, router)
         .use((req, res, next) => {
             next({status: 404, message: `page "${req.path}" could not be found`});
diff --git a/etc/config/c++.amazon.properties b/etc/config/c++.amazon.properties
index 681bc8840..4f21450c4 100644
--- a/etc/config/c++.amazon.properties
+++ b/etc/config/c++.amazon.properties
@@ -415,7 +415,7 @@ compiler.clang1810.options=--gcc-toolchain=/opt/compiler-explorer/gcc-13.2.0
 compiler.clang1810.ldPath=${exePath}/../lib|${exePath}/../lib/x86_64-unknown-linux-gnu
 compiler.clang1810.debugPatched=true
 
-group.clangx86trunk.compilers=clang_trunk:clang_assertions_trunk:clang_concepts:clang_p1144:clang_autonsdmi:clang_bb_p2996:clang_p3068:clang_lifetime:clang_p1061:clang_parmexpr:clang_patmat:clang_embed:clang_dang:clang_reflection:clang_variadic_friends:clang_widberg:clang_resugar:clang_clangir:clang_dascandy_contracts:clang_p1974
+group.clangx86trunk.compilers=clang_trunk:clang_assertions_trunk:clang_concepts:clang_p1144:clang_autonsdmi:clang_bb_p2996:clang_p3068:clang_p3309:clang_lifetime:clang_p1061:clang_parmexpr:clang_patmat:clang_embed:clang_dang:clang_reflection:clang_variadic_friends:clang_widberg:clang_resugar:clang_clangir:clang_dascandy_contracts:clang_p1974
 group.clangx86trunk.intelAsm=-mllvm --x86-asm-syntax=intel
 group.clangx86trunk.options=--gcc-toolchain=/opt/compiler-explorer/gcc-snapshot
 group.clangx86trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
@@ -460,7 +460,10 @@ compiler.clang_bb_p2996.notification=Experimental Reflection Support; see <a hre
 compiler.clang_bb_p2996.options=-std=c++26 -freflection -stdlib=libc++
 compiler.clang_p3068.exe=/opt/compiler-explorer/clang-p3068-trunk/bin/clang++
 compiler.clang_p3068.semver=(experimental P3068)
-compiler.clang_p3068.notification=Experimental constexpr Exception Support; see <a href="https://github.com/hanickadot/llvm-project/tree/P3068-constexpr-exceptions" target="_blank" rel="noopener noreferrer">P2996<sup><small class="fas fa-external-link-alt opens-new-window" title="Opens in a new window"></small></sup></a>
+compiler.clang_p3068.notification=Experimental constexpr Exception Support; see <a href="https://github.com/hanickadot/llvm-project/tree/P3068-constexpr-exceptions" target="_blank" rel="noopener noreferrer">P3068<sup><small class="fas fa-external-link-alt opens-new-window" title="Opens in a new window"></small></sup></a>
+compiler.clang_p3309.exe=/opt/compiler-explorer/clang-p3309-trunk/bin/clang++
+compiler.clang_p3309.semver=(experimental P3309)
+compiler.clang_p3309.notification=Experimental constexpr atomic and atomic_ref; see <a href="https://github.com/hanickadot/llvm-project/tree/P3309-constexpr-atomic-and-atomic-ref" target="_blank" rel="noopener noreferrer">P3309<sup><small class="fas fa-external-link-alt opens-new-window" title="Opens in a new window"></small></sup></a>
 compiler.clang_p1061.exe=/opt/compiler-explorer/clang-p1061-trunk/bin/clang++
 compiler.clang_p1061.semver=(experimental P1061)
 compiler.clang_p1061.notification=Experimental Structure Bindings can introduce a Pack; see <a href="https://wg21.link/P1061" target="_blank" rel="noopener noreferrer">P1061<sup><small class="fas fa-external-link-alt opens-new-window" title="Opens in a new window"></small></sup></a>
@@ -4133,7 +4136,7 @@ libs.flux.versions.trunk.path=/opt/compiler-explorer/libs/flux/trunk/include
 
 libs.fmt.name={fmt}
 libs.fmt.description=A modern formatting library
-libs.fmt.versions=trunk:400:410:500:510:520:530:600:610:611:612:620:621:700:713:801:811:900:910:1000:1011:1021
+libs.fmt.versions=trunk:400:410:500:510:520:530:600:610:611:612:620:621:700:713:801:811:900:910:1000:1011:1021:1100
 libs.fmt.url=https://fmt.dev/
 libs.fmt.staticliblink=fmtd
 libs.fmt.examples=Tevcjh:oK8h33:Yn7Txe:Yn7Txe:K8s4Mc:MjsY7c
@@ -4183,6 +4186,8 @@ libs.fmt.versions.1011.version=10.1.1
 libs.fmt.versions.1011.path=/opt/compiler-explorer/libs/fmt/10.1.1/include
 libs.fmt.versions.1021.version=10.2.1
 libs.fmt.versions.1021.path=/opt/compiler-explorer/libs/fmt/10.2.1/include
+libs.fmt.versions.1100.version=11.0.0
+libs.fmt.versions.1100.path=/opt/compiler-explorer/libs/fmt/11.0.0/include
 
 libs.gcem.name=GCEM
 libs.gcem.description=Generalized Constant Expression Math: a C++ compile-time math library using generalized constant expressions
@@ -4589,12 +4594,12 @@ libs.mlir.versions.1405.version=14.0.5
 libs.mlir.versions.1405.path=/opt/compiler-explorer/libs/mlir/14.0.5/include
 
 libs.mp-units.name=mp-units
-libs.mp-units.versions=trunk:031:040:050:060:070:080:200:210
+libs.mp-units.versions=trunk:031:040:050:060:070:080:200:210:220
 libs.mp-units.url=https://github.com/mpusz/mp-units
 libs.mp-units.description=A quantities and units library for C++<br /><br />Note that in some cases, you also need to add the {fmt} library.
 libs.mp-units.examples=81Ev7qhTd:Tsesa1Pvq
 libs.mp-units.versions.trunk.version=trunk
-libs.mp-units.versions.trunk.path=/opt/compiler-explorer/libs/mp-units/trunk/src/core/include:/opt/compiler-explorer/libs/mp-units/trunk/src/systems/include:/opt/compiler-explorer/libs/fmt/10.2.1/include:/opt/compiler-explorer/libs/gsl-lite/include
+libs.mp-units.versions.trunk.path=/opt/compiler-explorer/libs/mp-units/trunk/src/core/include:/opt/compiler-explorer/libs/mp-units/trunk/src/systems/include:/opt/compiler-explorer/libs/fmt/11.0.0/include:/opt/compiler-explorer/libs/gsl-lite/include
 libs.mp-units.versions.031.version=0.3.1
 libs.mp-units.versions.031.path=/opt/compiler-explorer/libs/mp-units/v0.3.1/src/include:/opt/compiler-explorer/libs/rangesv3/0.9.1/include
 libs.mp-units.versions.040.version=0.4.0
@@ -4611,6 +4616,8 @@ libs.mp-units.versions.200.version=2.0.0
 libs.mp-units.versions.200.path=/opt/compiler-explorer/libs/mp-units/v2.0.0/src/core/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/core-fmt/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/core-io/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/angular/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/cgs/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/hep/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/iau/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/iec80000/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/imperial/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/international/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/isq/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/isq_angle/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/natural/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/si/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/typographic/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/usc/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/utility/include:/opt/compiler-explorer/libs/fmt/10.1.1/include:/opt/compiler-explorer/libs/gsl-lite/include
 libs.mp-units.versions.210.version=2.1.0
 libs.mp-units.versions.210.path=/opt/compiler-explorer/libs/mp-units/v2.1.0/src/core/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/core-fmt/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/core-io/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/angular/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/cgs/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/hep/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/iau/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/iec80000/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/imperial/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/international/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/isq/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/isq_angle/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/natural/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/si/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/typographic/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/usc/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/utility/include:/opt/compiler-explorer/libs/fmt/10.1.1/include:/opt/compiler-explorer/libs/gsl-lite/include
+libs.mp-units.versions.220.version=2.2.0
+libs.mp-units.versions.220.path=/opt/compiler-explorer/libs/mp-units/v2.2.0/src/core/include:/opt/compiler-explorer/libs/mp-units/v2.2.0/src/systems/include:/opt/compiler-explorer/libs/fmt/10.2.1/include:/opt/compiler-explorer/libs/gsl-lite/include
 
 libs.mp-coro.name=mp-coro
 libs.mp-coro.versions=trunk
diff --git a/etc/config/circle.amazon.properties b/etc/config/circle.amazon.properties
index 025cd8ad2..788de9b57 100644
--- a/etc/config/circle.amazon.properties
+++ b/etc/config/circle.amazon.properties
@@ -478,7 +478,7 @@ libs.flux.versions.trunk.path=/opt/compiler-explorer/libs/flux/trunk/include
 
 libs.fmt.name={fmt}
 libs.fmt.description=A modern formatting library
-libs.fmt.versions=trunk:400:410:500:510:520:530:600:610:611:612:620:621:700:713:801:811:900:910:1000:1011:1021
+libs.fmt.versions=trunk:400:410:500:510:520:530:600:610:611:612:620:621:700:713:801:811:900:910:1000:1011:1021:1100
 libs.fmt.url=https://fmt.dev/
 libs.fmt.staticliblink=fmtd
 libs.fmt.examples=Tevcjh:oK8h33:Yn7Txe:Yn7Txe:K8s4Mc:MjsY7c
@@ -528,6 +528,8 @@ libs.fmt.versions.1011.version=10.1.1
 libs.fmt.versions.1011.path=/opt/compiler-explorer/libs/fmt/10.1.1/include
 libs.fmt.versions.1021.version=10.2.1
 libs.fmt.versions.1021.path=/opt/compiler-explorer/libs/fmt/10.2.1/include
+libs.fmt.versions.1100.version=11.0.0
+libs.fmt.versions.1100.path=/opt/compiler-explorer/libs/fmt/11.0.0/include
 
 libs.glm.name=GLM
 libs.glm.description=OpenGL Mathematics
@@ -758,12 +760,12 @@ libs.lua.versions.540.path=/opt/compiler-explorer/libs/lua/v5.4.0/include
 libs.lua.versions.540.libpath=/opt/compiler-explorer/libs/lua/v5.4.0/lib/x86_64:/opt/compiler-explorer/libs/lua/v5.4.0/lib/x86
 
 libs.mp-units.name=mp-units
-libs.mp-units.versions=trunk:031:040:050:060:070:080:200:210
+libs.mp-units.versions=trunk:031:040:050:060:070:080:200:210:220
 libs.mp-units.url=https://github.com/mpusz/mp-units
 libs.mp-units.description=A quantities and units library for C++<br /><br />Note that in some cases, you also need to add the {fmt} library.
 libs.mp-units.examples=81Ev7qhTd:Tsesa1Pvq
 libs.mp-units.versions.trunk.version=trunk
-libs.mp-units.versions.trunk.path=/opt/compiler-explorer/libs/mp-units/trunk/src/core/include:/opt/compiler-explorer/libs/mp-units/trunk/src/systems/include:/opt/compiler-explorer/libs/fmt/10.2.1/include:/opt/compiler-explorer/libs/gsl-lite/include
+libs.mp-units.versions.trunk.path=/opt/compiler-explorer/libs/mp-units/trunk/src/core/include:/opt/compiler-explorer/libs/mp-units/trunk/src/systems/include:/opt/compiler-explorer/libs/fmt/11.0.0/include:/opt/compiler-explorer/libs/gsl-lite/include
 libs.mp-units.versions.031.version=0.3.1
 libs.mp-units.versions.031.path=/opt/compiler-explorer/libs/mp-units/v0.3.1/src/include:/opt/compiler-explorer/libs/rangesv3/0.9.1/include
 libs.mp-units.versions.040.version=0.4.0
@@ -780,6 +782,8 @@ libs.mp-units.versions.200.version=2.0.0
 libs.mp-units.versions.200.path=/opt/compiler-explorer/libs/mp-units/v2.0.0/src/core/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/core-fmt/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/core-io/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/angular/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/cgs/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/hep/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/iau/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/iec80000/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/imperial/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/international/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/isq/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/isq_angle/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/natural/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/si/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/typographic/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/usc/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/utility/include:/opt/compiler-explorer/libs/fmt/10.1.1/include:/opt/compiler-explorer/libs/gsl-lite/include
 libs.mp-units.versions.210.version=2.1.0
 libs.mp-units.versions.210.path=/opt/compiler-explorer/libs/mp-units/v2.1.0/src/core/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/core-fmt/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/core-io/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/angular/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/cgs/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/hep/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/iau/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/iec80000/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/imperial/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/international/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/isq/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/isq_angle/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/natural/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/si/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/typographic/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/usc/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/utility/include:/opt/compiler-explorer/libs/fmt/10.1.1/include:/opt/compiler-explorer/libs/gsl-lite/include
+libs.mp-units.versions.220.version=2.2.0
+libs.mp-units.versions.220.path=/opt/compiler-explorer/libs/mp-units/v2.2.0/src/core/include:/opt/compiler-explorer/libs/mp-units/v2.2.0/src/systems/include:/opt/compiler-explorer/libs/fmt/10.2.1/include:/opt/compiler-explorer/libs/gsl-lite/include
 
 libs.mp-coro.name=mp-coro
 libs.mp-coro.versions=trunk
diff --git a/etc/config/d.amazon.properties b/etc/config/d.amazon.properties
index 9fd050866..d43c39a8e 100644
--- a/etc/config/d.amazon.properties
+++ b/etc/config/d.amazon.properties
@@ -1,12 +1,12 @@
 compilers=&gdc:&ldc:&dmd:&gdccross
-defaultCompiler=ldc1_38
+defaultCompiler=ldc1_39
 
 group.gdc.compilers=gdc48:gdc49:gdc52:gdc92:gdc93:gdc95:gdc101:gdc102:gdc105:gdc111:gdc113:gdc114:gdc121:gdc122:gdc123:gdc124:gdc131:gdc132:gdc133:gdc141:gdctrunk
 group.gdc.groupName=GDC x86-64
 group.gdc.includeFlag=-isystem
 group.gdc.isSemVer=true
 group.gdc.baseName=gdc
-group.gdc.demangler=/opt/compiler-explorer/ldc1.36.0/ldc2-1.36.0-linux-x86_64/bin/ddemangle
+group.gdc.demangler=/opt/compiler-explorer/ldc1.39.0/ldc2-1.39.0-linux-x86_64/bin/ddemangle
 group.gdc.objdumper=/opt/compiler-explorer/gcc-12.2.0/bin/objdump
 group.gdc.llvmSymbolizer=/opt/compiler-explorer/clang-17.0.1/bin/llvm-symbolizer
 
@@ -590,11 +590,11 @@ compiler.gdcmipsel1410.semver=14.1.0
 compiler.gdcmipsel1410.objdumper=/opt/compiler-explorer/mipsel/gcc-14.1.0/mipsel-multilib-linux-gnu/bin/mipsel-multilib-linux-gnu-objdump
 compiler.gdcmipsel1410.demangler=/opt/compiler-explorer/mipsel/gcc-14.1.0/mipsel-multilib-linux-gnu/bin/mipsel-multilib-linux-gnu-c++filt
 
-group.ldc.compilers=ldc017:ldc100:ldc110:ldc120:ldc130:ldc140:ldc150:ldc160:ldc170:ldc180:ldc190:ldc1_10:ldc1_11:ldc1_12:ldc1_13:ldc1_14:ldc1_15:ldc1_16:ldc1_17:ldc1_18:ldc1_19:ldc1_20:ldc1_21:ldc1_22:ldc1_23:ldc1_24:ldc1_25:ldc1_26:ldc1_27:ldc1_28:ldc1_29:ldc1_30:ldc1_31:ldc1_32:ldc1_33:ldc1_34:ldc1_35:ldc1_36:ldc1_37:ldc1_38:ldcbeta:ldclatestci
+group.ldc.compilers=ldc017:ldc100:ldc110:ldc120:ldc130:ldc140:ldc150:ldc160:ldc170:ldc180:ldc190:ldc1_10:ldc1_11:ldc1_12:ldc1_13:ldc1_14:ldc1_15:ldc1_16:ldc1_17:ldc1_18:ldc1_19:ldc1_20:ldc1_21:ldc1_22:ldc1_23:ldc1_24:ldc1_25:ldc1_26:ldc1_27:ldc1_28:ldc1_29:ldc1_30:ldc1_31:ldc1_32:ldc1_33:ldc1_34:ldc1_35:ldc1_36:ldc1_37:ldc1_38:ldc1_39:ldcbeta:ldclatestci
 group.ldc.compilerType=ldc
 group.ldc.isSemVer=true
 group.ldc.baseName=ldc
-group.ldc.demangler=/opt/compiler-explorer/ldc1.36.0/ldc2-1.36.0-linux-x86_64/bin/ddemangle
+group.ldc.demangler=/opt/compiler-explorer/ldc1.39.0/ldc2-1.39.0-linux-x86_64/bin/ddemangle
 group.ldc.objdumper=/opt/compiler-explorer/gcc-12.1.0/bin/objdump
 group.ldc.llvmSymbolizer=/opt/compiler-explorer/clang-17.0.1/bin/llvm-symbolizer
 
@@ -698,6 +698,9 @@ compiler.ldc1_37.options=-gcc=gcc
 compiler.ldc1_38.exe=/opt/compiler-explorer/ldc1.38.0/ldc2-1.38.0-linux-x86_64/bin/ldc2
 compiler.ldc1_38.semver=1.38.0
 compiler.ldc1_38.options=-gcc=gcc
+compiler.ldc1_39.exe=/opt/compiler-explorer/ldc1.39.0/ldc2-1.39.0-linux-x86_64/bin/ldc2
+compiler.ldc1_39.semver=1.39.0
+compiler.ldc1_39.options=-gcc=gcc
 compiler.ldcbeta.exe=/opt/compiler-explorer/ldcbeta/bin/ldc2
 compiler.ldcbeta.semver=beta
 compiler.ldcbeta.options=-gcc=gcc
diff --git a/etc/config/objc++.amazon.properties b/etc/config/objc++.amazon.properties
index faf623703..303a8befd 100644
--- a/etc/config/objc++.amazon.properties
+++ b/etc/config/objc++.amazon.properties
@@ -1067,7 +1067,7 @@ libs.flux.versions.trunk.path=/opt/compiler-explorer/libs/flux/trunk/include
 
 libs.fmt.name={fmt}
 libs.fmt.description=A modern formatting library
-libs.fmt.versions=trunk:400:410:500:510:520:530:600:610:611:612:620:621:700:713:801:811:900:910:1000:1011:1021
+libs.fmt.versions=trunk:400:410:500:510:520:530:600:610:611:612:620:621:700:713:801:811:900:910:1000:1011:1021:1100
 libs.fmt.url=https://fmt.dev/
 libs.fmt.staticliblink=fmtd
 libs.fmt.examples=Tevcjh:oK8h33:Yn7Txe:Yn7Txe:K8s4Mc:MjsY7c
@@ -1117,6 +1117,8 @@ libs.fmt.versions.1011.version=10.1.1
 libs.fmt.versions.1011.path=/opt/compiler-explorer/libs/fmt/10.1.1/include
 libs.fmt.versions.1021.version=10.2.1
 libs.fmt.versions.1021.path=/opt/compiler-explorer/libs/fmt/10.2.1/include
+libs.fmt.versions.1100.version=11.0.0
+libs.fmt.versions.1100.path=/opt/compiler-explorer/libs/fmt/11.0.0/include
 
 libs.gemmlowp.name=gemmlowp
 libs.gemmlowp.url=https://github.com/google/gemmlowp
@@ -1453,12 +1455,12 @@ libs.mlir.versions.1405.version=14.0.5
 libs.mlir.versions.1405.path=/opt/compiler-explorer/libs/mlir/14.0.5/include
 
 libs.mp-units.name=mp-units
-libs.mp-units.versions=trunk:031:040:050:060:070:080:200:210
+libs.mp-units.versions=trunk:031:040:050:060:070:080:200:210:220
 libs.mp-units.url=https://github.com/mpusz/mp-units
 libs.mp-units.description=A quantities and units library for C++<br /><br />Note that in some cases, you also need to add the {fmt} library.
 libs.mp-units.examples=81Ev7qhTd:Tsesa1Pvq
 libs.mp-units.versions.trunk.version=trunk
-libs.mp-units.versions.trunk.path=/opt/compiler-explorer/libs/mp-units/trunk/src/core/include:/opt/compiler-explorer/libs/mp-units/trunk/src/systems/include:/opt/compiler-explorer/libs/fmt/10.2.1/include:/opt/compiler-explorer/libs/gsl-lite/include
+libs.mp-units.versions.trunk.path=/opt/compiler-explorer/libs/mp-units/trunk/src/core/include:/opt/compiler-explorer/libs/mp-units/trunk/src/systems/include:/opt/compiler-explorer/libs/fmt/11.0.0/include:/opt/compiler-explorer/libs/gsl-lite/include
 libs.mp-units.versions.031.version=0.3.1
 libs.mp-units.versions.031.path=/opt/compiler-explorer/libs/mp-units/v0.3.1/src/include:/opt/compiler-explorer/libs/rangesv3/0.9.1/include
 libs.mp-units.versions.040.version=0.4.0
@@ -1475,6 +1477,8 @@ libs.mp-units.versions.200.version=2.0.0
 libs.mp-units.versions.200.path=/opt/compiler-explorer/libs/mp-units/v2.0.0/src/core/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/core-fmt/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/core-io/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/angular/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/cgs/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/hep/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/iau/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/iec80000/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/imperial/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/international/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/isq/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/isq_angle/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/natural/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/si/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/typographic/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/systems/usc/include:/opt/compiler-explorer/libs/mp-units/v2.0.0/src/utility/include:/opt/compiler-explorer/libs/fmt/10.1.1/include:/opt/compiler-explorer/libs/gsl-lite/include
 libs.mp-units.versions.210.version=2.1.0
 libs.mp-units.versions.210.path=/opt/compiler-explorer/libs/mp-units/v2.1.0/src/core/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/core-fmt/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/core-io/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/angular/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/cgs/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/hep/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/iau/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/iec80000/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/imperial/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/international/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/isq/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/isq_angle/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/natural/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/si/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/typographic/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/systems/usc/include:/opt/compiler-explorer/libs/mp-units/v2.1.0/src/utility/include:/opt/compiler-explorer/libs/fmt/10.1.1/include:/opt/compiler-explorer/libs/gsl-lite/include
+libs.mp-units.versions.220.version=2.2.0
+libs.mp-units.versions.220.path=/opt/compiler-explorer/libs/mp-units/v2.2.0/src/core/include:/opt/compiler-explorer/libs/mp-units/v2.2.0/src/systems/include:/opt/compiler-explorer/libs/fmt/10.2.1/include:/opt/compiler-explorer/libs/gsl-lite/include
 
 libs.mp-coro.name=mp-coro
 libs.mp-coro.versions=trunk
diff --git a/etc/config/sponsors.yaml b/etc/config/sponsors.yaml
index 218566143..a00386fd4 100644
--- a/etc/config/sponsors.yaml
+++ b/etc/config/sponsors.yaml
@@ -36,6 +36,15 @@ levels:
         displayType: SideBySide
         statsId: thinkcell
         bgColour: rgb(110, 166, 0)
+      - name: CLion
+        description: CLion, the cross-platform IDE for C and C++, is robust, responsive, and loaded with new functionality to help you make your development experience smoother and more productive.
+        icon: https://static.ce-cdn.net/jetbrains/Jetbrains.png
+        icon_dark: https://static.ce-cdn.net/jetbrains/JetbrainsWhite.png
+        img: https://static.ce-cdn.net/jetbrains/ClionWhite.png
+        url: https://jb.gg/clion_ce
+        topIconShowEvery: 3
+        displayType: SideBySide
+        statsId: jetbrains
   - name: Patreon Legends
     description: 'These amazing people have pledged at the highest level of support. Huge thanks to these fine folks:'
     class: legendary
@@ -462,3 +471,5 @@ levels:
       - Pieter van Schendel
       - LukeHjo
       - oldspiderdude
+      - Harish Naik
+      - Gabriel Ravier
diff --git a/examples/circt/default.mlir b/examples/circt/default.mlir
index a3c4e54ba..0c864187d 100644
--- a/examples/circt/default.mlir
+++ b/examples/circt/default.mlir
@@ -2,10 +2,10 @@
 // CIRCT example code may not always work out of the box because the textual MLIR format is not always stable.
 // The example tries to be compatible with the latest CIRCT version, using relatively stable IR.
 
-hw.module @Counter(%clock: i1, %reset: i1) -> (count: i8) {
+hw.module @Counter(in %clock: !seq.clock, in %reset: i1, out count: i8) {
   %c0_i8 = hw.constant 0 : i8
   %c1_i8 = hw.constant 1 : i8
-  %counter = seq.compreg %0, %clock, %reset, %c0_i8  : i8
+  %counter = seq.compreg %0, %clock reset %reset, %c0_i8  : i8
   %0 = comb.add %counter, %c1_i8 : i8
   hw.output %counter : i8
 }
diff --git a/lib/handlers/compile.interfaces.ts b/lib/handlers/compile.interfaces.ts
index 464f0c647..ec214dcab 100644
--- a/lib/handlers/compile.interfaces.ts
+++ b/lib/handlers/compile.interfaces.ts
@@ -62,3 +62,7 @@ export type CompileRequestTextBody = {
     skipAsm: string;
     filterAnsi?: string;
 };
+
+export interface ICompileHandler {
+    hasLanguages(): boolean;
+}
diff --git a/lib/handlers/compile.ts b/lib/handlers/compile.ts
index 0efda1b7f..445d24203 100644
--- a/lib/handlers/compile.ts
+++ b/lib/handlers/compile.ts
@@ -41,7 +41,7 @@ import {
     FiledataPair,
 } from '../../types/compilation/compilation.interfaces.js';
 import {CompilerOverrideOptions} from '../../types/compilation/compiler-overrides.interfaces.js';
-import {ICompiler, PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
+import {CompilerInfo, ICompiler, PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
 import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
 import {ResultLine} from '../../types/resultline/resultline.interfaces.js';
 import {BaseCompiler} from '../base-compiler.js';
@@ -54,7 +54,12 @@ import {SentryCapture} from '../sentry.js';
 import {KnownBuildMethod} from '../stats.js';
 import * as utils from '../utils.js';
 
-import {CompileRequestJsonBody, CompileRequestQueryArgs, CompileRequestTextBody} from './compile.interfaces.js';
+import {
+    CompileRequestJsonBody,
+    CompileRequestQueryArgs,
+    CompileRequestTextBody,
+    ICompileHandler,
+} from './compile.interfaces.js';
 
 temp.track();
 
@@ -97,7 +102,7 @@ export type ParsedRequest = {
     libraries: CompileChildLibraries[];
 };
 
-export class CompileHandler {
+export class CompileHandler implements ICompileHandler {
     private compilersById: Record<string, Record<string, BaseCompiler>> = {};
     private readonly compilerEnv: CompilationEnvironment;
     private readonly textBanner: string;
@@ -200,6 +205,14 @@ export class CompileHandler {
         });
     }
 
+    hasLanguages(): boolean {
+        try {
+            return Object.keys(this.compilersById).length > 0;
+        } catch {
+            return false;
+        }
+    }
+
     async create(compiler: PreliminaryCompilerInfo): Promise<ICompiler | null> {
         const isPrediscovered = !!compiler.version;
 
@@ -253,7 +266,10 @@ export class CompileHandler {
         }
     }
 
-    async setCompilers(compilers: PreliminaryCompilerInfo[], clientOptions: ClientOptionsType) {
+    async setCompilers(
+        compilers: PreliminaryCompilerInfo[],
+        clientOptions: ClientOptionsType,
+    ): Promise<CompilerInfo[]> {
         // Be careful not to update this.compilersById until we can replace it entirely.
         const compilersById = {};
         try {
@@ -278,6 +294,7 @@ export class CompileHandler {
             return createdCompilers.map(compiler => compiler.getInfo());
         } catch (err) {
             logger.error('Exception while processing compilers:', err);
+            return [];
         }
     }
 
diff --git a/lib/handlers/health-check.ts b/lib/handlers/health-check.ts
index eade683dc..cad3f0cba 100644
--- a/lib/handlers/health-check.ts
+++ b/lib/handlers/health-check.ts
@@ -29,12 +29,15 @@ import {CompilationQueue} from '../compilation-queue.js';
 import {logger} from '../logger.js';
 import {SentryCapture} from '../sentry.js';
 
+import {ICompileHandler} from './compile.interfaces.js';
+
 export class HealthCheckHandler {
     public readonly handle: (req: any, res: any) => Promise<void>;
 
     constructor(
         private readonly compilationQueue: CompilationQueue,
         private readonly filePath: any,
+        private readonly compileHandler: ICompileHandler,
     ) {
         this.handle = this._handle.bind(this);
     }
@@ -52,6 +55,12 @@ export class HealthCheckHandler {
          */
         await this.compilationQueue.enqueue(async () => {}, {highPriority: true});
 
+        if (!this.compileHandler.hasLanguages()) {
+            logger.error(`*** HEALTH CHECK FAILURE: no languages/compilers detected`);
+            res.status(500).end();
+            return;
+        }
+
         if (!this.filePath) {
             res.send('Everything is awesome');
             return;


Test patch:
diff --git a/test/handlers/health-check-tests.ts b/test/handlers/health-check-tests.ts
index 8e9a3b0a5..da7889d51 100644
--- a/test/handlers/health-check-tests.ts
+++ b/test/handlers/health-check-tests.ts
@@ -35,9 +35,12 @@ describe('Health checks', () => {
     let compilationQueue;
 
     beforeEach(() => {
+        const compileHandlerMock = {
+            hasLanguages: () => true,
+        };
         compilationQueue = new CompilationQueue(1, 0, 0);
         app = express();
-        app.use('/hc', new HealthCheckHandler(compilationQueue, '').handle);
+        app.use('/hc', new HealthCheckHandler(compilationQueue, '', compileHandlerMock).handle);
     });
 
     it('should respond with OK', async () => {
@@ -54,15 +57,36 @@ describe('Health checks', () => {
     });
 });
 
+describe('Health checks without lang/comp', () => {
+    let app;
+    let compilationQueue;
+
+    beforeEach(() => {
+        const compileHandlerMock = {
+            hasLanguages: () => false,
+        };
+        compilationQueue = new CompilationQueue(1, 0, 0);
+        app = express();
+        app.use('/hc', new HealthCheckHandler(compilationQueue, '', compileHandlerMock).handle);
+    });
+
+    it('should respond with error', async () => {
+        await request(app).get('/hc').expect(500);
+    });
+});
+
 describe('Health checks on disk', () => {
     let app;
 
     beforeAll(() => {
+        const compileHandlerMock = {
+            hasLanguages: () => true,
+        };
         const compilationQueue = new CompilationQueue(1, 0, 0);
 
         app = express();
-        app.use('/hc', new HealthCheckHandler(compilationQueue, '/fake/.nonexist').handle);
-        app.use('/hc2', new HealthCheckHandler(compilationQueue, '/fake/.health').handle);
+        app.use('/hc', new HealthCheckHandler(compilationQueue, '/fake/.nonexist', compileHandlerMock).handle);
+        app.use('/hc2', new HealthCheckHandler(compilationQueue, '/fake/.health', compileHandlerMock).handle);
 
         mockfs({
             '/fake': {