]> granicus.if.org Git - clang/commit
ObjectiveC Generics: Start using ObjCTypeParamType.
authorManman Ren <manman.ren@gmail.com>
Tue, 13 Sep 2016 17:41:05 +0000 (17:41 +0000)
committerManman Ren <manman.ren@gmail.com>
Tue, 13 Sep 2016 17:41:05 +0000 (17:41 +0000)
commit1286300e382671aaf0680870ca41c06cc1ea53a4
tree794d00f3c31208857a245b1955c5d970b31777a7
parent3c62e64cb2fb5295fabfde89e73e2b689d899732
ObjectiveC Generics: Start using ObjCTypeParamType.

For ObjC type parameter, we used to have TypedefType that is canonicalized to
id or the bound type. We can't represent "T <protocol>" and thus will lose
the type information in the following example:
@interface MyMutableDictionary<KeyType, ObjectType> : NSObject
- (void)setObject:(ObjectType)obj forKeyedSubscript:(KeyType <NSCopying>)key;
@end
MyMutableDictionary<NSString *, NSString *> *stringsByString;
NSNumber *n1, *n2;
stringsByString[n1] = n2;
--> no warning on type mismatch of the key.

To fix the problem, we introduce a new type ObjCTypeParamType that supports
a list of protocol qualifiers.

We create ObjCTypeParamType for ObjCTypeParamDecl when we create
ObjCTypeParamDecl. We also substitute ObjCTypeParamType instead of TypedefType
on an ObjCTypeParamDecl.

rdar://24619481
rdar://25060179

Differential Revision: http://reviews.llvm.org/D23080

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@281358 91177308-0d34-0410-b5e6-96231b3b80d8
lib/AST/ASTContext.cpp
lib/AST/DeclObjC.cpp
lib/AST/Type.cpp
lib/Sema/SemaDeclObjC.cpp
lib/Sema/SemaType.cpp
lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
test/SemaObjC/kindof.m
test/SemaObjC/parameterized_classes_subst.m