www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 17366] New: Inferrence results in a missing error for final

https://issues.dlang.org/show_bug.cgi?id=17366

          Issue ID: 17366
           Summary: Inferrence results in a missing error for final
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: issues.dlang jmdavisProg.com

This code

import std.stdio;

class A
{
    final print() { writeln(this); } // no return type
}

class B : A
{
    final void print() { writeln(this); }
}

void main()
{
    auto b = new B;
    b.print();

    A a1 = b;
    a1.print();

    A a2 = new A;
    a2.print();
}

compiles and runs, giving

q.B
q.B
q.A

as output. Putting

    pragma(msg, typeof(print));

after the declartion for A.print results in compilation printing

 system void()
q.d(11): Error: function q.B.print cannot override final function q.A.print

whereas putting the same pragma after B.print results in

void()

If A.print is changed to have void, then you get the error and the type that's
printed is the same as B.print.

I find it odd that  system void() and void() would any different, since the
default is  system - so that may or may not be a bug - but it's definitely a
bug that there isn't a compilation error in all cases, since A.print is final
and returns the same type as B.print (whether inferrence is involved or not).
The fact that whether the pragma is there or not affects whether you get a
compilation error is particularly disturbing, but it's a bug regardless.

--
May 03 2017