| /* Fix and continue should not interfere with computation of |
| local (static) function addresses. */ |
| /* Author: Ziemowit Laski <zlaski@apple.com> */ |
| |
| /* { dg-do run { target *-*-darwin* } } */ |
| /* { dg-options "-mfix-and-continue" } */ |
| |
| /* APPLE LOCAL radar 4894756 */ |
| #include "../objc/execute/Object2.h" |
| #include <stdlib.h> |
| |
| @class MyTarget, MySet; |
| |
| int global_value = 0; |
| |
| @interface MyTargetBuildContext : Object |
| { |
| 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: Object { |
| @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 : Object |
| - (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; |
| } |