Files
gcc-reflection/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C
Bernd Edlinger dac9376aee re PR c++/71973 (c++ handles built-in functions inconsistently)
2016-11-04  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR c++/71973
        * g++.dg/cpp1y/lambda-generic-udt.C: Fix builtin function declaration.
        * g++.dg/init/new15.C: Likewise.
        * g++.dg/ipa/inline-1.C: Likewise.
        * g++.dg/ipa/inline-2.C: Likewise.
        * g++.dg/lto/20080908-1_0.C: Likewise.
        * g++.dg/tc1/dr20.C: Likewise.
        * g++.dg/tree-ssa/inline-1.C: Likewise.
        * g++.dg/tree-ssa/inline-2.C: Likewise.
        * g++.old-deja/g++.law/except1.C: Likewise.
        * g++.old-deja/g++.other/vbase5.C: Likewise.
        * obj-c++.dg/lto/trivial-1_0.mm: Likewise.

From-SVN: r241846
2016-11-04 15:30:52 +00:00

52 lines
1.5 KiB
C

// 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);
}