Bug 20091 – nogc callback inferred as non-nogc

Status
NEW
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2019-07-29T22:32:23Z
Last change time
2024-12-13T19:04:45Z
Assigned to
No Owner
Creator
Ali Ak
Moved to GitHub: dmd#19603 →

Comments

Comment #0 by ali.akhtarzada — 2019-07-29T22:32:23Z
import std; struct W(T) { T value; auto hook(handlers...)() { return handlers[0](value); } } template f(handlers...) { auto ref f(T)(auto ref T value) { return value.hook!handlers; } } @nogc void main() { auto a = W!int(3); auto b = a.f!((_) => "yes"); } Produces: Error: @nogc function D main cannot call non-@nogc function onlineapp.main.f!(W!int).f Adding @nogc on function f says hook!((_) => "yes").hook closes over variable __this310 If you explicitly specify a type on the lambda that you pass to f then it compiles: auto b = a.f!((int) => "yes");
Comment #1 by ali.akhtarzada — 2019-07-29T23:21:16Z
f's instantiation with untyped lambda: f!(W!int) { auto pure nothrow @safe string f(ref W!int value) { return (void*[2] __this3 = null;) , value.hook(); } } With typed lambda: f!(W!int) { auto pure nothrow @nogc @safe string f(ref W!int value) { return value.hook(); } }
Comment #2 by robert.schadek — 2024-12-13T19:04:45Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19603 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB