Skip to content

Commit eab12e4

Browse files
authored
Merge pull request #6847 from wilzbach/forward-cleanup
Use moved core.lifetime.forward for std.functional.forward merged-on-behalf-of: Sebastian Wilzbach <sebi.wilzbach@gmail.com>
2 parents 8202a91 + 8e68c90 commit eab12e4

1 file changed

Lines changed: 2 additions & 111 deletions

File tree

std/functional.d

Lines changed: 2 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,28 +1613,8 @@ Returns:
16131613
*/
16141614
template 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

Comments
 (0)