[clang] edb3b44 - [NFC] [C++20] [Modules] Add more lambda tests

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 13 19:32:08 PST 2022


Author: Chuanqi Xu
Date: 2022-12-14T11:30:12+08:00
New Revision: edb3b44e7d7ca34b7e7a880a15411678d057e039

URL: https://github.com/llvm/llvm-project/commit/edb3b44e7d7ca34b7e7a880a15411678d057e039
DIFF: https://github.com/llvm/llvm-project/commit/edb3b44e7d7ca34b7e7a880a15411678d057e039.diff

LOG: [NFC] [C++20] [Modules] Add more lambda tests

Add more lambda tests in modules. This is useful when we started to work
on https://github.com/llvm/llvm-project/issues/57222.

Added: 
    clang/test/Modules/lambdas.cppm
    clang/test/Modules/template-lambdas.cppm

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/clang/test/Modules/lambdas.cppm b/clang/test/Modules/lambdas.cppm
new file mode 100644
index 0000000000000..7f00cf6f8682a
--- /dev/null
+++ b/clang/test/Modules/lambdas.cppm
@@ -0,0 +1,62 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/lambdas.cppm -emit-module-interface \
+// RUN:    -o %t/lambdas.pcm
+// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only \
+// RUN:    -verify
+//
+// RUN: %clang_cc1 -std=c++20 %t/lambdas2.cppm -emit-module-interface \
+// RUN:    -o %t/lambdas2.pcm
+// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only \
+// RUN:    -verify -DUSE_LAMBDA2
+
+//--- lambdas.h
+auto l1 = []() constexpr -> int {
+    return 43;
+};
+// 
+auto l2 = []() constexpr -> double {
+    return 3.0;
+};
+// 
+auto l3 = [](auto i) constexpr -> int {
+  return int(i);
+};
+// 
+auto l4 = [](auto i, auto u) constexpr -> int {
+  return i + u;
+};
+
+//--- lambdas.cppm
+module;
+#include "lambdas.h"
+export module lambdas;
+export using ::l1;
+export using ::l2;
+export using ::l3;
+export using ::l4;
+
+//--- lambdas2.cppm
+export module lambdas2;
+export {
+#include "lambdas.h"  
+}
+
+//--- Use.cpp
+// expected-no-diagnostics
+#ifndef USE_LAMBDA2
+import lambdas;
+#else
+import lambdas2;
+#endif
+
+static_assert(l1.operator()() == 43);
+
+static_assert(l2.operator()() == 3.0);
+
+static_assert(l3.operator()(8.4) == 8);
+ 
+static_assert(l4(4, 12) == 16);
+static_assert(l4(5, 20) == 25);

diff  --git a/clang/test/Modules/template-lambdas.cppm b/clang/test/Modules/template-lambdas.cppm
new file mode 100644
index 0000000000000..69117a1a04fc7
--- /dev/null
+++ b/clang/test/Modules/template-lambdas.cppm
@@ -0,0 +1,68 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/template_lambdas.cppm -emit-module-interface \
+// RUN:    -o %t/lambdas.pcm
+// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only \
+// RUN:    -verify
+//
+// RUN: %clang_cc1 -std=c++20 %t/template_lambdas2.cppm -emit-module-interface \
+// RUN:    -o %t/lambdas2.pcm
+// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only \
+// RUN:    -verify -DUSE_LAMBDA2
+
+//--- lambdas.h
+auto l1 = []<int I>() constexpr -> int {
+    return I;
+};
+
+auto l2 = []<auto I>() constexpr -> decltype(I) {
+    return I;
+};
+
+auto l3 = []<class T>(auto i) constexpr -> T {
+  return T(i);
+};
+
+auto l4 = []<template<class> class T, class U>(T<U>, auto i) constexpr -> U {
+  return U(i);
+};
+
+//--- template_lambdas.cppm
+module;
+#include "lambdas.h"
+export module lambdas;
+export using ::l1;
+export using ::l2;
+export using ::l3;
+export using ::l4;
+
+//--- template_lambdas2.cppm
+export module lambdas2;
+export {
+#include "lambdas.h"  
+}
+
+//--- Use.cpp
+// expected-no-diagnostics
+#ifndef USE_LAMBDA2
+import lambdas;
+#else
+import lambdas2;
+#endif
+
+static_assert(l1.operator()<5>() == 5);
+static_assert(l1.operator()<6>() == 6);
+
+static_assert(l2.operator()<7>() == 7);
+static_assert(l2.operator()<nullptr>() == nullptr);
+
+static_assert(l3.operator()<int>(8.4) == 8);
+static_assert(l3.operator()<int>(9.9) == 9);
+
+template<typename T>
+struct DummyTemplate { };
+
+static_assert(l4(DummyTemplate<float>(), 12) == 12.0);
+static_assert(l4(DummyTemplate<int>(), 19.8) == 19);


        


More information about the cfe-commits mailing list