Jump to page: 1 2
Thread overview
[Issue 4545] New: Alias to members possible without "this" instance
Aug 01, 2010
Tomasz Sowiński
Aug 01, 2010
Jacob Carlborg
Aug 07, 2010
Stewart Gordon
Aug 07, 2010
Jacob Carlborg
Aug 07, 2010
Stewart Gordon
Jan 24, 2012
Walter Bright
Jan 24, 2012
Denis
Jan 24, 2012
Walter Bright
Jan 24, 2012
Denis
Jan 24, 2012
Walter Bright
Jan 31, 2012
yebblies
August 01, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4545

           Summary: Alias to members possible without "this" instance
           Product: D
           Version: D2
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Keywords: accepts-invalid, spec
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: tomeksowi@gmail.com


--- Comment #0 from Tomasz Sowiński <tomeksowi@gmail.com> 2010-08-01 07:56:10 PDT ---
I'm tearing up bug 4533 to have member-related alias problems in a separate bug.

You can alias members from *outside*:

class A {
    void foo() {}
}

alias A.foo goo;

This compiles. It fails only if goo is called but should fail already at the alias declaration.


Also, Andrej Mitrovic found a similar issue documented, but not implemented:

In the docs (http://www.digitalmars.com/d/2.0/declaration.html), there's this
code:

void main() {
    struct S { static int i; }
    S s;

    alias s.i a;    // illegal, s.i is an expression
    alias S.i b;    // ok
    b = 4;        // sets S.i to 4
}

But this [illegal expression] will compile.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 01, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4545


Jacob Carlborg <doob@me.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |doob@me.com


--- Comment #1 from Jacob Carlborg <doob@me.com> 2010-08-01 15:29:55 PDT ---
I think your first example should be legal because you can create a delegate out of the alias and an instance of A.

void delegate () dg;
dg.ptr = new A;
dg.funcptr = &goo;
dg(); // this works

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 07, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4545


Stewart Gordon <smjg@iname.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |smjg@iname.com
            Version|D2                          |D1 & D2


--- Comment #2 from Stewart Gordon <smjg@iname.com> 2010-08-07 05:31:59 PDT ---
I'm not sure.  The existence of .funcptr seems to contradict

http://www.digitalmars.com/d/1.0/type.html#delegates
"There are no pointers-to-members in D, but a more useful concept called
delegates are supported."

See also bug 2557.

Applies to D1 as well, though new A must be cast.  Moreover, you don't need to
go through an alias - DMD 1.062 accepts even
    dg.funcptr = &A.foo;

But non-static members of structs/classes/unions are still compile-time entities, and they have properties.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 07, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4545



--- Comment #3 from Jacob Carlborg <doob@me.com> 2010-08-07 07:01:32 PDT ---
(In reply to comment #2)
> I'm not sure.  The existence of .funcptr seems to contradict
> 
> http://www.digitalmars.com/d/1.0/type.html#delegates
> "There are no pointers-to-members in D, but a more useful concept called
> delegates are supported."

Just after that it says: "Delegates are an aggregate of two pieces of data: an object reference and a function pointer.". You must always have a pointer to a member, then you add a context and gets a delegate. How about static members, you can have pointers to those, regular function pointers. I don't know why the docs are written like that. Probably because the concept is a little different compared to C++'s member pointers. D's delegates are basically just syntax sugar for a C++'s member pointer and a instance of the same class.

> See also bug 2557.
> 
> Applies to D1 as well, though new A must be cast.  Moreover, you don't need to
> go through an alias - DMD 1.062 accepts even
>     dg.funcptr = &A.foo;

I used an alias because an alias was used in the first example.

> But non-static members of structs/classes/unions are still compile-time entities, and they have properties.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 07, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4545



--- Comment #4 from Stewart Gordon <smjg@iname.com> 2010-08-07 07:21:22 PDT ---
(In reply to comment #3)
> (In reply to comment #2)
> > I'm not sure.  The existence of .funcptr seems to contradict
> > 
> > http://www.digitalmars.com/d/1.0/type.html#delegates
> > "There are no pointers-to-members in D, but a more useful concept called
> > delegates are supported."
> 
> Just after that it says: "Delegates are an aggregate of two pieces of data: an object reference and a function pointer.".

It really should say "a pointer to a non-static member function".

> You must always have a pointer to a
> member, then you add a context and gets a delegate. How about static members,
> you can have pointers to those, regular function pointers. I don't know why the
> docs are written like that. Probably because the concept is a little different
> compared to C++'s member pointers. D's delegates are basically just syntax
> sugar for a C++'s member pointer and a instance of the same class.

No, because delegate types don't care the least what class the function is a member of.  This is why they're more useful - whatever is using the delegate need not know anything about the class, and so (for instance) a library can use a delegate just like a plain function pointer.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 24, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=4545



--- Comment #5 from github-bugzilla@puremagic.com 2012-01-23 21:37:57 PST ---
Commit pushed to https://github.com/D-Programming-Language/d-programming-language.org

https://github.com/D-Programming-Language/d-programming-language.org/commit/eedb99442ac037495ae12c3a7732aad72a074bf6 fix Issue 4545 - Alias to members possible without 'this' instance

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 24, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=4545


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla@digitalmars.com
         Resolution|                            |FIXED


--- Comment #6 from Walter Bright <bugzilla@digitalmars.com> 2012-01-23 21:38:52 PST ---
I'm not sure what to do with this. I did make some minor tweaks to the delegate description. If more should be done, please be specific. I don't agree that the behavoior Tomasz is reporting is a bug; it's expected.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 24, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=4545


Denis <verylonglogin.reg@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
                 CC|                            |verylonglogin.reg@gmail.com
         Resolution|FIXED                       |


--- Comment #7 from Denis <verylonglogin.reg@gmail.com> 2012-01-24 12:34:28 MSK ---
---
alias s.i a;    // illegal, s.i is an expression
---
is still in the docs and compilable.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 24, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=4545


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|REOPENED                    |RESOLVED
         Resolution|                            |INVALID


--- Comment #8 from Walter Bright <bugzilla@digitalmars.com> 2012-01-24 01:42:22 PST ---
(In reply to comment #7)
> ---
> alias s.i a;    // illegal, s.i is an expression
> ---
> is still in the docs and compilable.

And it's not a bug.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 24, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=4545



--- Comment #9 from Denis <verylonglogin.reg@gmail.com> 2012-01-24 13:07:34 MSK ---
(In reply to comment #8)
> (In reply to comment #7)
> > ---
> > alias s.i a;    // illegal, s.i is an expression
> > ---
> > is still in the docs and compilable.
> 
> And it's not a bug.

As I understood everywhere in `statement.dd` "illegal" means incorrect statement and it shouldn't be compilable. So "illegal" in `expression.dd` is expected to do so too.

You reply means for me that those "illegal" statements doesn't compile with dmd but it is implementation specific and an other D compiler may compile them fine and it will result in undefined behavior. It will be a hell.

Or am I mistaken somewhere?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
« First   ‹ Prev
1 2