diff options
author | Nicola Pero <nicola.pero@meta-innovation.com> | 2010-09-15 00:08:59 +0000 |
---|---|---|
committer | Nicola Pero <nicola@gcc.gnu.org> | 2010-09-15 00:08:59 +0000 |
commit | 0f185d6eb2c73f4bb738baffbbd095cc2fcde2b9 (patch) | |
tree | 2176ab485e48382593d75f7310be5df0168c4713 | |
parent | 187c10dc7be89ff530b37df6a07d301a4be46e83 (diff) | |
download | gcc-0f185d6eb2c73f4bb738baffbbd095cc2fcde2b9.zip gcc-0f185d6eb2c73f4bb738baffbbd095cc2fcde2b9.tar.gz gcc-0f185d6eb2c73f4bb738baffbbd095cc2fcde2b9.tar.bz2 |
In gcc/testsuite/:
2010-09-15 Nicola Pero <nicola.pero@meta-innovation.com>
Merge from 'apple/trunk' branch on FSF servers.
2006-03-09 Fariborz Jahanian <fjahanian@apple.com>
Radar 4457381
* objc.dg/msg-in-protocol.m: New.
* obj-c++.dg/msg-in-protocol.mm: New.
2006-02-07 Fariborz Jahanian <fjahanian@apple.com>
Radar 4219590
* objc.dg/break-in-ifstmt.m: New.
2005-08-22 Ziemowit Laski <zlaski@apple.com>
Radar 4174166
* obj-c++.dg/comp-types-13.mm: New.
* objc.dg/comp-types-12.m: New.
2005-08-22 Ziemowit Laski <zlaski@apple.com>
Radar 4216500
* obj-c++.dg/proto-lossage-7.mm: New.
* objc.dg/proto-lossage-7.m: New.
In gcc/objc/:
2010-09-15 Nicola Pero <nicola.pero@meta-innovation.com>
Merge from 'apple/trunk' branch on FSF servers.
2006-03-09 Fariborz Jahanian <fjahanian@apple.com>
Radar 4457381
* objc/objc-act.c (objc_finish_message_expr): Look for message in
@class's protocol list.
2006-02-07 Fariborz Jahanian <fjahanian@apple.com>
Radar 4219590
* objc/objc-act.c (objc_start_method_definition): Initialize
break/continue labels.
2005-08-22 Ziemowit Laski <zlaski@apple.com>
Radar 4174166
* objc-act.c (objc_compare_types): Compare function
pointers; indicate success if the right-hand side has
a return type that is covariant, and the argument types
contravariant, with those of the left side.
2005-08-22 Ziemowit Laski <zlaski@apple.com>
Radar 4216500
* objc-act.c (objc_get_protocol_qualified_type): When looking
at a typedef, retrieve the precise type it describes (rather
than merely looking up a class by name).
From-SVN: r164290
-rw-r--r-- | gcc/objc/ChangeLog | 31 | ||||
-rw-r--r-- | gcc/objc/objc-act.c | 51 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 27 | ||||
-rw-r--r-- | gcc/testsuite/obj-c++.dg/comp-types-13.mm | 19 | ||||
-rw-r--r-- | gcc/testsuite/obj-c++.dg/msg-in-protocol.mm | 18 | ||||
-rw-r--r-- | gcc/testsuite/obj-c++.dg/proto-lossage-7.mm | 28 | ||||
-rw-r--r-- | gcc/testsuite/objc.dg/break-in-ifstmt.m | 14 | ||||
-rw-r--r-- | gcc/testsuite/objc.dg/comp-types-12.m | 19 | ||||
-rw-r--r-- | gcc/testsuite/objc.dg/msg-in-protocol.m | 18 | ||||
-rw-r--r-- | gcc/testsuite/objc.dg/proto-lossage-7.m | 28 |
10 files changed, 251 insertions, 2 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index aff287b..132679b 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,34 @@ +2010-09-15 Nicola Pero <nicola.pero@meta-innovation.com> + + Merge from 'apple/trunk' branch on FSF servers. + + 2006-03-09 Fariborz Jahanian <fjahanian@apple.com> + + Radar 4457381 + * objc/objc-act.c (objc_finish_message_expr): Look for message in + @class's protocol list. + + 2006-02-07 Fariborz Jahanian <fjahanian@apple.com> + + Radar 4219590 + * objc/objc-act.c (objc_start_method_definition): Initialize + break/continue labels. + + 2005-08-22 Ziemowit Laski <zlaski@apple.com> + + Radar 4174166 + * objc-act.c (objc_compare_types): Compare function + pointers; indicate success if the right-hand side has + a return type that is covariant, and the argument types + contravariant, with those of the left side. + + 2005-08-22 Ziemowit Laski <zlaski@apple.com> + + Radar 4216500 + * objc-act.c (objc_get_protocol_qualified_type): When looking + at a typedef, retrieve the precise type it describes (rather + than merely looking up a class by name). + 2010-09-10 Nicola Pero <nicola.pero@meta-innovation.com> * objc/objc-act.c (objc_begin_try_stmt): Generate an error if diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 38420c7..d8fbe36 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -788,6 +788,13 @@ objc_start_method_definition (tree decl) if (!objc_implementation_context) fatal_error ("method definition not in @implementation context"); +#ifndef OBJCPLUS + /* Indicate no valid break/continue context by setting these variables + to some non-null, non-label value. We'll notice and emit the proper + error message in c_finish_bc_stmt. */ + c_break_label = c_cont_label = size_zero_node; +#endif + objc_add_method (objc_implementation_context, decl, objc_inherit_code == CLASS_METHOD_DECL); @@ -1131,6 +1138,29 @@ objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee) } while (POINTER_TYPE_P (ltyp) && POINTER_TYPE_P (rtyp)); + /* We must also handle function pointers, since ObjC is a bit more + lenient than C or C++ on this. */ + if (TREE_CODE (ltyp) == FUNCTION_TYPE && TREE_CODE (rtyp) == FUNCTION_TYPE) + { + /* Return types must be covariant. */ + if (!comptypes (TREE_TYPE (ltyp), TREE_TYPE (rtyp)) + && !objc_compare_types (TREE_TYPE (ltyp), TREE_TYPE (rtyp), + argno, callee)) + return false; + + /* Argument types must be contravariant. */ + for (ltyp = TYPE_ARG_TYPES (ltyp), rtyp = TYPE_ARG_TYPES (rtyp); + ltyp && rtyp; ltyp = TREE_CHAIN (ltyp), rtyp = TREE_CHAIN (rtyp)) + { + if (!comptypes (TREE_VALUE (rtyp), TREE_VALUE (ltyp)) + && !objc_compare_types (TREE_VALUE (rtyp), TREE_VALUE (ltyp), + argno, callee)) + return false; + } + + return (ltyp == rtyp); + } + /* Past this point, we are only interested in ObjC class instances, or 'id' or 'Class'. */ if (TREE_CODE (ltyp) != RECORD_TYPE || TREE_CODE (rtyp) != RECORD_TYPE) @@ -1415,7 +1445,17 @@ objc_get_protocol_qualified_type (tree interface, tree protocols) type = objc_is_class_name (interface); if (type) - type = xref_tag (RECORD_TYPE, type); + { + /* If looking at a typedef, retrieve the precise type it + describes. */ + if (TREE_CODE (interface) == IDENTIFIER_NODE) + interface = identifier_global_value (interface); + + type = ((interface && TREE_CODE (interface) == TYPE_DECL + && DECL_ORIGINAL_TYPE (interface)) + ? DECL_ORIGINAL_TYPE (interface) + : xref_tag (RECORD_TYPE, type)); + } else return interface; } @@ -6360,7 +6400,14 @@ objc_finish_message_expr (tree receiver, tree sel_name, tree method_params) more intelligent about which methods the receiver will understand. */ if (!rtype || TREE_CODE (rtype) == IDENTIFIER_NODE) - rtype = NULL_TREE; + { + rtype = NULL_TREE; + /* We could not find an @interface declaration, yet Message maybe in a + @class's protocol. */ + if (!method_prototype && rprotos) + method_prototype + = lookup_method_in_protocol_list (rprotos, sel_name, 0); + } else if (TREE_CODE (rtype) == CLASS_INTERFACE_TYPE || TREE_CODE (rtype) == CLASS_IMPLEMENTATION_TYPE) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e5936b3..dc91d21 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,30 @@ +2010-09-15 Nicola Pero <nicola.pero@meta-innovation.com> + + Merge from 'apple/trunk' branch on FSF servers. + + 2006-03-09 Fariborz Jahanian <fjahanian@apple.com> + + Radar 4457381 + * objc.dg/msg-in-protocol.m: New. + * obj-c++.dg/msg-in-protocol.mm: New. + + 2006-02-07 Fariborz Jahanian <fjahanian@apple.com> + + Radar 4219590 + * objc.dg/break-in-ifstmt.m: New. + + 2005-08-22 Ziemowit Laski <zlaski@apple.com> + + Radar 4174166 + * obj-c++.dg/comp-types-13.mm: New. + * objc.dg/comp-types-12.m: New. + + 2005-08-22 Ziemowit Laski <zlaski@apple.com> + + Radar 4216500 + * obj-c++.dg/proto-lossage-7.mm: New. + * objc.dg/proto-lossage-7.m: New. + 2010-09-14 Jan Hubicka <jh@suse.cz> * gfortran.dg/vect/fast-math-pr38968.f90: Add common to prevent diff --git a/gcc/testsuite/obj-c++.dg/comp-types-13.mm b/gcc/testsuite/obj-c++.dg/comp-types-13.mm new file mode 100644 index 0000000..3a919d5 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/comp-types-13.mm @@ -0,0 +1,19 @@ +/* When assigning function pointers, allow for covariant return types + and contravariant argument types. */ +/* { dg-do compile } */ +#include <objc/Object.h> + +@class Derived; + +Object *ExternFunc (Object *filePath, Object *key); +typedef id FuncSignature (Object *arg1, Derived *arg2); + +@interface Derived: Object ++ (void)registerFunc:(FuncSignature *)function; +@end + +void foo(void) +{ + [Derived registerFunc: ExternFunc]; +} + diff --git a/gcc/testsuite/obj-c++.dg/msg-in-protocol.mm b/gcc/testsuite/obj-c++.dg/msg-in-protocol.mm new file mode 100644 index 0000000..86b7c85 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/msg-in-protocol.mm @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +#include <objc/objc.h> + +@class Foo; + +@protocol Bar + +- (void)bang; + +@end + +void foo() +{ + Foo<Bar> *foo = nil; + [foo bang]; +} + diff --git a/gcc/testsuite/obj-c++.dg/proto-lossage-7.mm b/gcc/testsuite/obj-c++.dg/proto-lossage-7.mm new file mode 100644 index 0000000..b7746d7 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/proto-lossage-7.mm @@ -0,0 +1,28 @@ +/* Check that typedefs of ObjC classes preserve + any @protocol qualifiers. */ +/* { dg-do compile } */ +#include <objc/Object.h> + +@protocol CanDoStuff; + +typedef Object<CanDoStuff> CanDoStuffType; +typedef Object<CanDoStuff> *CanDoStuffTypePtr; + +@protocol CanDoStuff +- (int) dostuff; +@end + +@protocol MoreStuff +- (int) morestuff; +@end + +int main(void) +{ + CanDoStuffTypePtr dice = nil; + CanDoStuffType *nodice = nil; + int count; + count = [dice dostuff]; + count = [nodice dostuff]; + return 0; +} + diff --git a/gcc/testsuite/objc.dg/break-in-ifstmt.m b/gcc/testsuite/objc.dg/break-in-ifstmt.m new file mode 100644 index 0000000..8968494 --- /dev/null +++ b/gcc/testsuite/objc.dg/break-in-ifstmt.m @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +@interface foo +- (void) test; +@end + +@implementation foo +-(void) test { + if (1) { + break; /* { dg-error "break" } */ + } +} +@end + diff --git a/gcc/testsuite/objc.dg/comp-types-12.m b/gcc/testsuite/objc.dg/comp-types-12.m new file mode 100644 index 0000000..3a919d5 --- /dev/null +++ b/gcc/testsuite/objc.dg/comp-types-12.m @@ -0,0 +1,19 @@ +/* When assigning function pointers, allow for covariant return types + and contravariant argument types. */ +/* { dg-do compile } */ +#include <objc/Object.h> + +@class Derived; + +Object *ExternFunc (Object *filePath, Object *key); +typedef id FuncSignature (Object *arg1, Derived *arg2); + +@interface Derived: Object ++ (void)registerFunc:(FuncSignature *)function; +@end + +void foo(void) +{ + [Derived registerFunc: ExternFunc]; +} + diff --git a/gcc/testsuite/objc.dg/msg-in-protocol.m b/gcc/testsuite/objc.dg/msg-in-protocol.m new file mode 100644 index 0000000..86b7c85 --- /dev/null +++ b/gcc/testsuite/objc.dg/msg-in-protocol.m @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +#include <objc/objc.h> + +@class Foo; + +@protocol Bar + +- (void)bang; + +@end + +void foo() +{ + Foo<Bar> *foo = nil; + [foo bang]; +} + diff --git a/gcc/testsuite/objc.dg/proto-lossage-7.m b/gcc/testsuite/objc.dg/proto-lossage-7.m new file mode 100644 index 0000000..b7746d7 --- /dev/null +++ b/gcc/testsuite/objc.dg/proto-lossage-7.m @@ -0,0 +1,28 @@ +/* Check that typedefs of ObjC classes preserve + any @protocol qualifiers. */ +/* { dg-do compile } */ +#include <objc/Object.h> + +@protocol CanDoStuff; + +typedef Object<CanDoStuff> CanDoStuffType; +typedef Object<CanDoStuff> *CanDoStuffTypePtr; + +@protocol CanDoStuff +- (int) dostuff; +@end + +@protocol MoreStuff +- (int) morestuff; +@end + +int main(void) +{ + CanDoStuffTypePtr dice = nil; + CanDoStuffType *nodice = nil; + int count; + count = [dice dostuff]; + count = [nodice dostuff]; + return 0; +} + |