On Mon, Dec 20, 2021 at 09:53:25PM +0100, Jakub Jelinek wrote: > On Mon, Dec 20, 2021 at 03:21:04PM -0500, Jason Merrill via Gcc-patches wrote: > > > @@ -3215,6 +3215,14 @@ check_tokens (const token_t *tokens, unsigned > > > ntoks, > > > plural = "s"; > > > } > > > + /* As an exception, don't warn about "decl-specifier*" since > > > + it's a C++ grammar production. */ > > > + { > > > + const size_t l = strlen ("decl-specifier"); > > > + if (!strncmp (format_chars, "decl-specifier", l)) > > > + return format_chars + l - 1; > > > + } > > > > I'd prefer to avoid repeating the string literal, but OK. > > We have the startswith inline function that allows to avoid the repetition. > It wouldn't work in the above case due to the return format_chars + l - 1, > but that in itself looks quite weird to me, I'd think better would be > continue; instead of the return ...;, i.e. whenever we see decl-specifier > in the text pretend we haven't seen decl. > So > /* As an exception, don't warn about "decl-specifier*" since > it's a C++ grammar production. */ > if (startswith (format_chars, "decl-specifier")) > continue; > ? > Or perhaps even optimize and don't compare uselessly everything with > "decl-specifier" and do it only for the "decl" badword if it matches, > so > if (badwords[i].name[0] == 'd' > && startswith (format_chars, "decl-specifier")) > continue; > ?
Works for me, thanks. Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? Can I backport it to GCC 11 too? -- >8 -- I'm tired of seeing cp/parser.c:15923:55: warning: misspelled term 'decl' in format; use 'declaration' instead [-Wformat-diag] cp/parser.c:15925:57: warning: misspelled term 'decl' in format; use 'declaration' instead [-Wformat-diag] every time I compile cp/parser.c, which happens...a lot. I'd like my compilation to be free of warnings, otherwise I'm going to miss some important ones. "decl-specifiers" is a C++ grammar term; it is not actual code, so should not be wrapped with %< %>. I hope we can accept it as an exception in check_tokens. It was surrounded by %< %> in cp_parser_decl_specifier_seq, so fix that. In passing, fix a misspelling in missspellings. PR c++/103758 gcc/c-family/ChangeLog: * c-format.c (check_tokens): Accept "decl-specifier*". gcc/cp/ChangeLog: * parser.c (cp_parser_decl_specifier_seq): Replace %<decl-specifier%> with %qD. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-condition.C: Adjust dg-error. --- gcc/c-family/c-format.c | 8 +++++++- gcc/cp/parser.c | 2 +- gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c index 7d3b3117ee2..afa77810a5c 100644 --- a/gcc/c-family/c-format.c +++ b/gcc/c-family/c-format.c @@ -3194,7 +3194,7 @@ check_tokens (const token_t *tokens, unsigned ntoks, wlen, format_chars); else { - /* Diagnose some common missspellings. */ + /* Diagnose some common misspellings. */ for (unsigned i = 0; i != sizeof badwords / sizeof *badwords; ++i) { unsigned badwlen = strspn (badwords[i].name, " -"); @@ -3215,6 +3215,12 @@ check_tokens (const token_t *tokens, unsigned ntoks, plural = "s"; } + /* As an exception, don't warn about "decl-specifier*" since + it's a C++ grammar production. */ + if (badwords[i].name[0] == 'd' + && startswith (format_chars, "decl-specifier")) + continue; + format_warning_substr (format_string_loc, format_string_cst, fmtchrpos, fmtchrpos + badwords[i].len, opt, diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 4475f792916..6b91a0ce491 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -15821,7 +15821,7 @@ cp_parser_decl_specifier_seq (cp_parser* parser, if (found_decl_spec && (flags & CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR) && token->keyword != RID_CONSTEXPR) - error ("%<decl-specifier%> invalid in condition"); + error ("%qD invalid in condition", ridpointers[token->keyword]); if (found_decl_spec && (flags & CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR) diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C index 733d494c4d7..e81acba68ae 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C @@ -5,5 +5,5 @@ constexpr int something() { return 3; } int main() { if (constexpr long v = something()) {} - if (static long v = something()) { } // { dg-error "'decl-specifier' invalid" } + if (static long v = something()) { } // { dg-error "'static' invalid" } } base-commit: 1096ab1775636f35de9c6661f8f71f03299af998 -- 2.33.1