Bug 16345 – IFTI fails with lazy variadic function in some cases

Status
NEW
Severity
minor
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2016-08-01T09:12:44Z
Last change time
2024-12-13T18:49:21Z
Keywords
rejects-valid
Assigned to
No Owner
Creator
Mario Kroeplin
Moved to GitHub: dmd#19167 →

Comments

Comment #0 by kroeplin.d — 2016-08-01T09:12:44Z
The following code does not compile: void all(string file = __FILE__, size_t line = __LINE__)(void delegate()[] dgs ...) { foreach (dg; dgs) { dg(); } } void main() { all( assert(true), ); } Error: template all cannot deduce function from argument types !()(void), candidates are: all(string file = __FILE__, ulong line = __LINE__)(void delegate()[] dgs...) Workaround: call `all!()(...)` instead of `all(...)`.
Comment #1 by ag0aep6g — 2016-08-01T10:55:01Z
For reference, the spec describes lazy variadic functions here: http://dlang.org/spec/function.html#lazy_variadic_functions The test case doesn't need the template parameters to fail. This fails, too: ---- void all()(void delegate()[] dgs ...) {} void f() {} void main() { all(f()); } /* Error: template test.all cannot deduce function from argument types !()(void) */ ---- It works when the return type is int or another primitive type, including pointers and arrays: ---- void all()(int delegate()[] dgs ...) {} int f() { return 0; } void main() { all(f()); } /* no error */ ---- But it fails with Object and user-defined aggregates. Most peculiarly, it also fails with an alias to a primitive type: ---- alias T = int; void all()(T delegate()[] dgs ...) {} T f() { return T.init; } void main() { all(f()); } /* Error: template test.all cannot deduce function from argument types !()(int) */ ----
Comment #2 by robert.schadek — 2024-12-13T18:49:21Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19167 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB