Thread overview
toString doesn't compile with -dip1000 switch
Aug 01, 2022
wjoe
Aug 01, 2022
Kagamin
Aug 01, 2022
wjoe
Aug 01, 2022
wjoe
August 01, 2022
struct Foo()
{
  import std.format: FormatSpec;
  const void toString(
    scope void delegate(const(char)[]) @safe sink,
    FormatSpec!char fmt)
  {}
}

struct Bar
{
  import std.format: FormatSpec;
  const void toString(
    scope void delegate(const(char)[]) @safe sink,
    FormatSpec!char fmt)
  {}
}

@safe unittest {
  import std.conv:to;

  Foo!() foo; foo.to!string;
  Bar bar; bar.to!string; // 25
}

# dmd d.d -dip1000 -unittest -main

d.d(25) Error: @safe function d.__unittest_121_C7 cannot call @system function std.conv.to!string.to!(Bar).to
/usr/lib/dmd/2.099/import/std/conv.d(221): std.conv.to!string.to! (Bar).to is declared here


why is that?

August 01, 2022

Bar.toString is typed @system.

August 01, 2022
On Monday, 1 August 2022 at 13:09:01 UTC, Kagamin wrote:
> Bar.toString is typed `@system`.

Even if I'd declare everything @safe: at module scope?
August 01, 2022

On Monday, 1 August 2022 at 17:07:43 UTC, wjoe wrote:

>

On Monday, 1 August 2022 at 13:09:01 UTC, Kagamin wrote:

>

Bar.toString is typed @system.

Even if I'd declare everything @safe: at module scope?

I wrote that on my phone and it got a bit messy...

module x;
@safe:

struct Foo()
{
  import std.format: FormatSpec;
  const void toString(scope void delegate(const(char)[]) @safe sink, FormatSpec!char fmt) {}
}

struct Bar
{
  import std.format: FormatSpec;
  const void toString(scope void delegate(const(char)[]) @safe sink, FormatSpec!char fmt) {}
}

unittest {
  import std.conv:to;

  Foo!() foo; foo.to!string;
  Bar bar; bar.to!string; // 25
}