Commit 81ff723b by Alexander Malmberg Committed by Ziemowit Laski

objc-act.c (add_method_to_hash_list, [...]): New functions.

[gcc]
2003-10-03  Alexander Malmberg  <alexander@malmberg.org>
            Ziemowit Laski  <zlaski@apple.com>

        * objc/objc-act.c (add_method_to_hash_list, lookup_category):
        New functions.
        (lookup_method_in_hash_lists): New parameter indicating whether
        we are messaging 'Class' or 'id'.
        (check_duplicates): Likewise; do not assume all methods will
        be either class or instance methods.
        (generate_category, finish_class): Use lookup_category().
        (add_method): Use add_method_to_hash_list(); insert instance
        methods of root classes into the global class method hash table.
        (add_category): Use lookup_category(); avoid constructing
        duplicate categories.
        (really_start_method): Add method to corresponding @interface,
        if not already there (and if the @interface exists).
        (finish_message_expr, finish_objc): Adjust calls to
        check_duplicates().

[gcc/testsuite]
2003-10-03  Alexander Malmberg  <alexander@malmberg.org>
            Ziemowit Laski  <zlaski@apple.com>

        * objc.dg/method-6.m ('starboard'): Move prototype from 'Base' to
        'Derived', so that it is never considered a class method; add
        new warning for '+port' method ambiguity.
        * objc.dg/method-12.m: Include <objc/objc.h> instead of
        <objc/objc-api.h> (needed on Mac OS X).
        * objc.dg/method-13.m: New test.

Co-Authored-By: Ziemowit Laski <zlaski@apple.com>

