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

           Summary: Inner class method can modify outer's members
                    regardless of constancy
           Product: D
           Version: D2
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Keywords: accepts-invalid
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nob...@puremagic.com
        ReportedBy: s...@iname.com
            Blocks: 2573


--- Comment #0 from Stewart Gordon <s...@iname.com> 2012-05-15 07:30:06 PDT ---
class Outer {
    int i = 6;

    class Inner {
        int y=0;

        int foo() const {
            pragma(msg, "this.outer: " ~ typeof(this.outer).stringof);
            pragma(msg, "i:          " ~ typeof(i).stringof);
            return ++i;
        }
    }
    Inner inner;
    this() {
        inner = new Inner;
    }
} 

void main() {
    const(Outer) x = new Outer;
    pragma(msg, "x:          " ~ typeof(x).stringof);
    pragma(msg, "x.inner:    " ~ typeof(x.inner).stringof);
    x.inner.foo();
    writeln(x.i);
}
----------
C:\Users\Stewart\Documents\Programming\D\Tests>dmd inner_const.d
this.outer: const(Outer)
i:          const(int)
x:          const(Outer)
x.inner:    const(Inner)

C:\Users\Stewart\Documents\Programming\D\Tests>inner_const
7
----------
(DMD 2.059 Win32)

x is a const reference.  By transitivity, x.inner is.  So far, so good.

Outer.Inner.foo is a const method.  The call fails if it isn't.  So far, so
good.

>From foo's point of view, this.outer and i are reported as const.  So far, so
good.

But despite i being const, it allows it to be modified!

Changing the declaration of x to

    const(Outer) x = new const(Outer);
    const(Outer) x = new immutable(Outer);
    immutable(Outer) x = new immutable(Outer);

makes no difference to the bug.

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

Reply via email to