c++: using from enclosing class template [PR105006]
authorJason Merrill <jason@redhat.com>
Tue, 22 Mar 2022 15:17:26 +0000 (11:17 -0400)
committerJason Merrill <jason@redhat.com>
Wed, 23 Mar 2022 12:56:17 +0000 (08:56 -0400)
Here, DECL_DEPENDENT_P was false for the second using because Row<eT> is
"the current instantiation", so lookup succeeds.  But since Row itself has a
dependent using-decl for operator(), the set of functions imported by the
second using is dependent, so we should set the flag.

PR c++/105006

gcc/cp/ChangeLog:

* name-lookup.cc (lookup_using_decl): Set DECL_DEPENDENT_P if lookup
finds a dependent using.

gcc/testsuite/ChangeLog:

* g++.dg/template/using30.C: New test.

gcc/cp/name-lookup.cc
gcc/testsuite/g++.dg/template/using30.C [new file with mode: 0644]

index 323f96b..ea947fa 100644 (file)
@@ -5665,6 +5665,21 @@ lookup_using_decl (tree scope, name_lookup &lookup)
        lookup.value = lookup_member (binfo, lookup.name, /*protect=*/2,
                                      /*want_type=*/false, tf_none);
 
+      /* If the lookup in the base contains a dependent using, this
+        using is also dependent.  */
+      if (!dependent_p && lookup.value)
+       {
+         tree val = lookup.value;
+         if (tree fns = maybe_get_fns (val))
+           val = fns;
+         for (tree f: lkp_range (val))
+           if (TREE_CODE (f) == USING_DECL && DECL_DEPENDENT_P (f))
+             {
+               dependent_p = true;
+               break;
+             }
+       }
+
       if (!depscope && b_kind < bk_proper_base)
        {
          if (cxx_dialect >= cxx20 && lookup.value
diff --git a/gcc/testsuite/g++.dg/template/using30.C b/gcc/testsuite/g++.dg/template/using30.C
new file mode 100644 (file)
index 0000000..914252d
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/105006
+
+template<class eT>
+class Row {
+  using eT::operator();
+  void operator()();
+  class fixed;
+};
+
+template<class eT>
+class Row<eT>::fixed : Row {
+  using Row::operator();
+};