* class.c (add_method): Allow using-declarations to coexist.
authorJason Merrill <jason@redhat.com>
Thu, 27 Oct 2016 13:39:48 +0000 (09:39 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 27 Oct 2016 13:39:48 +0000 (09:39 -0400)
From-SVN: r241620

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/g++.dg/overload/using4.C [new file with mode: 0644]

index 1276d13..efce361 100644 (file)
@@ -1,3 +1,7 @@
+2016-10-26  Jason Merrill  <jason@redhat.com>
+
+       * class.c (add_method): Allow using-declarations to coexist.
+
 2016-10-25  Jason Merrill  <jason@redhat.com>
 
        * constexpr.c (maybe_constant_init): Pull out TARGET_EXPR_INITIAL.
index d334b7c..a2a9346 100644 (file)
@@ -1094,6 +1094,11 @@ add_method (tree type, tree method, tree using_decl)
       if (TREE_CODE (fn) != TREE_CODE (method))
        continue;
 
+      /* Two using-declarations can coexist, we'll complain about ambiguity in
+        overload resolution.  */
+      if (using_decl && TREE_CODE (fns) == OVERLOAD && OVL_USED (fns))
+       continue;
+
       /* [over.load] Member function declarations with the
         same name and the same parameter types cannot be
         overloaded if any of them is a static member
diff --git a/gcc/testsuite/g++.dg/overload/using4.C b/gcc/testsuite/g++.dg/overload/using4.C
new file mode 100644 (file)
index 0000000..e4ee823
--- /dev/null
@@ -0,0 +1,19 @@
+struct A
+{
+  void f();
+};
+
+struct B
+{
+  void f();
+};
+
+struct C: A,B {
+  using A::f;
+  using B::f;
+};
+
+int main()
+{
+  C().f();                     // { dg-error "ambiguous" }
+}