www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 22210] New: std.meta.allSatisfy in mutual recursion classes


          Issue ID: 22210
           Summary: std.meta.allSatisfy in mutual recursion classes cannot
                    be compiled
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: regression
          Priority: P1
         Component: druntime
          Assignee: nobody puremagic.com
          Reporter: ttanjo gmail.com

The following code works with dmd 2.096.1 but does not work with dmd 2.097.0.
Digger shows that it was introduced by the commit 406e51c68 in druntime.

run.dlang.io: https://run.dlang.io/is/Ot8L6n

import std.meta : allSatisfy;

enum isHashable(T) = __traits(compiles,
    () { T.init; }

class A
    static if (isHashable!B) {}

class B
    static if (isHashable!C) {}

class C
    static if (allSatisfy!(isHashable, int, B)) {}

void main() {}

Error message:
Error: forward reference of variable `isHashable`
/dlang/dmd/linux/bin64/../../src/phobos/std/meta.d(842): Error: template
instance `core.internal.traits.allSat!(isHashable, int, B)` error instantiating
onlineapp.d(19):        instantiated from here: `allSatisfy!(isHashable, int,
onlineapp.d(14): Error: template instance `onlineapp.isHashable!(C)` error
onlineapp.d(9): Error: template instance `onlineapp.isHashable!(B)` error

I use the following commands to search for the commit that introduces this
$ cat bisect.ini
bad  = master   v2.097.0
good = master   v2.096.1

reverse = false

tester = dmd -i -run sample.d

$ dub run digger -- bisect bisect.ini
digger: c717e2eda7063a583ada54182f3016139a50a61f is the first bad commit
commit c717e2eda7063a583ada54182f3016139a50a61f
Author: Andrei Alexandrescu <andrei erdani.com>
Date:   Tue May 4 15:45:09 2021 -0400

druntime: Simplify anySatisfy, allSatisfy, maxAlignment

diff --git a/druntime b/druntime
index 5cfc074f7..406e51c68 160000
--- a/druntime
+++ b/druntime
   -1 +1   
-Subproject commit 5cfc074f73d2087841e66871cd859946ba14003a
+Subproject commit 406e51c68c94a65e383da5aaa500c17d0a9c4d0e

- If we use `isHashable!int && isHashable!B` instead of
`allSatisfy!(isHashable, int, B)`, it works with both of dmd 2.096.1 and dmd
- If we use `isHashable!B && isHashable!int` instead of
`allSatisfy!(isHashable, int, B)`, it is the case of Issue 22184 (does not work
with both versions)

Aug 14 2021