aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2005-11-03 23:08:18 +0000
committerJoseph Myers <jsm28@gcc.gnu.org>2005-11-03 23:08:18 +0000
commit178b58b59e18dcb713ef8ed45f79ffa072c617a5 (patch)
tree4d26b7322a593e1c409570f2ca4e99dccb8dc759 /gcc/cp
parentb0ae01d7f9e4c7e93097856926facb7ce9505f1d (diff)
downloadgcc-178b58b59e18dcb713ef8ed45f79ffa072c617a5.zip
gcc-178b58b59e18dcb713ef8ed45f79ffa072c617a5.tar.gz
gcc-178b58b59e18dcb713ef8ed45f79ffa072c617a5.tar.bz2
re PR c++/17964 (cpp error messages contain wrong line in C++)
gcc: PR c++/17964 * diagnostic.c (diagnostic_set_info_translated): New function. (diagnostic_set_info): Use it. Add comment. * diagnostic.h (diagnostic_set_info_translated): Declare. gcc/cp: * error.c (cp_cpp_error): New function. * cp-tree.h (cp_cpp_error): Declare. * parser.c (cp_lexer_new_main): Set CPP option client_diagnostic and error callback after lexing. gcc/testsuite: * g++.dg/cpp/string-1.C: New test. libcpp: * include/cpplib.h (struct cpp_options): Add client_diagnostic. (struct cpp_callbacks): Add error. * errors.c (cpp_error): If client_diagnostic, use error callback. * charset.c (convert_escape): Don't use %03o in diagnostic. From-SVN: r106454
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/cp-tree.h3
-rw-r--r--gcc/cp/error.c33
-rw-r--r--gcc/cp/parser.c5
4 files changed, 49 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 625413b..5d281d3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2005-11-03 Joseph S. Myers <joseph@codesourcery.com>
+
+ PR c++/17964
+ * error.c (cp_cpp_error): New function.
+ * cp-tree.h (cp_cpp_error): Declare.
+ * parser.c (cp_lexer_new_main): Set CPP option client_diagnostic
+ and error callback after lexing.
+
2005-11-03 Mark Mitchell <mark@codesourcery.com>
PR c++/21627
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 97cc064..e1ca9f3 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -4437,5 +4437,8 @@ extern void cp_genericize (tree);
#else
#define ATTRIBUTE_GCC_CXXDIAG(m, n) ATTRIBUTE_NONNULL(m)
#endif
+extern void cp_cpp_error (cpp_reader *, int,
+ const char *, va_list)
+ ATTRIBUTE_GCC_CXXDIAG(3,0);
#endif /* ! GCC_CP_TREE_H */
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 8e39cca..d5144b4 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -2327,3 +2327,36 @@ cp_printer (pretty_printer *pp, text_info *text, const char *spec,
#undef next_lang
#undef next_int
}
+
+/* Callback from cpp_error for PFILE to print diagnostics arising from
+ interpreting strings. The diagnostic is of type LEVEL; MSG is the
+ translated message and AP the arguments. */
+
+void
+cp_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level,
+ const char *msg, va_list ap)
+{
+ diagnostic_info diagnostic;
+ diagnostic_t dlevel;
+ switch (level)
+ {
+ case CPP_DL_WARNING:
+ case CPP_DL_WARNING_SYSHDR:
+ dlevel = DK_WARNING;
+ break;
+ case CPP_DL_PEDWARN:
+ dlevel = pedantic_error_kind ();
+ break;
+ case CPP_DL_ERROR:
+ dlevel = DK_ERROR;
+ break;
+ case CPP_DL_ICE:
+ dlevel = DK_ICE;
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ diagnostic_set_info_translated (&diagnostic, msg, &ap,
+ input_location, dlevel);
+ report_diagnostic (&diagnostic);
+}
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 9821981..bbc5c11 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -297,6 +297,11 @@ cp_lexer_new_main (void)
string constant concatenation. */
c_lex_return_raw_strings = false;
+ /* Subsequent preprocessor diagnostics should use compiler
+ diagnostic functions to get the compiler source location. */
+ cpp_get_options (parse_in)->client_diagnostic = true;
+ cpp_get_callbacks (parse_in)->error = cp_cpp_error;
+
gcc_assert (lexer->next_token->type != CPP_PURGED);
return lexer;
}