View mode: basic / threaded / horizontal-split · Log in · Help
November 22, 2012
[Issue 9056] New: More precise error messages when function arguments are wrong
http://d.puremagic.com/issues/show_bug.cgi?id=9056

          Summary: More precise error messages when function arguments
                   are wrong
          Product: D
          Version: D2
         Platform: x86
       OS/Version: Windows
           Status: NEW
         Keywords: diagnostic
         Severity: enhancement
         Priority: P2
        Component: DMD
       AssignedTo: nobody@puremagic.com
       ReportedBy: bearophile_hugs@eml.cc


--- Comment #0 from bearophile_hugs@eml.cc 2012-11-22 14:06:08 PST ---
This is wrong code (it's not meaningful code because it's a full reduction of a
much longer program):


struct Foo {}
void bar(in Foo* f4,
        in ref Foo f5,
        in uint m,
        ref const(Foo)* f6,
        ref double x,
        ref uint n) {}
void main() {
   Foo f1;
   Foo* f2, f3;
   double x = 0;
   uint n = 0;
   bar(f2, f1, 0, f3, x, n);
}



DMD 2.061alpha gives:

test.d(13): Error: function test.bar (const(Foo*) f4, ref const(Foo) f5,
const(uint) m, ref const(Foo)* f6, ref double x, ref uint n) is not callable
using argument types (Foo*,Foo,int,Foo*,double,uint)


The function bar() has six arguments. Generally it's better to avoid writing
functions with six arguments, especially in languages that don't have "named
arguments", but once in a while this happens. In bar() the arguments are tagged
in various complex ways. Given such error message it is not immediate to see
that this is a good way to fix the code:


struct Foo {}
void bar(in Foo* f4,
        in ref Foo f5,
        in uint m,
        ref const(Foo)* f6,
        ref double x,
        ref uint n) {}
void main() {
   Foo f1;
   Foo* f2;
   const(Foo)* f3;
   double x = 0;
   uint n = 0;
   bar(f2, f1, 0, f3, x, n);
}


Probably during the compilation the type system of the D compiler has more
information. So in my opinion here the compiler should give a more precise
error message, that tells what arguments are not acceptable.

In this case the problem is just in the f6 argument of bar(). So I suggest an
error message similar to (or better):

test.d(13): Error: function test.bar(const(Foo*) f4, ref const(Foo) f5,
const(uint) m, ref const(Foo)* f6, ref double x, ref uint n) is not callable
using argument types (Foo*,Foo,int,Foo*,double,uint). The incompatible
arguments are: f6.


(Even better is to explain why they are not compatible, but this probably is
too much complex to do, so it's better leave this to a future enhancement
request.)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Top | Discussion index | About this forum | D home