Thread overview
Should this work?
Jan 30, 2010
bobef
Jan 30, 2010
Jacob Carlborg
Jan 30, 2010
bobef
Jan 30, 2010
Jacob Carlborg
Jan 30, 2010
bobef
January 30, 2010
I get these errors DMD 1.055:

(void(char[] _param_0))()
bug.d(2): Error: expected 1 function arguments, not 0
(void(char[] _param_0))()
bug.d(15): Error: template instance bug.Foo!(a) error instantiating

//code----------------------------------------------------------------------------------------------

void Foo(alias X)() {
	pragma(msg,typeof(X).stringof);
}

class A {
	void a(char[]) {
	}

	void b() {
	}
}

void main() {

	Foo!(A.a)(); //doesnt work
	Foo!(A.b)(); //works

}

//end of code ----------------------------------------------------------------------
January 30, 2010
On 1/30/10 14:06, bobef wrote:
> I get these errors DMD 1.055:
>
> (void(char[] _param_0))()
> bug.d(2): Error: expected 1 function arguments, not 0
> (void(char[] _param_0))()
> bug.d(15): Error: template instance bug.Foo!(a) error instantiating
>
> //code----------------------------------------------------------------------------------------------
>
> void Foo(alias X)() {
> 	pragma(msg,typeof(X).stringof);
> }
>
> class A {
> 	void a(char[]) {
> 	}
>
> 	void b() {
> 	}
> }
>
> void main() {
>
> 	Foo!(A.a)(); //doesnt work
> 	Foo!(A.b)(); //works
>
> }
>
> //end of code ----------------------------------------------------------------------

Since "a" is a method and when you do "typeof(X)" it tries to call the method but since it takes one parameter it fails. "b" doesn't fail because it doesn't take any parameters. This is all because of the optional parentheses in function calls. Change to: "typeof(&X)".
January 30, 2010
Jacob Carlborg Wrote:

> On 1/30/10 14:06, bobef wrote:
> > I get these errors DMD 1.055:
> >
> > (void(char[] _param_0))()
> > bug.d(2): Error: expected 1 function arguments, not 0
> > (void(char[] _param_0))()
> > bug.d(15): Error: template instance bug.Foo!(a) error instantiating
> >
> > //code----------------------------------------------------------------------------------------------
> >
> > void Foo(alias X)() {
> > 	pragma(msg,typeof(X).stringof);
> > }
> >
> > class A {
> > 	void a(char[]) {
> > 	}
> >
> > 	void b() {
> > 	}
> > }
> >
> > void main() {
> >
> > 	Foo!(A.a)(); //doesnt work
> > 	Foo!(A.b)(); //works
> >
> > }
> >
> > //end of code ----------------------------------------------------------------------
> 
> Since "a" is a method and when you do "typeof(X)" it tries to call the method but since it takes one parameter it fails. "b" doesn't fail because it doesn't take any parameters. This is all because of the optional parentheses in function calls. Change to: "typeof(&X)".


This is not true. You can't call neither A.a nor A.b because A is a class, not an instance of a class - there is no this. Maybe I should file a bug.
January 30, 2010
On 1/30/10 14:47, bobef wrote:
> Jacob Carlborg Wrote:
>
>> On 1/30/10 14:06, bobef wrote:
>>> I get these errors DMD 1.055:
>>>
>>> (void(char[] _param_0))()
>>> bug.d(2): Error: expected 1 function arguments, not 0
>>> (void(char[] _param_0))()
>>> bug.d(15): Error: template instance bug.Foo!(a) error instantiating
>>>
>>> //code----------------------------------------------------------------------------------------------
>>>
>>> void Foo(alias X)() {
>>> 	pragma(msg,typeof(X).stringof);
>>> }
>>>
>>> class A {
>>> 	void a(char[]) {
>>> 	}
>>>
>>> 	void b() {
>>> 	}
>>> }
>>>
>>> void main() {
>>>
>>> 	Foo!(A.a)(); //doesnt work
>>> 	Foo!(A.b)(); //works
>>>
>>> }
>>>
>>> //end of code ----------------------------------------------------------------------
>>
>> Since "a" is a method and when you do "typeof(X)" it tries to call the
>> method but since it takes one parameter it fails. "b" doesn't fail
>> because it doesn't take any parameters. This is all because of the
>> optional parentheses in function calls. Change to: "typeof(&X)".
>
>
> This is not true. You can't call neither A.a nor A.b because A is a class, not an instance of a class - there is no this. Maybe I should file a bug.

That's true, but you can still try to call it.

void main ()
{
	A.a;
}

The above results in:
Error: function A.a (char[]) does not match parameter types ()
Error: expected 1 function arguments, not 0

When I add the correct argument I get this result:
Error: need 'this' to access member a

Apparently it tries to match the arguments before it checks if "this" is available.
January 30, 2010
Jacob Carlborg Wrote:

> On 1/30/10 14:47, bobef wrote:
> > Jacob Carlborg Wrote:
> >
> >> On 1/30/10 14:06, bobef wrote:
> >>> I get these errors DMD 1.055:
> >>>
> >>> (void(char[] _param_0))()
> >>> bug.d(2): Error: expected 1 function arguments, not 0
> >>> (void(char[] _param_0))()
> >>> bug.d(15): Error: template instance bug.Foo!(a) error instantiating
> >>>
> >>> //code----------------------------------------------------------------------------------------------
> >>>
> >>> void Foo(alias X)() {
> >>> 	pragma(msg,typeof(X).stringof);
> >>> }
> >>>
> >>> class A {
> >>> 	void a(char[]) {
> >>> 	}
> >>>
> >>> 	void b() {
> >>> 	}
> >>> }
> >>>
> >>> void main() {
> >>>
> >>> 	Foo!(A.a)(); //doesnt work
> >>> 	Foo!(A.b)(); //works
> >>>
> >>> }
> >>>
> >>> //end of code ----------------------------------------------------------------------
> >>
> >> Since "a" is a method and when you do "typeof(X)" it tries to call the method but since it takes one parameter it fails. "b" doesn't fail because it doesn't take any parameters. This is all because of the optional parentheses in function calls. Change to: "typeof(&X)".
> >
> >
> > This is not true. You can't call neither A.a nor A.b because A is a class, not an instance of a class - there is no this. Maybe I should file a bug.
> 
> That's true, but you can still try to call it.
> 
> void main ()
> {
> 	A.a;
> }
> 
> The above results in:
> Error: function A.a (char[]) does not match parameter types ()
> Error: expected 1 function arguments, not 0
> 
> When I add the correct argument I get this result:
> Error: need 'this' to access member a
> 
> Apparently it tries to match the arguments before it checks if "this" is available.

I am not sure it should try to call anything. If it did A.b would fail because of no this. So I guess nothing is actually called. Anyway it is a bug, I filed it :)