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>
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>
PR optimization/9325, PR java/6391
......
/* Contributed by Igor Seleznev <selez@mail.ru>. */
/* This used to be broken. */
#include <objc/objc-api.h>
#include <objc/objc.h>
@interface A
+ (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> */
/* { dg-do compile } */
......@@ -6,21 +7,25 @@
@interface Base
- (unsigned)port;
- (id)starboard;
@end
@interface Derived: Base
- (Object *)port;
+ (Protocol *)port;
- (id)starboard;
@end
id foo(void) {
void foo(void) {
Class receiver;
id p = [receiver port]; /* there should be no warnings here! */
p = [receiver starboard]; /* { dg-warning ".Class. may not respond to .\\+starboard." } */
/* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 20 } */
/* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 20 } */
/* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 20 } */
p = [Class port]; /* { dg-error ".Class. is not an Objective\\-C class name or alias" } */
return p;
[receiver port]; /* { dg-warning "multiple methods named .\\+port. found" } */
/* { dg-warning "using .\\-\\(unsigned\\)port." "" { target *-*-* } 9 } */
/* { dg-warning "also found .\\+\\(Protocol \\*\\)port." "" { target *-*-* } 14 } */
[receiver starboard]; /* { dg-warning ".Class. may not respond to .\\+starboard." } */
/* { 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