Error messages for newbies survey

bearophile bearophileHUGS at lycos.com
Wed Oct 10 05:09:19 PDT 2012


  From Reddit, a nice survey:
http://www.reddit.com/r/coding/comments/118ssp/honours_student_at_my_university_is_doing_a/


>For my Computer Science Honours research project, I am currently 
>investigating ways of improving the terse, technical error 
>messages given by traditional compilers to make them more useful 
>to novice programmers. As part of this research, I have designed 
>this survey to help determine which types of common novice 
>errors are inadequately reported by a traditional compiler and 
>to gather ideas on how they should be reported to a novice.<

http://www.esurveyspro.com/Survey.aspx?id=23752434-e25f-4a48-86bf-bb2634e1b5ce

So this survey is not to improve error messages in general, it's
specific for newbies. So the error situations shown in the survey
are not typical for C programmers.

Below some of the examples converted to D, with their relative
error messages.

---------------------------------

void main() {
      int height = 25;
      int width = 50;
      int area = height.width;
}


temp.d(4): Error: undefined identifier 'width'

---------------------------------

void main() {
      int x = 3;
      int y = 2(x + 1);
}


temp.d(3): Error: function expected before (), not 2 of type int

---------------------------------

int main() {
      for (int i = 0, i < 10, i++) {
          // do something
      }
      return 0;
}


temp.d(2): Error: semicolon expected, not '<'
temp.d(2): Error: expression expected, not '<'
temp.d(2): Error: found '10' when expecting ';' following for
condition
temp.d(2): Error: expression expected, not ','
temp.d(2): Error: found 'i' when expecting ')'
temp.d(2): Error: expression expected, not ')'
temp.d(2): Error: found '{' when expecting ';' following statement
temp.d(5): Error: Declaration expected, not 'return'
temp.d(6): Error: unrecognized declaration

---------------------------------

void main() {
    int value = 0;

    while (value < 10) do {
      // do something
      value++;
    }
}


temp.d(8): Error: found '}' when expecting 'while'
temp.d(8): Error: found 'EOF' when expecting '('
temp.d(8): Error: expression expected, not 'EOF'
temp.d(8): Error: found 'EOF' when expecting ')'
temp.d(8): Deprecation: do-while statement without terminating ;
is deprecated
temp.d(8): Error: found 'EOF' when expecting '}' following
compound statement

---------------------------------

void main() {
      double value = 1;

      switch (value) {
        case 1:
          // do something
          break;
      }
}


temp.d(4): Error: 'value' is not of integral type, it is a double
temp.d(5): Error: case must be a string or an integral constant,
not 1
temp.d(4): Deprecation: non-final switch statement without a
default is deprecated

---------------------------------

void main() {
      int i = 0;

      if (i => 0) {
        // do something
      }
}


temp.d(4): Error: expression __lambda2 of type void does not have
a boolean value

---------------------------------

void toDouble(int integer) {
      return cast(double)integer;
}
int main() {
      double x = toDouble(1);
      return 0;
}


temp.d(2): Error: cast has no effect in expression
(cast(double)integer)
temp.d(2): Error: cannot return non-void from void function
temp.d(5): Error: expression toDouble(1) is void and has no value

---------------------------------

int f(int x) {
      return x * x - x + 1;
}
int main() {
      int x = 5;
      x = f;
      return 0;
}


temp.d(6): Error: not a property f

---------------------------------

import std.math;
int main() {
      double x, y;
      x = 0.5;
      sin(x) = y;
      return 0;
}


temp.d(5): Error: sin(cast(real)x) is not an lvalue

---------------------------------

void main() {
      int arr[10];

      for (int i = 0; i < 10; i++) {
          arr(i) = 0;
      }
}

temp.d(5): Error: function expected before (), not arr of type
int[10u]

---------------------------------

import std.stdio;
int main() {
      int i = 1;
      printf("%f\n", i);
      return 0;
}


0.000000

(DMD gives no warning here)

=================================

Let me add few basic mistakes specific for D, and the error
messages they generate:


void main() {
      foreach (i, 0 .. 10) {}
}


temp.d(2): Error: basic type expected, not 0
temp.d(2): Error: no identifier for declarator int
temp.d(2): Error: found '0' when expecting ';'
temp.d(2): Error: expression expected, not '..'
temp.d(2): Error: found '10' when expecting ')'
temp.d(2): Error: found ')' instead of statement
temp.d(3): Error: unrecognized declaration

---------------------------------

void main() {
      int[10] data;
      foreach (i, x, data) {}
}



temp.d(3): Error: no identifier for declarator data
temp.d(3): Error: found ')' when expecting ';'
temp.d(4): Error: found '}' when expecting ')'
temp.d(4): Error: found 'EOF' instead of statement
temp.d(4): Error: found 'EOF' when expecting '}' following
compound statement

---------------------------------

void main() {
      int[10] data;
      foreach (i; x; data) {}
}


temp.d(3): Error: found ';' when expecting ')'
temp.d(3): Error: found ')' when expecting ';' following statement

---------------------------------

void main() {
      int[10] data;
      foreach (i; x, data) {}
}


temp.d(3): Error: undefined identifier x

---------------------------------

struct Foo { int x; }
void main() {
      Foo[10] data;
      foreach (f; data)
          f.x++;
}


[No error messages nor warnings]

---------------------------------

Some of those D error messages are sub-optimal for new
programmers.

Bye,
bearophile


More information about the Digitalmars-d mailing list