mirror of
https://github.com/darlinghq/darling-objc4.git
synced 2024-11-26 21:50:26 +00:00
134 lines
5.1 KiB
Objective-C
134 lines
5.1 KiB
Objective-C
/*
|
|
TEST_BUILD_OUTPUT
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\](\n.* note: expanded from macro 'testassert')?
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\](\n.* note: expanded from macro 'testassert')?
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\](\n.* note: expanded from macro 'testassert')?
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\](\n.* note: expanded from macro 'testassert')?
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\]
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\]
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\](\n.* note: expanded from macro 'testassert')?
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\](\n.* note: expanded from macro 'testassert')?
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\](\n.* note: expanded from macro 'testassert')?
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\](\n.* note: expanded from macro 'testassert')?
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\](\n.* note: expanded from macro 'testassert')?
|
|
.*ivar.m:\d+:\d+: warning: null passed to a callee that requires a non-null argument \[-Wnonnull\](\n.* note: expanded from macro 'testassert')?
|
|
END
|
|
*/
|
|
|
|
#include "test.h"
|
|
#include "testroot.i"
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <objc/objc-runtime.h>
|
|
|
|
@interface Super : TestRoot {
|
|
@public
|
|
char superIvar;
|
|
}
|
|
@end
|
|
|
|
@interface Sub : Super {
|
|
@public
|
|
id subIvar;
|
|
}
|
|
@end
|
|
|
|
@implementation Super @end
|
|
@implementation Sub @end
|
|
|
|
|
|
int main()
|
|
{
|
|
/*
|
|
Runtime layout of Sub:
|
|
[0] isa
|
|
[1] superIvar
|
|
[2] subIvar
|
|
*/
|
|
|
|
Ivar ivar;
|
|
Sub *sub = [Sub new];
|
|
sub->subIvar = [Sub class];
|
|
testassert(((Class *)(__bridge void *)sub)[2] == [Sub class]);
|
|
|
|
ivar = class_getInstanceVariable([Sub class], "subIvar");
|
|
testassert(ivar);
|
|
testassert(2*sizeof(intptr_t) == (size_t)ivar_getOffset(ivar));
|
|
testassert(0 == strcmp(ivar_getName(ivar), "subIvar"));
|
|
testassert(0 == strcmp(ivar_getTypeEncoding(ivar), "@"));
|
|
|
|
ivar = class_getInstanceVariable([Super class], "superIvar");
|
|
testassert(ivar);
|
|
testassert(sizeof(intptr_t) == (size_t)ivar_getOffset(ivar));
|
|
testassert(0 == strcmp(ivar_getName(ivar), "superIvar"));
|
|
testassert(0 == strcmp(ivar_getTypeEncoding(ivar), "c"));
|
|
testassert(ivar == class_getInstanceVariable([Sub class], "superIvar"));
|
|
|
|
ivar = class_getInstanceVariable([Super class], "subIvar");
|
|
testassert(!ivar);
|
|
|
|
ivar = class_getInstanceVariable(object_getClass([Sub class]), "subIvar");
|
|
testassert(!ivar);
|
|
|
|
ivar = class_getInstanceVariable([Sub class], "subIvar");
|
|
object_setIvar(sub, ivar, sub);
|
|
testassert(sub->subIvar == sub);
|
|
testassert(sub == object_getIvar(sub, ivar));
|
|
|
|
testassert(NULL == class_getInstanceVariable(NULL, "foo"));
|
|
testassert(NULL == class_getInstanceVariable([Sub class], NULL));
|
|
testassert(NULL == class_getInstanceVariable(NULL, NULL));
|
|
|
|
testassert(NULL == object_getIvar(sub, NULL));
|
|
testassert(NULL == object_getIvar(NULL, ivar));
|
|
testassert(NULL == object_getIvar(NULL, NULL));
|
|
|
|
object_setIvar(sub, NULL, NULL);
|
|
object_setIvar(NULL, ivar, NULL);
|
|
object_setIvar(NULL, NULL, NULL);
|
|
|
|
#if !__has_feature(objc_arc)
|
|
|
|
uintptr_t value;
|
|
|
|
sub->subIvar = (id)10;
|
|
value = 0;
|
|
object_getInstanceVariable(sub, "subIvar", (void **)&value);
|
|
testassert(value == 10);
|
|
|
|
object_setInstanceVariable(sub, "subIvar", (id)11);
|
|
testassert(sub->subIvar == (id)11);
|
|
|
|
ivar = class_getInstanceVariable([Sub class], "subIvar");
|
|
testassert(ivar == object_getInstanceVariable(sub, "subIvar", NULL));
|
|
|
|
testassert(NULL == object_getInstanceVariable(sub, NULL, NULL));
|
|
testassert(NULL == object_getInstanceVariable(NULL, "foo", NULL));
|
|
testassert(NULL == object_getInstanceVariable(NULL, NULL, NULL));
|
|
value = 10;
|
|
testassert(NULL == object_getInstanceVariable(sub, NULL, (void **)&value));
|
|
testassert(value == 0);
|
|
value = 10;
|
|
testassert(NULL == object_getInstanceVariable(NULL, "foo", (void **)&value));
|
|
testassert(value == 0);
|
|
value = 10;
|
|
testassert(NULL == object_getInstanceVariable(NULL, NULL, (void **)&value));
|
|
testassert(value == 0);
|
|
|
|
testassert(NULL == object_setInstanceVariable(sub, NULL, NULL));
|
|
testassert(NULL == object_setInstanceVariable(NULL, "foo", NULL));
|
|
testassert(NULL == object_setInstanceVariable(NULL, NULL, NULL));
|
|
#else
|
|
// provoke the same nullability warnings as the real test
|
|
objc_getClass(nil);
|
|
objc_getClass(nil);
|
|
objc_getClass(nil);
|
|
objc_getClass(nil);
|
|
objc_getClass(nil);
|
|
objc_getClass(nil);
|
|
#endif
|
|
|
|
succeed(__FILE__);
|
|
return 0;
|
|
}
|