/* Fix and continue should not interfere with computation of local (static) function addresses. */ /* Author: Ziemowit Laski */ /* { dg-do run { target *-*-darwin* } } */ /* { dg-options "-mfix-and-continue" } */ /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ #include "../objc-obj-c++-shared/TestsuiteObject.m" #include @class MyTarget, MySet; int global_value = 0; @interface MyTargetBuildContext : TestsuiteObject { MyTarget * _target; unsigned _cacheInvalDisableCount; BOOL _cacheInvalidationNeeded; unsigned short _isCreatingDependencies:1; unsigned short _isCreatingHeadermap:1; unsigned short _haveAddedIdleTimeInvoc:1; BOOL _hasSetUpBuildSettings; } - (id)initWithTarget:(MyTarget *)target; - (MyTarget *)target; @end @interface MyTargetBuildContext (PrivateMethods) + (MySet *)_headerFileExtensions; @end @interface MyCountedSet: TestsuiteObject { @public int cardinality; } - (id)init; - (id)sortedArrayUsingFunction:(int (*)(id, id, void *))comparator with:(int)value; @end @implementation MyCountedSet - (id)init { cardinality = 5; global_value = 17; return self; } - (id)sortedArrayUsingFunction:(int (*)(id, id, void *))comparator with:(int)value { if(value == comparator(self, self, self)) return self; return nil; } @end @implementation MyTargetBuildContext : TestsuiteObject - (id)initWithTarget:(MyTarget *)target { self = [super init]; return self; } - (MyTarget *)target { return _target; } static int _MyCompareObjectsByDecreasingSetCount (id object1, id object2, MyCountedSet * countedSet) { global_value = 5; return countedSet->cardinality; } + (MySet *)_headerFileExtensions { MySet * _headerFileExtensions = 0; return _headerFileExtensions; } - (void)_recomputeHeadermap { MyCountedSet *set = [MyCountedSet new]; int (*functionPointer)(id, id, void *) = (int (*)(id, id, void *))_MyCompareObjectsByDecreasingSetCount; id result = [set sortedArrayUsingFunction:functionPointer with:5]; } @end int main(void) { MyTargetBuildContext *ctx = [MyTargetBuildContext new]; [ctx _recomputeHeadermap]; if (global_value != 5) abort(); return 0; }