1// RUN: %clang_cc1 -fsyntax-only -verify -fobjc-exceptions %s 2 3@interface NSException 4@end 5 6// @throw 7template<typename T> 8void throw_test(T value) { 9 @throw value; // expected-error{{@throw requires an Objective-C object type ('int' invalid)}} 10} 11 12template void throw_test(NSException *); 13template void throw_test(int); // expected-note{{in instantiation of}} 14 15// @synchronized 16template<typename T> 17void synchronized_test(T value) { 18 @synchronized (value) { // expected-error{{@synchronized requires an Objective-C object type ('int' invalid)}} 19 value = 0; 20 } 21} 22 23template void synchronized_test(NSException *); 24template void synchronized_test(int); // expected-note{{in instantiation of}} 25 26// fast enumeration 27@interface NSArray 28- (unsigned int)countByEnumeratingWithState: (struct __objcFastEnumerationState *)state objects: (id *)items count:(unsigned int)stackcount; 29@end 30 31@interface NSString 32@end 33 34struct vector {}; 35 36template<typename T> void eat(T); 37 38template<typename E, typename T> 39void fast_enumeration_test(T collection) { 40 for (E element in collection) { // expected-error{{selector element type 'int' is not a valid object}} \ 41 // expected-error{{the type 'vector' is not a pointer to a fast-enumerable object}} 42 eat(element); 43 } 44 45 E element; 46 for (element in collection) // expected-error{{selector element type 'int' is not a valid object}} \ 47 // expected-error{{the type 'vector' is not a pointer to a fast-enumerable object}} 48 eat(element); 49 50 for (NSString *str in collection) // expected-error{{the type 'vector' is not a pointer to a fast-enumerable object}} 51 eat(str); 52 53 NSString *str; 54 for (str in collection) // expected-error{{the type 'vector' is not a pointer to a fast-enumerable object}} 55 eat(str); 56} 57 58template void fast_enumeration_test<NSString *>(NSArray*); 59template void fast_enumeration_test<int>(NSArray*); // expected-note{{in instantiation of}} 60template void fast_enumeration_test<NSString *>(vector); // expected-note{{in instantiation of}} 61 62// @try/@catch/@finally 63 64template<typename T, typename U> 65void try_catch_finally_test(U value) { 66 @try { 67 value = 1; // expected-error{{assigning to 'int *' from incompatible type 'int'}} 68 } 69 @catch (T obj) { // expected-error{{@catch parameter is not a pointer to an interface type}} 70 id x = obj; 71 } @finally { 72 value = 0; 73 } 74} 75 76template void try_catch_finally_test<NSString *>(int); 77template void try_catch_finally_test<NSString *>(int*); // expected-note{{in instantiation of}} 78template void try_catch_finally_test<NSString>(int); // expected-note{{in instantiation of function template specialization 'try_catch_finally_test<NSString, int>' requested here}} 79