November 30, 2018
https://issues.dlang.org/show_bug.cgi?id=19456

          Issue ID: 19456
           Summary: ParameterIdentifierTuple incorrect for abstract
                    methods with unnamed parameters
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Windows
            Status: NEW
          Severity: normal
          Priority: P1
         Component: phobos
          Assignee: nobody@puremagic.com
          Reporter: johnch_atms@hotmail.com

ParameterIdentifierTuple returns incorrect results for abstract methods on classes and interfaces.

class SomeClass {
  abstract void first(SomeClass);
  abstract void second(int);
  void third(SomeClass) {}
}

pragma(msg, ParameterIdentifierTuple!(__traits(getMember, SomeClass, "first"));
// outputs: tuple("SomeClass")
pragma(msg, ParameterIdentifierTuple!(__traits(getMember, SomeClass,
"second")); // outputs: tuple("")
pragma(msg, ParameterIdentifierTuple!(__traits(getMember, SomeClass, "third"));
// outputs: tuple("_param_0")

ParameterIdentifierTuple uses __traits(identifier,...) under the hood, and it looks like that's ultimately where the issue is. ParameterIdentifierTuple on non-abstract methods always seems to produce "_param_0", "_param_1" and so on. However, I'd expect to see a tuple of empty strings in all three cases.

--