File: generic-lambda.cpp

package info (click to toggle)
llvm-toolchain-15 1%3A15.0.6-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,554,644 kB
  • sloc: cpp: 5,922,452; ansic: 1,012,136; asm: 674,362; python: 191,568; objc: 73,855; f90: 42,327; lisp: 31,913; pascal: 11,973; javascript: 10,144; sh: 9,421; perl: 7,447; ml: 5,527; awk: 3,523; makefile: 2,520; xml: 885; cs: 573; fortran: 567
file content (62 lines) | stat: -rw-r--r-- 1,556 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s

// expected-no-diagnostics

template <class T, class U> constexpr bool is_same_v = false;
template <class T> constexpr bool is_same_v<T, T> = true;
template <class T, class U>
concept is_same = is_same_v<T, U>;

template <class T> struct X {};
template <class T, class U>
concept C1 = is_same<T, X<U>>;

template <class T1> X<X<X<T1>>> t1() {
  return []<class T2>(T2) -> X<X<T2>> {
    struct S {
      static X<X<T2>> f() {
        return []<class T3>(T3) -> X<T3> {
          static_assert(is_same<T2, X<T1>>);
          static_assert(is_same<T3, X<T2>>);
          return X<T3>();
        }(X<T2>());
      }
    };
    return S::f();
  }(X<T1>());
};
template X<X<X<int>>> t1<int>();

#if 0 // FIXME: crashes
template<class T1> auto t2() {
  return []<class T2>(T2) {
    struct S {
      static auto f() {
        return []<class T3>(T3) {
          static_assert(is_same<T2, X<T1>>);
          static_assert(is_same<T3, X<T2>>);
          return X<T3>();
        }(X<T2>());
      }
    };
    return S::f();
  }(X<T1>());
};
template auto t2<int>();
static_assert(is_same<decltype(t2<int>()), X<X<X<int>>>>);

template<class T1> C1<X<X<T1>>> auto t3() {
  return []<C1<T1> T2>(T2) -> C1<X<T2>> auto {
    struct S {
      static auto f() {
        return []<C1<T2> T3>(T3) -> C1<T3> auto {
          return X<T3>();
        }(X<T2>());
      }
    };
    return S::f();
  }(X<T1>());
};
template C1<X<X<int>>> auto t3<int>();
static_assert(is_same<decltype(t3<int>()), X<X<X<int>>>>);
#endif