c-family: Have -Wformat-diag accept "decl-specifier" [PR103758]

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.
This commit is contained in:
Marek Polacek 2021-12-17 14:34:12 -05:00
parent 1096ab1775
commit bb936163e2
3 changed files with 9 additions and 3 deletions

View File

@ -3194,7 +3194,7 @@ check_tokens (const token_t *tokens, unsigned ntoks,
wlen, format_chars); wlen, format_chars);
else else
{ {
/* Diagnose some common missspellings. */ /* Diagnose some common misspellings. */
for (unsigned i = 0; i != sizeof badwords / sizeof *badwords; ++i) for (unsigned i = 0; i != sizeof badwords / sizeof *badwords; ++i)
{ {
unsigned badwlen = strspn (badwords[i].name, " -"); unsigned badwlen = strspn (badwords[i].name, " -");
@ -3215,6 +3215,12 @@ check_tokens (const token_t *tokens, unsigned ntoks,
plural = "s"; 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, format_warning_substr (format_string_loc, format_string_cst,
fmtchrpos, fmtchrpos + badwords[i].len, fmtchrpos, fmtchrpos + badwords[i].len,
opt, opt,

View File

@ -15821,7 +15821,7 @@ cp_parser_decl_specifier_seq (cp_parser* parser,
if (found_decl_spec if (found_decl_spec
&& (flags & CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR) && (flags & CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR)
&& token->keyword != RID_CONSTEXPR) && token->keyword != RID_CONSTEXPR)
error ("%<decl-specifier%> invalid in condition"); error ("%qD invalid in condition", ridpointers[token->keyword]);
if (found_decl_spec if (found_decl_spec
&& (flags & CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR) && (flags & CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR)

View File

@ -5,5 +5,5 @@ constexpr int something() { return 3; }
int main() { int main() {
if (constexpr long v = something()) {} if (constexpr long v = something()) {}
if (static long v = something()) { } // { dg-error "'decl-specifier' invalid" } if (static long v = something()) { } // { dg-error "'static' invalid" }
} }