c++: Improve dump_decl for standard concepts
authorPatrick Palka <ppalka@redhat.com>
Mon, 10 Feb 2020 15:48:27 +0000 (10:48 -0500)
committerPatrick Palka <ppalka@redhat.com>
Tue, 11 Feb 2020 01:43:49 +0000 (20:43 -0500)
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
gcc/cp/error.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp2a/concepts6.C [new file with mode: 0644]

index a8b447b57402800f0115905c63a4856f0975124f..5a6e3564edae4f11a672839d55b76eb4b1afe8ea 100644 (file)
@@ -1,3 +1,9 @@
+2020-02-12  Patrick Palka  <ppalka@redhat.com>
+
+       * 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  <jakub@redhat.com>
 
        PR other/93641
index 8ec1653d87a88b758048248f0fcaa30043067ed7..cc51b6ffe1339c11eafdbd8e9b87561c36d13bb1 100644 (file)
@@ -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:
index 290bd8afdfa8c82b0fbce6f097d723beee444371..5f31ceb04debc97e12fd1343607f778decfaed6c 100644 (file)
@@ -1,3 +1,7 @@
+2020-02-12  Patrick Palka  <ppalka@redhat.com>
+
+       * g++.dg/cpp2a/concepts6.C: New test.
+
 2020-02-10  David Malcolm  <dmalcolm@redhat.com>
 
        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 (file)
index 0000000..d69628b
--- /dev/null
@@ -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." }
+}