From-SVN: r72080
parent 875eda9c
2003-10-03 Alexander Malmberg <alexander@malmberg.org>
Ziemowit Laski <zlaski@apple.com>
* objc/objc-act.c (add_method_to_hash_list, lookup_category):
New functions.
(lookup_method_in_hash_lists): New parameter indicating whether
we are messaging 'Class' or 'id'.
(check_duplicates): Likewise; do not assume all methods will
be either class or instance methods.
(generate_category, finish_class): Use lookup_category().
(add_method): Use add_method_to_hash_list(); insert instance
methods of root classes into the global class method hash table.
(add_category): Use lookup_category(); avoid constructing
duplicate categories.
(really_start_method): Add method to corresponding @interface,
if not already there (and if the @interface exists).
(finish_message_expr, finish_objc): Adjust calls to
check_duplicates().
2003-10-03 Roger Sayle <roger@eyesopen.com> 2003-10-03 Roger Sayle <roger@eyesopen.com>
PR optimization/9325, PR java/6391 PR optimization/9325, PR java/6391
......
2003-10-03 Alexander Malmberg <alexander@malmberg.org>
Ziemowit Laski <zlaski@apple.com>
* objc.dg/method-6.m ('starboard'): Move prototype from 'Base' to
'Derived', so that it is never considered a class method; add
new warning for '+port' method ambiguity.
* objc.dg/method-12.m: Include <objc/objc.h> instead of
<objc/objc-api.h> (needed on Mac OS X).
* objc.dg/method-13.m: New test.
2003-10-03 Roger Sayle <roger@eyesopen.com> 2003-10-03 Roger Sayle <roger@eyesopen.com>
PR optimization/9325, PR java/6391 PR optimization/9325, PR java/6391
......
/* Contributed by Igor Seleznev <selez@mail.ru>. */ /* Contributed by Igor Seleznev <selez@mail.ru>. */
/* This used to be broken. */ /* This used to be broken. */
#include <objc/objc-api.h> #include <objc/objc.h>
@interface A @interface A
+ (A *)currentContext; + (A *)currentContext;
......
/* Test if instance methods of root classes are used as class methods, if no
"real" methods are found. For receivers of type 'id' and 'Class', all
root classes must be considered. */
/* Author: Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */
#include <objc/objc.h>
#ifdef __NEXT_RUNTIME__
#define OBJC_GETCLASS objc_getClass
#else
#define OBJC_GETCLASS objc_get_class
#endif
extern void abort(void);
extern int strcmp(const char *, const char *);
#define CHECK_IF(expr) if(!(expr)) abort()
@protocol Proto
- (const char *) method4;
@end
@interface Root
{ Class isa; }
+ (const char *) method2;
@end
@interface Derived: Root
- (const char *) method1;
- (const char *) method2;
- (const char *) method3;
@end
@interface Root (Categ)
- (const char *) method3;
@end
@implementation Root (Categ)
- (const char *) method3 { return "Root(Categ)::-method3"; }
- (const char *) method4 { return "Root(Categ)::-method4"; }
@end
@implementation Derived
- (const char *) method1 { return "Derived::-method1"; }
- (const char *) method2 { return "Derived::-method2"; }
- (const char *) method3 { return "Derived::-method3"; }
@end
@implementation Root
#ifdef __NEXT_RUNTIME__
+ + initialize { return self; }
#endif
- (const char *) method1 { return "Root::-method1"; }
+ (const char *) method2 { return "Root::+method2"; }
@end
int main(void)
{
Class obj = OBJC_GETCLASS("Derived");
/* None of the following should elicit compiler-time warnings. */
CHECK_IF(!strcmp([Root method1], "Root::-method1"));
CHECK_IF(!strcmp([Root method2], "Root::+method2"));
CHECK_IF(!strcmp([Root method3], "Root(Categ)::-method3"));
CHECK_IF(!strcmp([Root method4], "Root(Categ)::-method4"));
CHECK_IF(!strcmp([Derived method1], "Root::-method1"));
CHECK_IF(!strcmp([Derived method2], "Root::+method2"));
CHECK_IF(!strcmp([Derived method3], "Root(Categ)::-method3"));
CHECK_IF(!strcmp([Derived method4], "Root(Categ)::-method4"));
CHECK_IF(!strcmp([obj method1], "Root::-method1"));
CHECK_IF(!strcmp([obj method2], "Root::+method2"));
CHECK_IF(!strcmp([obj method3], "Root(Categ)::-method3"));
CHECK_IF(!strcmp([obj method4], "Root(Categ)::-method4"));
return 0;
}
/* Check that sending messages to variables of type 'Class' does not involve instance methods. */ /* Check that sending messages to variables of type 'Class' does not involve instance methods,
unless they reside in root classes. */
/* Author: Ziemowit Laski <zlaski@apple.com> */ /* Author: Ziemowit Laski <zlaski@apple.com> */
/* { dg-do compile } */ /* { dg-do compile } */
...@@ -6,21 +7,25 @@ ...@@ -6,21 +7,25 @@
@interface Base @interface Base
- (unsigned)port; - (unsigned)port;
- (id)starboard;
@end @end
@interface Derived: Base @interface Derived: Base
- (Object *)port; - (Object *)port;
+ (Protocol *)port; + (Protocol *)port;
- (id)starboard;
@end @end
id foo(void) { void foo(void) {
Class receiver; Class receiver;
id p = [receiver port]; /* there should be no warnings here! */
p = [receiver starboard]; /* { dg-warning ".Class. may not respond to .\\+starboard." } */ [receiver port]; /* { dg-warning "multiple methods named .\\+port. found" } */
/* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 20 } */ /* { dg-warning "using .\\-\\(unsigned\\)port." "" { target *-*-* } 9 } */
/* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 20 } */ /* { dg-warning "also found .\\+\\(Protocol \\*\\)port." "" { target *-*-* } 14 } */
/* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 20 } */
p = [Class port]; /* { dg-error ".Class. is not an Objective\\-C class name or alias" } */ [receiver starboard]; /* { dg-warning ".Class. may not respond to .\\+starboard." } */
return p; /* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 25 } */
/* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 25 } */
/* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 25 } */
[Class port]; /* { dg-error ".Class. is not an Objective\\-C class name or alias" } */
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment