When using  std::conditional_t inside a class/struct with one of the
conditional types being `decltype([]{})`, the type is wrong.

https://godbolt.org/z/3jhfcKav4
```
#include <cstdint>
#include <concepts>
#include <type_traits>

template <bool Condition = true, std::size_t Size = 32>
using test_alias = std::conditional_t<Condition, uint32_t[Size],
                                     decltype([] {})>;

template <bool Condition = true, std::size_t Size = 32>
using test_alias3 = std::conditional_t<Condition, uint32_t[Size],
                                    float>;

template <bool Condition = true, std::size_t Size = 32>
class aboba {
public:
    using test_alias2 = std::conditional_t<Condition, uint32_t[Size],
                                     decltype([] {})>;
    static_assert(std::same_as<test_alias3<Condition, Size>, uint32_t[32]>);
    static_assert(std::same_as<test_alias<Condition, Size>, uint32_t[32]>);
    test_alias<true, Size> a;
    test_alias2 b;
    std::conditional_t<Condition, uint32_t[Size],
                                             decltype([] {})> c;
    test_alias3<true, Size> d;
};

aboba test{};
int main() {
    using a_t = decltype(test.a);
    using b_t = decltype(test.b);
    using c_t = decltype(test.c);
    using d_t = decltype(test.d);
    static_assert(std::same_as<test_alias<true, 32>, uint32_t[32]>);
    static_assert(std::same_as<b_t, uint32_t[32]>);
    static_assert(std::same_as<c_t, uint32_t[32]>);
    static_assert(std::same_as<d_t, uint32_t[32]>);
    static_assert(std::same_as<a_t, uint32_t[32]>);
    return 0;
}
```
```
Compiler returned: 1
Compiler stderr
<source>:19:24: error: template argument 1 is invalid
   19 |     static_assert(std::same_as<test_alias<Condition, Size>,
uint32_t[32]>);
      |
 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>: In function 'int main()':
<source>:37:24: error: static assertion failed
   37 |     static_assert(std::same_as<a_t, uint32_t[32]>);
      |                   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:37:24: note: constraints not satisfied
In file included from <source>:2:
/opt/compiler-explorer/gcc-13.1.0/include/c++/13.1.0/concepts:57:15:
required for the satisfaction of '__same_as<_Tp, _Up>' [with _Tp = int; _Up
= unsigned int[32]]
/opt/compiler-explorer/gcc-13.1.0/include/c++/13.1.0/concepts:57:32: note:
the expression 'is_same_v<_Tp, _Up> [with _Tp = int; _Up = unsigned
int[32]]' evaluated to 'false'
   57 |       concept __same_as = std::is_same_v<_Tp, _Up>;
      |
```

Reply via email to