diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CXX/temp/temp.decls/temp.variadic/p4.cpp | 9 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle-lambda-explicit-template-params.cpp | 34 | ||||
-rw-r--r-- | clang/test/Index/print-display-names.cpp | 2 | ||||
-rw-r--r-- | clang/test/PCH/cxx11-lambdas.mm | 2 | ||||
-rw-r--r-- | clang/test/PCH/cxx1y-lambdas.mm | 2 | ||||
-rw-r--r-- | clang/test/PCH/cxx2a-template-lambdas.cpp | 42 | ||||
-rw-r--r-- | clang/test/Parser/cxx2a-template-lambdas.cpp | 8 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx2a-template-lambdas.cpp | 45 |
8 files changed, 135 insertions, 9 deletions
diff --git a/clang/test/CXX/temp/temp.decls/temp.variadic/p4.cpp b/clang/test/CXX/temp/temp.decls/temp.variadic/p4.cpp index 1681325f2e6..da9895ca6d2 100644 --- a/clang/test/CXX/temp/temp.decls/temp.variadic/p4.cpp +++ b/clang/test/CXX/temp/temp.decls/temp.variadic/p4.cpp @@ -213,8 +213,10 @@ namespace PackExpansionWithinLambda { }; #endif +#if __cplusplus > 201703L // - in a template parameter pack that is a pack expansion - // FIXME: We do not support any way to reach this case yet. + swallow([]<T *...v, template<T *> typename ...W>(W<v> ...wv) { }); +#endif // - in an initializer-list int arr[] = {T().x...}; @@ -279,11 +281,6 @@ namespace PackExpansionWithinLambda { struct T { int x; using U = int; }; void g() { f<T>(1, 2, 3); } - template<typename ...T, typename ...U> void pack_in_lambda(U ...u) { // expected-note {{here}} - // FIXME: Move this test into 'f' above once we support this syntax. - []<T *...v, template<T *> typename ...U>(U<v> ...uv) {}; // expected-error {{expected body of lambda}} expected-error {{does not refer to a value}} - } - template<typename ...T> void pack_expand_attr() { // FIXME: Move this test into 'f' above once we support this. [[gnu::aligned(alignof(T))...]] int x; // expected-error {{cannot be used as an attribute pack}} expected-error {{unexpanded}} diff --git a/clang/test/CodeGenCXX/mangle-lambda-explicit-template-params.cpp b/clang/test/CodeGenCXX/mangle-lambda-explicit-template-params.cpp new file mode 100644 index 00000000000..3bec64156a9 --- /dev/null +++ b/clang/test/CodeGenCXX/mangle-lambda-explicit-template-params.cpp @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -std=c++2a -triple %itanium_abi_triple -emit-llvm -o - %s -w | FileCheck %s + +template<class, int, class> +struct DummyType { }; + +inline void inline_func() { + // CHECK: UlvE + []{}(); + + // CHECK: UlTyvE + []<class>{}.operator()<int>(); + + // CHECK: UlTyT_E + []<class T>(T){}(1); + + // CHECK: UlTyTyT_T0_E + []<class T1, class T2>(T1, T2){}(1, 2); + + // CHECK: UlTyTyT0_T_E + []<class T1, class T2>(T2, T1){}(2, 1); + + // CHECK: UlTniTyTnjT0_E + []<int I, class T, unsigned U>(T){}.operator()<1, int, 2>(3); + + // CHECK: UlTyTtTyTniTyETniTyvE + []<class, + template<class, int, class> class, + int, + class>{}.operator()<unsigned, DummyType, 5, int>(); +} + +void call_inline_func() { + inline_func(); +} diff --git a/clang/test/Index/print-display-names.cpp b/clang/test/Index/print-display-names.cpp index 5ba10e43bc2..958948df538 100644 --- a/clang/test/Index/print-display-names.cpp +++ b/clang/test/Index/print-display-names.cpp @@ -20,7 +20,7 @@ template<> void g<int>(ClassTmpl<int, int>); // DISPLAY_NAME: print-display-names.cpp:13:17: FunctionDecl=g<>(ClassTmpl<int, int>):13:17 [Specialization of g:11:6] // RUN: env CINDEXTEST_PRINTINGPOLICY_TERSEOUTPUT=1 c-index-test -test-load-source all-pretty %s | FileCheck %s --check-prefix=PRETTY -// PRETTY: print-display-names.cpp:2:7: ClassTemplate=template <typename T, typename > class ClassTmpl {}:2:7 (Definition) Extent=[1:1 - 2:20] +// PRETTY: print-display-names.cpp:2:7: ClassTemplate=template <typename T, typename> class ClassTmpl {}:2:7 (Definition) Extent=[1:1 - 2:20] // PRETTY: print-display-names.cpp:4:13: TypedefDecl=typedef int Integer:4:13 (Definition) Extent=[4:1 - 4:20] // PRETTY: print-display-names.cpp:6:16: ClassDecl=template<> class ClassTmpl<int, int> {}:6:16 (Definition) [Specialization of ClassTmpl:2:7] Extent=[6:1 - 6:43] // PRETTY: print-display-names.cpp:8:6: FunctionDecl=void f(ClassTmpl<float, Integer> p):8:6 Extent=[8:1 - 8:36] diff --git a/clang/test/PCH/cxx11-lambdas.mm b/clang/test/PCH/cxx11-lambdas.mm index 9628d12aa15..de2ed61606c 100644 --- a/clang/test/PCH/cxx11-lambdas.mm +++ b/clang/test/PCH/cxx11-lambdas.mm @@ -54,7 +54,7 @@ int add(int x, int y) { } // CHECK-PRINT: inline int add_int_slowly_twice -// CHECK-PRINT: lambda = [&] (int z) +// CHECK-PRINT: lambda = [&](int z) // CHECK-PRINT: init_capture // CHECK-PRINT: [&, x(t)] diff --git a/clang/test/PCH/cxx1y-lambdas.mm b/clang/test/PCH/cxx1y-lambdas.mm index 5235fc5a4cb..f140a15215b 100644 --- a/clang/test/PCH/cxx1y-lambdas.mm +++ b/clang/test/PCH/cxx1y-lambdas.mm @@ -50,7 +50,7 @@ int add(int x, int y) { } // CHECK-PRINT: inline int add_int_slowly_twice -// CHECK-PRINT: lambda = [] (type-parameter-0-0 z +// CHECK-PRINT: lambda = [](auto z // CHECK-PRINT: init_capture // CHECK-PRINT: [&, x(t)] diff --git a/clang/test/PCH/cxx2a-template-lambdas.cpp b/clang/test/PCH/cxx2a-template-lambdas.cpp new file mode 100644 index 00000000000..c9d923f98c0 --- /dev/null +++ b/clang/test/PCH/cxx2a-template-lambdas.cpp @@ -0,0 +1,42 @@ +// RUN: %clang_cc1 -std=c++2a -emit-pch %s -o %t +// RUN: %clang_cc1 -std=c++2a -include-pch %t -verify %s + +// expected-no-diagnostics + +#ifndef HEADER +#define HEADER + +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); +}; + +#else /*included pch*/ + +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); + +#endif // HEADER diff --git a/clang/test/Parser/cxx2a-template-lambdas.cpp b/clang/test/Parser/cxx2a-template-lambdas.cpp new file mode 100644 index 00000000000..034a3b157d8 --- /dev/null +++ b/clang/test/Parser/cxx2a-template-lambdas.cpp @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -std=c++2a %s -verify + +auto L0 = []<> { }; //expected-error {{cannot be empty}} + +auto L1 = []<typename T1, typename T2> { }; +auto L2 = []<typename T1, typename T2>(T1 arg1, T2 arg2) -> T1 { }; +auto L3 = []<typename T>(auto arg) { T t; }; +auto L4 = []<int I>() { }; diff --git a/clang/test/SemaCXX/cxx2a-template-lambdas.cpp b/clang/test/SemaCXX/cxx2a-template-lambdas.cpp new file mode 100644 index 00000000000..6d22be44d83 --- /dev/null +++ b/clang/test/SemaCXX/cxx2a-template-lambdas.cpp @@ -0,0 +1,45 @@ +// RUN: %clang_cc1 -std=c++2a -verify %s + +template<typename, typename> +constexpr bool is_same = false; + +template<typename T> +constexpr bool is_same<T, T> = true; + +template<typename T> +struct DummyTemplate { }; + +void func() { + auto L0 = []<typename T>(T arg) { + static_assert(is_same<T, int>); // expected-error {{static_assert failed}} + }; + L0(0); + L0(0.0); // expected-note {{in instantiation}} + + auto L1 = []<int I> { + static_assert(I == 5); // expected-error {{static_assert failed}} + }; + L1.operator()<5>(); + L1.operator()<6>(); // expected-note {{in instantiation}} + + auto L2 = []<template<typename> class T, class U>(T<U> &&arg) { + static_assert(is_same<T<U>, DummyTemplate<float>>); // // expected-error {{static_assert failed}} + }; + L2(DummyTemplate<float>()); + L2(DummyTemplate<double>()); // expected-note {{in instantiation}} +} + +template<typename T> // expected-note {{declared here}} +struct ShadowMe { + void member_func() { + auto L = []<typename T> { }; // expected-error {{'T' shadows template parameter}} + } +}; + +template<typename T> +constexpr T outer() { + return []<T x>() { return x; }.template operator()<123>(); // expected-error {{no matching member function}} \ + expected-note {{candidate template ignored}} +} +static_assert(outer<int>() == 123); +template int *outer<int *>(); // expected-note {{in instantiation}} |