The following code fails to compile with -dip1000:

struct Inner(T) {
    T value;
    this(ref T value) { this.value = value; }

struct Outer(T) {
    Inner!T inner;
    void opAssign(ref T rhs) { inner = Inner!T(rhs); }

@safe void main() {
    int x;
    int* p = &x;
    Outer!(int*) o;
    o = p;


Changing Inner's constructor to take a `scope ref T value` fixes the error. But since Inner is a template, and the body of the constructor is available to the compiler, shouldn't it be able to infer the `scope` attribute?

Reply via email to