Message ID | 20200210162801.775454-1-ppalka@redhat.com |
---|---|
State | New |
Headers | show |
Series | c++: Improve dump_decl for standard concepts | expand |
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 --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." } +}