OSDN Git Service

* decl2.c (import_export_decl): Use same_type_p, rather than
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Jun 1999 17:48:05 +0000 (17:48 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Jun 1999 17:48:05 +0000 (17:48 +0000)
relying on pointer-equality for types.
* method.c (do_build_copy_constructor): Simplify.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@27555 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/cp/method.c
gcc/testsuite/g++.old-deja/g++.eh/catch2.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.other/copy2.C [new file with mode: 0644]

index 4336252..1037548 100644 (file)
@@ -1,5 +1,10 @@
 1999-06-16  Mark Mitchell  <mark@codesourcery.com>
 
+       * decl2.c (import_export_decl): Use same_type_p, rather than
+       relying on pointer-equality for types.
+
+       * method.c (do_build_copy_constructor): Simplify.
+
        * call.c (build_method_call): Remove bogus code for two-argument
        delete.
        * init.c (build_new_1): Expand on comment, and remove dead code.
index 793a974..3b09993 100644 (file)
@@ -2807,7 +2807,7 @@ import_export_decl (decl)
             since it will not be emitted when the vtable for the type
             is output (which is when the unqualified version is
             generated).  */
-         && ctype == TYPE_MAIN_VARIANT (ctype))
+         && same_type_p (ctype, TYPE_MAIN_VARIANT (ctype)))
        {
          DECL_NOT_REALLY_EXTERN (decl)
            = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
@@ -2818,7 +2818,8 @@ import_export_decl (decl)
          if (flag_weak)
            comdat_linkage (decl);
        }
-      else if (TYPE_BUILT_IN (ctype) && ctype == TYPE_MAIN_VARIANT (ctype))
+      else if (TYPE_BUILT_IN (ctype) 
+              && same_type_p (ctype, TYPE_MAIN_VARIANT (ctype)))
        DECL_NOT_REALLY_EXTERN (decl) = 0;
       else
        comdat_linkage (decl);
index cf03013..caa3eb5 100644 (file)
@@ -2231,42 +2231,21 @@ do_build_copy_constructor (fndecl)
       tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
       int i;
 
+      /* Initialize all the base-classes.  */
       for (t = CLASSTYPE_VBASECLASSES (current_class_type); t;
           t = TREE_CHAIN (t))
-       {
-         tree basetype = BINFO_TYPE (t);
-         tree p = convert_to_reference
-           (build_reference_type (basetype), parm,
-            CONV_IMPLICIT|CONV_CONST, LOOKUP_COMPLAIN, NULL_TREE);
-         p = convert_from_reference (p);
-
-         if (p == error_mark_node)
-           cp_error ("in default copy constructor");
-         else 
-           current_base_init_list = tree_cons (basetype,
-                                               p, current_base_init_list);
-       }
-       
+       current_base_init_list 
+         = tree_cons (BINFO_TYPE (t), parm, current_base_init_list);
       for (i = 0; i < n_bases; ++i)
        {
-         tree p, basetype = TREE_VEC_ELT (binfos, i);
-         if (TREE_VIA_VIRTUAL (basetype))
+         t = TREE_VEC_ELT (binfos, i);
+         if (TREE_VIA_VIRTUAL (t))
            continue; 
 
-         basetype = BINFO_TYPE (basetype);
-         p = convert_to_reference
-           (build_reference_type (basetype), parm,
-            CONV_IMPLICIT|CONV_CONST, LOOKUP_COMPLAIN, NULL_TREE);
-
-         if (p == error_mark_node) 
-           cp_error ("in default copy constructor");
-         else 
-           {
-             p = convert_from_reference (p);
-             current_base_init_list = tree_cons (basetype,
-                                                 p, current_base_init_list);
-           }
+         current_base_init_list 
+           = tree_cons (BINFO_TYPE (t), parm, current_base_init_list);
        }
+
       for (; fields; fields = TREE_CHAIN (fields))
        {
          tree init, t;
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/catch2.C b/gcc/testsuite/g++.old-deja/g++.eh/catch2.C
new file mode 100644 (file)
index 0000000..66c607a
--- /dev/null
@@ -0,0 +1,11 @@
+// Build don't link:
+// Origin: Mike Danylchuk <miked@mpath.com>
+
+typedef char TCHAR;
+
+int main()
+{
+  try {}
+  catch( TCHAR* Err ) {}
+}
+
diff --git a/gcc/testsuite/g++.old-deja/g++.other/copy2.C b/gcc/testsuite/g++.old-deja/g++.other/copy2.C
new file mode 100644 (file)
index 0000000..2fb52a1
--- /dev/null
@@ -0,0 +1,21 @@
+// Origin: Mark Mitchell <mark@codesourcery.com>
+
+int i;
+
+struct B {
+  B () {}
+  B (B&) { i = 1; }
+  B (const B&) { i = 2; }
+};
+
+struct D : public B {
+  D () {}
+};
+
+int main ()
+{
+  D d;
+  D d2 (d);
+  if (i != 2)
+    return 1;
+}