On Wednesday, 3 May 2017 at 07:37:31 UTC, Jacob Carlborg wrote:
It might be by accident but I think the compiler is inferring
the return type. Just as "auto" is not necessary to infer the
type of a variable if there's another attribute:
auto a = 3;
const auto b = 4; // here "auto" is redundant
const c = 5;
In your case you have "final" as the attribute.
Yes, the compiler is inferring the return type. However, it
_should_ be inferring it as void, and the override in B should
then be illegal. If I stick
pragma(msg, typeof(print));
right after each declaration for print, then it prints
@system void()
for A and
void()
for B, which is odd, since both should be @system. Interestingly,
if both have pragmas at the same time, _then_ I get a compilation
error:
qd.d(11): Error: function qd.B.print cannot override final
function qd.A.print
So, I'd say that there's definitely a bug here.