Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
// Ensure that generic lambdas properly construct and destroy user types. // { dg-options "-DUSE_AUTO_SYNTAX" } // { dg-do run { target c++14 } } 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" int printf(const char*, ...); #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<S&&>(r)); assert (i == x); }; #elif USE_EXPLICIT_TEMPLATE_SYNTAX auto byref = [] <typename T> (T& r) { (void) r; }; auto bycref = [] <typename T> (T const& r) { (void) r; }; auto byval = [] <typename T, typename I> (T v, I const x) { assert (i == x); (void) v; }; auto byrval = [] <typename T, typename I> (T&& r, I const x) { S steal (static_cast<S&&>(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&&>(s), 6); assert (i == 5); } assert (i == 3); }