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