c++: Don't quote nothrow in diagnostic

Message ID 20220923184026.379494-1-polacek@redhat.com
State New
Headers
Series c++: Don't quote nothrow in diagnostic |

Commit Message

Marek Polacek Sept. 23, 2022, 6:40 p.m. UTC
  In <https://gcc.gnu.org/pipermail/gcc-patches/2022-September/602057.html>
Jason noticed that we quote "nothrow" in diagnostics even though it's
not a keyword in C++.  Just removing the quotes didn't work because
then -Wformat-diag complains, so this patch replaces it with "no-throw".

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

gcc/cp/ChangeLog:

	* constraint.cc (diagnose_trait_expr): Say "no-throw" (without quotes)
	rather than "nothrow" in quotes.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts-traits3.C: Adjust expected diagnostics.
---
 gcc/cp/constraint.cc                          | 14 +++++++-------
 gcc/testsuite/g++.dg/cpp2a/concepts-traits3.C |  8 ++++----
 2 files changed, 11 insertions(+), 11 deletions(-)


base-commit: 8a7bcf95a82c3dd68bd4bcfbd8432eb970575bc2
  

Comments

Richard Biener Sept. 26, 2022, 7:50 a.m. UTC | #1
On Fri, Sep 23, 2022 at 8:41 PM Marek Polacek via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> In <https://gcc.gnu.org/pipermail/gcc-patches/2022-September/602057.html>
> Jason noticed that we quote "nothrow" in diagnostics even though it's
> not a keyword in C++.  Just removing the quotes didn't work because
> then -Wformat-diag complains, so this patch replaces it with "no-throw".
>
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

That doesn't look like an improvement to me.  Can we quote 'nothrow()' instead?
I'd rather leave it alone than changing it to no-throw.  Why does -Wformat-diag
complain?  If we shouldn't quote nothrow that should be adjusted?

