[Issue 23452] New: Noncopyable variable can be silently passed to a function with variadic args

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Nov 3 08:39:17 UTC 2022


https://issues.dlang.org/show_bug.cgi?id=23452

          Issue ID: 23452
           Summary: Noncopyable variable can be silently passed to a
                    function with variadic args
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: chalucha at gmail.com

```D
import std.stdio;

struct Foo {
    @disable this(this);
    int x;
}

void test(Foo[] foos...) {
    foreach (ref f; foos) {
        writeln(&f, ": ", f.x);
        f.x = 0;
    }
}

void main()
{
    Foo f1 = Foo(1);
    Foo f2 = Foo(2);
    writeln("f1: ", &f1);
    writeln("f2: ", &f2);
    test(f1, f2);
    writeln("f1: ", f1.x);
    writeln("f2: ", f2.x);
}
```

This can compile without any warning or error but at the same time foos aren't
passed as a reference.
At least it shouldn't allow to pass the noncopyable variables.

For a record a possible workaround that works:
```D
void test(ARGS...)(ARGS foos)
  if (ARGS.length >= 1 && allSameType!ARGS && is(ARGS[0] == Foo))
{ ... }
```

This would rightly complain that Foo is not copyable and with `(ref ARGS foos)`
we can also pass foos by reference when needed.

--


More information about the Digitalmars-d-bugs mailing list