/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010.  */
/* { dg-do compile } */

#include <objc/objc.h>

/* Test standard warnings when a class conforms to a protocol but some
   methods are implemented in the superclass.  Use -Wno-protocol to
   turn these off.  */

@protocol MyProtocol
- (int)method;
@end

@protocol MyProtocol2
- (int)method2;
@end

/* The superclass implements the method required by the protocol.  */
@interface MyRootClass
{
  Class isa;
}
- (int)method;
@end

@implementation MyRootClass
- (int)method
{
  return 23;
}
@end

/* The subclass inherits the method (does not implement it directly)
   and unless -Wno-protocol is used, we emit a warning.  */
@interface MySubClass : MyRootClass <MyProtocol>
@end

@implementation MySubClass
@end

/* { dg-warning "incomplete implementation of class .MySubClass." "" { target *-*-* } 39 } */
/* { dg-warning "method definition for .\\-method. not found" "" { target *-*-* } 39 } */
/* { dg-warning "class .MySubClass. does not fully implement the .MyProtocol. protocol" "" { target *-*-* } 39 } */


/* The subclass instead does not inherit the method method2 (and does
   not implement it directly) so it does not conform to the
   protocol MyProtocol2.  */
@interface MySubClass2 : MyRootClass <MyProtocol2>
@end

@implementation MySubClass2
@end /* Warnings here, below.  */

/* { dg-warning "incomplete implementation of class .MySubClass2." "" { target *-*-* } 53 } */
/* { dg-warning "method definition for .\\-method2. not found" "" { target *-*-* } 53 } */
/* { dg-warning "class .MySubClass2. does not fully implement the .MyProtocol2. protocol" "" { target *-*-* } 53 } */