>
> gcc/cp/ChangeLog:
>
>         * constraint.cc (diagnose_trait_expr): Say "no-throw" (without quotes)
>         rather than "nothrow" in quotes.
>
> gcc/testsuite/ChangeLog:
>
>         * g++.dg/cpp2a/concepts-traits3.C: Adjust expected diagnostics.
> ---
>  gcc/cp/constraint.cc                          | 14 +++++++-------
>  gcc/testsuite/g++.dg/cpp2a/concepts-traits3.C |  8 ++++----
>  2 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
> index 5839bfb4b52..136647f7c9e 100644
> --- a/gcc/cp/constraint.cc
> +++ b/gcc/cp/constraint.cc
> @@ -3592,13 +3592,13 @@ diagnose_trait_expr (tree expr, tree args)
>    switch (TRAIT_EXPR_KIND (expr))
>      {
>      case CPTK_HAS_NOTHROW_ASSIGN:
> -      inform (loc, "  %qT is not %<nothrow%> copy assignable", t1);
> +      inform (loc, "  %qT is not no-throw copy assignable", t1);
>        break;
>      case CPTK_HAS_NOTHROW_CONSTRUCTOR:
> -      inform (loc, "  %qT is not %<nothrow%> default constructible", t1);
> +      inform (loc, "  %qT is not no-throw default constructible", t1);
>        break;
>      case CPTK_HAS_NOTHROW_COPY:
> -      inform (loc, "  %qT is not %<nothrow%> copy constructible", t1);
> +      inform (loc, "  %qT is not no-throw copy constructible", t1);
>        break;
>      case CPTK_HAS_TRIVIAL_ASSIGN:
>        inform (loc, "  %qT is not trivially copy assignable", t1);
> @@ -3674,7 +3674,7 @@ diagnose_trait_expr (tree expr, tree args)
>        inform (loc, "  %qT is not trivially assignable from %qT", t1, t2);
>        break;
>      case CPTK_IS_NOTHROW_ASSIGNABLE:
> -      inform (loc, "  %qT is not %<nothrow%> assignable from %qT", t1, t2);
> +      inform (loc, "  %qT is not no-throw assignable from %qT", t1, t2);
>        break;
>      case CPTK_IS_CONSTRUCTIBLE:
>        if (!t2)
> @@ -3690,9 +3690,9 @@ diagnose_trait_expr (tree expr, tree args)
>        break;
>      case CPTK_IS_NOTHROW_CONSTRUCTIBLE:
>        if (!t2)
> -       inform (loc, "  %qT is not %<nothrow%> default constructible", t1);
> +       inform (loc, "  %qT is not no-throw default constructible", t1);
>        else
> -       inform (loc, "  %qT is not %<nothrow%> constructible from %qE", t1, t2);
> +       inform (loc, "  %qT is not no-throw constructible from %qE", t1, t2);
>        break;
>      case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS:
>        inform (loc, "  %qT does not have unique object representations", t1);
> @@ -3701,7 +3701,7 @@ diagnose_trait_expr (tree expr, tree args)
>        inform (loc, "  %qT is not convertible from %qE", t2, t1);
>        break;
>      case CPTK_IS_NOTHROW_CONVERTIBLE:
> -       inform (loc, "  %qT is not %<nothrow%> convertible from %qE", t2, t1);
> +       inform (loc, "  %qT is not no-throw convertible from %qE", t2, t1);
>        break;
>      case CPTK_REF_CONSTRUCTS_FROM_TEMPORARY:
>        inform (loc, "  %qT is not a reference that binds to a temporary "
> diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-traits3.C b/gcc/testsuite/g++.dg/cpp2a/concepts-traits3.C
> index f20608b6918..6ac849d71fd 100644
> --- a/gcc/testsuite/g++.dg/cpp2a/concepts-traits3.C
> +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-traits3.C
> @@ -21,7 +21,7 @@ concept TriviallyAssignable = __is_trivially_assignable(T, U);
>
>  template<class T, class U>
>  concept NothrowAssignable = __is_nothrow_assignable(T, U);
> -// { dg-message "'S' is not 'nothrow' assignable from 'int'" "" { target *-*-* } .-1  }
> +// { dg-message "'S' is not no-throw assignable from 'int'" "" { target *-*-* } .-1  }
>
>  template<class T, class... Args>
>  concept Constructible = __is_constructible(T, Args...);
> @@ -37,9 +37,9 @@ concept TriviallyConstructible = __is_trivially_constructible(T, Args...);
>
>  template<class T, class... Args>
>  concept NothrowConstructible = __is_nothrow_constructible(T, Args...);
> -// { dg-message "'S' is not 'nothrow' default constructible" "" { target *-*-* } .-1  }
> -// { dg-message "'S' is not 'nothrow' constructible from 'int'" "" { target *-*-* } .-2  }
> -// { dg-message "'S' is not 'nothrow' constructible from 'int, char'" "" { target *-*-* } .-3  }
> +// { dg-message "'S' is not no-throw default constructible" "" { target *-*-* } .-1  }
> +// { dg-message "'S' is not no-throw constructible from 'int'" "" { target *-*-* } .-2  }
> +// { dg-message "'S' is not no-throw constructible from 'int, char'" "" { target *-*-* } .-3  }
>
>  template<class T>
>  concept UniqueObjReps = __has_unique_object_representations(T);
>
> base-commit: 8a7bcf95a82c3dd68bd4bcfbd8432eb970575bc2
> --
> 2.37.3
>
  
Jason Merrill Sept. 26, 2022, 4:34 p.m. UTC | #2
On 9/26/22 03:50, Richard Biener wrote:
> On Fri, Sep 23, 2022 at 8:41 PM Marek Polacek via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
>>
>> In <https://gcc.gnu.org/pipermail/gcc-patches/2022-September/602057.html>
>> Jason noticed that we quote "nothrow" in diagnostics even though it's
>> not a keyword in C++.  Just removing the quotes didn't work because
>> then -Wformat-diag complains, so this patch replaces it with "no-throw".
>>
>> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
> 
> That doesn't look like an improvement to me.  Can we quote 'nothrow()' instead?

nothrow() is a syntax error; the C++11 keyword is 'noexcept'. 
std::nothrow is a dummy placement argument used to indicate that a 
new-expression should return null rather than throw on failure.

But bizarrely, the library traits use the word "nothrow".  Marek's patch 
clarifies that we are not trying to refer to anything in the language.

> I'd rather leave it alone than changing it to no-throw.  Why does -Wformat-diag
> complain?  If we shouldn't quote nothrow that should be adjusted?

I think -Wformat-diag complains because "nothrow" is an attribute; it 
also includes some other attribute names in the list of "keywords".

I would also be fine with just removing the quotes and removing nothrow 
from c_keywords.

Jason
  

Patch

diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
index 5839bfb4b52..136647f7c9e 100644
--- a/gcc/cp/constraint.cc
+++ b/gcc/cp/constraint.cc
@@ -3592,13 +3592,13 @@  diagnose_trait_expr (tree expr, tree args)
   switch (TRAIT_EXPR_KIND (expr))
     {
     case CPTK_HAS_NOTHROW_ASSIGN:
-      inform (loc, "  %qT is not %<nothrow%> copy assignable", t1);
+      inform (loc, "  %qT is not no-throw copy assignable", t1);
       break;
     case CPTK_HAS_NOTHROW_CONSTRUCTOR:
-      inform (loc, "  %qT is not %<nothrow%> default constructible", t1);
+      inform (loc, "  %qT is not no-throw default constructible", t1);
       break;
     case CPTK_HAS_NOTHROW_COPY:
-      inform (loc, "  %qT is not %<nothrow%> copy constructible", t1);
+      inform (loc, "  %qT is not no-throw copy constructible", t1);
       break;
     case CPTK_HAS_TRIVIAL_ASSIGN:
       inform (loc, "  %qT is not trivially copy assignable", t1);
@@ -3674,7 +3674,7 @@  diagnose_trait_expr (tree expr, tree args)
       inform (loc, "  %qT is not trivially assignable from %qT", t1, t2);
       break;
     case CPTK_IS_NOTHROW_ASSIGNABLE:
-      inform (loc, "  %qT is not %<nothrow%> assignable from %qT", t1, t2);
+      inform (loc, "  %qT is not no-throw assignable from %qT", t1, t2);
       break;
     case CPTK_IS_CONSTRUCTIBLE:
       if (!t2)
@@ -3690,9 +3690,9 @@  diagnose_trait_expr (tree expr, tree args)
       break;
     case CPTK_IS_NOTHROW_CONSTRUCTIBLE:
       if (!t2)
-	inform (loc, "  %qT is not %<nothrow%> default constructible", t1);
+	inform (loc, "  %qT is not no-throw default constructible", t1);
       else
-	inform (loc, "  %qT is not %<nothrow%> constructible from %qE", t1, t2);
+	inform (loc, "  %qT is not no-throw constructible from %qE", t1, t2);
       break;
     case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS:
       inform (loc, "  %qT does not have unique object representations", t1);
@@ -3701,7 +3701,7 @@  diagnose_trait_expr (tree expr, tree args)
       inform (loc, "  %qT is not convertible from %qE", t2, t1);
       break;
     case CPTK_IS_NOTHROW_CONVERTIBLE:
-	inform (loc, "  %qT is not %<nothrow%> convertible from %qE", t2, t1);
+	inform (loc, "  %qT is not no-throw convertible from %qE", t2, t1);
       break;
     case CPTK_REF_CONSTRUCTS_FROM_TEMPORARY:
       inform (loc, "  %qT is not a reference that binds to a temporary "
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-traits3.C b/gcc/testsuite/g++.dg/cpp2a/concepts-traits3.C
index f20608b6918..6ac849d71fd 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-traits3.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-traits3.C
@@ -21,7 +21,7 @@  concept TriviallyAssignable = __is_trivially_assignable(T, U);
 
 template<class T, class U>
 concept NothrowAssignable = __is_nothrow_assignable(T, U);
-// { dg-message "'S' is not 'nothrow' assignable from 'int'" "" { target *-*-* } .-1  }
+// { dg-message "'S' is not no-throw assignable from 'int'" "" { target *-*-* } .-1  }
 
 template<class T, class... Args>
 concept Constructible = __is_constructible(T, Args...);
@@ -37,9 +37,9 @@  concept TriviallyConstructible = __is_trivially_constructible(T, Args...);
 
 template<class T, class... Args>
 concept NothrowConstructible = __is_nothrow_constructible(T, Args...);
-// { dg-message "'S' is not 'nothrow' default constructible" "" { target *-*-* } .-1  }
-// { dg-message "'S' is not 'nothrow' constructible from 'int'" "" { target *-*-* } .-2  }
-// { dg-message "'S' is not 'nothrow' constructible from 'int, char'" "" { target *-*-* } .-3  }
+// { dg-message "'S' is not no-throw default constructible" "" { target *-*-* } .-1  }
+// { dg-message "'S' is not no-throw constructible from 'int'" "" { target *-*-* } .-2  }
+// { dg-message "'S' is not no-throw constructible from 'int, char'" "" { target *-*-* } .-3  }
 
 template<class T>
 concept UniqueObjReps = __has_unique_object_representations(T);