Spec: can a class method change the type of the object (vtable) ?

Johan j at j.nl
Sun Mar 17 12:47:49 UTC 2024


Hi all,
   I am looking for a (legal D) counterexample where a class 
method alters the vtable of the object it is called on. In other 
words, a counterexample where the following transformation is 
invalid:

```
class A {
     void foo();
     ...
}

void g() {
     A a = new A();
     a.foo();
     a.foo();
}
---Transformed into --->
void g() {
     A a = new A();
     a.A.foo(); // devirtualized
     a.A.foo(); // devirtualized because `A.foo(a)` may not change 
the type of `a`.
}
```

Although accepted by the compiler currently, I believe this is 
forbidden by the spec (can't find it, if it is not in the spec it 
should be added):
```
     void foo() {
         this = new B(); // illegal D code
     }
```

Thanks,
   Johan



More information about the Digitalmars-d mailing list