[Issue 17871] Delegate type inference doesn't work
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Oct 2 11:50:12 UTC 2017
https://issues.dlang.org/show_bug.cgi?id=17871
--- Comment #3 from ag0aep6g at gmail.com ---
(In reply to Mathias Lang from comment #2)
> It is rather inconsistent though:
> ```
> auto wrapper = (foo) {};
> ```
> Doesn't compile, but:
> ```
> auto wrapper = (int) {};
> ```
> Does.
The key here is that `int` is a built-in type. I.e., "int" is a keyword and
cannot be used as a parameter name. dmd is being smart and recognizes it as the
type then.
Similarly, stuff like `auto wrapper = (typeof(size_t.init)) {};` works, because
`typeof(size_t.init)` isn't an identifier, so it can't be a parameter name.
[...]
> The grammar mentions that a FunctionLiteral
> (https://dlang.org/spec/grammar.html#FunctionLiteral) is, in this case:
> ParameterMemberAttributes FunctionLiteralBody
>
> Skipping a couple of intermediate steps, we end up with a list of Parameter
> (https://dlang.org/spec/grammar.html#Parameter) which always starts with
> `Type` or `BasicType`, so it looks like the grammar is not up to date in
> that regard (unless I'm again missing something?).
I think you're right.
The compiler treats single identifiers differently in function literals than in
function declarations (in `void f(size_t) {}`, "size_t" is the parameter
*type*). But the grammar is the same for both. It should probably show the
difference.
Grammar-wise, the "size_t" in `(size_t) {}` is matched by the rule `Parameter:
InOut_opt Type` ("size_t" -> Identifier -> ... -> Parameter). It could be
argued that semantic analysis makes a parameter name out of the "Type". But
then the grammar is clearly misleading.
--
More information about the Digitalmars-d-bugs
mailing list