/* 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;
}
