/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, May 2011.  */
/* { dg-do compile } */
/* { dg-options "-Wall" } */
/* { dg-additional-options "-Wno-objc-root-class" } */

#include <objc/objc.h>
#include <stdlib.h>

typedef __SIZE_TYPE__ my_size_t;

@interface MyArray
{
  Class isa;
} 
+ (void) addObject: (id)object __attribute__ ((nonnull));
- (void) addObject: (id)object __attribute__ ((nonnull));

+ (void) insertObject: (id)object  atIndex: (size_t)index __attribute__ ((nonnull (1)));
- (void) insertObject: (id)object  atIndex: (size_t)index __attribute__ ((nonnull (1)));

+ (void) insertObject: (id)object  atIndex: (size_t)index  andObject: (id)anotherObject  atIndex: (size_t)anotherIndex __attribute__ ((nonnull (1, 3)));
- (void) insertObject: (id)object  atIndex: (size_t)index  andObject: (id)anotherObject  atIndex: (size_t)anotherIndex __attribute__ ((nonnull (1, 3)));

/* Test the behavior with invalid code.  */
+ (void) removeObject: (id)object __attribute__ ((nonnull (0))); /* { dg-warning "does not refer to a function parameter" } */
- (void) removeObject: (id)object __attribute__ ((nonnull (0))); /* { dg-warning "does not refer to a function parameter" } */

+ (void) removeObject: (id)object __attribute__ ((nonnull (2))); /* { dg-warning "exceeds the number of function parameters 3" } */
- (void) removeObject: (id)object __attribute__ ((nonnull (2))); /* { dg-warning "exceeds the number of function parameters 3" } */

+ (void) removeObjectAtIndex: (my_size_t)object __attribute__ ((nonnull (1))); /* { dg-warning "refers to parameter type .my_size_t." } */
- (void) removeObjectAtIndex: (my_size_t)object __attribute__ ((nonnull (1))); /* { dg-warning "refers to parameter type .my_size_t." } */

+ (void) removeObject: (id)object __attribute__ ((nonnull (MyArray))); /* { dg-error "" } */
  /* { dg-warning "attribute argument is invalid" "" { target *-*-* } .-1 } */
- (void) removeObject: (id)object __attribute__ ((nonnull (MyArray))); /* { dg-error "" } */
  /* { dg-warning "attribute argument is invalid" "" { target *-*-* } .-1 } */
@end

void test (MyArray *object)
{
  [object addObject: object];
  [object addObject: nil]; /* { dg-warning "\\\[-Wnonnull" } */

  [object insertObject: object atIndex: 4];
  [object insertObject: nil    atIndex: 4]; /* { dg-warning "\\\[-Wnonnull" } */

  [object insertObject: object atIndex: 2 andObject: object atIndex: 3];
  [object insertObject: nil    atIndex: 2 andObject: object atIndex: 3]; /* { dg-warning "\\\[-Wnonnull" } */
  [object insertObject: object atIndex: 2 andObject: nil    atIndex: 3]; /* { dg-warning "\\\[-Wnonnull" } */
}
