llvm-project/clang/test/SemaObjC/objc-container-subscripting-2.m
Alex Lorenz 4b9f80cc03 [ObjC] Check that a subscript methods is declared for a qualified id type
Objective-C subscript expressions report errors when a subscript method is not
declared in the base class. However, prior to this commit, qualified id types
were not checked. This commit ensures that an appropriate error is reported
when a subscript method is not declared in any of the protocols that are
included in the qualified id type.

rdar://33213924

llvm-svn: 307642
2017-07-11 10:18:35 +00:00

50 lines
1.7 KiB
Objective-C

// RUN: %clang_cc1 -fsyntax-only -verify %s
typedef unsigned int size_t;
@protocol P @end
@interface NSMutableArray
- (id)objectAtIndexedSubscript:(size_t)index;
- (void)setObject:(id)object atIndexedSubscript:(size_t)index;
@end
@interface NSMutableDictionary
- (id)objectForKeyedSubscript:(id)key;
- (void)setObject:(id)object forKeyedSubscript:(size_t)key;
@end
id func() {
NSMutableArray *array;
float f;
array[f] = array; // expected-error {{indexing expression is invalid because subscript type 'float' is not an integral or Objective-C pointer type}}
return array[3.14]; // expected-error {{indexing expression is invalid because subscript type 'double' is not an integral or Objective-C pointer type}}
}
void test_unused() {
NSMutableArray *array;
array[10]; // expected-warning {{container access result unused - container access should not be used for side effects}}
NSMutableDictionary *dict;
dict[array]; // expected-warning {{container access result unused - container access should not be used for side effects}}
}
void testQualifiedId(id<P> qualifiedId) {
id object = qualifiedId[10]; // expected-error {{expected method to read array element not found on object of type 'id<P>'}}
qualifiedId[10] = qualifiedId; // expected-error {{expected method to write array element not found on object of type 'id<P>'}}
}
void testUnqualifiedId(id unqualId) {
id object = unqualId[10];
unqualId[10] = object;
}
@protocol Subscriptable
- (id)objectAtIndexedSubscript:(size_t)index;
- (void)setObject:(id)object atIndexedSubscript:(size_t)index;
@end
void testValidQualifiedId(id<Subscriptable> qualifiedId) {
id object = qualifiedId[10];
qualifiedId[10] = object;
}