diff mbox series

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

Message ID YdNi17R4CxND6ek3@redhat.com
State New
Headers show
Series [v2] c-family: Have -Wformat-diag accept "decl-specifier" [PR103758] | expand

Commit Message

Marek Polacek Jan. 3, 2022, 8:55 p.m. UTC
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(-)


base-commit: 1096ab1775636f35de9c6661f8f71f03299af998

Comments

Jakub Jelinek Jan. 3, 2022, 9:25 p.m. UTC | #1
On Mon, Jan 03, 2022 at 03:55:51PM -0500, Marek Polacek wrote:
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

LGTM, thanks.

> Can I backport it to GCC 11 too?

Not immediately, but say after 2 weeks sure.
> 
> -- >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

	Jakub
diff mbox series

Patch

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" }
 }