1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
/* Check if casting 'self' or 'super' affects message lookup in the correct way. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do compile } */
#include "../objc-obj-c++-shared/TestsuiteObject.h"
/* NOTE: we are relying on the built-in type for objc_getClass being used
rather than the one that might come from including <objc/runtime.h>. */
#include <stddef.h>
/* FIXME: This is temporary. At the moment, the compiler, when
compiling for the GNU runtime and doing method checks, only
recognizes objc_get_class(), and not objc_getClass(). So
temporarily force objc_get_class() to be used. */
#ifndef __NEXT_RUNTIME__
# define objc_getClass(C) objc_get_class(C)
#endif
/* FIXME: casting of super is not permitted by clang, so that many of the
tests here are testing non-portable code. */
@protocol Func
+ (int) class_func0;
- (int) instance_func0;
@end
@interface Derived: TestsuiteObject
+ (int) class_func1;
+ (int) class_func2;
+ (int) class_func3;
+ (int) class_func4;
+ (int) class_func5;
+ (int) class_func6;
+ (int) class_func7;
- (int) instance_func1;
- (int) instance_func2;
- (int) instance_func3;
- (int) instance_func4;
- (int) instance_func5;
- (int) instance_func6;
- (int) instance_func7;
@end
@interface Derived (Categ)
+ (int) categ_class_func1;
+ (int) categ_class_func2;
- (int) categ_instance_func1;
- (int) categ_instance_func2;
@end
@implementation Derived
+ (int) class_func1
{
int i = (size_t)[self class_func0]; /* { dg-warning ".Derived. may not respond to .\\+class_func0." } */
return i + (size_t)[super class_func0]; /* { dg-warning ".TestsuiteObject. may not respond to .\\+class_func0." } */
}
+ (int) class_func2
{
int i = [(id <Func>)self class_func0]; /* { dg-warning ".\\-class_func0. not found in protocol" } */
i += [(id <Func>)super class_func0]; /* { dg-warning ".\\-class_func0. not found in protocol" } */
i += [(Class <Func>)self class_func0];
return i + [(Class <Func>)super class_func0];
}
+ (int) class_func3
{
return [(TestsuiteObject <Func> *)super class_func0];
}
+ (int) class_func4
{
return [(Derived <Func> *)super class_func0];
}
+ (int) class_func5
{
int i = (size_t)[Derived class_func0]; /* { dg-warning ".Derived. may not respond to .\\+class_func0." } */
return i + (size_t)[TestsuiteObject class_func0]; /* { dg-warning ".TestsuiteObject. may not respond to .\\+class_func0." } */
}
+ (int) class_func6
{
return (size_t)[objc_getClass("TestsuiteObject") class_func1]; /* { dg-warning ".TestsuiteObject. may not respond to .\\+class_func1." } */
}
+ (int) class_func7
{
return [objc_getClass("Derived") class_func1];
}
- (int) instance_func1
{
int i = (size_t)[self instance_func0]; /* { dg-warning ".Derived. may not respond to .\\-instance_func0." } */
return i + (size_t)[super instance_func0]; /* { dg-warning ".TestsuiteObject. may not respond to .\\-instance_func0." } */
}
- (int) instance_func2
{
return [(id <Func>)super instance_func0];
}
- (int) instance_func3
{
return [(TestsuiteObject <Func> *)super instance_func0];
}
- (int) instance_func4
{
return [(Derived <Func> *)super instance_func0];
}
- (int) instance_func5
{
int i = (size_t)[Derived instance_func1]; /* { dg-warning ".Derived. may not respond to .\\+instance_func1." } */
return i + (size_t)[TestsuiteObject instance_func1]; /* { dg-warning ".TestsuiteObject. may not respond to .\\+instance_func1." } */
}
- (int) instance_func6
{
return (size_t)[objc_getClass("TestsuiteObject") class_func1]; /* { dg-warning ".TestsuiteObject. may not respond to .\\+class_func1." } */
}
- (int) instance_func7
{
return [objc_getClass("Derived") class_func1];
}
@end
@implementation Derived (Categ)
+ (int) categ_class_func1
{
int i = (size_t)[self class_func0]; /* { dg-warning ".Derived. may not respond to .\\+class_func0." } */
i += [self class_func1];
i += [self categ_class_func2];
i += (size_t)[self categ_instance_func1]; /* { dg-warning ".Derived. may not respond to .\\+categ_instance_func1." } */
return i + (size_t)[super class_func0]; /* { dg-warning ".TestsuiteObject. may not respond to .\\+class_func0." } */
}
+ (int) categ_class_func2
{
int i = [(id <Func>)self class_func0]; /* { dg-warning ".\\-class_func0. not found in protocol" } */
i += [(id <Func>)super class_func0]; /* { dg-warning ".\\-class_func0. not found in protocol" } */
i += [(Class <Func>)self class_func0];
return i + [(Class <Func>)super class_func0];
}
- (int) categ_instance_func1
{
int i = (size_t)[self instance_func0]; /* { dg-warning ".Derived. may not respond to .\\-instance_func0." } */
i += [(Derived <Func> *)self categ_instance_func2];
i += (size_t)[(TestsuiteObject <Func> *)self categ_instance_func2]; /* { dg-warning ".TestsuiteObject. may not respond to .\\-categ_instance_func2." } */
/* { dg-warning ".\\-categ_instance_func2. not found in protocol" "" { target *-*-* } .-1 } */
i += (size_t)[(id <Func>)self categ_instance_func2]; /* { dg-warning ".\\-categ_instance_func2. not found in protocol" } */
i += [(id)self categ_instance_func2];
return i + (size_t)[super instance_func0]; /* { dg-warning ".TestsuiteObject. may not respond to .\\-instance_func0." } */
}
- (int) categ_instance_func2
{
return [(id <Func>)super instance_func0];
}
@end
/* { dg-warning "messages without a matching method signature will be assumed to return .id. and accept .\.\.\.. as arguments" "" { target *-*-* } 0 } */
|