[Issue 7768] New: More readable template error messages

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Mar 24 23:23:20 PDT 2012


http://d.puremagic.com/issues/show_bug.cgi?id=7768

           Summary: More readable template error messages
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: diagnostic
          Severity: minor
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: k.hara.pg at gmail.com


--- Comment #0 from Kenji Hara <k.hara.pg at gmail.com> 2012-03-24 23:23:43 PDT ---
This code has bad usage of std.conv.parse template function.
But raised error message is less readable.

import std.conv;
void test1()
{
    int value;
    parse(value);
    // Error: template std.conv.parse(Target,Source)
    //   if (isSomeChar!(ElementType!(Source)) && isIntegral!(Target))
    //   does not match any function template declaration
    // Error: template std.conv.parse(Target,Source)
    //   if (isSomeChar!(ElementType!(Source)) && isIntegral!(Target))
    //   cannot deduce template function from argument types !()(int)
}

parse template function is overloaded, so printing template parameter and
constraint is much confusing.
It should print like follows:

    // Error: template std.conv.parse does not match any
    //   function template declaration
    // Error: template std.conv.parse cannot deduce template function
    //   from argument types !()(int)
}

"matches more than one template declaration" error message has same problem.

void foo(T)(T val) if (is(T : int)) {}
void foo(T)(T val) if (is(T : long)) {}
void test2()
{
    foo(10);
    // Error: template test.foo(T) if (is(T : int)) foo(T) if (is(T : int))
    //   matches more than one template declaration,
    //   test.d(29):foo(T) if (is(T : int)) and
    //   test.d(30):foo(T) if (is(T : long))

should print:
    // Error: template test.foo matches more than one template declaration,
    //   test.d(29):foo(T) if (is(T : int)) and
    //   test.d(30):foo(T) if (is(T : long))
}

If there is only one template function, keeping specialized error message is
better.

void bar(T)(T val) if (is(T : int)) {}
void test3()
{
    bar("abc");
    // Error: test.bar does not match any function template declaration
    // Error: template test.bar(T) if (is(T : int)) cannot deduce
    //   template function from argument types !()(string)
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list