mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 21:21:48 +03:00

* Fix 23722 - Lambdas are mangled incorrectly when using multiple compilation units, resulting in incorrect code * Update test cases
145 lines
3.8 KiB
D
145 lines
3.8 KiB
D
/*
|
|
TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fail12378.d(18): Error: undefined identifier `ANYTHING`
|
|
fail_compilation/fail12378.d(18): Error: undefined identifier `GOES`
|
|
fail_compilation/fail12378.d(91): instantiated from here: `MapResultS!((x0) => ANYTHING - GOES, Result)`
|
|
fail_compilation/fail12378.d(17): instantiated from here: `mapS!(Result)`
|
|
fail_compilation/fail12378.d(100): instantiated from here: `__lambda_L16_C19!int`
|
|
fail_compilation/fail12378.d(91): instantiated from here: `MapResultS!((y0) => iota(2).mapS!((x0) => ANYTHING - GOES), Result)`
|
|
fail_compilation/fail12378.d(16): instantiated from here: `mapS!(Result)`
|
|
---
|
|
*/
|
|
void testS()
|
|
{
|
|
auto r =
|
|
iota(1).mapS!(y0 =>
|
|
iota(2).mapS!(x0 =>
|
|
ANYTHING-GOES
|
|
)
|
|
);
|
|
}
|
|
|
|
/*
|
|
TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fail12378.d(40): Error: undefined identifier `ANYTHING`
|
|
fail_compilation/fail12378.d(40): Error: undefined identifier `GOES`
|
|
fail_compilation/fail12378.d(112): instantiated from here: `MapResultC!((x0) => ANYTHING - GOES, Result)`
|
|
fail_compilation/fail12378.d(39): instantiated from here: `mapC!(Result)`
|
|
fail_compilation/fail12378.d(123): instantiated from here: `__lambda_L38_C19!int`
|
|
fail_compilation/fail12378.d(112): instantiated from here: `MapResultC!((y0) => iota(2).mapC!((x0) => ANYTHING - GOES), Result)`
|
|
fail_compilation/fail12378.d(38): instantiated from here: `mapC!(Result)`
|
|
---
|
|
*/
|
|
void testC()
|
|
{
|
|
auto r =
|
|
iota(1).mapC!(y0 =>
|
|
iota(2).mapC!(x0 =>
|
|
ANYTHING-GOES
|
|
)
|
|
);
|
|
}
|
|
|
|
/*
|
|
TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fail12378.d(64): Error: undefined identifier `ANYTHING`
|
|
fail_compilation/fail12378.d(64): Error: undefined identifier `GOES`
|
|
fail_compilation/fail12378.d(135): instantiated from here: `MapResultI!((x0) => ANYTHING - GOES, Result)`
|
|
fail_compilation/fail12378.d(63): instantiated from here: `mapI!(Result)`
|
|
fail_compilation/fail12378.d(143): instantiated from here: `__lambda_L62_C19!int`
|
|
fail_compilation/fail12378.d(135): instantiated from here: `MapResultI!((y0) => iota(2).mapI!((x0) => ANYTHING - GOES), Result)`
|
|
fail_compilation/fail12378.d(62): instantiated from here: `mapI!(Result)`
|
|
---
|
|
*/
|
|
|
|
|
|
void testI()
|
|
{
|
|
auto r =
|
|
iota(1).mapI!(y0 =>
|
|
iota(2).mapI!(x0 =>
|
|
ANYTHING-GOES
|
|
)
|
|
);
|
|
}
|
|
|
|
auto iota(E)(E end)
|
|
{
|
|
alias Value = E;
|
|
|
|
static struct Result
|
|
{
|
|
private Value current, pastLast;
|
|
|
|
@property inout(Value) front() inout { return current; }
|
|
}
|
|
|
|
return Result(0, end);
|
|
}
|
|
|
|
template mapS(fun...)
|
|
{
|
|
auto mapS(R)(R r)
|
|
{
|
|
alias AppliedReturnType(alias f) = typeof(f(r.front));
|
|
static assert(!is(AppliedReturnType!fun == void),
|
|
"Mapping function must not return void.");
|
|
|
|
return MapResultS!(fun, R)(r);
|
|
}
|
|
}
|
|
struct MapResultS(alias fun, R)
|
|
{
|
|
R _input;
|
|
|
|
@property auto ref front()
|
|
{
|
|
return fun(_input.front);
|
|
}
|
|
}
|
|
|
|
template mapC(fun...)
|
|
{
|
|
auto mapC(R)(R r)
|
|
{
|
|
alias AppliedReturnType(alias f) = typeof(f(r.front));
|
|
static assert(!is(AppliedReturnType!fun == void),
|
|
"Mapping function must not return void.");
|
|
|
|
return new MapResultC!(fun, R)(r);
|
|
}
|
|
}
|
|
class MapResultC(alias fun, R)
|
|
{
|
|
R _input;
|
|
|
|
this(R r) { _input = r; }
|
|
|
|
@property auto ref front()
|
|
{
|
|
return fun(_input.front);
|
|
}
|
|
}
|
|
|
|
template mapI(fun...)
|
|
{
|
|
auto mapI(R)(R r)
|
|
{
|
|
alias AppliedReturnType(alias f) = typeof(f(r.front));
|
|
static assert(!is(AppliedReturnType!fun == void),
|
|
"Mapping function must not return void.");
|
|
|
|
return MapResultI!(fun, R).init;
|
|
}
|
|
}
|
|
interface MapResultI(alias fun, R)
|
|
{
|
|
static @property auto ref front()
|
|
{
|
|
R _input;
|
|
return fun(_input.front);
|
|
}
|
|
}
|