diff options
author | Joseph Myers <joseph@codesourcery.com> | 2005-11-03 23:08:18 +0000 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2005-11-03 23:08:18 +0000 |
commit | 178b58b59e18dcb713ef8ed45f79ffa072c617a5 (patch) | |
tree | 4d26b7322a593e1c409570f2ca4e99dccb8dc759 /gcc/cp | |
parent | b0ae01d7f9e4c7e93097856926facb7ce9505f1d (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 3 | ||||
-rw-r--r-- | gcc/cp/error.c | 33 | ||||
-rw-r--r-- | gcc/cp/parser.c | 5 |
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; } |