diff mbox series

c++: Improve dump_decl for standard concepts

Message ID 20200210162801.775454-1-ppalka@redhat.com
State New
Headers show
Series c++: Improve dump_decl for standard concepts | expand

Commit Message

Patrick Palka Feb. 10, 2020, 4:28 p.m. UTC
This patch improves the pretty printing of standard concept definitions in error
messages.  In particular, standard concepts are now printed qualified whenever
appropriate, and the "concept" specifier is printed only when the
TFF_DECL_SPECIFIERS flag is specified.

In the below test, the first error message changes from
  9:15: error: ‘b’ was not declared in this scope; did you mean ‘concept b’?
to
  9:15: error: ‘b’ was not declared in this scope; did you mean ‘a::b’?

Tested on x86_64-pc-linux-gnu, is this OK to commit?

gcc/cp/ChangeLog:

	* error.c (dump_decl) [CONCEPT_DECL]: Use dump_simple_decl.
	(dump_simple_decl): Handle standard concept definitions as well as
	variable concept definitions.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts6.C: New test.
---
 gcc/cp/error.c                         | 18 ++++++++----------
 gcc/testsuite/g++.dg/cpp2a/concepts6.C | 18 ++++++++++++++++++
 2 files changed, 26 insertions(+), 10 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts6.C

Comments

Jason Merrill Feb. 10, 2020, 6:17 p.m. UTC | #1
On 2/10/20 5:28 PM, Patrick Palka wrote:
> This patch improves the pretty printing of standard concept definitions in error
> messages.  In particular, standard concepts are now printed qualified whenever
> appropriate, and the "concept" specifier is printed only when the
> TFF_DECL_SPECIFIERS flag is specified.
> 
> In the below test, the first error message changes from
>    9:15: error: ‘b’ was not declared in this scope; did you mean ‘concept b’?
> to
>    9:15: error: ‘b’ was not declared in this scope; did you mean ‘a::b’?
> 
> Tested on x86_64-pc-linux-gnu, is this OK to commit?

OK.

> gcc/cp/ChangeLog:
> 
> 	* error.c (dump_decl) [CONCEPT_DECL]: Use dump_simple_decl.
> 	(dump_simple_decl): Handle standard concept definitions as well as
> 	variable concept definitions.
> 
> gcc/testsuite/ChangeLog:
> 
> 	* g++.dg/cpp2a/concepts6.C: New test.
> ---
>   gcc/cp/error.c                         | 18 ++++++++----------
>   gcc/testsuite/g++.dg/cpp2a/concepts6.C | 18 ++++++++++++++++++
>   2 files changed, 26 insertions(+), 10 deletions(-)
>   create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts6.C
> 
> diff --git a/gcc/cp/error.c b/gcc/cp/error.c
> index 973b3034e12..a56d83e1f45 100644
> --- a/gcc/cp/error.c
> +++ b/gcc/cp/error.c
> @@ -1037,14 +1037,13 @@ dump_simple_decl (cxx_pretty_printer *pp, tree t, tree type, int flags)
>   
>     if (flags & TFF_DECL_SPECIFIERS)
>       {
> -      if (VAR_P (t) && DECL_DECLARED_CONSTEXPR_P (t))
> -        {
> -	  if (DECL_LANG_SPECIFIC (t) && DECL_DECLARED_CONCEPT_P (t))
> -	    pp_cxx_ws_string (pp, "concept");
> -	  else
> -	    pp_cxx_ws_string (pp, "constexpr");
> -	}
> -      dump_type_prefix (pp, type, flags & ~TFF_UNQUALIFIED_NAME);
> +      if (concept_definition_p (t))
> +	pp_cxx_ws_string (pp, "concept");
> +      else if (VAR_P (t) && DECL_DECLARED_CONSTEXPR_P (t))
> +	pp_cxx_ws_string (pp, "constexpr");
> +
> +      if (!standard_concept_p (t))
> +	dump_type_prefix (pp, type, flags & ~TFF_UNQUALIFIED_NAME);
>         pp_maybe_space (pp);
>       }
>     if (! (flags & TFF_UNQUALIFIED_NAME)
> @@ -1296,8 +1295,7 @@ dump_decl (cxx_pretty_printer *pp, tree t, int flags)
>         break;
>   
>       case CONCEPT_DECL:
> -      pp_cxx_ws_string (pp, "concept");
> -      dump_decl_name (pp, DECL_NAME (t), flags);
> +      dump_simple_decl (pp, t, TREE_TYPE (t), flags);
>         break;
>   
>       case WILDCARD_DECL:
> diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts6.C b/gcc/testsuite/g++.dg/cpp2a/concepts6.C
> new file mode 100644
> index 00000000000..d69628b0318
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp2a/concepts6.C
> @@ -0,0 +1,18 @@
> +// { dg-do compile { target c++2a } }
> +
> +namespace a
> +{
> +  template<typename = int>
> +    concept b = true; // { dg-message ".a::b. declared here" }
> +}
> +
> +static_assert(b); // { dg-error "did you mean .a::b." }
> +
> +namespace c
> +{
> +  template<typename>
> +    concept b = true; // { dg-message "concept c::b." }
> +
> +  template<typename>
> +    concept b = true; // { dg-error "concept c::b." }
> +}
>
diff mbox series

Patch

diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 973b3034e12..a56d83e1f45 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -1037,14 +1037,13 @@  dump_simple_decl (cxx_pretty_printer *pp, tree t, tree type, int flags)
 
   if (flags & TFF_DECL_SPECIFIERS)
     {
-      if (VAR_P (t) && DECL_DECLARED_CONSTEXPR_P (t))
-        {
-	  if (DECL_LANG_SPECIFIC (t) && DECL_DECLARED_CONCEPT_P (t))
-	    pp_cxx_ws_string (pp, "concept");
-	  else
-	    pp_cxx_ws_string (pp, "constexpr");
-	}
-      dump_type_prefix (pp, type, flags & ~TFF_UNQUALIFIED_NAME);
+      if (concept_definition_p (t))
+	pp_cxx_ws_string (pp, "concept");
+      else if (VAR_P (t) && DECL_DECLARED_CONSTEXPR_P (t))
+	pp_cxx_ws_string (pp, "constexpr");
+
+      if (!standard_concept_p (t))
+	dump_type_prefix (pp, type, flags & ~TFF_UNQUALIFIED_NAME);
       pp_maybe_space (pp);
     }
   if (! (flags & TFF_UNQUALIFIED_NAME)
@@ -1296,8 +1295,7 @@  dump_decl (cxx_pretty_printer *pp, tree t, int flags)
       break;
 
     case CONCEPT_DECL:
-      pp_cxx_ws_string (pp, "concept");
-      dump_decl_name (pp, DECL_NAME (t), flags);
+      dump_simple_decl (pp, t, TREE_TYPE (t), flags);
       break;
 
     case WILDCARD_DECL:
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts6.C b/gcc/testsuite/g++.dg/cpp2a/concepts6.C
new file mode 100644
index 00000000000..d69628b0318
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts6.C
@@ -0,0 +1,18 @@ 
+// { dg-do compile { target c++2a } }
+
+namespace a
+{
+  template<typename = int>
+    concept b = true; // { dg-message ".a::b. declared here" }
+}
+
+static_assert(b); // { dg-error "did you mean .a::b." }
+
+namespace c
+{
+  template<typename>
+    concept b = true; // { dg-message "concept c::b." }
+
+  template<typename>
+    concept b = true; // { dg-error "concept c::b." }
+}