aboutsummaryrefslogtreecommitdiff
path: root/gcc/objc
diff options
context:
space:
mode:
authorZiemowit Laski <zlaski@apple.com>2004-09-22 01:13:07 +0000
committerZiemowit Laski <zlaski@gcc.gnu.org>2004-09-22 01:13:07 +0000
commit86c440722e1c91d4bccb6ab1fc038cbfb00f55cd (patch)
treed35e40ac9524f339521769d9f0f6bfe8fb6d51a2 /gcc/objc
parent76419821c6f3f12f40049b33d63660a11f228758 (diff)
downloadgcc-86c440722e1c91d4bccb6ab1fc038cbfb00f55cd.zip
gcc-86c440722e1c91d4bccb6ab1fc038cbfb00f55cd.tar.gz
gcc-86c440722e1c91d4bccb6ab1fc038cbfb00f55cd.tar.bz2
objc-act.c (objc_fold_objc_type_ref): New function.
[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
Diffstat (limited to 'gcc/objc')
-rw-r--r--gcc/objc/ChangeLog5
-rw-r--r--gcc/objc/objc-act.c27
-rw-r--r--gcc/objc/objc-act.h1
3 files changed, 33 insertions, 0 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog
index bfee615..b391c39 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -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,
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index f115ba4..5488b78 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -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
diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h
index b80761d..52eeb44 100644
--- a/gcc/objc/objc-act.h
+++ b/gcc/objc/objc-act.h
@@ -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. */