[Issue 2753] Cannot declare pointer to function returning ref

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Oct 25 13:59:07 UTC 2022


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

Bolpat <qs.il.paperinik at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |qs.il.paperinik at gmail.com

--- Comment #10 from Bolpat <qs.il.paperinik at gmail.com> ---
@Walter: It is “broken” in the sense that the grammar should(!) be able to
express a type without requiring type aliases.

I’d suggest minimal changes to the Type grammar to allow for it. 

TL;DR: The semantics is obvious, I hope. Let’s allow the following:
```d
ref (int function()) f1();
(ref int function()) f2();

void g1(ref (int function()) fp);
void g2((ref int function()) fp);

void hImpl(DG : ref int delegate())(DG dg) { }
alias h = fImpl!(ref int delegate() @safe);
```
――― End of TL;DR ―――

Note that `f1` and `g1` are equivalent to:
```d
ref int function() f1();
void g1(ref int function() fp);
```

In the grammar, I use `?` to signify optional occurrence.

```diff
  Type:
      TypeCtors? BasicType TypeSuffixes?
+     ref TypeCtors? BasicType CallableSuffix TypeSuffixes?

    BasicType:
        FundamentalType
        . QualifiedIdentifier
        QualifiedIdentifier
        Typeof
        Typeof . QualifiedIdentifier
−       TypeCtor ( Type )
+       TypeCtor? ( Type )
        Vector
        TraitsExpression
        MixinType

    TypeSuffix:
        *
        [ ]
        [ AssignExpression ]
        [ AssignExpression .. AssignExpression ]
        [ Type ]
+       CallableSuffix
+   
+   CallableSuffix:
        delegate Parameters MemberFunctionAttributes?
        function Parameters FunctionAttributes?
```
(This grammar diff does not address the special casing for `alias` that is
currently in place and superseded by this. As far as I can tell, it’ll be still
good and should not be changed.)

It is worth considering to deprecate the syntax without disambiguating
parentheses, akin to comparison and bit-wise operators and `() => { }`. The
deprecation only applies to cases where a non-aliased function pointer or
delegate type is used on a `ref` parameter or as the return type of a `ref`
returning function.

--


More information about the Digitalmars-d-bugs mailing list