c++: Member fns and deduction guide rewriting [PR98929]
authorJason Merrill <jason@redhat.com>
Tue, 2 Feb 2021 15:08:48 +0000 (10:08 -0500)
committerJason Merrill <jason@redhat.com>
Tue, 2 Feb 2021 17:11:39 +0000 (12:11 -0500)
My patch for 96199 had us re-substitute the parameter types of a constructor
in order to rewrite mentions of members into dependent references.  We need
to do that for member functions, too.

gcc/cp/ChangeLog:

PR c++/98929
PR c++/96199
* error.c (dump_expr): Ignore dummy object.
* pt.c (tsubst_baselink): Handle dependent scope.

gcc/testsuite/ChangeLog:

PR c++/98929
* g++.dg/cpp1z/class-deduction-decltype1.C: New test.

gcc/cp/error.c
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1z/class-deduction-decltype1.C [new file with mode: 0644]

index 60f4fd691f33030e900c81511291e38da6a728c1..5213a8030ca4a99102155b7d61fe20e4fa81ff65 100644 (file)
@@ -2352,7 +2352,8 @@ dump_expr (cxx_pretty_printer *pp, tree t, int flags)
        if (INDIRECT_REF_P (ob))
          {
            ob = TREE_OPERAND (ob, 0);
-           if (!is_this_parameter (ob))
+           if (!is_this_parameter (ob)
+               && !is_dummy_object (ob))
              {
                dump_expr (pp, ob, flags | TFF_EXPR_IN_PARENS);
                if (TYPE_REF_P (TREE_TYPE (ob)))
index db0ff73bdeb8a75c9b9b50d1dbbc01ccd0838ee9..aa1687a9f2a8a675085985e5d9850380228722a6 100644 (file)
@@ -16196,6 +16196,16 @@ tsubst_baselink (tree baselink, tree object_type,
       if (IDENTIFIER_CONV_OP_P (name))
        name = make_conv_op_name (optype);
 
+      /* See maybe_dependent_member_ref.  */
+      if (dependent_scope_p (qualifying_scope))
+       {
+         if (template_id_p)
+           name = build2 (TEMPLATE_ID_EXPR, unknown_type_node, name,
+                          template_args);
+         return build_qualified_name (NULL_TREE, qualifying_scope, name,
+                                      /* ::template */false);
+       }
+
       if (name == complete_dtor_identifier)
        /* Treat as-if non-dependent below.  */
        dependent_p = false;
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction-decltype1.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction-decltype1.C
new file mode 100644 (file)
index 0000000..b83f7ad
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/98929
+// { dg-do compile { target c++17 } }
+
+template <typename T>
+struct A {
+  void foo ();
+  using c = decltype (foo ());
+  A (c);                       // { dg-message {decltype \(A<T>::foo} }
+};
+A d;                           // { dg-error "deduction failed" }
+// { dg-error "no match" "" { target *-*-* } .-1 }