[PATCH] c++: Improve dump_decl for standard concepts

Jason Merrill jason@redhat.com
Mon Feb 10 18:17:00 GMT 2020


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



More information about the Gcc-patches mailing list