[Issue 18672] Error in @safe transitive propagation with associative arrays

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Mar 29 14:52:12 UTC 2018


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

RazvanN <razvan.nitu1305 at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |razvan.nitu1305 at gmail.com

--- Comment #3 from RazvanN <razvan.nitu1305 at gmail.com> ---
(In reply to ag0aep6g from comment #2)
> (In reply to Seb from comment #1)
> > So DMD already does transitively apply @safe, but apparently if it generated
> > for associative arrays this generation doesn't work in all cases.
> 
> It's not the associative array. It's just that the generated opAssign isn't
> @safe (for no reason):
> 
> ----
> void main() @safe
> {
>     struct ThrowingElement
>     {
>         ~this() {}
>     }
>     
>     ThrowingElement aa;
>         /* Accepted. The destructor is apparently inferred as @safe. */
>     aa = aa;
>         /* Error: @safe function D main cannot call @system generated
>         function onlineapp.main.ThrowingElement.opAssign */
> }
> ----

That's because the generated opAssign is not @safe. Look at [1] : it injects a
pointer which is void initialized, after that the function is inferred to be
@system. I tried replacing the void initializer with null, or with a new
ExpInitializer(loc, new ThisExp(loc)). That solves the current test case, but
ends up failing other tests (for reasons unknown)

[1] https://github.com/dlang/dmd/blob/master/src/dmd/clone.d#L273

--


More information about the Digitalmars-d-bugs mailing list