April 07, 2020
https://issues.dlang.org/show_bug.cgi?id=20724

          Issue ID: 20724
           Summary: Compiler fails to infer @safe
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody@puremagic.com
          Reporter: andrej.mitrovich@gmail.com

-----
public void hash (T) (scope const auto ref T record) // @safe  // uncomment to
compile
    if (is(T == struct))
{
    foreach (const ref field; record.tupleof)
    {
        hash(field);
    }
}

public void hash (T) (scope const auto ref T[] records) @safe
{
    foreach (ref record; records)
        hash(record);
}

@safe void main ()
{
    struct Foo
    {
        Foo[] foo;
    }

    Foo foo;
    hash(foo);
}
-----

$ dmd test.d
$ test.d(15): Error: @safe function test.hash!(Foo).hash cannot call @system
function test.hash!(Foo).hash
$ test.d(3):        test.hash!(Foo).hash is declared here

Uncommenting '@safe' makes it compile. The safety should have been inferred.

--