Skip to content

Commit

Permalink
Fix Issue 5753 - Disallow map with void function.
Browse files Browse the repository at this point in the history
  • Loading branch information
Poita committed Feb 12, 2014
1 parent 4a7f1a9 commit cef8d54
Showing 1 changed file with 20 additions and 1 deletion.
21 changes: 20 additions & 1 deletion std/algorithm.d
Expand Up @@ -388,15 +388,26 @@ template map(fun...) if (fun.length >= 1)
{
auto map(Range)(Range r) if (isInputRange!(Unqual!Range))
{
alias AppliedReturnType(alias f) = typeof(f(r.front));

static if (fun.length > 1)
{
import std.functional : adjoin;
import std.typetuple : staticIndexOf;

alias _funs = staticMap!(unaryFun, fun);
alias _fun = adjoin!_funs;

alias _fun = adjoin!(staticMap!(unaryFun, fun));
alias ReturnTypes = staticMap!(AppliedReturnType, _funs);
static assert(staticIndexOf!(void, ReturnTypes) == -1,
"All mapping functions must not return void.");
}
else
{
alias _fun = unaryFun!fun;

static assert(!is(AppliedReturnType!_fun == void),
"Mapping function must not return void.");
}

return MapResult!(_fun, Range)(r);
Expand Down Expand Up @@ -663,6 +674,14 @@ unittest
static assert(!is(ms1[0..1])); //narrow strings can't be sliced
assert(equal(ms2[0..2], "日本"w));
assert(equal(ms3[0..2], "HE"));

// Issue 5753
static void voidFun(int) {}
static int nonvoidFun(int) { return 0; }
static assert(!__traits(compiles, map!voidFun([1])));
static assert(!__traits(compiles, map!(voidFun, voidFun)([1])));
static assert(!__traits(compiles, map!(nonvoidFun, voidFun)([1])));
static assert(!__traits(compiles, map!(voidFun, nonvoidFun)([1])));
}
unittest
{
Expand Down

0 comments on commit cef8d54

Please sign in to comment.