Hi,

I get a strange error:

```
λ dub build
Performing "debug" build using D:\d\dmd2\windows\bin\dmd.exe for x86.
strange ~master: building configuration "application"...
source\app.d(24,18): Error: non-constant expression &[Particle(1.00000F, 1.00000F, 1.00000F), Particle(2.00000F, 2.00000F, 1.00000F), Particle(3.00000F, 3.00000F, 1.00000F)][0] source\app.d(25,18): Error: non-constant expression &[Particle(1.00000F, 1.00000F, 1.00000F), Particle(2.00000F, 2.00000F, 1.00000F), Particle(3.00000F, 3.00000F, 1.00000F)][1] source\app.d(24,18): Error: non-constant expression &[Particle(1.00000F, 1.00000F, 1.00000F), Particle(2.00000F, 2.00000F, 1.00000F), Particle(3.00000F, 3.00000F, 1.00000F)][1] source\app.d(25,18): Error: non-constant expression &[Particle(1.00000F, 1.00000F, 1.00000F), Particle(2.00000F, 2.00000F, 1.00000F), Particle(3.00000F, 3.00000F, 1.00000F)][2] source\app.d(24,18): Error: non-constant expression &[Particle(1.00000F, 1.00000F, 1.00000F), Particle(2.00000F, 2.00000F, 1.00000F), Particle(3.00000F, 3.00000F, 1.00000F)][2] source\app.d(25,18): Error: non-constant expression &[Particle(1.00000F, 1.00000F, 1.00000F), Particle(2.00000F, 2.00000F, 1.00000F), Particle(3.00000F, 3.00000F, 1.00000F)][0]
D:\d\dmd2\windows\bin\dmd.exe failed with exit code 1.
```

when compiling the following code:

```
import std.stdio;

struct Particle {
    float x;
    float y;
    float invMass;

    this(float x, float y)
    {
        this.x = x;
        this.y = y;
        this.invMass = 1f;
    }
}

struct Constraint {
    Particle* x;
    Particle* y;

    float distance;

    this(ref Particle x, ref Particle y)
    {
        this.x = &x;
        this.y = &y;

        auto dx = x.x - y.x;
        auto dy = x.y - y.y;

        import std.math;
        this.distance = sqrt(dx*dx + dy*dy);
    }
}

interface Body {
    void tick();
}

class Triangle : Body {

    Particle[3] particles = [
        Particle(1, 1),
        Particle(2, 2),
        Particle(3, 3)
    ];

    Constraint[3] constraints;

    this()
    {
        constraints[0] = Constraint(particles[0], particles[1]);
        constraints[1] = Constraint(particles[1], particles[2]);
        constraints[2] = Constraint(particles[2], particles[0]);
    }

    void tick()
    {
        particles[0].x += 1;
    }
}

struct Game {
    Triangle player = new Triangle;

    void tick() {
        player.tick();
    }
}

void main()
{
    Game game;
    game.tick();
}
```

Is that my bug (highest probability here) or a compiler bug? I'm confused, since the following `main` function compiles successfully:

```
void main()
{
    Triangle player = new Triangle;
    player.tick();
}
```

as well as this code:

```

struct Game {
    Triangle player;

    this(Triangle player)
    {
        this.player = player;
    }

    void tick() {
        player.tick();
    }
}

Game makeGame()
{
    return Game(new Triangle);
}

void main()
{
    auto game = makeGame();
    game.tick();
}
```

What's wrong with the first code snippet?

Thanks in advance,
--
Oleksii

Reply via email to