diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-10-12 10:44:17 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2024-10-12 10:50:41 +0200 |
commit | c397a8c12296b75a91ae51e4889debf023e6c338 (patch) | |
tree | 5d8aef26b2745084abfee7525e7304e4298aa9a7 /libcpp | |
parent | c20c9d8408f0ff4677acbd96f4803c191bd13ac6 (diff) | |
download | gcc-c397a8c12296b75a91ae51e4889debf023e6c338.zip gcc-c397a8c12296b75a91ae51e4889debf023e6c338.tar.gz gcc-c397a8c12296b75a91ae51e4889debf023e6c338.tar.bz2 |
libcpp, genmatch: Use gcc_diag instead of printf for libcpp diagnostics
When working on #embed support, or -Wheader-guard or other recent libcpp
changes, I've been annoyed by the libcpp diagnostics being visually
different from normal gcc diagnostics, especially in the area of quoting
stuff in the diagnostic messages.
Normall GCC diagnostics is gcc_diag/gcc_tdiag, one can use
%</%>, %qs etc. in there, while libcpp diagnostics was marked as printf
and in libcpp we've been very creative with quoting stuff, either
no quotes at all, or "something" quoting, or 'something' quoting, or
`something' quoting (but in none of the cases it used colors consistently
with the rest of the compiler).
Now, libcpp diagnostics is always emitted using a callback,
pfile->cb.diagnostic. On the gcc/ side, this callback is initialized with
genmatch.cc: cb->diagnostic = diagnostic_cb;
c-family/c-opts.cc: cb->diagnostic = c_cpp_diagnostic;
fortran/cpp.cc: cb->diagnostic = cb_cpp_diagnostic;
where the latter two just use diagnostic_report_diagnostic, so actually
support all the gcc_diag stuff, only the genmatch.cc case didn't.
So, the following patch changes genmatch.cc to use pp_format* instead
of vfprintf so that it supports the gcc_diag formatting (pretty-print.o
unfortunately has various dependencies, so had to link genmatch with
libcommon.a libbacktrace.a and tweak Makefile.in so that there are no
circular dependencies) and marks the libcpp diagnostic routines as
gcc_diag rather than printf. That change resulted in hundreds of
-Wformat-diag new warnings (most of them useful and resulting IMHO in
better diagnostics), so the rest of the patch is changing the format
strings to make -Wformat-diag happy and adjusting the testsuite for
the differences in how is the diagnostic reformatted.
Dunno if some out of GCC tree projects use libcpp, that case would
make it harder because one couldn't use vfprintf in the diagnostic
callback anymore, but there is always David's libdiagnostic which could
be used for that purpose IMHO.
2024-10-12 Jakub Jelinek <jakub@redhat.com>
libcpp/
* include/cpplib.h (ATTRIBUTE_CPP_PPDIAG): Define.
(struct cpp_callbacks): Use ATTRIBUTE_CPP_PPDIAG instead of
ATTRIBUTE_FPTR_PRINTF on diagnostic callback.
(cpp_error, cpp_warning, cpp_pedwarning, cpp_warning_syshdr): Use
ATTRIBUTE_CPP_PPDIAG (3, 4) instead of ATTRIBUTE_PRINTF_3.
(cpp_warning_at, cpp_pedwarning_at): Use ATTRIBUTE_CPP_PPDIAG (4, 5)
instead of ATTRIBUTE_PRINTF_4.
(cpp_error_with_line, cpp_warning_with_line, cpp_pedwarning_with_line,
cpp_warning_with_line_syshdr): Use ATTRIBUTE_CPP_PPDIAG (5, 6)
instead of ATTRIBUTE_PRINTF_5.
(cpp_error_at): Use ATTRIBUTE_CPP_PPDIAG (4, 5) instead of
ATTRIBUTE_PRINTF_4.
* Makefile.in (po/$(PACKAGE).pot): Use --language=GCC-source rather
than --language=c.
* errors.cc (cpp_diagnostic_at, cpp_diagnostic,
cpp_diagnostic_with_line): Use ATTRIBUTE_CPP_PPDIAG instead of
-ATTRIBUTE_FPTR_PRINTF.
* charset.cc (cpp_host_to_exec_charset, _cpp_valid_ucn, convert_hex,
convert_oct, convert_escape): Fix up -Wformat-diag warnings.
(cpp_interpret_string_ranges, count_source_chars): Use
ATTRIBUTE_CPP_PPDIAG instead of ATTRIBUTE_FPTR_PRINTF.
(narrow_str_to_charconst): Fix up -Wformat-diag warnings.
* directives.cc (check_eol_1, directive_diagnostics, lex_macro_node,
do_undef, glue_header_name, parse_include, do_include_common,
do_include_next, _cpp_parse_embed_params, do_embed, read_flag,
do_line, do_linemarker, register_pragma_1, do_pragma_once,
do_pragma_push_macro, do_pragma_pop_macro, do_pragma_poison,
do_pragma_system_header, do_pragma_warning_or_error, _cpp_do__Pragma,
do_else, do_elif, do_endif, parse_answer, do_assert,
cpp_define_unused): Likewise.
* expr.cc (cpp_classify_number, parse_defined, eval_token,
_cpp_parse_expr, reduce, check_promotion): Likewise.
* files.cc (_cpp_find_file, finish_base64_embed,
_cpp_pop_file_buffer): Likewise.
* init.cc (sanity_checks): Likewise.
* lex.cc (_cpp_process_line_notes, maybe_warn_bidi_on_char,
_cpp_warn_invalid_utf8, _cpp_skip_block_comment,
warn_about_normalization, forms_identifier_p, maybe_va_opt_error,
identifier_diagnostics_on_lex, cpp_maybe_module_directive): Likewise.
* macro.cc (class vaopt_state, builtin_has_include_1,
builtin_has_include, builtin_has_embed, _cpp_warn_if_unused_macro,
_cpp_builtin_macro_text, builtin_macro, stringify_arg,
_cpp_arguments_ok, collect_args, enter_macro_context,
_cpp_save_parameter, parse_params, create_iso_definition,
_cpp_create_definition, check_trad_stringification): Likewise.
* pch.cc (cpp_valid_state): Likewise.
* traditional.cc (_cpp_scan_out_logical_line, recursive_macro):
Likewise.
gcc/
* Makefile.in (generated_files): Remove {gimple,generic}-match*.
(generated_match_files): New variable. Add a dependency of
$(filter-out $(OBJS-libcommon),$(ALL_HOST_OBJS)) files on those.
(build/genmatch$(build_exeext)): Depend on and link against
libcommon.a and $(LIBBACKTRACE).
* genmatch.cc: Include pretty-print.h and input.h.
(ggc_internal_cleared_alloc, ggc_free): Remove.
(fatal): New function.
(line_table): Remove.
(linemap_client_expand_location_to_spelling_point): Remove.
(diagnostic_cb): Use gcc_diag rather than printf format. Use
pp_format_verbatim on a temporary pretty_printer instead of
vfprintf.
(fatal_at, warning_at): Use gcc_diag rather than printf format.
(output_line_directive): Rename location_hash to loc_hash.
(parser::eat_ident, parser::parse_operation, parser::parse_expr,
parser::parse_pattern, parser::finish_match_operand): Fix up
-Wformat-diag warnings.
gcc/c-family/
* c-lex.cc (c_common_has_attribute,
c_common_lex_availability_macro): Fix up -Wformat-diag warnings.
gcc/testsuite/
* c-c++-common/cpp/counter-2.c: Adjust expected diagnostics for
libcpp diagnostic formatting changes.
* c-c++-common/cpp/embed-3.c: Likewise.
* c-c++-common/cpp/embed-4.c: Likewise.
* c-c++-common/cpp/embed-16.c: Likewise.
* c-c++-common/cpp/embed-18.c: Likewise.
* c-c++-common/cpp/eof-2.c: Likewise.
* c-c++-common/cpp/eof-3.c: Likewise.
* c-c++-common/cpp/fmax-include-depth.c: Likewise.
* c-c++-common/cpp/has-builtin.c: Likewise.
* c-c++-common/cpp/line-2.c: Likewise.
* c-c++-common/cpp/line-3.c: Likewise.
* c-c++-common/cpp/macro-arg-count-1.c: Likewise.
* c-c++-common/cpp/macro-arg-count-2.c: Likewise.
* c-c++-common/cpp/macro-ranges.c: Likewise.
* c-c++-common/cpp/named-universal-char-escape-4.c: Likewise.
* c-c++-common/cpp/named-universal-char-escape-5.c: Likewise.
* c-c++-common/cpp/pr88974.c: Likewise.
* c-c++-common/cpp/va-opt-error.c: Likewise.
* c-c++-common/cpp/va-opt-pedantic.c: Likewise.
* c-c++-common/cpp/Wheader-guard-2.c: Likewise.
* c-c++-common/cpp/Wheader-guard-3.c: Likewise.
* c-c++-common/cpp/Winvalid-utf8-1.c: Likewise.
* c-c++-common/cpp/Winvalid-utf8-2.c: Likewise.
* c-c++-common/cpp/Winvalid-utf8-3.c: Likewise.
* c-c++-common/diagnostic-format-sarif-file-bad-utf8-pr109098-1.c:
Likewise.
* c-c++-common/diagnostic-format-sarif-file-bad-utf8-pr109098-3.c:
Likewise.
* c-c++-common/pr68833-3.c: Likewise.
* c-c++-common/raw-string-directive-1.c: Likewise.
* gcc.dg/analyzer/named-constants-Wunused-macros.c: Likewise.
* gcc.dg/binary-constants-4.c: Likewise.
* gcc.dg/builtin-redefine.c: Likewise.
* gcc.dg/cpp/19951025-1.c: Likewise.
* gcc.dg/cpp/c11-warning-1.c: Likewise.
* gcc.dg/cpp/c11-warning-2.c: Likewise.
* gcc.dg/cpp/c11-warning-3.c: Likewise.
* gcc.dg/cpp/c23-elifdef-2.c: Likewise.
* gcc.dg/cpp/c23-warning-2.c: Likewise.
* gcc.dg/cpp/embed-2.c: Likewise.
* gcc.dg/cpp/embed-3.c: Likewise.
* gcc.dg/cpp/embed-4.c: Likewise.
* gcc.dg/cpp/expr.c: Likewise.
* gcc.dg/cpp/gnu11-elifdef-2.c: Likewise.
* gcc.dg/cpp/gnu11-elifdef-3.c: Likewise.
* gcc.dg/cpp/gnu11-elifdef-4.c: Likewise.
* gcc.dg/cpp/gnu11-warning-1.c: Likewise.
* gcc.dg/cpp/gnu11-warning-2.c: Likewise.
* gcc.dg/cpp/gnu11-warning-3.c: Likewise.
* gcc.dg/cpp/gnu23-warning-2.c: Likewise.
* gcc.dg/cpp/include6.c: Likewise.
* gcc.dg/cpp/pr35322.c: Likewise.
* gcc.dg/cpp/tr-warn6.c: Likewise.
* gcc.dg/cpp/undef2.c: Likewise.
* gcc.dg/cpp/warn-comments.c: Likewise.
* gcc.dg/cpp/warn-comments-2.c: Likewise.
* gcc.dg/cpp/warn-comments-3.c: Likewise.
* gcc.dg/cpp/warn-cxx-compat.c: Likewise.
* gcc.dg/cpp/warn-cxx-compat-2.c: Likewise.
* gcc.dg/cpp/warn-deprecated.c: Likewise.
* gcc.dg/cpp/warn-deprecated-2.c: Likewise.
* gcc.dg/cpp/warn-long-long.c: Likewise.
* gcc.dg/cpp/warn-long-long-2.c: Likewise.
* gcc.dg/cpp/warn-normalized-1.c: Likewise.
* gcc.dg/cpp/warn-normalized-2.c: Likewise.
* gcc.dg/cpp/warn-normalized-3.c: Likewise.
* gcc.dg/cpp/warn-normalized-4-bytes.c: Likewise.
* gcc.dg/cpp/warn-normalized-4-unicode.c: Likewise.
* gcc.dg/cpp/warn-redefined.c: Likewise.
* gcc.dg/cpp/warn-redefined-2.c: Likewise.
* gcc.dg/cpp/warn-traditional.c: Likewise.
* gcc.dg/cpp/warn-traditional-2.c: Likewise.
* gcc.dg/cpp/warn-trigraphs-1.c: Likewise.
* gcc.dg/cpp/warn-trigraphs-2.c: Likewise.
* gcc.dg/cpp/warn-trigraphs-3.c: Likewise.
* gcc.dg/cpp/warn-trigraphs-4.c: Likewise.
* gcc.dg/cpp/warn-undef.c: Likewise.
* gcc.dg/cpp/warn-undef-2.c: Likewise.
* gcc.dg/cpp/warn-unused-macros.c: Likewise.
* gcc.dg/cpp/warn-unused-macros-2.c: Likewise.
* gcc.dg/pch/counter-2.c: Likewise.
* g++.dg/cpp0x/udlit-error1.C: Likewise.
* g++.dg/cpp23/named-universal-char-escape1.C: Likewise.
* g++.dg/cpp23/named-universal-char-escape2.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-1.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-2.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-3.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-4.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-5.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-6.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-7.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-8.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-9.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-10.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-11.C: Likewise.
* g++.dg/cpp23/Winvalid-utf8-12.C: Likewise.
* g++.dg/cpp/elifdef-3.C: Likewise.
* g++.dg/cpp/elifdef-5.C: Likewise.
* g++.dg/cpp/elifdef-6.C: Likewise.
* g++.dg/cpp/elifdef-7.C: Likewise.
* g++.dg/cpp/embed-1.C: Likewise.
* g++.dg/cpp/embed-2.C: Likewise.
* g++.dg/cpp/pedantic-errors.C: Likewise.
* g++.dg/cpp/warning-1.C: Likewise.
* g++.dg/cpp/warning-2.C: Likewise.
* g++.dg/ext/bitint1.C: Likewise.
* g++.dg/ext/bitint2.C: Likewise.
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/Makefile.in | 2 | ||||
-rw-r--r-- | libcpp/charset.cc | 56 | ||||
-rw-r--r-- | libcpp/directives.cc | 151 | ||||
-rw-r--r-- | libcpp/errors.cc | 6 | ||||
-rw-r--r-- | libcpp/expr.cc | 75 | ||||
-rw-r--r-- | libcpp/files.cc | 15 | ||||
-rw-r--r-- | libcpp/include/cpplib.h | 33 | ||||
-rw-r--r-- | libcpp/init.cc | 11 | ||||
-rw-r--r-- | libcpp/lex.cc | 52 | ||||
-rw-r--r-- | libcpp/macro.cc | 80 | ||||
-rw-r--r-- | libcpp/pch.cc | 18 | ||||
-rw-r--r-- | libcpp/traditional.cc | 4 |
12 files changed, 263 insertions, 240 deletions
diff --git a/libcpp/Makefile.in b/libcpp/Makefile.in index 7e47153..eff0dd6 100644 --- a/libcpp/Makefile.in +++ b/libcpp/Makefile.in @@ -263,7 +263,7 @@ po/$(PACKAGE).pot: $(libcpp_a_SOURCES) --keyword=SYNTAX_ERROR --keyword=SYNTAX_ERROR2 \ --copyright-holder="Free Software Foundation, Inc." \ --msgid-bugs-address="https://gcc.gnu.org/bugs/" \ - --language=c -o po/$(PACKAGE).pot.tmp $^ + --language=GCC-source -o po/$(PACKAGE).pot.tmp $^ sed 's:$(srcdir)/::g' <po/$(PACKAGE).pot.tmp >po/$(PACKAGE).pot rm po/$(PACKAGE).pot.tmp diff --git a/libcpp/charset.cc b/libcpp/charset.cc index 32b6fd5..c7d4508 100644 --- a/libcpp/charset.cc +++ b/libcpp/charset.cc @@ -867,8 +867,8 @@ cpp_host_to_exec_charset (cpp_reader *pfile, cppchar_t c) if (c > LAST_POSSIBLY_BASIC_SOURCE_CHAR) { cpp_error (pfile, CPP_DL_ICE, - "character 0x%lx is not in the basic source character set\n", - (unsigned long)c); + "character 0x%lx is not in the basic source character set", + (unsigned long) c); return 0; } @@ -1550,10 +1550,10 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, else if (CPP_OPTION (pfile, cpp_warn_c90_c99_compat) > 0 && !CPP_OPTION (pfile, cplusplus)) cpp_error (pfile, CPP_DL_WARNING, - "C99's universal character names are incompatible with C90"); + "C99%'s universal character names are incompatible with C90"); else if (CPP_WTRADITIONAL (pfile) && identifier_pos == 0) cpp_warning (pfile, CPP_W_TRADITIONAL, - "the meaning of '\\%c' is different in traditional C", + "the meaning of %<\\%c%> is different in traditional C", (int) str[-1]); result = 0; @@ -1592,7 +1592,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, *cp = 0; return false; } - cpp_error (pfile, CPP_DL_ERROR, "'\\N' not followed by '{'"); + cpp_error (pfile, CPP_DL_ERROR, "%<\\N%> not followed by %<{%>"); } else { @@ -1656,13 +1656,13 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, && (!CPP_OPTION (pfile, delimited_escape_seqs) || !strict)) ret = cpp_warning (pfile, CPP_W_UNICODE, - "\\N{%.*s} is not a valid " + "%<\\N{%.*s}%> is not a valid " "universal character; treating it " "as separate tokens", (int) (str - name), name); else cpp_error (pfile, CPP_DL_ERROR, - "\\N{%.*s} is not a valid universal " + "%<\\N{%.*s}%> is not a valid universal " "character", (int) (str - name), name); /* Try to do a loose name lookup according to @@ -1672,7 +1672,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, str - name, canon_name); if (result != (cppchar_t) -1 && ret) cpp_error (pfile, CPP_DL_NOTE, - "did you mean \\N{%s}?", canon_name); + "did you mean %<\\N{%s}%>?", canon_name); else result = 0xC0; if (identifier_pos @@ -1690,7 +1690,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, else if (identifier_pos) { cpp_warning (pfile, CPP_W_UNICODE, - "'\\N{' not terminated with '}' after %.*s; " + "%<\\N{%> not terminated with %<}%> after %.*s; " "treating it as separate tokens", (int) (str - base), base); *cp = 0; @@ -1699,7 +1699,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, else { cpp_error (pfile, CPP_DL_ERROR, - "'\\N{' not terminated with '}' after %.*s", + "%<\\N{%> not terminated with %<}%> after %.*s", (int) (str - base), base); result = 1; } @@ -1707,7 +1707,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, } else { - cpp_error (pfile, CPP_DL_ICE, "In _cpp_valid_ucn but not a UCN"); + cpp_error (pfile, CPP_DL_ICE, "in %<_cpp_valid_ucn%> but not a UCN"); length = 4; } @@ -1775,7 +1775,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, { if (delimited) cpp_warning (pfile, CPP_W_UNICODE, - "'\\u{' not terminated with '}' after %.*s; " + "%<\\u{%> not terminated with %<}%> after %.*s; " "treating it as separate tokens", (int) (str - base), base); *cp = 0; @@ -1791,7 +1791,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, (int) (str - base), base); else cpp_error (pfile, CPP_DL_ERROR, - "'\\u{' not terminated with '}' after %.*s", + "%<\\u{%> not terminated with %<}%> after %.*s", (int) (str - base), base); result = 1; } @@ -1821,7 +1821,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, if (CPP_OPTION (pfile, warn_dollars) && !pfile->state.skipping) { CPP_OPTION (pfile, warn_dollars) = 0; - cpp_error (pfile, CPP_DL_PEDWARN, "'$' in identifier or number"); + cpp_error (pfile, CPP_DL_PEDWARN, "%<$%> in identifier or number"); } NORMALIZE_STATE_UPDATE_IDNUM (nst, result); } @@ -2096,7 +2096,7 @@ convert_hex (cpp_reader *pfile, const uchar *from, const uchar *limit, if (CPP_WTRADITIONAL (pfile)) cpp_warning (pfile, CPP_W_TRADITIONAL, - "the meaning of '\\x' is different in traditional C"); + "the meaning of %<\\x%> is different in traditional C"); /* Skip 'x'. */ from++; @@ -2144,13 +2144,13 @@ convert_hex (cpp_reader *pfile, const uchar *from, const uchar *limit, if (!digits_found) { cpp_error (pfile, CPP_DL_ERROR, - "\\x used with no following hex digits"); + "%<\\x%> used with no following hex digits"); return from; } else if (delimited) { cpp_error (pfile, CPP_DL_ERROR, - "'\\x{' not terminated with '}' after %.*s", + "%<\\x{%> not terminated with %<}%> after %.*s", (int) (from - base), base); return from; } @@ -2201,7 +2201,7 @@ convert_oct (cpp_reader *pfile, const uchar *from, const uchar *limit, from++; extend_char_range (&char_range, loc_reader); if (from == limit || *from != '{') - cpp_error (pfile, CPP_DL_ERROR, "'\\o' not followed by '{'"); + cpp_error (pfile, CPP_DL_ERROR, "%<\\o%> not followed by %<}%>"); else { from++; @@ -2247,7 +2247,7 @@ convert_oct (cpp_reader *pfile, const uchar *from, const uchar *limit, else { cpp_error (pfile, CPP_DL_ERROR, - "'\\o{' not terminated with '}' after %.*s", + "%<\\o{%> not terminated with %<}%> after %.*s", (int) (from - base), base); return from; } @@ -2309,7 +2309,7 @@ convert_escape (cpp_reader *pfile, const uchar *from, const uchar *limit, if (uneval) cpp_pedwarning (pfile, CPP_W_PEDANTIC, "numeric escape sequence in unevaluated string: " - "'\\%c'", (int) c); + "%<\\%c%>", (int) c); return convert_hex (pfile, from, limit, tbuf, cvt, char_range, loc_reader, ranges); @@ -2319,7 +2319,7 @@ convert_escape (cpp_reader *pfile, const uchar *from, const uchar *limit, if (uneval) cpp_pedwarning (pfile, CPP_W_PEDANTIC, "numeric escape sequence in unevaluated string: " - "'\\%c'", (int) c); + "%<\\%c%>", (int) c); return convert_oct (pfile, from, limit, tbuf, cvt, char_range, loc_reader, ranges); @@ -2346,13 +2346,13 @@ convert_escape (cpp_reader *pfile, const uchar *from, const uchar *limit, case 'a': if (CPP_WTRADITIONAL (pfile)) cpp_warning (pfile, CPP_W_TRADITIONAL, - "the meaning of '\\a' is different in traditional C"); + "the meaning of %<\\a%> is different in traditional C"); c = charconsts[0]; break; case 'e': case 'E': cpp_pedwarning (pfile, CPP_W_PEDANTIC, - "non-ISO-standard escape sequence, '\\%c'", (int) c); + "non-ISO-standard escape sequence, %<\\%c%>", (int) c); c = charconsts[2]; break; @@ -2360,7 +2360,7 @@ convert_escape (cpp_reader *pfile, const uchar *from, const uchar *limit, unknown: if (ISGRAPH (c)) cpp_error (pfile, CPP_DL_PEDWARN, - "unknown escape sequence: '\\%c'", (int) c); + "unknown escape sequence: %<\\%c%>", (int) c); else { encoding_rich_location rich_loc (pfile); @@ -2370,7 +2370,7 @@ convert_escape (cpp_reader *pfile, const uchar *from, const uchar *limit, char buf[32]; sprintf(buf, "%03o", (int) c); cpp_error_at (pfile, CPP_DL_PEDWARN, &rich_loc, - "unknown escape sequence: '\\%s'", buf); + "unknown escape sequence: %<\\%s%>", buf); } } @@ -2655,7 +2655,7 @@ cpp_interpret_string_ranges (cpp_reader *pfile, const cpp_string *from, bool (*saved_diagnostic_handler) (cpp_reader *, enum cpp_diagnostic_level, enum cpp_warning_reason, rich_location *, const char *, va_list *) - ATTRIBUTE_FPTR_PRINTF(5,0); + ATTRIBUTE_CPP_PPDIAG (5, 0); saved_diagnostic_handler = pfile->cb.diagnostic; pfile->cb.diagnostic = noop_diagnostic_cb; @@ -2704,7 +2704,7 @@ count_source_chars (cpp_reader *pfile, cpp_string str, cpp_ttype type) bool (*saved_diagnostic_handler) (cpp_reader *, enum cpp_diagnostic_level, enum cpp_warning_reason, rich_location *, const char *, va_list *) - ATTRIBUTE_FPTR_PRINTF(5,0); + ATTRIBUTE_CPP_PPDIAG (5, 0); saved_diagnostic_handler = pfile->cb.diagnostic; pfile->cb.diagnostic = noop_diagnostic_cb; convert_f save_func = pfile->narrow_cset_desc.func; @@ -2803,7 +2803,7 @@ narrow_str_to_charconst (cpp_reader *pfile, cpp_string str, if (type != CPP_UTF8CHAR) cpp_error (pfile, CPP_DL_WARNING, "multi-character literal with %ld characters exceeds " - "'int' size of %ld bytes", (long) i, (long) max_chars); + "%<int%> size of %ld bytes", (long) i, (long) max_chars); else if (src_chars > 2) cpp_error (pfile, CPP_DL_ERROR, "multi-character literal cannot have an encoding prefix"); diff --git a/libcpp/directives.cc b/libcpp/directives.cc index 9c906b3..50fa8ace2 100644 --- a/libcpp/directives.cc +++ b/libcpp/directives.cc @@ -239,7 +239,7 @@ check_eol_1 (cpp_reader *pfile, bool expand, enum cpp_warning_reason reason) if (! SEEN_EOL () && (expand ? cpp_get_token (pfile) : _cpp_lex_token (pfile))->type != CPP_EOF) - cpp_pedwarning (pfile, reason, "extra tokens at end of #%s directive", + cpp_pedwarning (pfile, reason, "extra tokens at end of %<#%s%> directive", pfile->directive->name); } @@ -391,8 +391,8 @@ directive_diagnostics (cpp_reader *pfile, const directive *dir, int indented) if (dir->origin == EXTENSION && !(dir == &dtable[T_IMPORT] && CPP_OPTION (pfile, objc))) warned - = cpp_pedwarning (pfile, CPP_W_PEDANTIC, "#%s is a GCC extension", - dir->name); + = cpp_pedwarning (pfile, CPP_W_PEDANTIC, + "%<#%s%> is a GCC extension", dir->name); if (!warned && dir == &dtable[T_WARNING]) { if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, warning_directive)) @@ -400,18 +400,18 @@ directive_diagnostics (cpp_reader *pfile, const directive *dir, int indented) if (CPP_OPTION (pfile, cplusplus)) warned = cpp_pedwarning (pfile, CPP_W_CXX23_EXTENSIONS, - "#%s before C++23 is a GCC extension", + "%<#%s%> before C++23 is a GCC extension", dir->name); else warned = cpp_pedwarning (pfile, CPP_W_PEDANTIC, - "#%s before C23 is a GCC extension", + "%<#%s%> before C23 is a GCC extension", dir->name); } if (!warned && CPP_OPTION (pfile, cpp_warn_c11_c23_compat) > 0) warned = cpp_warning (pfile, CPP_W_C11_C23_COMPAT, - "#%s before C23 is a GCC extension", + "%<#%s%> before C23 is a GCC extension", dir->name); } @@ -419,7 +419,7 @@ directive_diagnostics (cpp_reader *pfile, const directive *dir, int indented) || (dir == &dtable[T_IMPORT] && !CPP_OPTION (pfile, objc))) && !warned) cpp_warning (pfile, CPP_W_DEPRECATED, - "#%s is a deprecated GCC extension", dir->name); + "%<#%s%> is a deprecated GCC extension", dir->name); } /* Traditionally, a directive is ignored unless its # is in @@ -432,15 +432,15 @@ directive_diagnostics (cpp_reader *pfile, const directive *dir, int indented) { if (dir == &dtable[T_ELIF]) cpp_warning (pfile, CPP_W_TRADITIONAL, - "suggest not using #elif in traditional C"); + "suggest not using %<#elif%> in traditional C"); else if (indented && dir->origin == KANDR) cpp_warning (pfile, CPP_W_TRADITIONAL, - "traditional C ignores #%s with the # indented", + "traditional C ignores %<#%s%> with the %<#%> indented", dir->name); else if (!indented && dir->origin != KANDR) cpp_warning (pfile, CPP_W_TRADITIONAL, - "suggest hiding #%s from traditional C with an indented #", - dir->name); + "suggest hiding %<#%s%> from traditional C with an " + "indented %<#%>", dir->name); } } @@ -652,17 +652,17 @@ lex_macro_node (cpp_reader *pfile, bool is_def_or_undef) if (is_def_or_undef && node == pfile->spec_nodes.n_defined) cpp_error (pfile, CPP_DL_ERROR, - "\"%s\" cannot be used as a macro name", + "%qs cannot be used as a macro name", NODE_NAME (node)); else if (! (node->flags & NODE_POISONED)) return node; } else if (token->flags & NAMED_OP) cpp_error (pfile, CPP_DL_ERROR, - "\"%s\" cannot be used as a macro name as it is an operator in C++", - NODE_NAME (token->val.node.node)); + "%qs cannot be used as a macro name as it is an operator " + "in C++", NODE_NAME (token->val.node.node)); else if (token->type == CPP_EOF) - cpp_error (pfile, CPP_DL_ERROR, "no macro name given in #%s directive", + cpp_error (pfile, CPP_DL_ERROR, "no macro name given in %<#%s%> directive", pfile->directive->name); else cpp_error (pfile, CPP_DL_ERROR, "macro names must be identifiers"); @@ -739,11 +739,11 @@ do_undef (cpp_reader *pfile) { if (node->flags & NODE_WARN) cpp_error (pfile, CPP_DL_WARNING, - "undefining \"%s\"", NODE_NAME (node)); + "undefining %qs", NODE_NAME (node)); else if (cpp_builtin_macro_p (node) && CPP_OPTION (pfile, warn_builtin_macro_redefined)) cpp_warning (pfile, CPP_W_BUILTIN_MACRO_REDEFINED, - "undefining \"%s\"", NODE_NAME (node)); + "undefining %qs", NODE_NAME (node)); if (node->value.macro && CPP_OPTION (pfile, warn_unused_macros)) @@ -800,7 +800,8 @@ glue_header_name (cpp_reader *pfile) break; if (token->type == CPP_EOF) { - cpp_error (pfile, CPP_DL_ERROR, "missing terminating > character"); + cpp_error (pfile, CPP_DL_ERROR, + "missing terminating %<>%> character"); break; } @@ -856,11 +857,11 @@ parse_include (cpp_reader *pfile, int *pangle_brackets, const unsigned char *dir; if (pfile->directive == &dtable[T_PRAGMA]) - dir = UC"pragma dependency"; + dir = UC"pragma GCC dependency"; else dir = pfile->directive->name; - cpp_error (pfile, CPP_DL_ERROR, "#%s expects \"FILENAME\" or <FILENAME>", - dir); + cpp_error (pfile, CPP_DL_ERROR, + "%<#%s%> expects %<\"FILENAME\"%> or %<<FILENAME>%>", dir); return NULL; } @@ -915,8 +916,8 @@ do_include_common (cpp_reader *pfile, enum include_type type) if (pfile->line_table->depth >= CPP_OPTION (pfile, max_include_depth)) cpp_error (pfile, CPP_DL_ERROR, - "#include nested depth %u exceeds maximum of %u" - " (use -fmax-include-depth=DEPTH to increase the maximum)", + "%<#include%> nested depth %u exceeds maximum of %u" + " (use %<-fmax-include-depth=DEPTH%> to increase the maximum)", pfile->line_table->depth, CPP_OPTION (pfile, max_include_depth)); else @@ -960,7 +961,7 @@ do_include_next (cpp_reader *pfile) if (_cpp_in_main_source_file (pfile)) { cpp_error (pfile, CPP_DL_WARNING, - "#include_next in primary source file"); + "%<#include_next%> in primary source file"); type = IT_INCLUDE; } do_include_common (pfile, type); @@ -1115,7 +1116,7 @@ _cpp_parse_embed_params (cpp_reader *pfile, struct cpp_embed_params *params) { if (params->has_embed) { - cpp_error (pfile, CPP_DL_ERROR, "expected ')'"); + cpp_error (pfile, CPP_DL_ERROR, "expected %<)%>"); return false; } } @@ -1132,8 +1133,9 @@ _cpp_parse_embed_params (cpp_reader *pfile, struct cpp_embed_params *params) if (!params->has_embed) cpp_error_with_line (pfile, CPP_DL_ERROR, params->base64.base_run.base->src_loc, 0, - "'gnu::base64' parameter conflicts with " - "'limit' or 'gnu::offset' parameters"); + "%<gnu::base64%> parameter conflicts " + "with %<limit%> or %<gnu::offset%> " + "parameters"); } else if (params->base64.count == 0 && CPP_OPTION (pfile, preprocessed)) @@ -1141,7 +1143,7 @@ _cpp_parse_embed_params (cpp_reader *pfile, struct cpp_embed_params *params) ret = false; if (!params->has_embed) cpp_error_with_line (pfile, CPP_DL_ERROR, params->loc, 0, - "'gnu::base64' parameter required in " + "%<gnu::base64%> parameter required in " "preprocessed source"); } return ret; @@ -1162,7 +1164,7 @@ _cpp_parse_embed_params (cpp_reader *pfile, struct cpp_embed_params *params) token = _cpp_get_token_no_padding (pfile); if (token->type != CPP_COLON) { - cpp_error (pfile, CPP_DL_ERROR, "expected ':'"); + cpp_error (pfile, CPP_DL_ERROR, "expected %<:%>"); return false; } token = _cpp_get_token_no_padding (pfile); @@ -1250,7 +1252,7 @@ _cpp_parse_embed_params (cpp_reader *pfile, struct cpp_embed_params *params) } if (param_kind != (size_t) -1 && token->type != CPP_OPEN_PAREN) cpp_error_with_line (pfile, CPP_DL_ERROR, loc, 0, - "expected '('"); + "expected %<(%>"); else if (param_kind == EMBED_PARAM_LIMIT || param_kind == EMBED_PARAM_GNU_OFFSET) { @@ -1263,7 +1265,7 @@ _cpp_parse_embed_params (cpp_reader *pfile, struct cpp_embed_params *params) { if (res > INTTYPE_MAXIMUM (off_t)) cpp_error_with_line (pfile, CPP_DL_ERROR, loc, 0, - "too large 'gnu::offset' argument"); + "too large %<gnu::offset%> argument"); else params->offset = res; } @@ -1305,7 +1307,7 @@ _cpp_parse_embed_params (cpp_reader *pfile, struct cpp_embed_params *params) while (token->type == CPP_STRING); if (token->type != CPP_CLOSE_PAREN) cpp_error_with_line (pfile, CPP_DL_ERROR, token->src_loc, 0, - "expected ')'"); + "expected %<)%>"); } else { @@ -1355,7 +1357,7 @@ do_embed (cpp_reader *pfile) if (CPP_OPTION (pfile, traditional)) { cpp_error (pfile, CPP_DL_ERROR, /* FIXME should be DL_SORRY */ - "#embed not supported in traditional C"); + "%<#embed%> not supported in traditional C"); skip_rest_of_line (pfile); goto done; } @@ -1364,10 +1366,10 @@ do_embed (cpp_reader *pfile) { if (CPP_OPTION (pfile, cplusplus)) cpp_error (pfile, CPP_DL_PEDWARN, - "#%s is a GCC extension", "embed"); + "%<#%s%> is a GCC extension", "embed"); else cpp_error (pfile, CPP_DL_PEDWARN, - "#%s before C23 is a GCC extension", "embed"); + "%<#%s%> before C23 is a GCC extension", "embed"); } fname = parse_include (pfile, &angle_brackets, NULL, ¶ms.loc); @@ -1425,7 +1427,7 @@ read_flag (cpp_reader *pfile, unsigned int last) } if (token->type != CPP_EOF) - cpp_error (pfile, CPP_DL_ERROR, "invalid flag \"%s\" in line directive", + cpp_error (pfile, CPP_DL_ERROR, "invalid flag %qs in line directive", cpp_token_as_text (pfile, token)); return 0; } @@ -1492,10 +1494,11 @@ do_line (cpp_reader *pfile) &new_lineno, &wrapped)) { if (token->type == CPP_EOF) - cpp_error (pfile, CPP_DL_ERROR, "unexpected end of file after #line"); + cpp_error (pfile, CPP_DL_ERROR, + "unexpected end of file after %<#line%>"); else cpp_error (pfile, CPP_DL_ERROR, - "\"%s\" after #line is not a positive integer", + "%qs after %<#line%> is not a positive integer", cpp_token_as_text (pfile, token)); return; } @@ -1517,7 +1520,7 @@ do_line (cpp_reader *pfile) } else if (token->type != CPP_EOF) { - cpp_error (pfile, CPP_DL_ERROR, "\"%s\" is not a valid filename", + cpp_error (pfile, CPP_DL_ERROR, "%qs is not a valid filename", cpp_token_as_text (pfile, token)); return; } @@ -1558,7 +1561,7 @@ do_linemarker (cpp_reader *pfile) /* Unlike #line, there does not seem to be a way to get an EOF here. So, it should be safe to always spell the token. */ cpp_error (pfile, CPP_DL_ERROR, - "\"%s\" after # is not a positive integer", + "%qs after %<#%> is not a positive integer", cpp_token_as_text (pfile, token)); return; } @@ -1598,7 +1601,7 @@ do_linemarker (cpp_reader *pfile) } else if (token->type != CPP_EOF) { - cpp_error (pfile, CPP_DL_ERROR, "\"%s\" is not a valid filename", + cpp_error (pfile, CPP_DL_ERROR, "%qs is not a valid filename", cpp_token_as_text (pfile, token)); return; } @@ -1625,7 +1628,7 @@ do_linemarker (cpp_reader *pfile) if (!from) { cpp_warning (pfile, CPP_W_NONE, - "file \"%s\" linemarker ignored due to " + "file %qs linemarker ignored due to " "incorrect nesting", new_file); return; } @@ -1794,7 +1797,7 @@ register_pragma_1 (cpp_reader *pfile, const char *space, const char *name, else if (entry->allow_expansion != allow_name_expansion) { cpp_error (pfile, CPP_DL_ICE, - "registering pragmas in namespace \"%s\" with mismatched " + "registering pragmas in namespace %qs with mismatched " "name expansion", space); return NULL; } @@ -1803,7 +1806,7 @@ register_pragma_1 (cpp_reader *pfile, const char *space, const char *name, else if (allow_name_expansion) { cpp_error (pfile, CPP_DL_ICE, - "registering pragma \"%s\" with name expansion " + "registering pragma %qs with name expansion " "and no namespace", name); return NULL; } @@ -1821,13 +1824,14 @@ register_pragma_1 (cpp_reader *pfile, const char *space, const char *name, if (entry->is_nspace) clash: cpp_error (pfile, CPP_DL_ICE, - "registering \"%s\" as both a pragma and a pragma namespace", + "registering %qs as both a pragma and a pragma namespace", NODE_NAME (node)); else if (space) - cpp_error (pfile, CPP_DL_ICE, "#pragma %s %s is already registered", + cpp_error (pfile, CPP_DL_ICE, "%<#pragma %s %s%> is already registered", space, name); else - cpp_error (pfile, CPP_DL_ICE, "#pragma %s is already registered", name); + cpp_error (pfile, CPP_DL_ICE, "%<#pragma %s%> is already registered", + name); return NULL; } @@ -2075,7 +2079,7 @@ do_pragma_once (cpp_reader *pfile) { if (_cpp_in_main_source_file (pfile)) cpp_warning (pfile, CPP_W_PRAGMA_ONCE_OUTSIDE_HEADER, - "'#pragma once' in main file"); + "%<#pragma once%> in main file"); check_eol (pfile, false); _cpp_mark_file_once_only (pfile, pfile->buffer->file); @@ -2098,7 +2102,7 @@ do_pragma_push_macro (cpp_reader *pfile) { location_t src_loc = pfile->cur_token[-1].src_loc; cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0, - "invalid #pragma push_macro directive"); + "invalid %<#pragma push_macro%> directive"); check_eol (pfile, false); skip_rest_of_line (pfile); return; @@ -2155,7 +2159,7 @@ do_pragma_pop_macro (cpp_reader *pfile) { location_t src_loc = pfile->cur_token[-1].src_loc; cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0, - "invalid #pragma pop_macro directive"); + "invalid %<#pragma pop_macro%> directive"); check_eol (pfile, false); skip_rest_of_line (pfile); return; @@ -2210,7 +2214,7 @@ do_pragma_poison (cpp_reader *pfile) if (tok->type != CPP_NAME) { cpp_error (pfile, CPP_DL_ERROR, - "invalid #pragma GCC poison directive"); + "invalid %<#pragma GCC poison%> directive"); break; } @@ -2219,7 +2223,7 @@ do_pragma_poison (cpp_reader *pfile) continue; if (cpp_macro_p (hp)) - cpp_error (pfile, CPP_DL_WARNING, "poisoning existing macro \"%s\"", + cpp_error (pfile, CPP_DL_WARNING, "poisoning existing macro %qs", NODE_NAME (hp)); _cpp_free_definition (hp); hp->flags |= NODE_POISONED | NODE_DIAGNOSTIC; @@ -2241,7 +2245,7 @@ do_pragma_system_header (cpp_reader *pfile) { if (_cpp_in_main_source_file (pfile)) cpp_error (pfile, CPP_DL_WARNING, - "#pragma system_header ignored outside include file"); + "%<#pragma system_header%> ignored outside include file"); else { check_eol (pfile, false); @@ -2294,7 +2298,7 @@ do_pragma_warning_or_error (cpp_reader *pfile, bool error) CPP_STRING) || str.len == 0) { - cpp_error (pfile, CPP_DL_ERROR, "invalid \"#pragma GCC %s\" directive", + cpp_error (pfile, CPP_DL_ERROR, "invalid %<#pragma GCC %s%> directive", error ? "error" : "warning"); return; } @@ -2502,7 +2506,7 @@ _cpp_do__Pragma (cpp_reader *pfile, location_t expansion_loc) return 1; } cpp_error (pfile, CPP_DL_ERROR, - "_Pragma takes a parenthesized string literal"); + "%<_Pragma%> takes a parenthesized string literal"); return 0; } @@ -2585,12 +2589,12 @@ do_else (cpp_reader *pfile) struct if_stack *ifs = buffer->if_stack; if (ifs == NULL) - cpp_error (pfile, CPP_DL_ERROR, "#else without #if"); + cpp_error (pfile, CPP_DL_ERROR, "%<#else%> without %<#if%>"); else { if (ifs->type == T_ELSE) { - cpp_error (pfile, CPP_DL_ERROR, "#else after #else"); + cpp_error (pfile, CPP_DL_ERROR, "%<#else%> after %<#else%>"); cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0, "the conditional began here"); } @@ -2618,12 +2622,13 @@ do_elif (cpp_reader *pfile) struct if_stack *ifs = buffer->if_stack; if (ifs == NULL) - cpp_error (pfile, CPP_DL_ERROR, "#%s without #if", pfile->directive->name); + cpp_error (pfile, CPP_DL_ERROR, "%<#%s%> without %<#if%>", + pfile->directive->name); else { if (ifs->type == T_ELSE) { - cpp_error (pfile, CPP_DL_ERROR, "#%s after #else", + cpp_error (pfile, CPP_DL_ERROR, "%<#%s%> after %<#else%>", pfile->directive->name); cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0, "the conditional began here"); @@ -2646,11 +2651,11 @@ do_elif (cpp_reader *pfile) { if (CPP_OPTION (pfile, cplusplus)) cpp_pedwarning (pfile, CPP_W_CXX23_EXTENSIONS, - "#%s before C++23 is a GCC extension", + "%<#%s%> before C++23 is a GCC extension", pfile->directive->name); else cpp_pedwarning (pfile, CPP_W_PEDANTIC, - "#%s before C23 is a GCC extension", + "%<#%s%> before C23 is a GCC extension", pfile->directive->name); } pfile->state.skipping = 1; @@ -2685,11 +2690,13 @@ do_elif (cpp_reader *pfile) { if (CPP_OPTION (pfile, cplusplus)) cpp_pedwarning (pfile, CPP_W_CXX23_EXTENSIONS, - "#%s before C++23 is a GCC extension", + "%<#%s%> before C++23 is a GCC " + "extension", pfile->directive->name); else cpp_pedwarning (pfile, CPP_W_PEDANTIC, - "#%s before C23 is a GCC extension", + "%<#%s%> before C23 is a GCC " + "extension", pfile->directive->name); } pfile->state.skipping = skip; @@ -2725,7 +2732,7 @@ do_endif (cpp_reader *pfile) struct if_stack *ifs = buffer->if_stack; if (ifs == NULL) - cpp_error (pfile, CPP_DL_ERROR, "#endif without #if"); + cpp_error (pfile, CPP_DL_ERROR, "%<#endif%> without %<#if%>"); else { /* Only check EOL if was not originally skipping. */ @@ -2810,7 +2817,7 @@ parse_answer (cpp_reader *pfile, int type, location_t pred_loc, return true; cpp_error_with_line (pfile, CPP_DL_ERROR, pred_loc, 0, - "missing '(' after predicate"); + "missing %<(%> after predicate"); return false; } @@ -2828,7 +2835,7 @@ parse_answer (cpp_reader *pfile, int type, location_t pred_loc, if (token->type == CPP_EOF) { - cpp_error (pfile, CPP_DL_ERROR, "missing ')' to complete answer"); + cpp_error (pfile, CPP_DL_ERROR, "missing %<)%> to complete answer"); return false; } @@ -2840,7 +2847,7 @@ parse_answer (cpp_reader *pfile, int type, location_t pred_loc, if (!count) { - cpp_error (pfile, CPP_DL_ERROR, "predicate's answer is empty"); + cpp_error (pfile, CPP_DL_ERROR, "predicate%'s answer is empty"); return false; } @@ -2955,7 +2962,7 @@ do_assert (cpp_reader *pfile) is not a duplicate. */ if (*find_answer (node, answer)) { - cpp_error (pfile, CPP_DL_WARNING, "\"%s\" re-asserted", + cpp_error (pfile, CPP_DL_WARNING, "%qs re-asserted", NODE_NAME (node) + 1); return; } @@ -3038,10 +3045,10 @@ cpp_define (cpp_reader *pfile, const char *str) void cpp_define_unused (cpp_reader *pfile, const char *str) { - unsigned char warn_unused_macros = CPP_OPTION (pfile, warn_unused_macros); - CPP_OPTION (pfile, warn_unused_macros) = 0; - cpp_define (pfile, str); - CPP_OPTION (pfile, warn_unused_macros) = warn_unused_macros; + unsigned char warn_unused_macros = CPP_OPTION (pfile, warn_unused_macros); + CPP_OPTION (pfile, warn_unused_macros) = 0; + cpp_define (pfile, str); + CPP_OPTION (pfile, warn_unused_macros) = warn_unused_macros; } /* Use to build macros to be run through cpp_define() as diff --git a/libcpp/errors.cc b/libcpp/errors.cc index 295496d..5d8ceb9 100644 --- a/libcpp/errors.cc +++ b/libcpp/errors.cc @@ -54,7 +54,7 @@ cpp_diagnostic_get_current_location (cpp_reader *pfile) /* Print a diagnostic at the given location. */ -ATTRIBUTE_FPTR_PRINTF(5,0) +ATTRIBUTE_CPP_PPDIAG (5, 0) static bool cpp_diagnostic_at (cpp_reader * pfile, enum cpp_diagnostic_level level, enum cpp_warning_reason reason, rich_location *richloc, @@ -71,7 +71,7 @@ cpp_diagnostic_at (cpp_reader * pfile, enum cpp_diagnostic_level level, /* Print a diagnostic at the location of the previously lexed token. */ -ATTRIBUTE_FPTR_PRINTF(4,0) +ATTRIBUTE_CPP_PPDIAG (4, 0) static bool cpp_diagnostic (cpp_reader * pfile, enum cpp_diagnostic_level level, enum cpp_warning_reason reason, @@ -190,7 +190,7 @@ cpp_pedwarning_at (cpp_reader * pfile, enum cpp_warning_reason reason, /* Print a diagnostic at a specific location. */ -ATTRIBUTE_FPTR_PRINTF(6,0) +ATTRIBUTE_CPP_PPDIAG (6, 0) static bool cpp_diagnostic_with_line (cpp_reader * pfile, enum cpp_diagnostic_level level, enum cpp_warning_reason reason, diff --git a/libcpp/expr.cc b/libcpp/expr.cc index 089bf3e..b7772c9 100644 --- a/libcpp/expr.cc +++ b/libcpp/expr.cc @@ -678,10 +678,12 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, { if (radix == 2) SYNTAX_ERROR2_AT (virtual_location, - "invalid digit \"%c\" in binary constant", '0' + max_digit); + "invalid digit %<%c%> in binary constant", + '0' + max_digit); else SYNTAX_ERROR2_AT (virtual_location, - "invalid digit \"%c\" in octal constant", '0' + max_digit); + "invalid digit %<%c%> in octal constant", + '0' + max_digit); } if (float_flag != NOT_FLOAT) @@ -689,7 +691,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, if (radix == 2) { cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0, - "invalid prefix \"0b\" for floating constant"); + "invalid prefix %<0b%> for floating constant"); return CPP_N_INVALID; } @@ -751,8 +753,8 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, else { cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0, - "invalid suffix \"%.*s\" on floating constant", - (int) (limit - str), str); + "invalid suffix %<%.*s%> on floating " + "constant", (int) (limit - str), str); return CPP_N_INVALID; } } @@ -762,7 +764,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, && CPP_WTRADITIONAL (pfile) && ! cpp_sys_macro_p (pfile)) cpp_warning_with_line (pfile, CPP_W_TRADITIONAL, virtual_location, 0, - "traditional C rejects the \"%.*s\" suffix", + "traditional C rejects the %<%.*s%> suffix", (int) (limit - str), str); /* A suffix for double is a GCC extension via decimal float support. @@ -777,8 +779,8 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, if ((result & CPP_N_DFLOAT) && radix != 10) { cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0, - "invalid suffix \"%.*s\" with hexadecimal floating constant", - (int) (limit - str), str); + "invalid suffix %<%.*s%> with hexadecimal " + "floating constant", (int) (limit - str), str); return CPP_N_INVALID; } @@ -791,11 +793,12 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, if (!CPP_OPTION (pfile, dfp_constants)) cpp_pedwarning_with_line (pfile, CPP_W_PEDANTIC, virtual_location, 0, - "decimal float constants are a C23 feature"); + "decimal floating constants are a C23 feature"); else if (CPP_OPTION (pfile, cpp_warn_c11_c23_compat) > 0) cpp_warning_with_line (pfile, CPP_W_C11_C23_COMPAT, virtual_location, 0, - "decimal float constants are a C23 feature"); + "decimal floating constants are a C23 " + "feature"); } result |= CPP_N_FLOATING; @@ -814,8 +817,8 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, else { cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0, - "invalid suffix \"%.*s\" on integer constant", - (int) (limit - str), str); + "invalid suffix %<%.*s%> on integer " + "constant", (int) (limit - str), str); return CPP_N_INVALID; } } @@ -831,7 +834,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, if (u_or_i || large) cpp_warning_with_line (pfile, large ? CPP_W_LONG_LONG : CPP_W_TRADITIONAL, virtual_location, 0, - "traditional C rejects the \"%.*s\" suffix", + "traditional C rejects the %<%.*s%> suffix", (int) (limit - str), str); } @@ -853,9 +856,10 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, if ((result & CPP_N_SIZE_T) == CPP_N_SIZE_T && !CPP_OPTION (pfile, size_t_literals)) { - const char *message = (result & CPP_N_UNSIGNED) == CPP_N_UNSIGNED - ? N_("use of C++23 %<size_t%> integer constant") - : N_("use of C++23 %<make_signed_t<size_t>%> integer constant"); + const char *message + = (result & CPP_N_UNSIGNED) == CPP_N_UNSIGNED + ? N_("use of C++23 %<size_t%> integer constant") + : N_("use of C++23 %<make_signed_t<size_t>%> integer constant"); cpp_warning_with_line (pfile, CPP_W_SIZE_T_LITERALS, virtual_location, 0, message); } @@ -1118,7 +1122,7 @@ parse_defined (cpp_reader *pfile) cpp_context *initial_context = pfile->context; if (pfile->state.in_directive == 3) - cpp_error (pfile, CPP_DL_ERROR, "'defined' in #embed parameter"); + cpp_error (pfile, CPP_DL_ERROR, "%<defined%> in %<#embed%> parameter"); /* Don't expand macros. */ pfile->state.prevent_expansion++; @@ -1135,14 +1139,14 @@ parse_defined (cpp_reader *pfile) node = token->val.node.node; if (paren && cpp_get_token (pfile)->type != CPP_CLOSE_PAREN) { - cpp_error (pfile, CPP_DL_ERROR, "missing ')' after \"defined\""); + cpp_error (pfile, CPP_DL_ERROR, "missing %<)%> after %<defined%>"); node = 0; } } else { cpp_error (pfile, CPP_DL_ERROR, - "operator \"defined\" requires an identifier"); + "operator %<defined%> requires an identifier"); if (token->flags & NAMED_OP) { cpp_token op; @@ -1150,7 +1154,7 @@ parse_defined (cpp_reader *pfile) op.flags = 0; op.type = token->type; cpp_error (pfile, CPP_DL_ERROR, - "(\"%s\" is an alternative token for \"%s\" in C++)", + "(%qs is an alternative token for %qs in C++)", cpp_token_as_text (pfile, token), cpp_token_as_text (pfile, &op)); } @@ -1163,7 +1167,7 @@ parse_defined (cpp_reader *pfile) || initial_context != &pfile->base_context) && CPP_OPTION (pfile, warn_expansion_to_defined)) cpp_pedwarning (pfile, CPP_W_EXPANSION_TO_DEFINED, - "this use of \"defined\" may not be portable"); + "this use of %<defined%> may not be portable"); is_defined = _cpp_defined_macro_p (node); if (!_cpp_maybe_notify_macro_use (pfile, node, token->src_loc)) /* It wasn't a macro after all. */ @@ -1268,7 +1272,7 @@ eval_token (cpp_reader *pfile, const cpp_token *token, result.low = 0; if (CPP_OPTION (pfile, warn_undef) && !pfile->state.skip_eval) cpp_warning_with_line (pfile, CPP_W_UNDEF, virtual_location, 0, - "\"%s\" is not defined, evaluates to 0", + "%qs is not defined, evaluates to %<0%>", NODE_NAME (token->val.node.node)); } break; @@ -1431,7 +1435,7 @@ _cpp_parse_expr (cpp_reader *pfile, const char *dir, case CPP_HASH: if (!want_value) SYNTAX_ERROR2_AT (op.loc, - "missing binary operator before token \"%s\"", + "missing binary operator before token %qs", cpp_token_as_text (pfile, op.token)); want_value = false; top->value = eval_token (pfile, op.token, op.loc); @@ -1456,7 +1460,8 @@ _cpp_parse_expr (cpp_reader *pfile, const char *dir, default: if ((int) op.op <= (int) CPP_EQ || (int) op.op >= (int) CPP_PLUS_EQ) SYNTAX_ERROR2_AT (op.loc, - "token \"%s\" is not valid in preprocessor expressions", + "token %qs is not valid in preprocessor " + "expressions", cpp_token_as_text (pfile, op.token)); break; } @@ -1466,7 +1471,7 @@ _cpp_parse_expr (cpp_reader *pfile, const char *dir, { if (!want_value) SYNTAX_ERROR2_AT (op.loc, - "missing binary operator before token \"%s\"", + "missing binary operator before token %qs", cpp_token_as_text (pfile, op.token)); } else if (want_value) @@ -1475,7 +1480,7 @@ _cpp_parse_expr (cpp_reader *pfile, const char *dir, Try to emit a specific diagnostic. */ if (op.op == CPP_CLOSE_PAREN && top->op == CPP_OPEN_PAREN) SYNTAX_ERROR_AT (op.loc, - "missing expression between '(' and ')'"); + "missing expression between %<(%> and %<)%>"); if (op.op == CPP_EOF && top->op == CPP_EOF) SYNTAX_ERROR2_AT (op.loc, @@ -1483,13 +1488,13 @@ _cpp_parse_expr (cpp_reader *pfile, const char *dir, if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN) SYNTAX_ERROR2_AT (op.loc, - "operator '%s' has no right operand", + "operator %qs has no right operand", cpp_token_as_text (pfile, top->token)); else if (op.op == CPP_CLOSE_PAREN || op.op == CPP_EOF) /* Complain about missing paren during reduction. */; else SYNTAX_ERROR2_AT (op.loc, - "operator '%s' has no left operand", + "operator %qs has no left operand", cpp_token_as_text (pfile, op.token)); } @@ -1518,7 +1523,7 @@ _cpp_parse_expr (cpp_reader *pfile, const char *dir, case CPP_COLON: if (top->op != CPP_QUERY) SYNTAX_ERROR_AT (op.loc, - " ':' without preceding '?'"); + " %<:%> without preceding %<?%>"); if (!num_zerop (top[-1].value)) /* Was '?' condition true? */ pfile->state.skip_eval++; else @@ -1687,7 +1692,7 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op) { cpp_error_with_line (pfile, CPP_DL_ERROR, top->token->src_loc, - 0, "missing ')' in expression"); + 0, "missing %<)%> in expression"); return 0; } top--; @@ -1716,7 +1721,7 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op) /* COMMA and COLON should not reduce a QUERY operator. */ if (op == CPP_COMMA || op == CPP_COLON) return top; - cpp_error (pfile, CPP_DL_ERROR, "'?' without following ':'"); + cpp_error (pfile, CPP_DL_ERROR, "%<?%> without following %<:%>"); return 0; default: @@ -1731,7 +1736,7 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op) if (op == CPP_CLOSE_PAREN) { - cpp_error (pfile, CPP_DL_ERROR, "missing '(' in expression"); + cpp_error (pfile, CPP_DL_ERROR, "missing %<(%> in expression"); return 0; } @@ -1763,12 +1768,12 @@ check_promotion (cpp_reader *pfile, const struct op *op) { if (!num_positive (op[-1].value, CPP_OPTION (pfile, precision))) cpp_error_with_line (pfile, CPP_DL_WARNING, op[-1].loc, 0, - "the left operand of \"%s\" changes sign when promoted", - cpp_token_as_text (pfile, op->token)); + "the left operand of %qs changes sign when " + "promoted", cpp_token_as_text (pfile, op->token)); } else if (!num_positive (op->value, CPP_OPTION (pfile, precision))) cpp_error_with_line (pfile, CPP_DL_WARNING, op->loc, 0, - "the right operand of \"%s\" changes sign when promoted", + "the right operand of %qs changes sign when promoted", cpp_token_as_text (pfile, op->token)); } diff --git a/libcpp/files.cc b/libcpp/files.cc index 5f9fbc5..8f9a5a4 100644 --- a/libcpp/files.cc +++ b/libcpp/files.cc @@ -530,7 +530,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, /* Ensure we get no confusion between cached files and directories. */ if (start_dir == NULL) - cpp_error_at (pfile, CPP_DL_ICE, loc, "NULL directory in find_file"); + cpp_error_at (pfile, CPP_DL_ICE, loc, "NULL directory in %<find_file%>"); void **hash_slot = htab_find_slot_with_hash (pfile->file_hash, fname, @@ -607,7 +607,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, " but they were invalid"); if (!cpp_get_options (pfile)->warn_invalid_pch) cpp_error (pfile, CPP_DL_NOTE, - "use -Winvalid-pch for more information"); + "use %<-Winvalid-pch%> for more information"); } if (kind == _cpp_FFK_PRE_INCLUDE) @@ -1415,7 +1415,8 @@ finish_base64_embed (cpp_reader *pfile, const char *fname, bool angle, { if (!params->has_embed) cpp_error_at (pfile, CPP_DL_ERROR, params->loc, - "'gnu::base64' parameter can be only used with \".\""); + "%<gnu::base64%> parameter can be only used with " + "%<\".\"%>"); return 0; } tokenrun *cur_run = ¶ms->base64.base_run; @@ -1431,7 +1432,7 @@ finish_base64_embed (cpp_reader *pfile, const char *fname, bool angle, { fail: cpp_error_at (pfile, CPP_DL_ERROR, params->loc, - "'gnu::base64' argument not valid base64 " + "%<gnu::base64%> argument not valid base64 " "encoded string"); free (buf); return 0; @@ -2265,11 +2266,11 @@ _cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file, if (pfile->cb.get_suggestion (pfile, mi_cmacro, names) && cpp_warning_with_line (pfile, CPP_W_HEADER_GUARD, pfile->mi_loc, 0, - "header guard \"%s\" followed by " - "\"#define\" of a different macro", + "header guard %qs followed by " + "%<#define%> of a different macro", mi_cmacro)) cpp_error_at (pfile, CPP_DL_NOTE, pfile->mi_def_loc, - "\"%s\" is defined here; did you mean \"%s\"?", + "%qs is defined here; did you mean %qs?", mi_def_cmacro, mi_cmacro); } } diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index bff6601..e64c2b6 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -653,6 +653,13 @@ struct cpp_options cpp_main_search main_search : 8; }; +#if GCC_VERSION >= 3005 +#define ATTRIBUTE_CPP_PPDIAG(m, n) \ + __attribute__ ((__format__ (__gcc_diag__, m , n))) ATTRIBUTE_NONNULL(m) +#else +#define ATTRIBUTE_CPP_PPDIAG(m, n) ATTRIBUTE_NONNULL(m) +#endif + /* Diagnostic levels. To get a diagnostic without associating a position in the translation unit with it, use cpp_error_with_line with a line number of zero. */ @@ -760,7 +767,7 @@ struct cpp_callbacks enum cpp_warning_reason, rich_location *, const char *, va_list *) - ATTRIBUTE_FPTR_PRINTF(5,0); + ATTRIBUTE_CPP_PPDIAG (5,0); /* Callbacks for when a macro is expanded, or tested (whether defined or not at the time) in #ifdef, #ifndef or "defined". */ @@ -1357,24 +1364,24 @@ cpp_num cpp_num_sign_extend (cpp_num, size_t); /* Output a diagnostic of some kind. */ extern bool cpp_error (cpp_reader *, enum cpp_diagnostic_level, const char *msgid, ...) - ATTRIBUTE_PRINTF_3; + ATTRIBUTE_CPP_PPDIAG (3, 4); extern bool cpp_warning (cpp_reader *, enum cpp_warning_reason, const char *msgid, ...) - ATTRIBUTE_PRINTF_3; + ATTRIBUTE_CPP_PPDIAG (3, 4); extern bool cpp_pedwarning (cpp_reader *, enum cpp_warning_reason, const char *msgid, ...) - ATTRIBUTE_PRINTF_3; + ATTRIBUTE_CPP_PPDIAG (3, 4); extern bool cpp_warning_syshdr (cpp_reader *, enum cpp_warning_reason reason, const char *msgid, ...) - ATTRIBUTE_PRINTF_3; + ATTRIBUTE_CPP_PPDIAG (3, 4); /* As their counterparts above, but use RICHLOC. */ extern bool cpp_warning_at (cpp_reader *, enum cpp_warning_reason, rich_location *richloc, const char *msgid, ...) - ATTRIBUTE_PRINTF_4; + ATTRIBUTE_CPP_PPDIAG (4, 5); extern bool cpp_pedwarning_at (cpp_reader *, enum cpp_warning_reason, rich_location *richloc, const char *msgid, ...) - ATTRIBUTE_PRINTF_4; + ATTRIBUTE_CPP_PPDIAG (4, 5); /* Output a diagnostic with "MSGID: " preceding the error string of errno. No location is printed. */ @@ -1391,27 +1398,27 @@ extern bool cpp_errno_filename (cpp_reader *, enum cpp_diagnostic_level, extern bool cpp_error_with_line (cpp_reader *, enum cpp_diagnostic_level, location_t, unsigned, const char *msgid, ...) - ATTRIBUTE_PRINTF_5; + ATTRIBUTE_CPP_PPDIAG (5, 6); extern bool cpp_warning_with_line (cpp_reader *, enum cpp_warning_reason, location_t, unsigned, const char *msgid, ...) - ATTRIBUTE_PRINTF_5; + ATTRIBUTE_CPP_PPDIAG (5, 6); extern bool cpp_pedwarning_with_line (cpp_reader *, enum cpp_warning_reason, location_t, unsigned, const char *msgid, ...) - ATTRIBUTE_PRINTF_5; + ATTRIBUTE_CPP_PPDIAG (5, 6); extern bool cpp_warning_with_line_syshdr (cpp_reader *, enum cpp_warning_reason, location_t, unsigned, const char *msgid, ...) - ATTRIBUTE_PRINTF_5; + ATTRIBUTE_CPP_PPDIAG (5, 6); extern bool cpp_error_at (cpp_reader * pfile, enum cpp_diagnostic_level, location_t src_loc, const char *msgid, ...) - ATTRIBUTE_PRINTF_4; + ATTRIBUTE_CPP_PPDIAG (4, 5); extern bool cpp_error_at (cpp_reader * pfile, enum cpp_diagnostic_level, rich_location *richloc, const char *msgid, ...) - ATTRIBUTE_PRINTF_4; + ATTRIBUTE_CPP_PPDIAG (4, 5); /* In lex.cc */ extern int cpp_ideq (const cpp_token *, const char *); diff --git a/libcpp/init.cc b/libcpp/init.cc index 3e4a2bc..1cc62a4 100644 --- a/libcpp/init.cc +++ b/libcpp/init.cc @@ -663,7 +663,7 @@ static void sanity_checks (cpp_reader *pfile) type precisions made by cpplib. */ test--; if (test < 1) - cpp_error (pfile, CPP_DL_ICE, "cppchar_t must be an unsigned type"); + cpp_error (pfile, CPP_DL_ICE, "%<cppchar_t%> must be an unsigned type"); if (CPP_OPTION (pfile, precision) > max_precision) cpp_error (pfile, CPP_DL_ICE, @@ -674,18 +674,19 @@ static void sanity_checks (cpp_reader *pfile) if (CPP_OPTION (pfile, precision) < CPP_OPTION (pfile, int_precision)) cpp_error (pfile, CPP_DL_ICE, - "CPP arithmetic must be at least as precise as a target int"); + "CPP arithmetic must be at least as precise as a target " + "%<int%>"); if (CPP_OPTION (pfile, char_precision) < 8) - cpp_error (pfile, CPP_DL_ICE, "target char is less than 8 bits wide"); + cpp_error (pfile, CPP_DL_ICE, "target %<char%> is less than 8 bits wide"); if (CPP_OPTION (pfile, wchar_precision) < CPP_OPTION (pfile, char_precision)) cpp_error (pfile, CPP_DL_ICE, - "target wchar_t is narrower than target char"); + "target %<wchar_t%> is narrower than target %<char%>"); if (CPP_OPTION (pfile, int_precision) < CPP_OPTION (pfile, char_precision)) cpp_error (pfile, CPP_DL_ICE, - "target int is narrower than target char"); + "target %<int%> is narrower than target %<char%>"); /* This is assumed in eval_token() and could be fixed if necessary. */ if (sizeof (cppchar_t) > sizeof (cpp_num_part)) diff --git a/libcpp/lex.cc b/libcpp/lex.cc index 4025e5c..66ff6ce 100644 --- a/libcpp/lex.cc +++ b/libcpp/lex.cc @@ -1036,7 +1036,7 @@ _cpp_process_line_notes (cpp_reader *pfile, int in_comment) if (CPP_OPTION (pfile, trigraphs)) cpp_warning_with_line (pfile, CPP_W_TRIGRAPHS, pfile->line_table->highest_line, col, - "trigraph ??%c converted to %c", + "trigraph %<??%c%> converted to %<%c%>", note->type, (int) _cpp_trigraph_map[note->type]); else @@ -1044,7 +1044,7 @@ _cpp_process_line_notes (cpp_reader *pfile, int in_comment) cpp_warning_with_line (pfile, CPP_W_TRIGRAPHS, pfile->line_table->highest_line, col, - "trigraph ??%c ignored, use -trigraphs to enable", + "trigraph %<??%c%> ignored, use %<-trigraphs%> to enable", note->type); } } @@ -1577,7 +1577,7 @@ maybe_warn_bidi_on_char (cpp_reader *pfile, bidi::kind kind, rich_loc.add_range (bidi::current_ctx_loc ()); cpp_warning_at (pfile, CPP_W_BIDIRECTIONAL, &rich_loc, "UTF-8 vs UCN mismatch when closing " - "a context by \"%s\"", bidi::to_str (kind)); + "a context by %qs", bidi::to_str (kind)); } } else if (warn_bidi & bidirectional_any @@ -1585,11 +1585,11 @@ maybe_warn_bidi_on_char (cpp_reader *pfile, bidi::kind kind, { if (kind == bidi::kind::PDF || kind == bidi::kind::PDI) cpp_warning_at (pfile, CPP_W_BIDIRECTIONAL, &rich_loc, - "\"%s\" is closing an unopened context", + "%qs is closing an unopened context", bidi::to_str (kind)); else cpp_warning_at (pfile, CPP_W_BIDIRECTIONAL, &rich_loc, - "found problematic Unicode character \"%s\"", + "found problematic Unicode character %qs", bidi::to_str (kind)); } } @@ -1619,13 +1619,13 @@ _cpp_warn_invalid_utf8 (cpp_reader *pfile) cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line_table->highest_line, CPP_BUF_COL (buffer), - "invalid UTF-8 character <%x>", + "invalid UTF-8 character %<<%x>%>", cur[0]); else cpp_warning_with_line (pfile, CPP_W_INVALID_UTF8, pfile->line_table->highest_line, CPP_BUF_COL (buffer), - "invalid UTF-8 character <%x>", + "invalid UTF-8 character %<<%x>%>", cur[0]); return cur + 1; } @@ -1635,13 +1635,13 @@ _cpp_warn_invalid_utf8 (cpp_reader *pfile) cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line_table->highest_line, CPP_BUF_COL (buffer), - "invalid UTF-8 character <%x><%x>", + "invalid UTF-8 character %<<%x><%x>%>", cur[0], cur[1]); else cpp_warning_with_line (pfile, CPP_W_INVALID_UTF8, pfile->line_table->highest_line, CPP_BUF_COL (buffer), - "invalid UTF-8 character <%x><%x>", + "invalid UTF-8 character %<<%x><%x>%>", cur[0], cur[1]); return cur + 2; } @@ -1651,13 +1651,13 @@ _cpp_warn_invalid_utf8 (cpp_reader *pfile) cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line_table->highest_line, CPP_BUF_COL (buffer), - "invalid UTF-8 character <%x><%x><%x>", + "invalid UTF-8 character %<<%x><%x><%x>%>", cur[0], cur[1], cur[2]); else cpp_warning_with_line (pfile, CPP_W_INVALID_UTF8, pfile->line_table->highest_line, CPP_BUF_COL (buffer), - "invalid UTF-8 character <%x><%x><%x>", + "invalid UTF-8 character %<<%x><%x><%x>%>", cur[0], cur[1], cur[2]); return cur + 3; } @@ -1667,13 +1667,13 @@ _cpp_warn_invalid_utf8 (cpp_reader *pfile) cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line_table->highest_line, CPP_BUF_COL (buffer), - "invalid UTF-8 character <%x><%x><%x><%x>", + "invalid UTF-8 character %<<%x><%x><%x><%x>%>", cur[0], cur[1], cur[2], cur[3]); else cpp_warning_with_line (pfile, CPP_W_INVALID_UTF8, pfile->line_table->highest_line, CPP_BUF_COL (buffer), - "invalid UTF-8 character <%x><%x><%x><%x>", + "invalid UTF-8 character %<<%x><%x><%x><%x>%>", cur[0], cur[1], cur[2], cur[3]); return cur + 4; } @@ -1755,7 +1755,7 @@ _cpp_skip_block_comment (cpp_reader *pfile) cpp_warning_with_line (pfile, CPP_W_COMMENTS, pfile->line_table->highest_line, CPP_BUF_COL (buffer), - "\"/*\" within comment"); + "%</*%> within comment"); } } else if (c == '\n') @@ -1933,13 +1933,13 @@ warn_about_normalization (cpp_reader *pfile, sz = cpp_spell_token (pfile, token, buf, false) - buf; if (NORMALIZE_STATE_RESULT (s) == normalized_C) cpp_warning_at (pfile, CPP_W_NORMALIZE, &rich_loc, - "`%.*s' is not in NFKC", (int) sz, buf); + "%<%.*s%> is not in NFKC", (int) sz, buf); else if (identifier && CPP_OPTION (pfile, xid_identifiers)) cpp_pedwarning_at (pfile, CPP_W_NORMALIZE, &rich_loc, - "`%.*s' is not in NFC", (int) sz, buf); + "%<%.*s%> is not in NFC", (int) sz, buf); else cpp_warning_at (pfile, CPP_W_NORMALIZE, &rich_loc, - "`%.*s' is not in NFC", (int) sz, buf); + "%<%.*s%> is not in NFC", (int) sz, buf); free (buf); } } @@ -1966,7 +1966,7 @@ forms_identifier_p (cpp_reader *pfile, int first, if (CPP_OPTION (pfile, warn_dollars) && !pfile->state.skipping) { CPP_OPTION (pfile, warn_dollars) = 0; - cpp_error (pfile, CPP_DL_PEDWARN, "'$' in identifier or number"); + cpp_error (pfile, CPP_DL_PEDWARN, "%<$%> in identifier or number"); } return true; @@ -2028,10 +2028,10 @@ maybe_va_opt_error (cpp_reader *pfile) { if (CPP_OPTION (pfile, cplusplus)) cpp_pedwarning (pfile, CPP_W_CXX20_EXTENSIONS, - "__VA_OPT__ is not available until C++20"); + "%<__VA_OPT__%> is not available until C++20"); else cpp_pedwarning (pfile, CPP_W_PEDANTIC, - "__VA_OPT__ is not available until C23"); + "%<__VA_OPT__%> is not available until C23"); } } else if (!pfile->state.va_args_ok) @@ -2039,7 +2039,7 @@ maybe_va_opt_error (cpp_reader *pfile) /* __VA_OPT__ should only appear in the replacement list of a variadic macro. */ cpp_error (pfile, CPP_DL_PEDWARN, - "__VA_OPT__ can only appear in the expansion" + "%<__VA_OPT__%> can only appear in the expansion" " of a C++20 variadic macro"); } } @@ -2056,7 +2056,7 @@ identifier_diagnostics_on_lex (cpp_reader *pfile, cpp_hashnode *node) /* It is allowed to poison the same identifier twice. */ if ((node->flags & NODE_POISONED) && !pfile->state.poisoned_ok) { - cpp_error (pfile, CPP_DL_ERROR, "attempt to use poisoned \"%s\"", + cpp_error (pfile, CPP_DL_ERROR, "attempt to use poisoned %qs", NODE_NAME (node)); const auto data = (cpp_hashnode_extra *) ht_lookup (pfile->extra_hash_table, node->ident, HT_NO_INSERT); @@ -2071,11 +2071,11 @@ identifier_diagnostics_on_lex (cpp_reader *pfile, cpp_hashnode *node) { if (CPP_OPTION (pfile, cplusplus)) cpp_error (pfile, CPP_DL_PEDWARN, - "__VA_ARGS__ can only appear in the expansion" + "%<__VA_ARGS__%> can only appear in the expansion" " of a C++11 variadic macro"); else cpp_error (pfile, CPP_DL_PEDWARN, - "__VA_ARGS__ can only appear in the expansion" + "%<__VA_ARGS__%> can only appear in the expansion" " of a C99 variadic macro"); } @@ -2087,7 +2087,7 @@ identifier_diagnostics_on_lex (cpp_reader *pfile, cpp_hashnode *node) /* For -Wc++-compat, warn about use of C++ named operators. */ if (node->flags & NODE_WARN_OPERATOR) cpp_warning (pfile, CPP_W_CXX_OPERATOR_NAMES, - "identifier \"%s\" is a special operator name in C++", + "identifier %qs is a special operator name in C++", NODE_NAME (node)); } @@ -3485,7 +3485,7 @@ cpp_maybe_module_directive (cpp_reader *pfile, cpp_token *result) && _cpp_maybe_notify_macro_use (pfile, node, tok->src_loc) && !cpp_fun_like_macro_p (node)) cpp_error_with_line (pfile, CPP_DL_ERROR, tok->src_loc, 0, - "module control-line \"%s\" cannot be" + "module control-line %qs cannot be" " an object-like macro", NODE_NAME (node)); } diff --git a/libcpp/macro.cc b/libcpp/macro.cc index 2fb3861..f0dfc79 100644 --- a/libcpp/macro.cc +++ b/libcpp/macro.cc @@ -141,7 +141,7 @@ class vaopt_state { if (m_state > 0) { cpp_error_at (m_pfile, CPP_DL_ERROR, token->src_loc, - "__VA_OPT__ may not appear in a __VA_OPT__"); + "%<__VA_OPT__%> may not appear in a %<__VA_OPT__%>"); return ERROR; } ++m_state; @@ -154,7 +154,7 @@ class vaopt_state { if (token->type != CPP_OPEN_PAREN) { cpp_error_at (m_pfile, CPP_DL_ERROR, m_location, - "__VA_OPT__ must be followed by an " + "%<__VA_OPT__%> must be followed by an " "open parenthesis"); return ERROR; } @@ -232,7 +232,7 @@ class vaopt_state { { if (m_variadic && m_state != 0) cpp_error_at (m_pfile, CPP_DL_ERROR, m_location, - "unterminated __VA_OPT__"); + "unterminated %<__VA_OPT__%>"); return m_state == 0; } @@ -393,7 +393,7 @@ builtin_has_include_1 (cpp_reader *pfile, const char *name, bool *paren, { if (!pfile->state.in_directive) cpp_error (pfile, CPP_DL_ERROR, - "\"%s\" used outside of preprocessing directive", name); + "%qs used outside of preprocessing directive", name); pfile->state.angled_headers = true; const auto sav_padding = pfile->state.directive_wants_padding; @@ -404,7 +404,7 @@ builtin_has_include_1 (cpp_reader *pfile, const char *name, bool *paren, token = _cpp_get_token_no_padding (pfile); else cpp_error (pfile, CPP_DL_ERROR, - "missing '(' before \"%s\" operand", name); + "missing %<(%> before %qs operand", name); pfile->state.angled_headers = false; pfile->state.directive_wants_padding = sav_padding; @@ -422,7 +422,7 @@ builtin_has_include_1 (cpp_reader *pfile, const char *name, bool *paren, fname = _cpp_bracket_include (pfile); else cpp_error (pfile, CPP_DL_ERROR, - "operator \"%s\" requires a header-name", name); + "operator %qs requires a header-name", name); return fname; } @@ -451,7 +451,7 @@ builtin_has_include (cpp_reader *pfile, cpp_hashnode *op, bool has_next) if (paren && _cpp_get_token_no_padding (pfile)->type != CPP_CLOSE_PAREN) cpp_error (pfile, CPP_DL_ERROR, - "missing ')' after \"%s\" operand", NODE_NAME (op)); + "missing %<)%> after %qs operand", NODE_NAME (op)); return result; } @@ -496,7 +496,7 @@ builtin_has_embed (cpp_reader *pfile) if (!*fname) { cpp_error_with_line (pfile, CPP_DL_ERROR, params.loc, 0, - "empty filename in '%s'", "__has_embed"); + "empty filename in %qs", "__has_embed"); ok = false; } @@ -530,7 +530,7 @@ _cpp_warn_if_unused_macro (cpp_reader *pfile, cpp_hashnode *node, (linemap_lookup (pfile->line_table, macro->line)))) cpp_warning_with_line (pfile, CPP_W_UNUSED_MACROS, macro->line, 0, - "macro \"%s\" is not used", NODE_NAME (node)); + "macro %qs is not used", NODE_NAME (node)); } return 1; @@ -569,14 +569,14 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node, switch (node->value.builtin) { default: - cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro \"%s\"", + cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro %qs", NODE_NAME (node)); break; case BT_TIMESTAMP: { if (CPP_OPTION (pfile, warn_date_time)) - cpp_warning (pfile, CPP_W_DATE_TIME, "macro \"%s\" might prevent " + cpp_warning (pfile, CPP_W_DATE_TIME, "macro %qs might prevent " "reproducible builds", NODE_NAME (node)); cpp_buffer *pbuffer = cpp_get_buffer (pfile); @@ -684,7 +684,7 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node, case BT_DATE: case BT_TIME: if (CPP_OPTION (pfile, warn_date_time)) - cpp_warning (pfile, CPP_W_DATE_TIME, "macro \"%s\" might prevent " + cpp_warning (pfile, CPP_W_DATE_TIME, "macro %qs might prevent " "reproducible builds", NODE_NAME (node)); if (pfile->date == NULL) { @@ -730,7 +730,8 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node, case BT_COUNTER: if (CPP_OPTION (pfile, directives_only) && pfile->state.in_directive) cpp_error (pfile, CPP_DL_ERROR, - "__COUNTER__ expanded inside directive with -fdirectives-only"); + "%<__COUNTER__%> expanded inside directive with " + "%<-fdirectives-only%>"); number = pfile->counter++; break; @@ -756,7 +757,7 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node, if (CPP_OPTION (pfile, traditional)) { cpp_error (pfile, CPP_DL_ERROR, /* FIXME should be DL_SORRY */ - "'__has_embed' not supported in traditional C"); + "%<__has_embed%> not supported in traditional C"); break; } number = builtin_has_embed (pfile); @@ -884,7 +885,7 @@ builtin_macro (cpp_reader *pfile, cpp_hashnode *node, else _cpp_push_token_context (pfile, NULL, token, 1); if (pfile->buffer->cur != pfile->buffer->rlimit) - cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro \"%s\"", + cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro %qs", NODE_NAME (node)); _cpp_pop_buffer (pfile); @@ -1003,7 +1004,7 @@ stringify_arg (cpp_reader *pfile, const cpp_token **first, unsigned int count) if (backslash_count & 1) { cpp_error (pfile, CPP_DL_WARNING, - "invalid string literal, ignoring final '\\'"); + "invalid string literal, ignoring final %<\\%>"); dest--; } @@ -1200,26 +1201,26 @@ _cpp_arguments_ok (cpp_reader *pfile, cpp_macro *macro, const cpp_hashnode *node if (CPP_OPTION (pfile, cplusplus)) cpp_pedwarning (pfile, CPP_W_CXX20_EXTENSIONS, "ISO C++11 requires at least one argument " - "for the \"...\" in a variadic macro"); + "for the %<...%> in a variadic macro"); else cpp_pedwarning (pfile, CPP_W_PEDANTIC, "ISO C99 requires at least one argument " - "for the \"...\" in a variadic macro"); + "for the %<...%> in a variadic macro"); } return true; } cpp_error (pfile, CPP_DL_ERROR, - "macro \"%s\" requires %u arguments, but only %u given", + "macro %qs requires %u arguments, but only %u given", NODE_NAME (node), macro->paramc, argc); } else cpp_error (pfile, CPP_DL_ERROR, - "macro \"%s\" passed %u arguments, but takes just %u", + "macro %qs passed %u arguments, but takes just %u", NODE_NAME (node), argc, macro->paramc); if (macro->line > RESERVED_LOCATION_COUNT) - cpp_error_at (pfile, CPP_DL_NOTE, macro->line, "macro \"%s\" defined here", + cpp_error_at (pfile, CPP_DL_NOTE, macro->line, "macro %qs defined here", NODE_NAME (node)); return false; @@ -1413,7 +1414,7 @@ collect_args (cpp_reader *pfile, const cpp_hashnode *node, if (token == &pfile->endarg) _cpp_backup_tokens (pfile, 1); cpp_error (pfile, CPP_DL_ERROR, - "unterminated argument list invoking macro \"%s\"", + "unterminated argument list invoking macro %qs", NODE_NAME (node)); } else @@ -1559,8 +1560,8 @@ enter_macro_context (cpp_reader *pfile, cpp_hashnode *node, { if (CPP_WTRADITIONAL (pfile) && ! node->value.macro->syshdr) cpp_warning (pfile, CPP_W_TRADITIONAL, - "function-like macro \"%s\" must be used with arguments in traditional C", - NODE_NAME (node)); + "function-like macro %qs must be used with " + "arguments in traditional C", NODE_NAME (node)); if (pragma_buff) _cpp_release_buff (pfile, pragma_buff); @@ -3462,7 +3463,7 @@ _cpp_save_parameter (cpp_reader *pfile, unsigned n, cpp_hashnode *node, /* Constraint 6.10.3.6 - duplicate parameter names. */ if (node->type == NT_MACRO_ARG) { - cpp_error (pfile, CPP_DL_ERROR, "duplicate macro parameter \"%s\"", + cpp_error (pfile, CPP_DL_ERROR, "duplicate macro parameter %qs", NODE_NAME (node)); return false; } @@ -3544,11 +3545,11 @@ parse_params (cpp_reader *pfile, unsigned *n_ptr, bool *variadic_ptr) { const char *const msgs[5] = { - N_("expected parameter name, found \"%s\""), - N_("expected ',' or ')', found \"%s\""), + N_("expected parameter name, found %qs"), + N_("expected %<,%> or %<)%>, found %qs"), N_("expected parameter name before end of line"), - N_("expected ')' before end of line"), - N_("expected ')' after \"...\"") + N_("expected %<)%> before end of line"), + N_("expected %<)%> after %<...%>") }; unsigned ix = prev_ident; const unsigned char *as_text = NULL; @@ -3663,7 +3664,7 @@ create_iso_definition (cpp_reader *pfile) { bool following_paste_op = false; const char *paste_op_error_msg = - N_("'##' cannot appear at either end of a macro expansion"); + N_("%<##%> cannot appear at either end of a macro expansion"); unsigned int num_extra_tokens = 0; unsigned nparms = 0; cpp_hashnode **params = NULL; @@ -3779,7 +3780,7 @@ create_iso_definition (cpp_reader *pfile) else if (CPP_OPTION (pfile, lang) != CLK_ASM) { cpp_error (pfile, CPP_DL_ERROR, - "'#' is not followed by a macro parameter"); + "%<#%> is not followed by a macro parameter"); goto out; } } @@ -3940,15 +3941,14 @@ _cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node, = (cpp_builtin_macro_p (node) && !(node->flags & NODE_WARN)) ? CPP_W_BUILTIN_MACRO_REDEFINED : CPP_W_NONE; - bool warned = - cpp_pedwarning_with_line (pfile, reason, - macro->line, 0, - "\"%s\" redefined", NODE_NAME (node)); + bool warned + = cpp_pedwarning_with_line (pfile, reason, macro->line, 0, + "%qs redefined", NODE_NAME (node)); if (warned && cpp_user_macro_p (node)) - cpp_error_with_line (pfile, CPP_DL_NOTE, - node->value.macro->line, 0, - "this is the location of the previous definition"); + cpp_error_with_line (pfile, CPP_DL_NOTE, node->value.macro->line, + 0, "this is the location of the previous " + "definition"); } _cpp_free_definition (node); } @@ -4085,8 +4085,8 @@ check_trad_stringification (cpp_reader *pfile, const cpp_macro *macro, && !memcmp (p, NODE_NAME (node), len)) { cpp_warning (pfile, CPP_W_TRADITIONAL, - "macro argument \"%s\" would be stringified in traditional C", - NODE_NAME (node)); + "macro argument %qs would be stringified in " + "traditional C", NODE_NAME (node)); break; } } diff --git a/libcpp/pch.cc b/libcpp/pch.cc index f2f74ed..0989fb3 100644 --- a/libcpp/pch.cc +++ b/libcpp/pch.cc @@ -613,7 +613,7 @@ cpp_valid_state (cpp_reader *r, const char *name, int fd) { if (CPP_OPTION (r, warn_invalid_pch)) cpp_warning_syshdr (r, CPP_W_INVALID_PCH, - "%s: not used because `%.*s' is poisoned", + "%s: not used because %<%.*s%> is poisoned", name, m.name_length, namebuf); goto fail; } @@ -635,7 +635,7 @@ cpp_valid_state (cpp_reader *r, const char *name, int fd) if (CPP_OPTION (r, warn_invalid_pch)) cpp_warning_syshdr (r, CPP_W_INVALID_PCH, - "%s: not used because `%.*s' not defined", + "%s: not used because %<%.*s%> not defined", name, m.name_length, namebuf); goto fail; } @@ -647,10 +647,12 @@ cpp_valid_state (cpp_reader *r, const char *name, int fd) { if (CPP_OPTION (r, warn_invalid_pch)) cpp_warning_syshdr (r, CPP_W_INVALID_PCH, - "%s: not used because `%.*s' defined as `%s' not `%.*s'", - name, m.name_length, namebuf, newdefn + m.name_length, - m.definition_length - m.name_length, - namebuf + m.name_length); + "%s: not used because %<%.*s%> defined as " + "%<%s%> not %<%.*s%>", + name, m.name_length, namebuf, + newdefn + m.name_length, + m.definition_length - m.name_length, + namebuf + m.name_length); goto fail; } } @@ -688,7 +690,7 @@ cpp_valid_state (cpp_reader *r, const char *name, int fd) { if (CPP_OPTION (r, warn_invalid_pch)) cpp_warning_syshdr (r, CPP_W_INVALID_PCH, - "%s: not used because `%s' is defined", + "%s: not used because %qs is defined", name, first); goto fail; } @@ -708,7 +710,7 @@ cpp_valid_state (cpp_reader *r, const char *name, int fd) { if (CPP_OPTION (r, warn_invalid_pch)) cpp_warning_syshdr (r, CPP_W_INVALID_PCH, - "%s: not used because `__COUNTER__' is invalid", + "%s: not used because %<__COUNTER__%> is invalid", name); goto fail; } diff --git a/libcpp/traditional.cc b/libcpp/traditional.cc index cf0ef4c..ac01f9d 100644 --- a/libcpp/traditional.cc +++ b/libcpp/traditional.cc @@ -819,7 +819,7 @@ _cpp_scan_out_logical_line (cpp_reader *pfile, cpp_macro *macro, if (lex_state == ls_fun_close) cpp_error_with_line (pfile, CPP_DL_ERROR, fmacro.line, 0, - "unterminated argument list invoking macro \"%s\"", + "unterminated argument list invoking macro %qs", NODE_NAME (fmacro.node)); return result; } @@ -888,7 +888,7 @@ recursive_macro (cpp_reader *pfile, cpp_hashnode *node) if (recursing) cpp_error (pfile, CPP_DL_ERROR, - "detected recursion whilst expanding macro \"%s\"", + "detected recursion whilst expanding macro %qs", NODE_NAME (node)); return recursing; |