On 25.05.2017 20:57, MysticZach wrote:
On Thursday, 25 May 2017 at 11:49:47 UTC, MysticZach wrote:
...there is no known possibility of semantic confusion between the two
potential uses of `body`,
I spoke too soon. I found a place where such semantic ambiguity is
possible. It can only occur in interface declarations, and will not
exist in any currently compilable D code, as it requires `body` to be an
identifier to be legal in the first place.
Currently, the only place in D where you can declare a function that has
a contract, but no body, is in an interface. D syntax, it turns out,
does not require a semicolon at the end of such declarations.
Referencing https://dlang.org/spec/interface.html#interface-contracts we
have:
interface I
{
int foo(int i)
in { assert(i); } // <-- no semicolon required
void bar();
}
Therefore, with `body` as an identifier, you might have this ambiguity:
struct body {}
interface I {
int foo(int i)
in { assert(i); }
body bar();
}
The ambiguity is fixable by modifying the parser to look ahead after
`body` for `{`. Since virtual interface functions are not even allowed
to have bodies, if it finds `{`, then `body` should be interpreted as a
keyword, and an error issued. In all other cases `body` should be
interpreted as an identifier.
This is not a hard problem, but it is indeed a semantic ambiguity, so it
bears mentioning.
There is no ambiguity, because only one valid interpretation exists.