[Issue 14675] New: template specialization for T: T* and T: T[] has issues with IFTI

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Wed Jun 10 04:57:20 PDT 2015


https://issues.dlang.org/show_bug.cgi?id=14675

          Issue ID: 14675
           Summary: template specialization for T: T* and T: T[] has
                    issues with IFTI
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: spec
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: schveiguy at yahoo.com

Some background:
http://forum.dlang.org/post/rvflnpxwzetpcphwxrgx@forum.dlang.org

When a specialization of the form:

void foo(T : T*)(T* t)
void foo(T : T[])(T[] t)

exists in a function template, it cannot be matched for IFTI, only explicit
instantiation:

int i;
foo(&i); // error
foo!(int *)(&i); // ok

However, this will match both calls:

void foo(T : U*, U)(T t)
void foo(T : U[], U)(T t)

The docs say that parameters involved with specialization cannot be used for
IFTI, but that simply isn't the case for almost all specializations (2 examples
are the secondary forms above). Just these 2 as far as I can tell don't work.

First, their existence is redundant. The secondary forms are superior in almost
every way.

Second, they are confusing. A T is specialized as a T*? But then it's not?

Third, if they must exist, I think they should be usable with IFTI. There
doesn't seem to be any reasonable explanation as to why these particular
templates cannot be used for IFTI.

As an example of why this is important, consider the following:

void foo(T)(T t) { /* impl 1 */}
void foo(T:T*)(T* t) { /* impl 2 */}

int i;
foo(&i); // calls impl 1
foo!(typeof(&i))(i) // calls impl 2

This makes absolutely no sense, and seems extremely error prone.

Valid resolutions here:

1. Deprecate. This would break some code, but the ability to use the second
form at least gives a path forward.
2. Allow IFTI. At least this would not break code (at least not *reasonable*
code), but could potentially change code paths. It's possible someone has
exploited this confusing behavior to have two code paths for calling a function
with the same parameters. I don't think we should support this though.

--


More information about the Digitalmars-d-bugs mailing list