class.c (handle_using_decl): Reject using of constructor name of sourcing class.
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 9 Jan 2001 11:37:07 +0000 (11:37 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 9 Jan 2001 11:37:07 +0000 (11:37 +0000)
cp:
* class.c (handle_using_decl): Reject using of constructor name
of sourcing class. Allow injecting of a method with same name as
nested class. Fixup error messages.
testsuite:
* g++.old_deja/g++.pt/using8.C: New test.

From-SVN: r38831

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/using8.C [new file with mode: 0644]

index 4c84be0b506b46fe295e8cfc73bcf035d07360eb..fe4ee2032c001cb336300537c0ca016ea361cfdb 100644 (file)
@@ -1,3 +1,9 @@
+2001-01-09  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * class.c (handle_using_decl): Reject using of constructor name
+       of sourcing class. Allow injecting of a method with same name as
+       nested class. Fixup error messages.
+
 2001-01-09  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * decl2.c (lang_decode_option): Handle -Wformat=2.
index 8b04aa3014ac7de3590ef70bbd2ee57f9ce4d258..ada9779ec93f3e26aeef7c6bb02b663d52eb0d4e 100644 (file)
@@ -1527,7 +1527,13 @@ handle_using_decl (using_decl, t)
   if (name == constructor_name (ctype)
       || name == constructor_name_full (ctype))
     {
-      cp_error_at ("using-declaration for constructor", using_decl);
+      cp_error_at ("`%D' names constructor", using_decl);
+      return;
+    }
+  if (name == constructor_name (t)
+      || name == constructor_name_full (t))
+    {
+      cp_error_at ("`%D' invalid in `%T'", using_decl, t);
       return;
     }
 
@@ -1567,16 +1573,16 @@ handle_using_decl (using_decl, t)
           the same name already present in the current class.  */;
       else
        {
-         cp_error ("`%D' invalid in `%#T'", using_decl, t);
+         cp_error_at ("`%D' invalid in `%#T'", using_decl, t);
          cp_error_at ("  because of local method `%#D' with same name",
                       OVL_CURRENT (old_value));
          return;
        }
     }
-  else
+  else if (!DECL_ARTIFICIAL (old_value))
     {
-      cp_error ("`%D' invalid in `%#T'", using_decl, t);
-      cp_error_at ("  because of local field `%#D' with same name", old_value);
+      cp_error_at ("`%D' invalid in `%#T'", using_decl, t);
+      cp_error_at ("  because of local member `%#D' with same name", old_value);
       return;
     }
   
index 5eac7717f7ecec15f1c0a35b3cbe08af0196c05b..c47778d31f9e5ca4e37f6286fca021d6ddf92e86 100644 (file)
@@ -1,3 +1,7 @@
+2001-01-09  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old_deja/g++.pt/using8.C: New test.
+
 2001-01-09  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * gcc.dg/format/attr-2.c, gcc.dg/format/attr-3.c: New tests.
diff --git a/gcc/testsuite/g++.old-deja/g++.other/using8.C b/gcc/testsuite/g++.old-deja/g++.other/using8.C
new file mode 100644 (file)
index 0000000..1dc29de
--- /dev/null
@@ -0,0 +1,43 @@
+// Build don't link:
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Nov 2000 <nathan@codesourcery.com>
+
+// We rejected using decls bringing in functions from a base which would hide a
+// nested class of the same name, but only if we had no functions by that name
+// already. Also, we failed to find that using declaration during lookup. Also
+// we failed to reject using declarations which matched the constructor name.
+
+struct A
+{
+  int f ();
+  void D ();
+};
+
+struct A2 {
+  typedef int f;
+};
+
+struct B : A 
+{
+  using A::f;
+  struct f {};
+};
+
+struct C : A 
+{
+  using A::f;
+  int f (int);
+  struct f {};
+};
+
+void foo (B *bp, C* cp)
+{
+  bp->f ();
+  cp->f ();
+}
+
+struct D : A
+{
+  using A::D;   // ERROR - names constructor
+};