Home | History | Annotate | Download | only in SemaObjCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify -fobjc-exceptions %s
      2 
      3 @interface NSException
      4 @end
      5 
      6 // @throw
      7 template<typename T>
      8 void throw_test(T value) {
      9   @throw value; // expected-error{{@throw requires an Objective-C object type ('int' invalid)}}
     10 }
     11 
     12 template void throw_test(NSException *);
     13 template void throw_test(int); // expected-note{{in instantiation of}}
     14 
     15 // @synchronized
     16 template<typename T>
     17 void synchronized_test(T value) {
     18   @synchronized (value) { // expected-error{{@synchronized requires an Objective-C object type ('int' invalid)}}
     19     value = 0;
     20   }
     21 }
     22 
     23 template void synchronized_test(NSException *);
     24 template 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 
     34 struct vector {};
     35 
     36 template<typename T> void eat(T);
     37 
     38 template<typename E, typename T>
     39 void 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 
     58 template void fast_enumeration_test<NSString *>(NSArray*);
     59 template void fast_enumeration_test<int>(NSArray*); // expected-note{{in instantiation of}}
     60 template void fast_enumeration_test<NSString *>(vector); // expected-note{{in instantiation of}}
     61 
     62 // @try/@catch/@finally
     63 
     64 template<typename T, typename U>
     65 void 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 
     76 template void try_catch_finally_test<NSString *>(int);
     77 template void try_catch_finally_test<NSString *>(int*); // expected-note{{in instantiation of}}
     78 template void try_catch_finally_test<NSString>(int); // expected-note{{in instantiation of function template specialization 'try_catch_finally_test<NSString, int>' requested here}}
     79