c++: Fix useless using-declaration.
authorJason Merrill <jason@redhat.com>
Thu, 13 Feb 2020 15:56:08 +0000 (16:56 +0100)
committerJason Merrill <jason@redhat.com>
Thu, 13 Feb 2020 21:32:13 +0000 (22:32 +0100)
Here reintroducing the same declarations into the global namespace via
using-declaration is useless but OK.  And a function and a function template
with the same parameters do not conflict.

gcc/cp/ChangeLog
2020-02-13  Jason Merrill  <jason@redhat.com>

PR c++/93713
* name-lookup.c (matching_fn_p): A function does not match a
template.

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/g++.dg/lookup/using62.C [new file with mode: 0644]

index 8d7d91ce719cd1cd4574c4fe6bbdcf13652e93d4..793e4afffcba070b90053c45fe8b4d36060af23e 100644 (file)
@@ -1,5 +1,9 @@
 2020-02-13  Jason Merrill  <jason@redhat.com>
 
+       PR c++/93713
+       * name-lookup.c (matching_fn_p): A function does not match a
+       template.
+
        PR c++/93643
        PR c++/91476
        * tree.c (decl_linkage): Always lk_none for locals.
index 2a9bae531627eedb6579038b5c4e2ddcdfe5a044..e5638d2df9188ea85e247bdd4a872807295b7728 100644 (file)
@@ -2321,12 +2321,14 @@ update_local_overload (cxx_binding *binding, tree newval)
 static bool
 matching_fn_p (tree one, tree two)
 {
+  if (TREE_CODE (one) != TREE_CODE (two))
+    return false;
+
   if (!compparms (TYPE_ARG_TYPES (TREE_TYPE (one)),
                  TYPE_ARG_TYPES (TREE_TYPE (two))))
     return false;
 
-  if (TREE_CODE (one) == TEMPLATE_DECL
-      && TREE_CODE (two) == TEMPLATE_DECL)
+  if (TREE_CODE (one) == TEMPLATE_DECL)
     {
       /* Compare template parms.  */
       if (!comp_template_parms (DECL_TEMPLATE_PARMS (one),
diff --git a/gcc/testsuite/g++.dg/lookup/using62.C b/gcc/testsuite/g++.dg/lookup/using62.C
new file mode 100644 (file)
index 0000000..e7a952a
--- /dev/null
@@ -0,0 +1,3 @@
+template <class T> T bar ();
+void bar () {}
+using :: bar;