Thread overview
Error messages for newbies survey
Oct 10, 2012
bearophile
Oct 10, 2012
Don Clugston
Oct 12, 2012
bearophile
Oct 10, 2012
ixid
October 10, 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
October 10, 2012
On 10/10/12 14:09, bearophile wrote:
>   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.

Many of the things you report are examples of bug 8684. Please file bug reports for any others you think are important.
October 10, 2012
On Wednesday, 10 October 2012 at 12:33:23 UTC, bearophile wrote:
>  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.<
>

Maybe I'm not quite as novice as most of those errors but by far the most frustrating thing is unhandled exceptions as a scrub. You just get thrown out of the program with no idea what caused it to sulk and little idea how to diagnose and fix it, making things like stack overflows and so on really irritating as a beginner.
October 12, 2012
Don Clugston:

> Many of the things you report are examples of bug 8684. Please file bug reports for any others you think are important.

I have added some cases here:
http://d.puremagic.com/issues/show_bug.cgi?id=8684

Add added a new report:
http://d.puremagic.com/issues/show_bug.cgi?id=8807

Bye,
bearophile