diff options
author | Ziemowit Laski <zlaski@apple.com> | 2004-09-22 01:13:07 +0000 |
---|---|---|
committer | Ziemowit Laski <zlaski@gcc.gnu.org> | 2004-09-22 01:13:07 +0000 |
commit | 86c440722e1c91d4bccb6ab1fc038cbfb00f55cd (patch) | |
tree | d35e40ac9524f339521769d9f0f6bfe8fb6d51a2 /gcc/objc | |
parent | 76419821c6f3f12f40049b33d63660a11f228758 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/objc/objc-act.c | 27 | ||||
-rw-r--r-- | gcc/objc/objc-act.h | 1 |
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. */ |