aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2009-04-22 15:32:18 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2009-04-22 15:32:18 +0000
commitcfc935327585254eabd5c18f298b1b4bc28a2b02 (patch)
tree51e37b610f5f0eae957aa2a3cee06eec9ab65abb /gcc
parent8632d02a43457ecbcef85175e7575e5da6784646 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/c-common.c31
-rw-r--r--gcc/c-common.h2
-rw-r--r--gcc/c-parser.c6
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parser.c2
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/parse/error6.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/parser-pr14875-2.C31
-rw-r--r--gcc/testsuite/g++.dg/parse/parser-pr14875.C20
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" }
+{
+}