// RUN: %clang_cc1 -emit-llvm -triple x86_64-apple-darwin -o - %s | FileCheck %s

typedef unsigned int size_t;
@protocol P @end
@protocol NSCopying @end

@interface NSMutableArray
- (id)objectAtIndexedSubscript:(size_t)index;
- (void)setObject:(id)object atIndexedSubscript:(size_t)index;
@end

struct S {
  operator unsigned int ();
  operator id ();
};

@interface NSMutableDictionary
- (id)objectForKeyedSubscript:(id<NSCopying>)key;
- (void)setObject:(id)object forKeyedSubscript:(id<NSCopying>)key;
@end

int main() {
  NSMutableArray<P> * array;
  S s;
  id oldObject = array[(int)s];

  NSMutableDictionary<P> *dict;
  dict[(id)s] = oldObject;
  oldObject = dict[(id)s];

}

template <class T> void test2(NSMutableArray *a) {
  a[10] = 0;
}
template void test2<int>(NSMutableArray*);
// CHECK-LABEL: define weak_odr void @_Z5test2IiEvP14NSMutableArray
// CHECK: @objc_msgSend 
// CHECK: ret void


template <class T> void test3(NSMutableArray *a) {
  a[sizeof(T)] = 0;
}

template void test3<int>(NSMutableArray*);
// CHECK-LABEL: define weak_odr void @_Z5test3IiEvP14NSMutableArray
// CHECK: @objc_msgSend
// CHECK: ret void

