www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 19934] New: template function inference breaks when taking

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!()();
    }

--
Jun 01 2019