DIP 1003 Formal Review
MysticZach via Digitalmars-d
digitalmars-d at puremagic.com
Thu May 25 11:57:47 PDT 2017
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.
More information about the Digitalmars-d
mailing list