Thread overview
Issue with struct invariants
Mar 05
Sergey
Mar 05
kdevel
March 05

Hi all,

I was debugging an old project that started crashing after upgrading to a recent toolchain. I noticed that commenting out invariants helps. I reduced it to the following:

import std.conv: to;

struct A
{
    ulong n;
    string str()
    {
        if (n == 0) { return "0"; }
        return to!string(n);
    }
}

struct B
{
    ulong n;
    invariant() {}
    string str()
    {
        if (n == 0) { return "0"; }
        return to!string(n);
    }
}

void main()
{
    A a = { 1 };
    B b = { 2 };
    assert(a.str() == "1");  // OK
    assert(b.str() == "2");  // Fails
}

Is this a bug, or am I misunderstanding something?

Compiled with "gdc -Og -o repro repro.d", using gdc (GCC) 14.2.1 20240912 (Red Hat 14.2.1-3), on Linux.

Thanks.

March 05

On Wednesday, 5 March 2025 at 16:58:18 UTC, Kirill Kryukov wrote:

>

Hi all,
Is this a bug, or am I misunderstanding something?

Compiled with "gdc -Og -o repro repro.d", using gdc (GCC) 14.2.1 20240912 (Red Hat 14.2.1-3), on Linux.

Thanks.

It seems working with dmd and ldc.
Maybe GDC specific bug?

March 05

On Wednesday, 5 March 2025 at 16:58:18 UTC, Kirill Kryukov wrote:

>

Hi all,

I was debugging an old project that started crashing after upgrading to a recent toolchain. I noticed that commenting out invariants helps. I reduced it to the following:

[...]

>

Is this a bug, or am I misunderstanding something?

Compiled with "gdc -Og -o repro repro.d", using gdc (GCC) 14.2.1 20240912 (Red Hat 14.2.1-3), on Linux.

Thanks.

I tried compiling your example using both DMD and LDC, and was unable to reproduce the crash. So this may be a GDC-specific problem.

March 05

On Wednesday, 5 March 2025 at 16:58:18 UTC, Kirill Kryukov wrote:

>

Is this a bug, or am I misunderstanding something?

Compiled with "gdc -Og -o repro repro.d", using gdc (GCC) 14.2.1 20240912 (Red Hat 14.2.1-3), on Linux.

Compiled your code with DMD v2.109.1, gdc (GCC) 11.3.0 and gdc (GCC) 12.1.0, using gdc -Og -o repro repro.d with the latter two: All executables ran without error.

March 06

Thanks for checking. Looks like it works with DMD, LDC, and older GDC, so this could be a GDC regression. I'll try to post it in GDC (GCC) Bugzilla if I can get an account there.