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

Message ID 20211217225902.499568-1-polacek@redhat.com
State New
Headers
Series c-family: Have -Wformat-diag accept "decl-specifier" [PR103758] |

Commit Message

Marek Polacek Dec. 17, 2021, 10:59 p.m. UTC
  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.

Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

In fact, I think I'd like to backport to 11 too, so that eventually
even my system compiler stops warning about this.

	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                          | 10 +++++++++-
 gcc/cp/parser.c                                  |  2 +-
 gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C |  2 +-
 3 files changed, 11 insertions(+), 3 deletions(-)


base-commit: d7ca2a79b82c6500ead6ab983d14c609e2124eee
  

Comments

Jeff Law Dec. 20, 2021, 3:22 p.m. UTC | #1
On 12/17/2021 3:59 PM, Marek Polacek via Gcc-patches wrote:
> 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.
>
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
>
> In fact, I think I'd like to backport to 11 too, so that eventually
> even my system compiler stops warning about this.
>
> 	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.
OK.  I know, cp/, but it seems trivial enough that I don't mind ACKing 
this one.


jeff
  
Jason Merrill Dec. 20, 2021, 8:21 p.m. UTC | #2
On 12/17/21 17:59, Marek Polacek wrote:
> 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.
> 
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
> 
> In fact, I think I'd like to backport to 11 too, so that eventually
> even my system compiler stops warning about this.
> 
> 	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                          | 10 +++++++++-
>   gcc/cp/parser.c                                  |  2 +-
>   gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C |  2 +-
>   3 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c
> index 617fb5ea626..e1b1d6ba31e 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,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.

>   	      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 44eed7ea638..3b33ae0cc21 100644
> --- a/gcc/cp/parser.c
> +++ b/gcc/cp/parser.c
> @@ -15820,7 +15820,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: d7ca2a79b82c6500ead6ab983d14c609e2124eee
  
Jakub Jelinek Dec. 20, 2021, 8:53 p.m. UTC | #3
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;
?

	Jakub
  

Patch

diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c
index 617fb5ea626..e1b1d6ba31e 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,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;
+	      }
+
 	      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 44eed7ea638..3b33ae0cc21 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -15820,7 +15820,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" }
 }