Index: cfe/trunk/lib/Parse/ParseObjc.cpp =================================================================== --- cfe/trunk/lib/Parse/ParseObjc.cpp +++ cfe/trunk/lib/Parse/ParseObjc.cpp @@ -603,7 +603,7 @@ // whether there are any protocol references. lAngleLoc = SourceLocation(); rAngleLoc = SourceLocation(); - return list; + return invalid ? nullptr : list; } /// Parse an objc-type-parameter-list. Index: cfe/trunk/test/SemaObjC/kindof.m =================================================================== --- cfe/trunk/test/SemaObjC/kindof.m +++ cfe/trunk/test/SemaObjC/kindof.m @@ -302,3 +302,19 @@ void processCopyable(__typeof(getSomeCopyable()) string); processCopyable(0); // expected-warning{{null passed to a callee that requires a non-null argument}} } + +// Check that clang doesn't crash when a type parameter is illegal. +@interface Array1 : NSObject +@end + +@interface I1 : NSObject +@end + +@interface Array1<__kindof I1*>(extensions1) // expected-error{{expected type parameter name}} +@end + +@interface Array2 : NSObject +@end + +@interface Array2(extensions2) // expected-error{{expected type parameter name}} expected-error{{redeclaration of type parameter 'T'}} +@end