October 13, 2014 [Issue 13611] New: opDispatch and UFCS not resolving as expected | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=13611 Issue ID: 13611 Summary: opDispatch and UFCS not resolving as expected Product: D Version: D2 Hardware: x86_64 OS: Linux Status: NEW Severity: normal Priority: P1 Component: DMD Assignee: nobody@puremagic.com Reporter: franklinmathieu@gmail.com Given the following source: import std.stdio; import std.string; class Wrapper(T) { T val; this(T val) { this.val = val; } auto opDispatch(string s, T...)(T args) { return mixin("this.val." ~ s)(args); } } void main() { auto wrap = new Wrapper!string("Lorem ipsum dolor sit amet"); foreach (e; wrap.split(" ")) writeln(e); } We get an error on the line with wrap.split(" "): template std.array.split cannot deduce function from argument types !()(Wrapper!string, string), candidates are: std.array.split(S)(S s) if (isSomeString!S) std.array.split(R, E)(R r, E delim) if (isForwardRange!R && is(typeof(ElementType!R.init == E.init))) std.array.split(R1, R2)(R1 r, R2 delim) if (isForwardRange!R1 && isForwardRange!R2 && is(typeof(ElementType!R1.init == ElementType!R2.init))) std.array.split(alias isTerminator, R)(R r) if (isForwardRange!R && is(typeof(unaryFun!isTerminator(r.front)))) This happens because the compiler thinks that the call to split is a UFCS, because split resolves to the function in std.array and is of course not a member of the string type -- however, it cannot decide between the multiple overloads of split, and stops there, without calling opDispatch. This can be seen pretty easily with the introduction of a str class: class str { string val; this(string val) { this.val = val; } string[] split(string delim) { return std.array.split(val, delim); } } and using the following main: void main() { auto wrap = new Wrapper!str(new str("Lorem ipsum dolor sit amet")); foreach (e; wrap.split(" ")) writeln(e); } works as expected. The issue happens regardless of the function being templated or not. -- |
Copyright © 1999-2021 by the D Language Foundation