From 91f4fc40bcf666eb57d566198981dc8e8eff9ccb Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Mon, 10 Feb 2020 10:48:27 -0500 Subject: [PATCH] c++: Improve dump_decl for standard concepts MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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’? 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/ChangeLog | 6 ++++++ gcc/cp/error.c | 18 ++++++++---------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/cpp2a/concepts6.C | 18 ++++++++++++++++++ 4 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a8b447b5740..5a6e3564eda 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-02-12 Patrick Palka + + * error.c (dump_decl) [CONCEPT_DECL]: Use dump_simple_decl. + (dump_simple_decl): Handle standard concept definitions as well as + variable concept definitions. + 2020-02-10 Jakub Jelinek PR other/93641 diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 8ec1653d87a..cc51b6ffe13 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/ChangeLog b/gcc/testsuite/ChangeLog index 290bd8afdfa..5f31ceb04de 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2020-02-12 Patrick Palka + + * g++.dg/cpp2a/concepts6.C: New test. + 2020-02-10 David Malcolm PR analyzer/93350 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 + concept b = true; // { dg-message ".a::b. declared here" } +} + +static_assert(b); // { dg-error "did you mean .a::b." } + +namespace c +{ + template + concept b = true; // { dg-message "concept c::b." } + + template + concept b = true; // { dg-error "concept c::b." } +} -- 2.30.2