From ad5537d5c95c1b6690dcbd4dc627172795438fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20Nordl=C3=B6w?= Date: Thu, 13 Oct 2016 15:57:05 +0200 Subject: [PATCH] Restrict making of containers to non-infinite ranges --- std/container/util.d | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/std/container/util.d b/std/container/util.d index a3dab9398a1..d9718d26270 100644 --- a/std/container/util.d +++ b/std/container/util.d @@ -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 {