Skip to content

Commit

Permalink
Merge pull request #4510 from 9rnsr/fix14320
Browse files Browse the repository at this point in the history
Issue 14320 - Improve diagnostic message for "undefined identifier" error
  • Loading branch information
WalterBright committed Mar 27, 2015
2 parents c420fa1 + 01741b5 commit 3605942
Show file tree
Hide file tree
Showing 73 changed files with 154 additions and 152 deletions.
4 changes: 2 additions & 2 deletions src/dsymbol.c
Expand Up @@ -481,10 +481,10 @@ Dsymbol *Dsymbol::searchX(Loc loc, Scope *sc, RootObject *id)
{
sm = s->search_correct(ti->name);
if (sm)
::error(loc, "template identifier '%s' is not a member of '%s %s', did you mean '%s %s'?",
::error(loc, "template identifier '%s' is not a member of %s '%s', did you mean %s '%s'?",
ti->name->toChars(), s->kind(), s->toPrettyChars(), sm->kind(), sm->toChars());
else
::error(loc, "template identifier '%s' is not a member of '%s %s'",
::error(loc, "template identifier '%s' is not a member of %s '%s'",
ti->name->toChars(), s->kind(), s->toPrettyChars());
return NULL;
}
Expand Down
11 changes: 6 additions & 5 deletions src/expression.c
Expand Up @@ -3288,9 +3288,9 @@ Expression *IdentifierExp::semantic(Scope *sc)
{
s = sc->search_correct(ident);
if (s)
error("undefined identifier %s, did you mean %s %s?", ident->toChars(), s->kind(), s->toChars());
error("undefined identifier '%s', did you mean %s '%s'?", ident->toChars(), s->kind(), s->toChars());
else
error("undefined identifier %s", ident->toChars());
error("undefined identifier '%s'", ident->toChars());
}
return new ErrorExp();
}
Expand Down Expand Up @@ -7404,10 +7404,11 @@ Expression *DotIdExp::semanticY(Scope *sc, int flag)
return NULL;
s = ie->sds->search_correct(ident);
if (s)
error("undefined identifier '%s', did you mean '%s %s'?",
ident->toChars(), s->kind(), s->toChars());
error("undefined identifier '%s' in %s '%s', did you mean %s '%s'?",
ident->toChars(), ie->sds->kind(), ie->sds->toPrettyChars(), s->kind(), s->toChars());
else
error("undefined identifier '%s'", ident->toChars());
error("undefined identifier '%s' in %s '%s'",
ident->toChars(), ie->sds->kind(), ie->sds->toPrettyChars());
return new ErrorExp();
}
else if (t1b->ty == Tpointer && e1->type->ty != Tenum &&
Expand Down
2 changes: 1 addition & 1 deletion src/import.c
Expand Up @@ -280,7 +280,7 @@ void Import::semantic(Scope *sc)
{
Dsymbol *s = mod->search_correct(names[i]);
if (s)
mod->error(loc, "import '%s' not found, did you mean '%s %s'?", names[i]->toChars(), s->kind(), s->toChars());
mod->error(loc, "import '%s' not found, did you mean %s '%s'?", names[i]->toChars(), s->kind(), s->toChars());
else
mod->error(loc, "import '%s' not found", names[i]->toChars());
ad->type = Type::terror;
Expand Down
2 changes: 1 addition & 1 deletion src/init.c
Expand Up @@ -186,7 +186,7 @@ Initializer *StructInitializer::semantic(Scope *sc, Type *t, NeedInterpret needI
{
s = sd->search_correct(id);
if (s)
error(loc, "'%s' is not a member of '%s', did you mean '%s %s'?",
error(loc, "'%s' is not a member of '%s', did you mean %s '%s'?",
id->toChars(), sd->toChars(), s->kind(), s->toChars());
else
error(loc, "'%s' is not a member of '%s'", id->toChars(), sd->toChars());
Expand Down
11 changes: 6 additions & 5 deletions src/mtype.c
Expand Up @@ -6450,15 +6450,16 @@ void TypeQualified::resolveHelper(Loc loc, Scope *sc,
else
{
if (id->dyncast() == DYNCAST_DSYMBOL)
{ // searchX already handles errors for template instances
{
// searchX already handles errors for template instances
assert(global.errors);
}
else
{
assert(id->dyncast() == DYNCAST_IDENTIFIER);
sm = s->search_correct((Identifier *)id);
if (sm)
error(loc, "identifier '%s' of '%s' is not defined, did you mean '%s %s'?",
error(loc, "identifier '%s' of '%s' is not defined, did you mean %s '%s'?",
id->toChars(), toChars(), sm->kind(), sm->toChars());
else
error(loc, "identifier '%s' of '%s' is not defined", id->toChars(), toChars());
Expand Down Expand Up @@ -6554,7 +6555,7 @@ void TypeQualified::resolveHelper(Loc loc, Scope *sc,
}
if (!s)
{
const char *p = toChars();
const char *p = mutableOf()->unSharedOf()->toChars();
const char *n = importHint(p);
if (n)
error(loc, "'%s' is not defined, perhaps you need to import %s; ?", p, n);
Expand All @@ -6563,9 +6564,9 @@ void TypeQualified::resolveHelper(Loc loc, Scope *sc,
Identifier *id = new Identifier(p, TOKidentifier);
s = sc->search_correct(id);
if (s)
error(loc, "undefined identifier %s, did you mean %s %s?", p, s->kind(), s->toChars());
error(loc, "undefined identifier '%s', did you mean %s '%s'?", p, s->kind(), s->toChars());
else
error(loc, "undefined identifier %s", p);
error(loc, "undefined identifier '%s'", p);
}
*pt = Type::terror;
}
Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/diag10089.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/diag10089.d(15): Error: undefined identifier 'chunks'
fail_compilation/diag10089.d(15): Error: undefined identifier 'chunks' in package 'imports'
fail_compilation/diag10089.d(17): Error: no property 'chunks' for type 'void'
---
*/
Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/diag10783.d
Expand Up @@ -2,7 +2,7 @@
TEST_OUTPUT:
---
fail_compilation/diag10783.d(14): Error: no property 'type' for type 'Event'
fail_compilation/diag10783.d(14): Error: undefined identifier En
fail_compilation/diag10783.d(14): Error: undefined identifier 'En'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/diag11423.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/diag11423.d(9): Error: undefined identifier shared(Foo)
fail_compilation/diag11423.d(9): Error: undefined identifier 'Foo'
---
*/
void main()
Expand Down
4 changes: 2 additions & 2 deletions test/fail_compilation/diag11840.d
@@ -1,8 +1,8 @@
/*
TEST_OUTPUT:
---
fail_compilation/diag11840.d(12): Error: undefined identifier i
fail_compilation/diag11840.d(12): Error: undefined identifier j
fail_compilation/diag11840.d(12): Error: undefined identifier 'i'
fail_compilation/diag11840.d(12): Error: undefined identifier 'j'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/diag12280.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/diag12280.d(15): Error: undefined identifier nonexistent
fail_compilation/diag12280.d(15): Error: undefined identifier 'nonexistent'
fail_compilation/diag12280.d(13): Error: template instance diag12280.f!10 error instantiating
fail_compilation/diag12280.d(18): 11 recursive instantiations from here: f!0
---
Expand Down
4 changes: 2 additions & 2 deletions test/fail_compilation/diag12640.d
@@ -1,8 +1,8 @@
/*
TEST_OUTPUT:
---
fail_compilation/diag12640.d(14): Error: undefined identifier asdf
fail_compilation/diag12640.d(23): Error: undefined identifier asdf
fail_compilation/diag12640.d(14): Error: undefined identifier 'asdf'
fail_compilation/diag12640.d(23): Error: undefined identifier 'asdf'
---
*/

Expand Down
4 changes: 2 additions & 2 deletions test/fail_compilation/diag14235.d
@@ -1,8 +1,8 @@
/*
TEST_OUTPUT:
---
fail_compilation/diag14235.d(11): Error: template identifier 'Undefined' is not a member of 'module imports.a14235'
fail_compilation/diag14235.d(12): Error: template identifier 'Something' is not a member of 'module imports.a14235', did you mean 'struct SomeThing(T...)'?
fail_compilation/diag14235.d(11): Error: template identifier 'Undefined' is not a member of module 'imports.a14235'
fail_compilation/diag14235.d(12): Error: template identifier 'Something' is not a member of module 'imports.a14235', did you mean struct 'SomeThing(T...)'?
fail_compilation/diag14235.d(13): Error: imports.a14235.SomeClass is not a template, it is a class
---
*/
Expand Down
6 changes: 3 additions & 3 deletions test/fail_compilation/diag6699.d
Expand Up @@ -10,9 +10,9 @@ alias b6699.x b6699a;
/*
TEST_OUTPUT:
---
fail_compilation/diag6699.d(18): Error: undefined identifier junk1
fail_compilation/diag6699.d(18): Error: undefined identifier junk2
fail_compilation/diag6699.d(19): Error: undefined identifier junk3
fail_compilation/diag6699.d(18): Error: undefined identifier 'junk1'
fail_compilation/diag6699.d(18): Error: undefined identifier 'junk2'
fail_compilation/diag6699.d(19): Error: undefined identifier 'junk3'
---
*/
class X : junk1, junk2 {}
Expand Down
6 changes: 3 additions & 3 deletions test/fail_compilation/diag8648.d
@@ -1,13 +1,13 @@
/*
TEST_OUTPUT:
---
fail_compilation/diag8648.d(18): Error: undefined identifier X
fail_compilation/diag8648.d(18): Error: undefined identifier 'X'
fail_compilation/diag8648.d(29): Error: template diag8648.foo cannot deduce function from argument types !()(Foo!(int, 1)), candidates are:
fail_compilation/diag8648.d(18): diag8648.foo(T, n)(X!(T, n))
fail_compilation/diag8648.d(20): Error: undefined identifier a
fail_compilation/diag8648.d(20): Error: undefined identifier 'a'
fail_compilation/diag8648.d(31): Error: template diag8648.bar cannot deduce function from argument types !()(Foo!(int, 1)), candidates are:
fail_compilation/diag8648.d(20): diag8648.bar(T)(Foo!(T, a))
fail_compilation/diag8648.d(20): Error: undefined identifier a
fail_compilation/diag8648.d(20): Error: undefined identifier 'a'
fail_compilation/diag8648.d(32): Error: template diag8648.bar cannot deduce function from argument types !()(Foo!(int, f)), candidates are:
fail_compilation/diag8648.d(20): diag8648.bar(T)(Foo!(T, a))
---
Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/diag8825.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/diag8825.d(13): Error: undefined identifier foo
fail_compilation/diag8825.d(13): Error: undefined identifier 'foo'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/diag9210a.d
Expand Up @@ -4,7 +4,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/imports/diag9210b.d(6): Error: undefined identifier A
fail_compilation/imports/diag9210b.d(6): Error: undefined identifier 'A'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/diag9479.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/diag9479.d(10): Error: undefined identifier something_undefined
fail_compilation/diag9479.d(10): Error: undefined identifier 'something_undefined'
---
*/

Expand Down
8 changes: 4 additions & 4 deletions test/fail_compilation/diag_err1.d
@@ -1,12 +1,12 @@
/*
TEST_OUTPUT:
---
fail_compilation/diag_err1.d(21): Error: undefined identifier x
fail_compilation/diag_err1.d(21): Error: undefined identifier 'x'
fail_compilation/diag_err1.d(21): while evaluating pragma(msg, [1, 2, x].length)
fail_compilation/diag_err1.d(22): Error: undefined identifier x
fail_compilation/diag_err1.d(22): Error: undefined identifier y
fail_compilation/diag_err1.d(22): Error: undefined identifier 'x'
fail_compilation/diag_err1.d(22): Error: undefined identifier 'y'
fail_compilation/diag_err1.d(22): while evaluating pragma(msg, (x + y).sizeof)
fail_compilation/diag_err1.d(23): Error: undefined identifier x
fail_compilation/diag_err1.d(23): Error: undefined identifier 'x'
fail_compilation/diag_err1.d(23): while evaluating pragma(msg, (n += x).sizeof)
fail_compilation/diag_err1.d(24): Error: incompatible types for ((s) ~ (n)): 'string' and 'int'
fail_compilation/diag_err1.d(24): while evaluating pragma(msg, (s ~ n).sizeof)
Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail10346.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail10346.d(9): Error: undefined identifier T
fail_compilation/fail10346.d(9): Error: undefined identifier 'T'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail10481.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail10481.d(11): Error: undefined identifier T1, did you mean alias T0?
fail_compilation/fail10481.d(11): Error: undefined identifier 'T1', did you mean alias 'T0'?
fail_compilation/fail10481.d(15): Error: cannot resolve type for get!(A)
---
*/
Expand Down
4 changes: 2 additions & 2 deletions test/fail_compilation/fail11042.d
@@ -1,8 +1,8 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail11042.d(8): Error: undefined identifier error, did you mean class Error?
fail_compilation/fail11042.d(9): Error: undefined identifier error, did you mean class Error?
fail_compilation/fail11042.d(8): Error: undefined identifier 'error', did you mean class 'Error'?
fail_compilation/fail11042.d(9): Error: undefined identifier 'error', did you mean class 'Error'?
---
*/
static if ({ return true || error; }()) {} // NG
Expand Down
14 changes: 7 additions & 7 deletions test/fail_compilation/fail12047.d
Expand Up @@ -2,13 +2,13 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail12047.d(15): Error: undefined identifier asdf
fail_compilation/fail12047.d(16): Error: undefined identifier asdf
fail_compilation/fail12047.d(17): Error: undefined identifier asdf
fail_compilation/fail12047.d(18): Error: undefined identifier asdf
fail_compilation/fail12047.d(19): Error: undefined identifier asdf
fail_compilation/fail12047.d(20): Error: undefined identifier asdf
fail_compilation/fail12047.d(21): Error: undefined identifier asdf
fail_compilation/fail12047.d(15): Error: undefined identifier 'asdf'
fail_compilation/fail12047.d(16): Error: undefined identifier 'asdf'
fail_compilation/fail12047.d(17): Error: undefined identifier 'asdf'
fail_compilation/fail12047.d(18): Error: undefined identifier 'asdf'
fail_compilation/fail12047.d(19): Error: undefined identifier 'asdf'
fail_compilation/fail12047.d(20): Error: undefined identifier 'asdf'
fail_compilation/fail12047.d(21): Error: undefined identifier 'asdf'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail122.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail122.d(12): Error: undefined identifier y
fail_compilation/fail122.d(12): Error: undefined identifier 'y'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail123.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail123.d(11): Error: undefined identifier type
fail_compilation/fail123.d(11): Error: undefined identifier 'type'
fail_compilation/fail123.d(17): Error: enum fail123.foo2 base type must not be void
---
*/
Expand Down
12 changes: 6 additions & 6 deletions test/fail_compilation/fail12378.d
@@ -1,8 +1,8 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail12378.d(18): Error: undefined identifier ANYTHING
fail_compilation/fail12378.d(18): Error: undefined identifier GOES
fail_compilation/fail12378.d(18): Error: undefined identifier 'ANYTHING'
fail_compilation/fail12378.d(18): Error: undefined identifier 'GOES'
fail_compilation/fail12378.d(91): instantiated from here: MapResultS!((x0) => ANYTHING - GOES, Result)
fail_compilation/fail12378.d(17): instantiated from here: mapS!(Result)
fail_compilation/fail12378.d(100): instantiated from here: __lambda1!int
Expand All @@ -23,8 +23,8 @@ void testS()
/*
TEST_OUTPUT:
---
fail_compilation/fail12378.d(40): Error: undefined identifier ANYTHING
fail_compilation/fail12378.d(40): Error: undefined identifier GOES
fail_compilation/fail12378.d(40): Error: undefined identifier 'ANYTHING'
fail_compilation/fail12378.d(40): Error: undefined identifier 'GOES'
fail_compilation/fail12378.d(112): instantiated from here: MapResultC!((x0) => ANYTHING - GOES, Result)
fail_compilation/fail12378.d(39): instantiated from here: mapC!(Result)
fail_compilation/fail12378.d(123): instantiated from here: __lambda1!int
Expand All @@ -45,8 +45,8 @@ void testC()
/*
TEST_OUTPUT:
---
fail_compilation/fail12378.d(64): Error: undefined identifier ANYTHING
fail_compilation/fail12378.d(64): Error: undefined identifier GOES
fail_compilation/fail12378.d(64): Error: undefined identifier 'ANYTHING'
fail_compilation/fail12378.d(64): Error: undefined identifier 'GOES'
fail_compilation/fail12378.d(135): instantiated from here: MapResultI!((x0) => ANYTHING - GOES, Result)
fail_compilation/fail12378.d(63): instantiated from here: mapI!(Result)
fail_compilation/fail12378.d(143): instantiated from here: __lambda1!int
Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail189.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail189.d(10): Error: undefined identifier foo
fail_compilation/fail189.d(10): Error: undefined identifier 'foo'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail228.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail228.d(22): Error: undefined identifier localVariable
fail_compilation/fail228.d(22): Error: undefined identifier 'localVariable'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail236.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail236.d(14): Error: undefined identifier x
fail_compilation/fail236.d(14): Error: undefined identifier 'x'
fail_compilation/fail236.d(22): Error: template fail236.Templ2 cannot deduce function from argument types !()(int), candidates are:
fail_compilation/fail236.d(12): fail236.Templ2(alias a)(x)
---
Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail237.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail237.d(10): Error: undefined identifier 'a'
fail_compilation/fail237.d(10): Error: undefined identifier 'a' in module 'fail237'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail251.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail251.d(12): Error: undefined identifier xs
fail_compilation/fail251.d(12): Error: undefined identifier 'xs'
fail_compilation/fail251.d(16): called from here: foo()
fail_compilation/fail251.d(16): while evaluating: static assert(foo())
---
Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail264.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail264.d(10): Error: undefined identifier undef
fail_compilation/fail264.d(10): Error: undefined identifier 'undef'
---
*/

Expand Down

0 comments on commit 3605942

Please sign in to comment.