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.

Reply via email to