From a7a847013e22b3b8ea370fd03a2c35bc552bb7fc Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Thu, 14 Mar 2019 16:15:49 -0700 Subject: [PATCH] ChooseResult: use of unions need to be @trusted --- std/range/package.d | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/std/range/package.d b/std/range/package.d index f14788f18..287f883e3 100644 --- a/std/range/package.d +++ b/std/range/package.d @@ -1450,9 +1450,15 @@ private struct ChooseResult(R1, R2) auto ref ExtraArgs extraArgs) { if (r.r1Chosen) - return foo(r.r1, extraArgs); + { + ref get1(return ref ChooseResult r) @trusted { return r.r1; } + return foo(get1(r), extraArgs); + } else - return foo(r.r2, extraArgs); + { + ref get2(return ref ChooseResult r) @trusted { return r.r2; } + return foo(get2(r), extraArgs); + } } this(bool r1Chosen, return scope R1 r1, return scope R2 r2) @trusted @@ -1475,6 +1481,15 @@ private struct ChooseResult(R1, R2) } } + void opAssign(return scope ChooseResult r) @trusted + { + r1Chosen = r.r1Chosen; + if (r1Chosen) + r1 = r.r1; // assigning to union members is @system + else + r2 = r.r2; + } + // Carefully defined postblit to postblit the appropriate range static if (hasElaborateCopyConstructor!R1 || hasElaborateCopyConstructor!R2)