May 08, 2023
https://issues.dlang.org/show_bug.cgi?id=23904

          Issue ID: 23904
           Summary: Spurious "struct [...] already exists"
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: rejects-valid
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody@puremagic.com
          Reporter: dlang-bugzilla@thecybershadow.net

//////////// test.d ///////////
template f1(alias fun)
{
    struct UnusedButConflicting
    {
    }

    auto f1()
    {
    }
}

template f2(T)
{
    alias fun = {};

    auto f2(auto ref T)
    {
        f1!fun();
    }
}

auto f3(T)(T value)
{
    f2(value);
}

void main()
{
    f2(5);
    f3(5);
}
///////////////////////////////

Output:

test.d(3): Error: struct `test.f1!(function ()
{
}
).UnusedButConflicting` already exists at test.d(3). Perhaps in another
function with the same name?
test.d(18): Error: template instance `test.f1!(function ()
{
}
)` error instantiating
test.d(24):        instantiated from here: `f2!int`
test.d(30):        instantiated from here: `f3!int`
-----


I think the "auto ref" is somehow to blame. The type is the same, but the "auto ref" is instantiated to with/without ref, which seems to cause two UnusedButConflicting instances with the same mangling?

--