This is a regression in Clang 22. Accepted by Clang 21, GCC 16, and MSVC 19.52.
https://godbolt.org/z/Pz83o3E8z
C:\Temp>"%ProgramFiles%\Microsoft Visual Studio\18\Insiders\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=preview
**********************************************************************
** Visual Studio 2026 Developer Command Prompt v18.7.0-insiders
** Copyright (c) 2026 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
C:\Temp>cl
Microsoft (R) C/C++ Optimizing Compiler Version 19.52.36405.1 for x64 (PREVIEW)
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
C:\Temp>clang-cl -v
clang version 22.1.3 (https://github.com/llvm/llvm-project e9846648fd6183ee6d8cbdb4502213fcf902a211)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\Microsoft Visual Studio\18\Insiders\VC\Tools\Llvm\x64\bin
C:\Temp>type meow.cpp
template <class T>
concept HasIsTransparent = requires { typename T::is_transparent; };
template <class K, class V, class Compare>
struct FlatMapBase {
using key_compare = Compare;
};
template <class K, class V, class Compare>
struct FlatMap : FlatMapBase<K, V, Compare> {
using Base = FlatMapBase<K, V, Compare>;
using typename Base::key_compare;
void at(const K&) {}
void at(const K&) const {}
template <class Other>
void at(const Other&)
requires HasIsTransparent<key_compare>
{}
template <class Other>
void at(const Other&) const
requires HasIsTransparent<key_compare>
{}
};
template <class T>
struct Transparent {
T t;
};
struct TransparentComparator {
using is_transparent = void;
template <class T>
bool operator()(const T&, const Transparent<T>&) const;
template <class T>
bool operator()(const Transparent<T>&, const T& t) const;
template <class T>
bool operator()(const T&, const T&) const;
};
struct NonTransparentComparator {
template <class T>
bool operator()(const T&, const Transparent<T>&) const;
template <class T>
bool operator()(const Transparent<T>&, const T&) const;
template <class T>
bool operator()(const T&, const T&) const;
};
template <class M>
concept CanAt = requires(M m, Transparent<int> k) { m.at(k); };
using TransparentMap = FlatMap<int, double, TransparentComparator>;
using NonTransparentMap = FlatMap<int, double, NonTransparentComparator>;
static_assert(CanAt<TransparentMap>);
static_assert(!CanAt<NonTransparentMap>);
C:\Temp>cl /EHsc /nologo /W4 /std:c++latest /c meow.cpp
meow.cpp
C:\Temp>clang-cl /EHsc /nologo /W4 /std:c++latest /c meow.cpp
meow.cpp(63,15): error: static assertion failed due to requirement '!CanAt<FlatMap<int, double,
NonTransparentComparator>>'
63 | static_assert(!CanAt<NonTransparentMap>);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
This is a regression in Clang 22. Accepted by Clang 21, GCC 16, and MSVC 19.52.
https://godbolt.org/z/Pz83o3E8z