@@ -1613,28 +1613,8 @@ Returns:
16131613*/
16141614template forward (args... )
16151615{
1616- static if (args.length)
1617- {
1618- import std.algorithm.mutation : move;
1619-
1620- alias arg = args[0 ];
1621- // by ref || lazy || const/immutable
1622- static if (__traits(isRef, arg) ||
1623- __traits (isOut , arg) ||
1624- __traits (isLazy , arg) ||
1625- ! is (typeof (move(arg))))
1626- alias fwd = arg;
1627- // (r)value
1628- else
1629- @property auto fwd(){ return move(arg); }
1630-
1631- static if (args.length == 1 )
1632- alias forward = fwd;
1633- else
1634- alias forward = AliasSeq! (fwd, forward! (args[1 .. $]));
1635- }
1636- else
1637- alias forward = AliasSeq! ();
1616+ import core.lifetime : fun = forward;
1617+ alias forward = fun! args;
16381618}
16391619
16401620// /
@@ -1678,49 +1658,6 @@ template forward(args...)
16781658 assert (s == " HelloHello" );
16791659}
16801660
1681- @safe unittest
1682- {
1683- auto foo (TL ... )(auto ref TL args)
1684- {
1685- string result = " " ;
1686- foreach (i, _; args)
1687- {
1688- // pragma(msg, "[",i,"] ", __traits(isRef, args[i]) ? "L" : "R");
1689- result ~= __traits(isRef, args[i]) ? " L" : " R" ;
1690- }
1691- return result;
1692- }
1693-
1694- string bar (TL ... )(auto ref TL args)
1695- {
1696- return foo (forward! args);
1697- }
1698- string baz (TL ... )(auto ref TL args)
1699- {
1700- int x;
1701- return foo (forward! args[3 ], forward! args[2 ], 1 , forward! args[1 ], forward! args[0 ], x);
1702- }
1703-
1704- struct S {}
1705- S makeS (){ return S(); }
1706- int n;
1707- string s;
1708- assert (bar(S(), makeS(), n, s) == " RRLL" );
1709- assert (baz(S(), makeS(), n, s) == " LLRRRL" );
1710- }
1711-
1712- @safe unittest
1713- {
1714- ref int foo (return ref int a) { return a; }
1715- ref int bar (Args)(auto ref Args args)
1716- {
1717- return foo (forward! args);
1718- }
1719- static assert (! __traits(compiles, { auto x1 = bar(3 ); })); // case of NG
1720- int value = 3 ;
1721- auto x2 = bar(value); // case of OK
1722- }
1723-
17241661// /
17251662@safe unittest
17261663{
@@ -1787,49 +1724,3 @@ template forward(args...)
17871724 // const rvalue, copy
17881725 assert (z4.x_.i == 1 );
17891726}
1790-
1791- // lazy -> lazy
1792- @safe unittest
1793- {
1794- int foo1 (lazy int i) { return i; }
1795- int foo2 (A)(auto ref A i) { return foo1(forward! i); }
1796- int foo3 (lazy int i) { return foo2(i); }
1797-
1798- int numCalls = 0 ;
1799- assert (foo3({ ++ numCalls; return 42 ; }()) == 42 );
1800- assert (numCalls == 1 );
1801- }
1802-
1803- // lazy -> non-lazy
1804- @safe unittest
1805- {
1806- int foo1 (int a, int b) { return a + b; }
1807- int foo2 (A... )(auto ref A args) { return foo1(forward! args); }
1808- int foo3 (int a, lazy int b) { return foo2(a, b); }
1809-
1810- int numCalls;
1811- assert (foo3(11 , { ++ numCalls; return 31 ; }()) == 42 );
1812- assert (numCalls == 1 );
1813- }
1814-
1815- // non-lazy -> lazy
1816- @safe unittest
1817- {
1818- int foo1 (int a, lazy int b) { return a + b; }
1819- int foo2 (A... )(auto ref A args) { return foo1(forward! args); }
1820- int foo3 (int a, int b) { return foo2(a, b); }
1821-
1822- assert (foo3(11 , 31 ) == 42 );
1823- }
1824-
1825- // out
1826- @safe unittest
1827- {
1828- void foo1 (int a, out int b) { b = a; }
1829- void foo2 (A... )(auto ref A args) { foo1(forward! args); }
1830- void foo3 (int a, out int b) { foo2(a, b); }
1831-
1832- int b;
1833- foo3(42 , b);
1834- assert (b == 42 );
1835- }
0 commit comments