xref: /llvm-project/clang/test/Modules/template-lambdas.cppm (revision da00c60dae0040185dc45039c4397f6e746548e9)
1edb3b44eSChuanqi Xu// RUN: rm -rf %t
2edb3b44eSChuanqi Xu// RUN: mkdir -p %t
3edb3b44eSChuanqi Xu// RUN: split-file %s %t
4edb3b44eSChuanqi Xu//
5edb3b44eSChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/template_lambdas.cppm -emit-module-interface \
6edb3b44eSChuanqi Xu// RUN:    -o %t/lambdas.pcm
7edb3b44eSChuanqi Xu// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only \
8edb3b44eSChuanqi Xu// RUN:    -verify
9edb3b44eSChuanqi Xu//
10edb3b44eSChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/template_lambdas2.cppm -emit-module-interface \
11edb3b44eSChuanqi Xu// RUN:    -o %t/lambdas2.pcm
12edb3b44eSChuanqi Xu// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only \
13edb3b44eSChuanqi Xu// RUN:    -verify -DUSE_LAMBDA2
14edb3b44eSChuanqi Xu
15*da00c60dSChuanqi Xu// Test again with reduced BMI
16*da00c60dSChuanqi Xu// RUN: rm -rf %t
17*da00c60dSChuanqi Xu// RUN: mkdir -p %t
18*da00c60dSChuanqi Xu// RUN: split-file %s %t
19*da00c60dSChuanqi Xu//
20*da00c60dSChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/template_lambdas.cppm -emit-reduced-module-interface \
21*da00c60dSChuanqi Xu// RUN:    -o %t/lambdas.pcm
22*da00c60dSChuanqi Xu// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only \
23*da00c60dSChuanqi Xu// RUN:    -verify
24*da00c60dSChuanqi Xu//
25*da00c60dSChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/template_lambdas2.cppm -emit-reduced-module-interface \
26*da00c60dSChuanqi Xu// RUN:    -o %t/lambdas2.pcm
27*da00c60dSChuanqi Xu// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only \
28*da00c60dSChuanqi Xu// RUN:    -verify -DUSE_LAMBDA2
29*da00c60dSChuanqi Xu
30edb3b44eSChuanqi Xu//--- lambdas.h
31edb3b44eSChuanqi Xuauto l1 = []<int I>() constexpr -> int {
32edb3b44eSChuanqi Xu    return I;
33edb3b44eSChuanqi Xu};
34edb3b44eSChuanqi Xu
35edb3b44eSChuanqi Xuauto l2 = []<auto I>() constexpr -> decltype(I) {
36edb3b44eSChuanqi Xu    return I;
37edb3b44eSChuanqi Xu};
38edb3b44eSChuanqi Xu
39edb3b44eSChuanqi Xuauto l3 = []<class T>(auto i) constexpr -> T {
40edb3b44eSChuanqi Xu  return T(i);
41edb3b44eSChuanqi Xu};
42edb3b44eSChuanqi Xu
43edb3b44eSChuanqi Xuauto l4 = []<template<class> class T, class U>(T<U>, auto i) constexpr -> U {
44edb3b44eSChuanqi Xu  return U(i);
45edb3b44eSChuanqi Xu};
46edb3b44eSChuanqi Xu
47edb3b44eSChuanqi Xu//--- template_lambdas.cppm
48edb3b44eSChuanqi Xumodule;
49edb3b44eSChuanqi Xu#include "lambdas.h"
50edb3b44eSChuanqi Xuexport module lambdas;
51edb3b44eSChuanqi Xuexport using ::l1;
52edb3b44eSChuanqi Xuexport using ::l2;
53edb3b44eSChuanqi Xuexport using ::l3;
54edb3b44eSChuanqi Xuexport using ::l4;
55edb3b44eSChuanqi Xu
56edb3b44eSChuanqi Xu//--- template_lambdas2.cppm
57edb3b44eSChuanqi Xuexport module lambdas2;
58edb3b44eSChuanqi Xuexport {
59edb3b44eSChuanqi Xu#include "lambdas.h"
60edb3b44eSChuanqi Xu}
61edb3b44eSChuanqi Xu
62edb3b44eSChuanqi Xu//--- Use.cpp
63edb3b44eSChuanqi Xu// expected-no-diagnostics
64edb3b44eSChuanqi Xu#ifndef USE_LAMBDA2
65edb3b44eSChuanqi Xuimport lambdas;
66edb3b44eSChuanqi Xu#else
67edb3b44eSChuanqi Xuimport lambdas2;
68edb3b44eSChuanqi Xu#endif
69edb3b44eSChuanqi Xu
70edb3b44eSChuanqi Xustatic_assert(l1.operator()<5>() == 5);
71edb3b44eSChuanqi Xustatic_assert(l1.operator()<6>() == 6);
72edb3b44eSChuanqi Xu
73edb3b44eSChuanqi Xustatic_assert(l2.operator()<7>() == 7);
74edb3b44eSChuanqi Xustatic_assert(l2.operator()<nullptr>() == nullptr);
75edb3b44eSChuanqi Xu
76edb3b44eSChuanqi Xustatic_assert(l3.operator()<int>(8.4) == 8);
77edb3b44eSChuanqi Xustatic_assert(l3.operator()<int>(9.9) == 9);
78edb3b44eSChuanqi Xu
79edb3b44eSChuanqi Xutemplate<typename T>
80edb3b44eSChuanqi Xustruct DummyTemplate { };
81edb3b44eSChuanqi Xu
82edb3b44eSChuanqi Xustatic_assert(l4(DummyTemplate<float>(), 12) == 12.0);
83edb3b44eSChuanqi Xustatic_assert(l4(DummyTemplate<int>(), 19.8) == 19);
84