From 01a12f919e624b3f7b73171ae03d4d0a91a0b87b Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Mon, 10 Apr 2023 17:10:18 +0100 Subject: [PATCH] [std.algorithm.searching] Don't instantiate template pred in `all` and `any` constraints (#8715) Fixes Issue 23769 - Lambda isn't a unary predicate for lambda that doesn't compile. --- std/algorithm/searching.d | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/std/algorithm/searching.d b/std/algorithm/searching.d index e2c99363d..f891056a7 100644 --- a/std/algorithm/searching.d +++ b/std/algorithm/searching.d @@ -119,12 +119,9 @@ template all(alias pred = "a") Performs (at most) $(BIGOH range.length) evaluations of `pred`. +/ bool all(Range)(Range range) - if (isInputRange!Range) + if (isInputRange!Range && + (__traits(isTemplate, pred) || is(typeof(unaryFun!pred(range.front))))) { - static assert(is(typeof(unaryFun!pred(range.front))), - "`" ~ (isSomeString!(typeof(pred)) - ? pred.stringof[1..$-1] : pred.stringof) - ~ "` isn't a unary predicate function for range.front"); import std.functional : not; return find!(not!(unaryFun!pred))(range).empty; @@ -172,7 +169,8 @@ template any(alias pred = "a") Performs (at most) $(BIGOH range.length) evaluations of `pred`. +/ bool any(Range)(Range range) - if (isInputRange!Range && is(typeof(unaryFun!pred(range.front)))) + if (isInputRange!Range && + (__traits(isTemplate, pred) || is(typeof(unaryFun!pred(range.front))))) { return !find!pred(range).empty; }