Bug 15870 – UFCS not recognized on array when passing as alias parameter

Status
NEW
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2016-04-04T11:33:20Z
Last change time
2024-12-13T18:47:21Z
Keywords
CTFE, rejects-valid
Assigned to
No Owner
Creator
ryan
Moved to GitHub: dmd#19112 →

Comments

Comment #0 by ryan — 2016-04-04T11:33:20Z
Ordinarily, I don't have to slice an array to treat it as a range. However, when passing it as template alias parameter, it seems like I do: --- enum test(alias fun) = "it works"; immutable a = [1,2,3]; pragma(msg, test!(a[].map!(x => x))); // OK pragma(msg, test!(a.map!(x => x))); // map is not a member of a pragma(msg, test!(map!(x => x)(a))); // OK (no UFCS) // but a.map does work at runtime ... unittest { auto r = a.map!(x => x); } ---
Comment #1 by gassa — 2018-05-25T23:19:00Z
Still does not work in 2.080 release. The error message however is interesting. Here is a modified example with a line containing `(a)` instead of `a`. Compile with `dmd -main`: ----- import std.algorithm; enum test(alias fun) = "it works"; immutable a = [1,2,3]; pragma(msg, typeof(a)); // immutable(int[]) pragma(msg, test!((a).map!(x => x))); // "it works" pragma(msg, test!(a.map!(x => x))); // template identifier `map` is not a member of variable `a.a` ----- Why is that `a.a` in the first place? Does the compiler mistake `a` for an eponymous template somehow, instead of seeing that `map` is a template here?
Comment #2 by robert.schadek — 2024-12-13T18:47:21Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19112 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB