Skip to content

[Clang] Compiler regression affecting concept-constrained flat_map::at() #198663

@StephanTLavavej

Description

@StephanTLavavej

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.

Metadata

Metadata

Assignees

Labels

clang:frontendLanguage frontend issues, e.g. anything involving "Sema"conceptsC++20 conceptsconfirmedVerified by a second partyregression:22Regression in 22 release

Type

No fields configured for Bug.

Projects

Status
Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions