Thread overview
[Issue 2913] New: aliasing a ref type is not possible
Apr 29, 2009
d-bugmail
Apr 30, 2009
d-bugmail
Apr 30, 2009
d-bugmail
May 04, 2009
d-bugmail
Dec 23, 2012
Andrej Mitrovic
April 29, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=2913

           Summary: aliasing a ref type is not possible
           Product: D
           Version: unspecified
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla@digitalmars.com
        ReportedBy: andrei@metalanguage.com


alias ref int rint;

rint foo() { static int x; return x; }

void main()
{
    auto p = &(foo());
}

This doesn't work. It led me to write the ugliest code I have ever written. Search std.range for "mixin" if you want to see ugly stuff.


-- 

April 30, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=2913





------- Comment #1 from kamm-removethis@incasoftware.de  2009-04-30 02:40 -------
I'm not sure allowing that alias is a good idea, as ref int and int still name the same type. If that alias worked, wouldn't you expect

alias ref int rint;
int i = 3;
rint ri = i;
ri = 4;
assert(i == 4);


-- 

April 30, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=2913





------- Comment #2 from andrei@metalanguage.com  2009-04-30 08:12 -------
(In reply to comment #1)
> I'm not sure allowing that alias is a good idea, as ref int and int still name the same type. If that alias worked, wouldn't you expect
> 
> alias ref int rint;
> int i = 3;
> rint ri = i;
> ri = 4;
> assert(i == 4);
> 

The ref would be only effective in a function signature. This can be done (I discussed it with Walter). The problem is, Walter has a lot on his plate already. Yet that doesn't make my code look any better :o).


-- 

May 04, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=2913





------- Comment #3 from maxmo@pochta.ru  2009-05-04 08:44 -------
dup of bug 2753?


-- 

December 23, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=2913


Andrej Mitrovic <andrej.mitrovich@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |andrej.mitrovich@gmail.com


--- Comment #4 from Andrej Mitrovic <andrej.mitrovich@gmail.com> 2012-12-23 10:45:12 PST ---
(In reply to comment #2)
> (In reply to comment #1)
> > I'm not sure allowing that alias is a good idea, as ref int and int still name the same type. If that alias worked, wouldn't you expect
> > 
> > alias ref int rint;
> > int i = 3;
> > rint ri = i;
> > ri = 4;
> > assert(i == 4);
> > 
> 
> The ref would be only effective in a function signature.

So would that code error at compile-time or just silently compile and fail at runtime as if the ref didn't exist? It's tricky business..

But there's definitely a problem of not being able to pass around 'ref' in metaprogramming. The classic example being std.signal, where you can't define a signal with ref parameters:

struct S
{
    // would allow connecting to 'void f(ref int) { }'
    mixin Signal!(ref int);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------