From 97e821dd6f233ba0d9c8a921d1bb183e1ba5ac9b Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 24 Jul 2014 06:51:03 -0400 Subject: [PATCH] Improve error messaging for reserved keywords (bug 6199). --- sourcepawn/compiler/sc1.c | 10 ++++++++-- sourcepawn/compiler/sc5.scp | 1 + .../compiler/tests/fail-object-keyword-as-name.sp | 5 +++++ .../compiler/tests/fail-object-keyword-as-name.txt | 1 + 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 sourcepawn/compiler/tests/fail-object-keyword-as-name.sp create mode 100644 sourcepawn/compiler/tests/fail-object-keyword-as-name.txt diff --git a/sourcepawn/compiler/sc1.c b/sourcepawn/compiler/sc1.c index 941319a7f2..1389ace332 100644 --- a/sourcepawn/compiler/sc1.c +++ b/sourcepawn/compiler/sc1.c @@ -3265,12 +3265,18 @@ static int parse_old_decl(declinfo_t *decl, int flags) strcpy(decl->name, "__unknown__"); } else { if (!lexpeek(tSYMBOL)) { + extern char *sc_tokens[]; switch (lextok(&tok)) { case tOBJECT: case tCHAR: case tVOID: case tINT: - error(143); + if (lexpeek(tSYMBOL)) { + error(143); + } else { + error(157, sc_tokens[tok.id - tFIRST]); + strcpy(decl->name, sc_tokens[tok.id - tFIRST]); + } break; default: lexpush(); @@ -3279,7 +3285,7 @@ static int parse_old_decl(declinfo_t *decl, int flags) } if (expecttoken(tSYMBOL, &tok)) strcpy(decl->name, tok.str); - else + else if (decl->name[0] == '\0') strcpy(decl->name, "__unknown__"); } } diff --git a/sourcepawn/compiler/sc5.scp b/sourcepawn/compiler/sc5.scp index c1c9c514d0..dacdb08d97 100644 --- a/sourcepawn/compiler/sc5.scp +++ b/sourcepawn/compiler/sc5.scp @@ -200,6 +200,7 @@ static char *errmsg[] = { /*154*/ "cannot assign INVALID_FUNCTION to a non-function type\n", /*155*/ "expected newline, but found '%s'\n", /*156*/ "the 'any' type is not allowed in new-style natives\n", +/*157*/ "'%s' is a reserved keyword\n", #else "\315e\306\230\266k\217:\235\276bu\201fo\220\204\223\012", "\202l\224\251s\205g\346\356e\233\201(\243\315\215\267\202) \253 f\255low ea\305 \042c\353e\042\012", diff --git a/sourcepawn/compiler/tests/fail-object-keyword-as-name.sp b/sourcepawn/compiler/tests/fail-object-keyword-as-name.sp new file mode 100644 index 0000000000..756c2a69a7 --- /dev/null +++ b/sourcepawn/compiler/tests/fail-object-keyword-as-name.sp @@ -0,0 +1,5 @@ +public Action:SomeEvent( Handle:event, const String:name[], bool:dontBroadcast) +{ + // error 143: new-style declarations should not have "new" + new object = GetEventInt(event, "object"); +} diff --git a/sourcepawn/compiler/tests/fail-object-keyword-as-name.txt b/sourcepawn/compiler/tests/fail-object-keyword-as-name.txt new file mode 100644 index 0000000000..ed27092686 --- /dev/null +++ b/sourcepawn/compiler/tests/fail-object-keyword-as-name.txt @@ -0,0 +1 @@ +(4) : error 157: 'object' is a reserved keyword