[Issue 17366] New: Inferrence results in a missing error for final
    via Digitalmars-d-bugs 
    digitalmars-d-bugs at puremagic.com
       
    Wed May  3 01:20:18 PDT 2017
    
    
  
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 at puremagic.com
          Reporter: issues.dlang at 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.
--
    
    
More information about the Digitalmars-d-bugs
mailing list