June 02, 2019
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!()();
    }

--