From f127756d39b2c79a43e6a77af52fdb9411e0263d Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Wed, 16 Dec 2015 06:25:38 +0000 Subject: [PATCH] [Objective-c] Fix a crash that occurs when ObjCTypeParamList::back() is called on an empty list. This commit makes Parser::parseObjCTypeParamListOrProtocolRefs return nullptr if it sees an invalid type parameter (e.g., __kindof) in the type parameter list. rdar://problem/23068920 Differential Revision: http://reviews.llvm.org/D15463 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@255754 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseObjc.cpp | 2 +- test/SemaObjC/kindof.m | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 63c01932c1..8a028b5037 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -603,7 +603,7 @@ ObjCTypeParamList *Parser::parseObjCTypeParamListOrProtocolRefs( // whether there are any protocol references. lAngleLoc = SourceLocation(); rAngleLoc = SourceLocation(); - return list; + return invalid ? nullptr : list; } /// Parse an objc-type-parameter-list. diff --git a/test/SemaObjC/kindof.m b/test/SemaObjC/kindof.m index b19e423720..f205e68ea1 100644 --- a/test/SemaObjC/kindof.m +++ b/test/SemaObjC/kindof.m @@ -302,3 +302,19 @@ void testNullability() { 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 -- 2.40.0