May 18, 2019
https://issues.dlang.org/show_bug.cgi?id=19884

          Issue ID: 19884
           Summary: Error: alias op = op; cannot alias itself, use a
                    qualified name to create an overload set
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: regression
          Priority: P1
         Component: dmd
          Assignee: nobody@puremagic.com
          Reporter: hsteoh@quickfur.ath.cx

This regression is so strange that I'm not sure what's the best title for the bug beyond the compiler's strange error message.

Reduced code:
------
mixin template genCtEvaluate()
{
    void evaluate(alias op)() { }
}
struct S
{
    mixin genCtEvaluate!() mixinEval;
    alias evaluate = mixinEval.evaluate;
    void evaluate() { }
}
alias List(Ops...) = Ops;
void main()
{
    S g;
    foreach (op; List!(0))
    {
        g.evaluate!op();
    }
}
------

Compiler output:
------
expr.d(3): Error: alias op = op; cannot alias itself, use a qualified name to
create an overload set
expr.d(17):        while looking for match for evaluate!op
------

This error is very strange, because 'op' is supposed to be a local symbol in the scope of the foreach, so why does it clash with the 'op' in the 'alias op' parameter of genCtEvaluate.evaluate?

Furthermore, renaming the alias parameter, e.g., to `alias _op` elicits this even stranger error message:

------
expr.d(17): Error: undefined identifier op
expr.d(17):        while looking for match for evaluate!op
------

Very odd, since op is declared right in the line above as the foreach loop variable.

Also, this strange behaviour goes away if the `void evaluate() {}` overload is
commented out.

This is a recent regression, though I haven't compiled the unreduced version of this code for a while now, so not 100% sure exactly when the regression was introduced.  For sure it works back in 2.079.0.

--