Thread overview
Template + alias + basic type depends on another parameter = broken?
Feb 22, 2023
Dark Hole
Feb 22, 2023
Paul Backus
Feb 24, 2023
Elfstone
February 22, 2023

I'm trying to rewrite really old D code. There was fragment like that:

template Foo(T, T[] Array) {
    // ...
}
// ...
Bar[] arr;
Foo!(Bar, arr);

This gives error can't read arr in compile time. Small changes:

template Foo(T, alias T[] Array) {
    // ...
}
// ...
Bar[] arr;
Foo!(Bar, arr);

This is valid D, but it doesn't work. It gives error "Error: template instance Foo!(Bar, arr) does not match template declaration Foo(T, alias T[] Array)".

Of course, there is some ways to avoid this error (e.g. check Array type in if), but I don't undestand why this code doesn't compiles.

February 22, 2023

On Wednesday, 22 February 2023 at 20:20:46 UTC, Dark Hole wrote:

>
template Foo(T, alias T[] Array) {
    // ...
}
// ...
Bar[] arr;
Foo!(Bar, arr);

This is valid D, but it doesn't work. It gives error "Error: template instance Foo!(Bar, arr) does not match template declaration Foo(T, alias T[] Array)".

Of course, there is some ways to avoid this error (e.g. check Array type in if), but I don't undestand why this code doesn't compiles.

Pretty sure this is just a bug. There are a lot of edge-case bugs like this where template instantiation doesn't work the way it's supposed to.

I've submitted a bug report for this on issues.dlang.org: https://issues.dlang.org/show_bug.cgi?id=23733

February 24, 2023

On Wednesday, 22 February 2023 at 20:20:46 UTC, Dark Hole wrote:

>

I'm trying to rewrite really old D code. There was fragment like that:

template Foo(T, T[] Array) {
    // ...
}
// ...
Bar[] arr;
Foo!(Bar, arr);

This gives error can't read arr in compile time. Small changes:

template Foo(T, alias T[] Array) {
    // ...
}
// ...
Bar[] arr;
Foo!(Bar, arr);

This is valid D, but it doesn't work. It gives error "Error: template instance Foo!(Bar, arr) does not match template declaration Foo(T, alias T[] Array)".

Of course, there is some ways to avoid this error (e.g. check Array type in if), but I don't undestand why this code doesn't compiles.

I never used really old D compiler, but the error looks reasonable to me. The following code should compile - note arr is "const".

template Foo(T, T[] arr)
{
	void boo()
	{
	}
}

struct Bar
{
}

void main()
{
	const Bar[] arr;// = [];
	(Foo!(Bar, arr)).boo();

}