On Thursday, 7 May 2015 at 11:15:02 UTC, Daniel Kozak wrote:
On Thursday, 7 May 2015 at 11:08:50 UTC, Daniel Kozák wrote:

On Thu, 07 May 2015 10:46:19 +0000
Lemonfiend via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
wrote:

On Thursday, 7 May 2015 at 10:43:28 UTC, Daniel Kozak wrote:
> On Thursday, 7 May 2015 at 10:39:09 UTC, Daniel Kozák wrote:
>>
>> On Thu, 07 May 2015 10:33:44 +0000
>> Vadim Lopatin via Digitalmars-d-learn
>> <digitalmars-d-learn@puremagic.com> wrote:
>>
>>> struct S
>>> {
>>>    int i;
>>> >>> auto foo2(T)(int j) {
>>>        i=j;
>>>    }
>>> >>> static S foo(T)(int j) {
>>>        S s;
>>>        s.foo2!T(j);
>>>        return s;
>>>    }
>>> }
>>> >>> void main()
>>> {
>>>    auto s = S.foo!bool(1);
>>> }
>>
>> As I said, it is not bug. It is OK. There is no way how >> you can >> distinguish between static and non static methods or even >> field in some
>> cases.
>
> e.g.:
>
> import std.stdio;
>
> struct S
> {
>    string foo = "Please select me?";
>    string foo() { return ("No, select me?"); };
> static string foo() { return ("I am better than the otters > :D?"); };
> }
>
> void main()
> {
>    auto s = S();
>    writeln(s.foo);
> }

Well it's clear to me now why it shouldn't work.

However, the error msg is not clear on the problem. Imo it should give a conflict error like in your previous example. That would make it clear what's happened/allowed.


Yep, I think you are right even this example make useless and
wrong error message:

struct S
{
   static S foo(T)(int j) {
       S s;
       return s;
   }
   static S foo(T)(int j) {
       S s;
       return s;
   }
}

void main()
{
   auto s = S.foo!bool(1);
}


test.d(15): Error: need 'this' for 'foo' of type '(int j)' // WTF?

btw. it is a regresion from 2.067 on 2.066 and before it makes much better error. Even for OP code when is modified (static must be declared before non static one) it have a better error msg.

test.d(6): Error: test.S.foo called with argument types (int) matches both:
test.d(4):     test.S.foo!bool.foo(int j)
and:
test.d(10):     test.S.foo!bool.foo(int j)
test.d(18): Error: template instance test.S.foo!bool error instantiating

But only when static one is declared before non static one, so even on 2.066 it was not ideal. So I think we should open two issues, probably one for regression and one for enhancment

OK both are regressions, cause on dmd 2.063 it is much much better

test.d(19): Error: template test.S.foo matches more than one template declaration, test.d(3):foo(T)(int j) and test.d(8):foo(T)(int j) test.d(19): Error: need 'this' for 'foo' of type 'pure nothrow @safe void(int j)'


Reply via email to