/* APPLE LOCAL file ObjC GC */
/* Using -fobjc-gc should not mess with how 'super' gets handled. */
/* { dg-do compile { target powerpc*-*-darwin* i?86*-*-darwin* } } */
/* { dg-options "-fnext-runtime -fobjc-gc" } */
/* { dg-require-effective-target objc_gc } */
/* Contributed by Ziemowit Laski <zlaski@apple.com>  */

#include <objc/Object.h>

typedef struct _GRDataPoint *GRDataPoint;
typedef struct _NSRange {
  unsigned int location;
  unsigned int length;
} NSRange;

typedef struct {
  id baz;
} SmallStruct;
typedef struct {
  SmallStruct bar;
} InnerStruct;

typedef struct {
  InnerStruct foo;
} ComplexStruct;

@interface SomeOther : Object
- (void)setSelectedRange:(NSRange)charRange;
@end

@interface GRDataSet : Object {
@protected
  int numElements;
  GRDataPoint * dataPoints;
@private
  id _dataSource;
}
-(BOOL) setSelectedRange:(NSRange)r;
-(void) dealloc;
@end

@interface GRPieDataSet : GRDataSet {
@private
   double _sum;
}
@end

@implementation GRPieDataSet
-(void) dealloc
{
  dataPoints = 0;
  [super dealloc];
}
-(BOOL) setSelectedRange:(NSRange)r
{
  BOOL retval;
  retval = [super setSelectedRange:r];
  return retval;
}
-(void) modStruct:(ComplexStruct)s
{
  s.foo.bar.baz = nil;
}
@end

/* { dg-final { scan-assembler "objc_msgSendSuper" } } */
/* { dg-final { scan-assembler-not "objc_msgSend\[^S\]" } } */
/* { dg-final { scan-assembler "objc_assign_strongCast" } } */
