1383 – Implicit Function Instantiation with typesafe-variadic of delegates doesn't work

D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 1383 - Implicit Function Instantiation with typesafe-variadic of delegates doesn't work
Summary: Implicit Function Instantiation with typesafe-variadic of delegates doesn't work
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: x86 Linux
: P2 normal
Assignee: Walter Bright
URL:
Keywords: rejects-valid
Depends on:
Blocks:
Reported: 2007年07月27日 13:01 UTC by Russ Lewis
Modified: 2014年02月16日 15:26 UTC (History)
3 users (show)

See Also:


Attachments
Add an attachment (proposed patch, testcase, etc.)

Note You need to log in before you can comment on or make changes to this issue.
Description Russ Lewis 2007年07月27日 13:01:12 UTC
I have a template function, with a single Tuple template parameter, where the arguments to the function are typesafe variadic delegates, where each delegate takes arguments defined by the Tuple. It will not implicitly deduce the elements of the Tuple:
CODE
================
/* parts of Curry() taken from the digitalmars.com template examples */
void delegate(U) Curry(A, U...)(void delegate(A,U) dg,A arg)
{
 struct ArgRecord {
 A arg;
 typeof(dg) callback;
 void OpCall(U args) { callback(arg,args); }
 }
 auto temp = new ArgRecord;
 temp.arg = arg;
 temp.callback = dg;
 return &temp.OpCall;
}
/* the intent of this template is to take 2 or more delegates with the
 * the same argument types and return a new delegate which will call
 * each delegate in sequence, passing it the arguments delivered.
 */
void delegate(A) Seq(A...)(void delegate(A)[] dgs...)
{
 return Curry(delegate void(void delegate(A)[] dgs1,A args)
 {
 foreach(dg; dgs1)
 dg(args);
 },
 dgs);
}
struct Foo {
 void fred(int i) {}
}
void main() {
 void delegate(int) tmp;
 auto bob = new Foo;
 auto dan = new Foo;
 tmp = Seq!(int)(&bob.fred); // this works
 tmp = Seq!(int)(&bob.fred, &dan.fred); // this works
 tmp = Seq (&bob.fred); // this doesn't
 tmp = Seq (&bob.fred, &dan.fred); // neither does this
}
=========
DMD OUTPUT:
=========
baz.d(45): template baz.Seq(A...) does not match any template declaration
baz.d(45): template baz.Seq(A...) cannot deduce template function from argument types (void delegate(int))
baz.d(45): Error: cannot implicitly convert expression ((Seq(A...))((&(*bob).fred))) of type int to void delegate(int)
baz.d(46): template baz.Seq(A...) does not match any template declaration
baz.d(46): template baz.Seq(A...) cannot deduce template function from argument types (void delegate(int),void delegate(int))
baz.d(46): Error: cannot implicitly convert expression ((Seq(A...))((&(*bob).fred),(&(*dan).fred))) of type int to void delegate(int)
Note that the template works fine if I explicitly instantiate it.
Comment 1 Bill Baxter 2008年03月11日 16:34:02 UTC
Actually it's much simpler than all that. IFTI with plain old typesafe variadic doesn't work.
void foo(T)(T[] x ...) {
}
void main() {
 foo(2,7,4);
}
iftivariadic.d(23): template iftivariadic.foo(T) does not match any function template declaration
iftivariadic.d(23): template iftivariadic.foo(T) cannot deduce template function from argument types !()(int,int,int)
Comment 2 Walter Bright 2008年06月22日 18:52:19 UTC
Fixed dmd 1.031 and 2.015
Comment 3 Russ Lewis 2008年06月23日 12:14:09 UTC
Fix confirmed.


AltStyle によって変換されたページ (->オリジナル) /