// RUN: %clang_cc1 -fsyntax-only -verify %s

#include <stddef.h>

typedef struct objc_object *id;
id objc_getClass(const char *s);

@interface Object 
- (id) initWithInt: (int) i;
@end

@protocol Func
+ (int) class_func0;
- (int) instance_func0;
@end

@interface Derived: Object // expected-note {{receiver is instance of class declared here}}
+ (int) class_func1;
+ (int) class_func2;
+ (int) class_func3;
+ (int) class_func4;
+ (int) class_func5;
+ (int) class_func6;
+ (int) class_func7;
- (int) instance_func1;
- (int) instance_func2;
- (int) instance_func3;
- (int) instance_func4;
- (int) instance_func5;
- (int) instance_func6;
- (int) instance_func7;
- (id) initWithInt: (int) i;
@end

@implementation Derived
+ (int) class_func1
{
   int i = (size_t)[self class_func0];       // expected-warning {{class method '+class_func0' not found (return type defaults to 'id'); did you mean '+class_func}}
   return i + (size_t)[super class_func0];   // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}}
}
+ (int) class_func2
{
   int i = [(id <Func>)self class_func0];
   i += [(id <Func>)super class_func0];    // expected-error {{cannot cast 'super' (it isn't an expression)}}
   i += [(Class <Func>)self class_func0];  // 
   return i + [(Class <Func>)super class_func0]; // // expected-error {{cannot cast 'super' (it isn't an expression)}}
}
+ (int) class_func3
{
   return [(Object <Func> *)super class_func0];  // expected-error {{cannot cast 'super' (it isn't an expression)}}
}
+ (int) class_func4
{
   return [(Derived <Func> *)super class_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}}
}   
+ (int) class_func5
{
   int i = (size_t)[Derived class_func0];    // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}}
   return i + (size_t)[Object class_func0];  // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}}
}
+ (int) class_func6
{
   return (size_t)[objc_getClass("Object") class_func1]; // GCC warns about this
}
+ (int) class_func7
{
   return [objc_getClass("Derived") class_func1];
}
- (int) instance_func1
{
   int i = (size_t)[self instance_func0];     // expected-warning {{instance method '-instance_func0' not found (return type defaults to 'id'); did you mean}}
   return i + (size_t)[super instance_func0]; // expected-warning {{'Object' may not respond to 'instance_func0'}}
}
- (int) instance_func2
{
   return [(id <Func>)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}}
}
- (int) instance_func3
{
   return [(Object <Func> *)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}}
}
- (int) instance_func4
{
   return [(Derived <Func> *)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}}
}   
- (int) instance_func5
{
   int i = (size_t)[Derived instance_func1]; // expected-warning {{class method '+instance_func1' not found (return type defaults to 'id')}} 
   return i + (size_t)[Object instance_func1]; // expected-warning {{class method '+instance_func1' not found (return type defaults to 'id')}}
}
- (int) instance_func6
{
   return (size_t)[objc_getClass("Object") class_func1];
}
- (int) instance_func7
{
   return [objc_getClass("Derived") class_func1];
}
- (id) initWithInt: (int) i
{
   // Don't warn about parentheses here.
   if (self = [super initWithInt: i]) {
     [self instance_func1];
   }
   return self;
}
@end

@class C;
@interface A // expected-note {{receiver is instance of class declared here}}
- (instancetype)initWithCoder:(A *)coder;
@end

@interface B : A
@end

@implementation B
- (instancetype)initWithCoder:(C *)coder {
  if (0 != (self = [super initWithCode:code])) // expected-error {{use of undeclared identifier 'code'}} expected-warning {{instance method '-initWithCode:' not found}}
    return (void *)0;
  return (void *)0;
}
@end
