Re: Confused by refusal to expand template

2012-03-23 Thread Timon Gehr

On 03/23/2012 11:52 PM, H. S. Teoh wrote:

Code:
struct S {
int f(K)(K x) {
return 1;
}
void func(K)(inout(K) x) {
auto h = f(x);
}
}
void main() {
S s;
s.func("abc");// This is line 44
}

This refuses to compile:

test2.d(44): Error: template test2.S.func(K) does not match any function 
template declaration
test2.d(44): Error: template test2.S.func(K) cannot deduce template function 
from argument types !()(string)

Removing 'inout' fixes the problem. But I don't understand why.


T



You already brought this up IIRC. The IFTI matching algorithm is too 
weak. I think it should work.


Re: Confused by refusal to expand template

2012-03-23 Thread David

Am 23.03.2012 23:52, schrieb H. S. Teoh:

Code:
struct S {
int f(K)(K x) {
return 1;
}
void func(K)(inout(K) x) {
auto h = f(x);
}
}
void main() {
S s;
s.func("abc");// This is line 44
}

This refuses to compile:

test2.d(44): Error: template test2.S.func(K) does not match any function 
template declaration
test2.d(44): Error: template test2.S.func(K) cannot deduce template function 
from argument types !()(string)

Removing 'inout' fixes the problem. But I don't understand why.


T

I've never really used inout, but don't you need it also for the 
return-type? Furthermore you don't the the inout here, since this 
template does match const/immutable/nothing anyways.


Re: Confused by refusal to expand template

2012-03-23 Thread Timon Gehr

On 03/23/2012 11:58 PM, David wrote:

Am 23.03.2012 23:52, schrieb H. S. Teoh:

Code:
struct S {
int f(K)(K x) {
return 1;
}
void func(K)(inout(K) x) {
auto h = f(x);
}
}
void main() {
S s;
s.func("abc"); // This is line 44
}

This refuses to compile:

test2.d(44): Error: template test2.S.func(K) does not match any
function template declaration
test2.d(44): Error: template test2.S.func(K) cannot deduce template
function from argument types !()(string)

Removing 'inout' fixes the problem. But I don't understand why.


T


I've never really used inout, but don't you need it also for the
return-type?


Not any more (DMD 2.059). See 
http://d.puremagic.com/issues/show_bug.cgi?id=7105



Furthermore you don't the the inout here, since this
template does match const/immutable/nothing anyways.


His intention probably is to prevent multiple instantiation of a 
template based on different constness.


Re: Confused by refusal to expand template

2012-03-24 Thread Kenji Hara

On Friday, 23 March 2012 at 23:01:43 UTC, Timon Gehr wrote:

On 03/23/2012 11:58 PM, David wrote:

Am 23.03.2012 23:52, schrieb H. S. Teoh:

Code:
struct S {
int f(K)(K x) {
return 1;
}
void func(K)(inout(K) x) {
auto h = f(x);
}
}
void main() {
S s;
s.func("abc"); // This is line 44
}

This refuses to compile:

test2.d(44): Error: template test2.S.func(K) does not match 
any

function template declaration
test2.d(44): Error: template test2.S.func(K) cannot deduce 
template

function from argument types !()(string)

Removing 'inout' fixes the problem. But I don't understand 
why.



T

I've never really used inout, but don't you need it also for 
the

return-type?


Not any more (DMD 2.059). See 
http://d.puremagic.com/issues/show_bug.cgi?id=7105



Furthermore you don't the the inout here, since this
template does match const/immutable/nothing anyways.


His intention probably is to prevent multiple instantiation of 
a template based on different constness.


This is definitely a bug. I've filed it in bugzilla, and posted a 
pull to fix it.

http://d.puremagic.com/issues/show_bug.cgi?id=7769