www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Huge improvement in error messages in recent dmd

reply mipri <mipri minimaltype.com> writes:
Consider the following code with an error:


   import std;
   void main() {
       auto pts = Array!(int[])([0, 0], [5, 5], [0, 1], [0, 2]);
       multiSort!("a[0] < b[0]", "a[1] < b[1]", 
SwapStrategy.unstable)(pts);
   }

The latest version of dmd that's packaged with Fedora is
2.086.1. Of this code it says:

./x266.d(5): Error: template 
std.algorithm.sorting.multiSort!("a[0] < b[0]", "a[1] < b[1]", 
cast(SwapStrategy)0).multiSort cannot deduce function from 
argument types !()(Array!(int[])), candidates are:
/usr/include/dmd/phobos/std/algorithm/sorting.d(1463):        
std.algorithm.sorting.multiSort!("a[0] < b[0]", "a[1] < b[1]", 
cast(SwapStrategy)0).multiSort(Range)(Range r) if 
(validPredicates!(ElementType!Range, less) && 
hasSwappableElements!Range)

The nightly I have is v2.089.1-beta.1, and it says:

x266.d(5): Error: template std.algorithm.sorting.multiSort!("a[0] 
< b[0]", "a[1] < b[1]", cast(SwapStrategy)0).multiSort cannot 
deduce function from argument types !()(Array!(int[])), 
candidates are:
/edit/nightly/dmd2/linux/bin64/../../src/phobos/std/algorithm/sorting.d(1466): 
      multiSort(Range)(Range r)
   with Range = Array!(int[])
   must satisfy the following constraint:
        hasSwappableElements!Range

Which is a huge, huge improvement! The problem is that
Array!(Point) doesn't satisfy hasSwappableElements.

I saw that this was also in the v2.089.0 compiler, and so
checked the blog for announcements back to v2.087, and none of
them showed how much better the error messages got. This should
be highlighted. I don't normally care that much about staying
exactly up-to-date with compilers, but I'd sure have upgraded
earlier for this.

A slightly strange thing is that rdmd's error messages are
even friendlier (v2.089.0):

   ./x266.d(5): Error: template 
std.algorithm.sorting.multiSort!("a[0] < b[0]", "a[1] < b[1]", 
cast(SwapStrategy)0).multiSort cannot deduce function from 
argument types !()(Array!(int[])), candidates are:
   
/edit/latest/dmd2/linux/bin64/../../src/phobos/std/algorithm/sorting.d(1466):  
     multiSort(Range)(Range r)
     with Range = Array!(int[])
     whose parameters have the following constraints:
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       validPredicates!(ElementType!Range, less)
     > hasSwappableElements!Range
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     Tip: not satisfied constraints are marked with >

wow!
Dec 11 2019
next sibling parent Meta <jared771 gmail.com> writes:
On Thursday, 12 December 2019 at 00:39:15 UTC, mipri wrote:
 Consider the following code with an error:


   import std;
   void main() {
       auto pts = Array!(int[])([0, 0], [5, 5], [0, 1], [0, 2]);
       multiSort!("a[0] < b[0]", "a[1] < b[1]", 
 SwapStrategy.unstable)(pts);
   }

 The latest version of dmd that's packaged with Fedora is
 2.086.1. Of this code it says:

 ./x266.d(5): Error: template 
 std.algorithm.sorting.multiSort!("a[0] < b[0]", "a[1] < b[1]", 
 cast(SwapStrategy)0).multiSort cannot deduce function from 
 argument types !()(Array!(int[])), candidates are:
 /usr/include/dmd/phobos/std/algorithm/sorting.d(1463):        
 std.algorithm.sorting.multiSort!("a[0] < b[0]", "a[1] < b[1]", 
 cast(SwapStrategy)0).multiSort(Range)(Range r) if 
 (validPredicates!(ElementType!Range, less) && 
 hasSwappableElements!Range)

 The nightly I have is v2.089.1-beta.1, and it says:

 x266.d(5): Error: template 
 std.algorithm.sorting.multiSort!("a[0] < b[0]", "a[1] < b[1]", 
 cast(SwapStrategy)0).multiSort cannot deduce function from 
 argument types !()(Array!(int[])), candidates are:
 /edit/nightly/dmd2/linux/bin64/../../src/phobos/std/algorithm/sorting.d(1466):
       multiSort(Range)(Range r)
   with Range = Array!(int[])
   must satisfy the following constraint:
        hasSwappableElements!Range

 Which is a huge, huge improvement! The problem is that
 Array!(Point) doesn't satisfy hasSwappableElements.

 I saw that this was also in the v2.089.0 compiler, and so
 checked the blog for announcements back to v2.087, and none of
 them showed how much better the error messages got. This should
 be highlighted. I don't normally care that much about staying
 exactly up-to-date with compilers, but I'd sure have upgraded
 earlier for this.

 A slightly strange thing is that rdmd's error messages are
 even friendlier (v2.089.0):

   ./x266.d(5): Error: template 
 std.algorithm.sorting.multiSort!("a[0] < b[0]", "a[1] < b[1]", 
 cast(SwapStrategy)0).multiSort cannot deduce function from 
 argument types !()(Array!(int[])), candidates are:
   
 /edit/latest/dmd2/linux/bin64/../../src/phobos/std/algorithm/sorting.d(1466): 
      multiSort(Range)(Range r)
     with Range = Array!(int[])
     whose parameters have the following constraints:
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       validPredicates!(ElementType!Range, less)
     > hasSwappableElements!Range
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     Tip: not satisfied constraints are marked with >

 wow!
Huh, I thought I was keeping up to date with the stuff in every new release, but apparently not, as I had no idea that template constraint function error messages had been improved.
Dec 11 2019
prev sibling parent Les De Ridder <les lesderid.net> writes:
On Thursday, 12 December 2019 at 00:39:15 UTC, mipri wrote:
 [...]

 Which is a huge, huge improvement! The problem is that
 Array!(Point) doesn't satisfy hasSwappableElements.

 I saw that this was also in the v2.089.0 compiler, and so
 checked the blog for announcements back to v2.087, and none of
 them showed how much better the error messages got. This should
 be highlighted. I don't normally care that much about staying
 exactly up-to-date with compilers, but I'd sure have upgraded
 earlier for this.
I agree, this is easily one of the most significant user experience improvements in years.
Dec 12 2019