/* APPLE LOCAL file mainline */
/* Test for situations in which protocol conformance information
   may be lost, leading to superfluous warnings.  */
/* Author: Ziemowit Laski <zlaski@apple.com>.  */
/* { dg-do compile } */

/* One-line substitute for objc/objc.h */
typedef struct objc_object { struct objc_class *class_pointer; } *id;

@protocol NSObject
- (int)someValue;
@end

@interface NSObject <NSObject>
@end

@protocol PlateMethods
- (void)someMethod;
@end

@interface Foo {
  NSObject <PlateMethods> *plate;
  id <PlateMethods> plate1;
  NSObject *plate2;
}
- (id <PlateMethods>) getPlate;
- (id <NSObject>) getPlate1;
- (int) getValue;
@end

@implementation Foo
- (id <PlateMethods>) getPlate {
  return plate;  /* { dg-bogus "does not implement" } */
}
- (id <NSObject>) getPlate1 {
  return (id <NSObject>)plate1; /* { dg-bogus "does not conform" } */
}
- (int) getValue {
  int i = [plate1 someValue];   /* { dg-warning ".\\-someValue. not found in protocol\\(s\\)" } */

  int j = [(id <NSObject>)plate1 someValue];  /* { dg-bogus "not found in protocol" } */
  int k = [(id)plate1 someValue]; /* { dg-bogus "not found in protocol" } */
  return i + j + k;
}
@end
