From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13679 invoked by alias); 2 Nov 2013 10:03:27 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 13478 invoked by uid 89); 2 Nov 2013 10:03:25 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-wg0-f54.google.com Received: from mail-wg0-f54.google.com (HELO mail-wg0-f54.google.com) (74.125.82.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Sat, 02 Nov 2013 10:03:23 +0000 Received: by mail-wg0-f54.google.com with SMTP id c11so434224wgh.9 for ; Sat, 02 Nov 2013 03:03:19 -0700 (PDT) X-Received: by 10.180.12.14 with SMTP id u14mr5234300wib.63.1383386599599; Sat, 02 Nov 2013 03:03:19 -0700 (PDT) Received: from sphere.lan (munkyhouse.force9.co.uk. [84.92.244.81]) by mx.google.com with ESMTPSA id dn2sm14732694wid.1.2013.11.02.03.03.18 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 02 Nov 2013 03:03:18 -0700 (PDT) From: Adam Butcher To: Jason Merrill Cc: gcc-patches@gcc.gnu.org, Volker Reichelt , Adam Butcher Subject: [C++ PATCH 3/3] Add some generic lambda test cases. Date: Sat, 02 Nov 2013 10:03:00 -0000 Message-Id: <1383212824-5493-4-git-send-email-adam@jessamine.co.uk> In-Reply-To: <1383212824-5493-1-git-send-email-adam@jessamine.co.uk> References: <1383212824-5493-1-git-send-email-adam@jessamine.co.uk> X-SW-Source: 2013-11/txt/msg00084.txt.bz2 gcc/testsuite/g++.dg/cpp1y/ * lambda-generic.C: New test case. * lambda-generic-cfun.C: New test case. * lambda-generic-dep.C: New test case. * lambda-generic-udt.C: New test case. * lambda-generic-variadic.C: New test case. * lambda-generic-x.C: New test case. * lambda-generic-xcfun.C: New test case. * lambda-generic-xudt.C: New test case. * lambda-generic-mixed.C: New test case. --- gcc/testsuite/g++.dg/cpp1y/lambda-generic-cfun.C | 25 +++++++++++ gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C | 42 ++++++++++++++++++ gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C | 10 +++++ gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C | 51 ++++++++++++++++++++++ .../g++.dg/cpp1y/lambda-generic-variadic.C | 15 +++++++ gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C | 25 +++++++++++ gcc/testsuite/g++.dg/cpp1y/lambda-generic-xcfun.C | 25 +++++++++++ gcc/testsuite/g++.dg/cpp1y/lambda-generic-xudt.C | 4 ++ gcc/testsuite/g++.dg/cpp1y/lambda-generic.C | 23 ++++++++++ 9 files changed, 220 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-cfun.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-xcfun.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-xudt.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic.C diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-cfun.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-cfun.C new file mode 100644 index 0000000..5e51526 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-cfun.C @@ -0,0 +1,25 @@ +// Generic lambda conversion to function ptr test from N3690 5.1.2.6 +// { dg-options "-std=c++1y" } + +void f1(int (*)(int)) { } +void f2(char (*)(int)) { } +void g(int (*)(int)) { } // #1 +void g(char (*)(char)) { } // #2 +void h(int (*)(int)) { } // #3 +void h(char (*)(int)) { } // #4 + +int main() +{ + auto glambda = [](auto a) { return a; }; + int (*fp)(int) = glambda; + f1(glambda); // OK + f2(glambda); // { dg-error "invalid user-defined conversion" } + g(glambda); // { dg-error "ambiguous" } + h(glambda); // OK: calls #3 since it is convertible from ID + int& (*fpi)(int*) = [](auto* a) -> auto& { return *a; }; // OK + + auto GL = [](auto a) { return a; }; + int (*GL_int)(int) = GL; // OK: through conversion function template + GL_int(3); +} + diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C new file mode 100644 index 0000000..bb68738 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C @@ -0,0 +1,42 @@ +// Generic lambda type dependence test part from N3690 5.1.2.12 +// { dg-options "-std=c++1y" } + +void f(int, const int (&)[2] = {}) { } // #1 +void f(const int&, const int (&)[1]) { } // #2 + +void test() +{ + const int x = 17; + auto g = [](auto a) { + f(x); // OK: calls #1, does not capture x + }; + auto g2 = [=](auto a) { + int selector[sizeof(a) == 1 ? 1 : 2]{}; + f(x, selector); // OK: is a dependent expression, so captures x + }; +} + +struct S { + struct N { + auto test () { return 7.f; } + }; +}; + +#include + +int main() +{ + auto f = [] (T const& s) mutable { + typename T::N x; + return x.test (); + }; + auto g = [] (auto const& s) { + typename std::decay::type::N x; + return x.test (); + }; + + S i; + f(i); + g(i); +} + diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C new file mode 100644 index 0000000..4e26fc5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C @@ -0,0 +1,10 @@ +// Mixed explicit and implicit generic lambda test. +// { dg-options "-std=c++1y" } + +int main() +{ + auto f = [] (T a, auto b) { return a + b; }; + auto g = [] (auto a, T b) { return a + b; }; + + return f (1.0, 3) + g (1.0, 3); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C new file mode 100644 index 0000000..9f6d45a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C @@ -0,0 +1,51 @@ +// Ensure that generic lambdas properly construct and destroy user types. +// { dg-options "-std=c++1y -DUSE_AUTO_SYNTAX" } +// { dg-do run } + +int i = 3; + +struct S +{ + S () { ++i; } + S (S const&) { ++i; } + S (S&& old) { old.shadow = true; i += 2; } + ~S () { if (shadow) i -= 2; else --i; } + + bool shadow = false; +}; + +extern "C" void printf(...); +#define assert(e) if (e); else \ + printf ("%s:%d: !(%s)\n", __FILE__, __LINE__, #e), __builtin_abort (); + +int main () +{ + assert (i == 3); + { + S s; assert (i == 4); + + #if USE_AUTO_SYNTAX + auto byref = [] (auto& r) { (void) r; }; + auto bycref = [] (auto const& r) { (void) r; }; + auto byval = [] (auto v, auto const x) { assert (i == x); (void) v; }; + auto byrval = [] (auto&& r, auto const x) { S steal (static_cast(r)); + assert (i == x); }; + + #elif USE_EXPLICIT_TEMPLATE_SYNTAX + auto byref = [] (T& r) { (void) r; }; + auto bycref = [] (T const& r) { (void) r; }; + auto byval = [] + (T v, I const x) { assert (i == x); (void) v; }; + auto byrval = [] + (T&& r, I const x) { S steal (static_cast(r)); + assert (i == x); }; + #endif + + byref (s); assert (i == 4); + bycref (s); assert (i == 4); + byval (s, 5); assert (i == 4); + byrval (static_cast(s), 6); assert (i == 5); + } + assert (i == 3); +} + diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic.C new file mode 100644 index 0000000..bd41b35 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic.C @@ -0,0 +1,15 @@ +// Basic generic lambda test +// { dg-options "-std=c++1y" } +// { dg-do run } + +template struct pair {}; +template struct tuple {}; + +int main() +{ + auto a = [] (auto, pair v) { return sizeof (v); }; + auto b = [] (auto, pair,auto>... v) { return sizeof... (v); }; + + a(1, pair()); + b(2, pair, double>(), pair, int>()); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C new file mode 100644 index 0000000..48a6268 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C @@ -0,0 +1,25 @@ +// Explicit generic lambda test from N3690 5.1.2.5 +// { dg-options "-std=gnu++1y" } + +#include + +int main() +{ + auto glambda = [] (A a, B&& b) { return a < b; }; + bool b = glambda(3, 3.14); // OK + auto vglambda = [] (P printer) { + return [=] (T&& ... ts) { // OK: ts is a function parameter pack + printer(std::forward(ts)...); + return [=]() { + printer(ts ...); + }; + }; + }; + auto p = vglambda( [] (A v1, B v2, C v3) + { std::cout << v1 << v2 << v3; } ); + auto q = p(1, 'a', 3.14); // OK: outputs 1a3.14 + q(); // OK: outputs 1a3.14 +} + diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xcfun.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xcfun.C new file mode 100644 index 0000000..d44b796 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xcfun.C @@ -0,0 +1,25 @@ +// Explicit generic lambda conversion to function ptr test from N3690 5.1.2.6 +// { dg-options "-std=gnu++1y" } + +void f1(int (*)(int)) { } +void f2(char (*)(int)) { } +void g(int (*)(int)) { } // #1 +void g(char (*)(char)) { } // #2 +void h(int (*)(int)) { } // #3 +void h(char (*)(int)) { } // #4 + +int main() +{ + auto glambda = [] (T a) { return a; }; + int (*fp)(int) = glambda; + f1(glambda); // OK + f2(glambda); // { dg-error "invalid user-defined conversion" } + g(glambda); // { dg-error "ambiguous" } + h(glambda); // OK: calls #3 since it is convertible from ID + int& (*fpi)(int*) = [] (T* a) -> auto& { return *a; }; // OK + + auto GL = [] (T a) { return a; }; + int (*GL_int)(int) = GL; // OK: through conversion function template + GL_int(3); +} + diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xudt.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xudt.C new file mode 100644 index 0000000..fba864b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xudt.C @@ -0,0 +1,4 @@ +// Ensure that generic lambdas properly construct and destroy user types. +// { dg-options "-std=gnu++1y -DUSE_EXPLICIT_TEMPLATE_SYNTAX" } + +#include "lambda-generic-udt.C" diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic.C new file mode 100644 index 0000000..1f66475 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic.C @@ -0,0 +1,23 @@ +// Generic lambda test from N3690 5.1.2.5 +// { dg-options "-std=c++1y" } + +#include + +int main() +{ + auto glambda = [](auto a, auto&& b) { return a < b; }; + bool b = glambda(3, 3.14); // OK + auto vglambda = [](auto printer) { + return [=](auto&& ... ts) { // OK: ts is a function parameter pack + printer(std::forward(ts)...); + return [=]() { + printer(ts ...); + }; + }; + }; + auto p = vglambda( [](auto v1, auto v2, auto v3) + { std::cout << v1 << v2 << v3; } ); + auto q = p(1, 'a', 3.14); // OK: outputs 1a3.14 + q(); // OK: outputs 1a3.14 +} + -- 1.8.4