Opaque type (struct) with a static immutable fails to compile without constructor - why?

harakim harakim at gmail.com
Thu Mar 4 14:18:07 UTC 2021


On Thursday, 4 March 2021 at 13:58:48 UTC, frankp wrote:
> Hi all,
>
> I want to make an opaque type that simply contains an integer 
> with some immutable constants and toString pretty printing. 
> Like this:
>
> struct Foo_t
> {
>    private long foo;
>    alias foo this;
>    static immutable long Inf = long.max; //1)
>
>    void toString(...){}
> }
>
> On dmd 2.092.1 this fails with:
>   1) Error: cannot implicitly convert expression 9223...L of 
> type immutable(long) to Foo_t
>
> I simply want to initialize an immutable long with long.max.
> Why the conversion to Foo_t ?
>
> If I add a constructor:
> private this(long f)
> {
>    foo = f;
> }
>
> It compiles but according to code coverage this constructor is 
> never called.
> What's going on?

This is the text of my program

import std.stdio;

struct Foo_t
{
    private long foo;
    alias foo this;
    static immutable long Inf = long.max; //1)

    void toString(...){ writeln(foo); }
}


void main()
{
	Foo_t sample;
	sample.foo = 100;
	
	sample.toString();
}


This is the results of running the program:

PS C:\Users\someone\source\tests> dmd forum1.d
PS C:\Users\someone\source\tests> ./forum1.exe
100
PS C:\Users\someone\source\tests> dmd --version
DMD32 D Compiler v2.095.1-dirty
Copyright (C) 1999-2020 by The D Language Foundation, All Rights 
Reserved written by Walter Bright

So I was not able to reproduce your issue. Is it possible that 
error is coming from somewhere else?


More information about the Digitalmars-d-learn mailing list