Skip to content

Commit

Permalink
Merge pull request #4860 from nordlow/no-infinite-make
Browse files Browse the repository at this point in the history
Restrict making of containers to non-infinite ranges
  • Loading branch information
jmdavis committed Oct 13, 2016
2 parents 10d84d2 + ad5537d commit dd609e6
Showing 1 changed file with 13 additions and 2 deletions.
15 changes: 13 additions & 2 deletions std/container/util.d
Expand Up @@ -103,22 +103,33 @@ unittest
template make(alias Container, Args...)
if (!is(Container))
{
import std.range : isInputRange;
import std.range : isInputRange, isInfinite;
import std.traits : isDynamicArray;

auto make(Range)(Range range)
if (!isDynamicArray!Range && isInputRange!Range)
if (!isDynamicArray!Range && isInputRange!Range && !isInfinite!Range)
{
import std.range : ElementType;
return .make!(Container!(ElementType!Range, Args))(range);
}

auto make(T)(T[] items...)
if (!isInfinite!T)
{
return .make!(Container!(T, Args))(items);
}
}

/// forbid construction from infinite range
unittest
{
import std.container.array : Array;
import std.range : only, repeat;
import std.range.primitives : isInfinite;
static assert(__traits(compiles, { auto arr = make!Array(only(5)); }));
static assert(!__traits(compiles, { auto arr = make!Array(repeat(5)); }));
}

///
unittest
{
Expand Down

0 comments on commit dd609e6

Please sign in to comment.