objc-act.c (objc_fold_objc_type_ref): New function.
authorZiemowit Laski <zlaski@apple.com>
Wed, 22 Sep 2004 01:13:07 +0000 (01:13 +0000)
committerZiemowit Laski <zlaski@gcc.gnu.org>
Wed, 22 Sep 2004 01:13:07 +0000 (01:13 +0000)
[gcc/objc/ChangeLog]
2004-09-21  Ziemowit Laski  <zlaski@apple.com>

        * objc-act.c (objc_fold_objc_type_ref): New function.
        * objc-act.h (objc_fold_objc_type_ref): New prototype.

From-SVN: r87838

gcc/objc/ChangeLog
gcc/objc/objc-act.c
gcc/objc/objc-act.h

index bfee61589e660132b20f4e3e0ecc99e22c7cf160..b391c39e8dbd723f3b08e171c48fe6d9d1f3fec0 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-21  Ziemowit Laski  <zlaski@apple.com>
+
+       * objc-act.c (objc_fold_objc_type_ref): New function.
+       * objc-act.h (objc_fold_objc_type_ref): New prototype.
+
 2004-09-09  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * objc-act.c (objc_start_function, really_start_method,
index f115ba44fd1e1548c669054b6a642009c49c6101..5488b78a8360f01ed24cf162e81baf979e53e981 100644 (file)
@@ -7530,6 +7530,33 @@ comp_proto_with_proto (tree proto1, tree proto2)
   return (!type1 && !type2);
 }
 
+/* Fold an OBJ_TYPE_REF expression for ObjC method dispatches, where
+   this occurs.  ObjC method dispatches are _not_ like C++ virtual
+   member function dispatches, and we account for the difference here.  */
+tree
+#ifdef OBJCPLUS
+objc_fold_obj_type_ref (tree ref, tree known_type)
+#else
+objc_fold_obj_type_ref (tree ref ATTRIBUTE_UNUSED,
+                       tree known_type ATTRIBUTE_UNUSED)
+#endif
+{
+#ifdef OBJCPLUS
+  tree v = BINFO_VIRTUALS (TYPE_BINFO (known_type));
+
+  /* If the receiver does not have virtual member functions, there
+     is nothing we can (or need to) do here.  */
+  if (!v)
+    return NULL_TREE;
+
+  /* Let C++ handle C++ virtual functions.  */
+  return cp_fold_obj_type_ref (ref, known_type);
+#else
+  /* For plain ObjC, we currently do not need to do anything.  */
+  return NULL_TREE;
+#endif
+}
+
 static void
 objc_start_function (tree name, tree type, tree attrs,
 #ifdef OBJCPLUS
index b80761d310feb120adebf192c25d957f32b05dba..52eeb448cfa89559a44679da223c0600a849fc2e 100644 (file)
@@ -27,6 +27,7 @@ Boston, MA 02111-1307, USA.  */
 bool objc_init (void);
 const char *objc_printable_name (tree, int);
 void objc_finish_file (void);
+tree objc_fold_obj_type_ref (tree, tree);
 
 /* NB: The remaining public functions are prototyped in c-common.h, for the
    benefit of stub-objc.c and objc-act.c.  */