diff options
| author | Douglas Gregor <dgregor@apple.com> | 2015-07-07 03:58:14 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2015-07-07 03:58:14 +0000 |
| commit | 9bda6cff20276f67c02d0d2814ef44c2d62ecd89 (patch) | |
| tree | 42cdccf290e6507ad745f4b0a838e76a6f8e32d0 /clang/test/SemaObjC | |
| parent | c5e07f5c115ed486f57db957447086c1b0023385 (diff) | |
| download | bcm5719-llvm-9bda6cff20276f67c02d0d2814ef44c2d62ecd89.tar.gz bcm5719-llvm-9bda6cff20276f67c02d0d2814ef44c2d62ecd89.zip | |
C++ support for Objective-C lightweight generics.
Teach C++'s tentative parsing to handle specializations of Objective-C
class types (e.g., NSArray<NSString *>) as well as Objective-C
protocol qualifiers (id<NSCopying>) by extending type-annotation
tokens to handle this case. As part of this, remove Objective-C
protocol qualifiers from the declaration specifiers, which never
really made sense: instead, provide Sema entry points to make them
part of the type annotation token. Among other things, this properly
diagnoses bogus types such as "<NSCopying> id" which should have been
written as "id <NSCopying>".
Implements template instantiation support for, e.g., NSArray<T>*
in C++. Note that parameterized classes are not templates in the C++
sense, so that cannot (for example) be used as a template argument for
a template template parameter. Part of rdar://problem/6294649.
llvm-svn: 241545
Diffstat (limited to 'clang/test/SemaObjC')
| -rw-r--r-- | clang/test/SemaObjC/parameterized_classes.m | 12 | ||||
| -rw-r--r-- | clang/test/SemaObjC/protocol-archane.m | 4 |
2 files changed, 12 insertions, 4 deletions
diff --git a/clang/test/SemaObjC/parameterized_classes.m b/clang/test/SemaObjC/parameterized_classes.m index 9834f7cd11f..eb3e122e820 100644 --- a/clang/test/SemaObjC/parameterized_classes.m +++ b/clang/test/SemaObjC/parameterized_classes.m @@ -1,5 +1,9 @@ // RUN: %clang_cc1 -fblocks %s -verify +#if !__has_feature(objc_generics) +# error Compiler does not support Objective-C generics? +#endif + @protocol NSObject // expected-note{{'NSObject' declared here}} @end @@ -255,14 +259,14 @@ typedef PC15<int (^)(int, int), // block pointers as 'id' typedef PC15<NSObject *, NSObject *, id<NSCopying>> typeArgs8; typedef PC15<NSObject *, NSObject *, - NSObject *> typeArgs8b; // expected-error{{type argument 'NSObject *' does not satisy the bound ('id<NSCopying>') of type parameter 'V'}} + NSObject *> typeArgs8b; // expected-error{{type argument 'NSObject *' does not satisfy the bound ('id<NSCopying>') of type parameter 'V'}} typedef PC15<id, - id, // expected-error{{type argument 'id' does not satisy the bound ('NSObject *') of type parameter 'U'}} + id, // expected-error{{type argument 'id' does not satisfy the bound ('NSObject *') of type parameter 'U'}} id> typeArgs9; typedef PC15<id, NSObject *, - id> typeArgs10; // expected-error{{type argument 'id' does not satisy the bound ('id<NSCopying>') of type parameter 'V'}} + id> typeArgs10; // expected-error{{type argument 'id' does not satisfy the bound ('id<NSCopying>') of type parameter 'V'}} typedef PC15<id, int (^)(int, int), // okay @@ -306,7 +310,7 @@ void testSpecializedTypePrinting() { @interface PC23<T : NSObject *> : PC1<T, U> // expected-error{{unknown type name 'U'}} @end -@interface PC24<T> : PC1<T, T> // expected-error{{type argument 'T' (aka 'id') does not satisy the bound ('NSObject *') of type parameter 'U'}} +@interface PC24<T> : PC1<T, T> // expected-error{{type argument 'T' (aka 'id') does not satisfy the bound ('NSObject *') of type parameter 'U'}} @end @interface NSFoo : PC1<NSObject *, NSObject *> // okay diff --git a/clang/test/SemaObjC/protocol-archane.m b/clang/test/SemaObjC/protocol-archane.m index 788edf276d7..f2f6025a5ad 100644 --- a/clang/test/SemaObjC/protocol-archane.m +++ b/clang/test/SemaObjC/protocol-archane.m @@ -40,3 +40,7 @@ Class <SomeProtocol> UnfortunateGCCExtension; - (void)crashWith:(<Broken>)a { // expected-warning {{protocol has no object type specified; defaults to qualified 'id'}} } @end + +typedef <SomeProtocol> id TwoTypeSpecs; // expected-warning{{no object type specified}} +// expected-error@-1{{typedef redefinition with different types ('id<SomeProtocol>' vs 'id')}} +// expected-error@-2{{expected ';' after top level declarator}} |

