June 02, 2019 [Issue 19934] New: template function inference breaks when taking the address of the function inside the template | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=19934 Issue ID: 19934 Summary: template function inference breaks when taking the address of the function inside the template Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nobody@puremagic.com Reporter: johnnymarler@gmail.com Reproduce issue with: ``` void func()() { pragma(msg, typeof(&func!()).stringof); } void main() @nogc { auto funcPtr = &func!(); funcPtr(); } ``` This fails with: Error: `@nogc` function `D main` cannot call non-@nogc function pointer `funcPtr` Normally `func` would be @nogc here, but when DMD is forced to resolve typeof(&func!()) while analyzing func, it causes an issue template inference. Note that this issue occurs for all function attributes such as `pure` and `nothrow`. Note that any of the following modifications will fix the issue: 1. remove the pragma, if dmd doesn't have to resolve typeof(&func) inside of func then attribute inference still works correctly 2. don't use auto for funcPtr, i.e. void main() @nogc { void function() @nogc funcPtr = &func!(); funcPtr(); } 3. call the function pointer without assigning it to a variable: void main() @nogc { (&func!())(); } 3. call func directly instead of through a function pointer: void main() @nogc { func!()(); } -- |
Copyright © 1999-2021 by the D Language Foundation