diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2009-04-22 15:32:18 +0000 |
---|---|---|
committer | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2009-04-22 15:32:18 +0000 |
commit | cfc935327585254eabd5c18f298b1b4bc28a2b02 (patch) | |
tree | 51e37b610f5f0eae957aa2a3cee06eec9ab65abb /gcc | |
parent | 8632d02a43457ecbcef85175e7575e5da6784646 (diff) | |
download | gcc-cfc935327585254eabd5c18f298b1b4bc28a2b02.zip gcc-cfc935327585254eabd5c18f298b1b4bc28a2b02.tar.gz gcc-cfc935327585254eabd5c18f298b1b4bc28a2b02.tar.bz2 |
re PR c++/14875 (When using 'or' keyword, the error message speaks of a '||' token)
2009-04-22 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/14875
* c-common.c (c_parse_error): Take a token_flags parameter.
Use token_type for the token type instead.
Pass token_flags to cpp_type2name.
* c-common.h (c_parse_error): Update declaration.
* c-parser.c (c_parser_error): Pass 0 as token flags.
libcpp/
* lex.c (cpp_type2name): Take a flags parameter. Call
cpp_named_operator2name for named operators and cpp_digraph2name
for digraphs.
(cpp_digraph2name): New.
(cpp_spell_token): Use it.
(cpp_output_token): Likewise.
* include/cpplib.h (cpp_type2name): Update declaration.
* init.c (cpp_named_operator2name): New.
* internal.h (cpp_named_operator2name): Declare.
cp/
* parser.c (cp_parser_error): Pass token->flags to c_parse_error.
testsuite/
* g++.dg/parse/parser-pr14875.C: New.
* g++.dg/parse/parser-pr14875-2.C: New.
* g++.dg/parse/error6.C: Update match string.
From-SVN: r146589
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/c-common.c | 31 | ||||
-rw-r--r-- | gcc/c-common.h | 2 | ||||
-rw-r--r-- | gcc/c-parser.c | 6 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/parser.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/error6.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/parser-pr14875-2.C | 31 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/parser-pr14875.C | 20 |
10 files changed, 98 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1745a36..f037097 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-04-22 Manuel Lopez-Ibanez <manu@gcc.gnu.org> + + PR c++/14875 + * c-common.c (c_parse_error): Take a token_flags parameter. + Use token_type for the token type instead. + Pass token_flags to cpp_type2name. + * c-common.h (c_parse_error): Update declaration. + * c-parser.c (c_parser_error): Pass 0 as token flags. + 2009-04-22 Andrey Belevantsev <abel@ispras.ru> PR rtl-optimization/39580 diff --git a/gcc/c-common.c b/gcc/c-common.c index 3595e55..67fe8ad 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -8167,21 +8167,24 @@ catenate_strings (const char *lhs, const char *rhs_start, int rhs_size) TOKEN, which had the associated VALUE. */ void -c_parse_error (const char *gmsgid, enum cpp_ttype token, tree value) +c_parse_error (const char *gmsgid, enum cpp_ttype token_type, + tree value, unsigned char token_flags) { #define catenate_messages(M1, M2) catenate_strings ((M1), (M2), sizeof (M2)) char *message = NULL; - if (token == CPP_EOF) + if (token_type == CPP_EOF) message = catenate_messages (gmsgid, " at end of input"); - else if (token == CPP_CHAR || token == CPP_WCHAR || token == CPP_CHAR16 - || token == CPP_CHAR32) + else if (token_type == CPP_CHAR + || token_type == CPP_WCHAR + || token_type == CPP_CHAR16 + || token_type == CPP_CHAR32) { unsigned int val = TREE_INT_CST_LOW (value); const char *prefix; - switch (token) + switch (token_type) { default: prefix = ""; @@ -8206,26 +8209,28 @@ c_parse_error (const char *gmsgid, enum cpp_ttype token, tree value) free (message); message = NULL; } - else if (token == CPP_STRING || token == CPP_WSTRING || token == CPP_STRING16 - || token == CPP_STRING32) + else if (token_type == CPP_STRING + || token_type == CPP_WSTRING + || token_type == CPP_STRING16 + || token_type == CPP_STRING32) message = catenate_messages (gmsgid, " before string constant"); - else if (token == CPP_NUMBER) + else if (token_type == CPP_NUMBER) message = catenate_messages (gmsgid, " before numeric constant"); - else if (token == CPP_NAME) + else if (token_type == CPP_NAME) { message = catenate_messages (gmsgid, " before %qE"); error (message, value); free (message); message = NULL; } - else if (token == CPP_PRAGMA) + else if (token_type == CPP_PRAGMA) message = catenate_messages (gmsgid, " before %<#pragma%>"); - else if (token == CPP_PRAGMA_EOL) + else if (token_type == CPP_PRAGMA_EOL) message = catenate_messages (gmsgid, " before end of line"); - else if (token < N_TTYPES) + else if (token_type < N_TTYPES) { message = catenate_messages (gmsgid, " before %qs token"); - error (message, cpp_type2name (token)); + error (message, cpp_type2name (token_type, token_flags)); free (message); message = NULL; } diff --git a/gcc/c-common.h b/gcc/c-common.h index a46da6b..ec47a02 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -1029,7 +1029,7 @@ extern void builtin_define_std (const char *macro); extern void builtin_define_with_value (const char *, const char *, int); extern void c_stddef_cpp_builtins (void); extern void fe_file_change (const struct line_map *); -extern void c_parse_error (const char *, enum cpp_ttype, tree); +extern void c_parse_error (const char *, enum cpp_ttype, tree, unsigned char); /* Objective-C / Objective-C++ entry points. */ diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 676c709..ed77098 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -573,7 +573,11 @@ c_parser_error (c_parser *parser, const char *gmsgid) CPP_KEYWORD, keywords are treated like identifiers. */ (token->type == CPP_KEYWORD ? CPP_NAME : token->type), - token->value); + /* ??? The C parser does not save the cpp flags of a + token, we need to pass 0 here and we will not get + the source spelling of some tokens but rather the + canonical spelling. */ + token->value, /*flags=*/0); } /* If the next token is of the indicated TYPE, consume it. Otherwise, diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 99c7826..1b67ad8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2009-04-22 Manuel Lopez-Ibanez <manu@gcc.gnu.org> + + PR c++/14875 + * parser.c (cp_parser_error): Pass token->flags to c_parse_error. + 2009-04-21 Manuel Lopez-Ibanez <manu@gcc.gnu.org> PR c++/35711 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index b6b8bf5..fbf211b 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2091,7 +2091,7 @@ cp_parser_error (cp_parser* parser, const char* message) CPP_KEYWORD, keywords are treated like identifiers. */ (token->type == CPP_KEYWORD ? CPP_NAME : token->type), - token->u.value); + token->u.value, token->flags); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6fa530d..386ce8c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2009-04-22 Manuel Lopez-Ibanez <manu@gcc.gnu.org> + + PR c++/14875 + * g++.dg/parse/parser-pr14875.C: New. + * g++.dg/parse/parser-pr14875-2.C: New. + * g++.dg/parse/error6.C: Update match string. + 2009-04-22 Richard Guenther <rguenther@suse.de> PR tree-optimization/39845 diff --git a/gcc/testsuite/g++.dg/parse/error6.C b/gcc/testsuite/g++.dg/parse/error6.C index 81e04e2..8b8424f 100644 --- a/gcc/testsuite/g++.dg/parse/error6.C +++ b/gcc/testsuite/g++.dg/parse/error6.C @@ -5,7 +5,7 @@ int f(int not) { return 1-not; } -// { dg-error "11:expected ',' or '...' before '!' token" "" { target *-*-* } 4 } +// { dg-error "11:expected ',' or '...' before 'not' token" "" { target *-*-* } 4 } // { dg-error "15:expected primary\\-expression before ';' token" "" { target *-*-* } 5 } diff --git a/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C b/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C new file mode 100644 index 0000000..3510aac --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C @@ -0,0 +1,31 @@ +// PR 14875: When using 'or' keyword, the error message speaks of a '||' token +// { dg-do compile } +// { dg-options "" } +#define CHECK(x) void ::x + CHECK (and); // { dg-error "before .and. token" } + CHECK (and_eq); // { dg-error "before .and_eq. token" } + CHECK (bitand); // { dg-error "before .bitand. token" } + CHECK (bitor); // { dg-error "before .bitor. token" } + CHECK (compl); // { dg-error "before .compl. token" } + CHECK (not); // { dg-error "before .not. token" } + CHECK (not_eq); // { dg-error "before .not_eq. token" } + CHECK (or); // { dg-error "before .or. token" } + CHECK (or_eq); // { dg-error "before .or_eq. token" } + CHECK (xor); // { dg-error "before .xor. token" } + CHECK (xor_eq); // { dg-error "before .xor_eq. token" } +#undef CHECK +#define CHECK(x) int x + CHECK (<:); // { dg-error "before .<:. token" } + CHECK (:>); // { dg-error "before .:>. token" } +#undef CHECK +#define CHECK(x) x + CHECK (<%); // { dg-error "before .<%. token" } +#undef CHECK +#define CHECK(x) x x + CHECK (%>); // { dg-error "before .%>. token" } +#undef CHECK +#define CHECK(x) x + CHECK (%:); // { dg-error "stray .%:. " } + CHECK (%:%:); // { dg-error "stray .%:%:. " } + + diff --git a/gcc/testsuite/g++.dg/parse/parser-pr14875.C b/gcc/testsuite/g++.dg/parse/parser-pr14875.C new file mode 100644 index 0000000..7a6f061 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parser-pr14875.C @@ -0,0 +1,20 @@ +// PR 14875: When using 'or' keyword, the error message speaks of a '||' token +// { dg-do compile } +// { dg-options "" } +using namespace std; + +class Sample +{ + +public: + Sample(); + void or(long Digital); // { dg-error "before .or. token" } +}; + +Sample::Sample() +{ +} + +void Sample::or(long Digital) // { dg-error "before .or. token" } +{ +} |