From 1ac1b63c9ca898e66aae9775cca6045082907b9a Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 7 Jul 2015 03:58:54 +0000 Subject: Implement variance for Objective-C type parameters. Introduce co- and contra-variance for Objective-C type parameters, which allows us to express that (for example) an NSArray is covariant in its type parameter. This means that NSArray * is a subtype of NSArray *, which is expected of the immutable Foundation collections. Type parameters can be annotated with __covariant or __contravariant to make them co- or contra-variant, respectively. This feature can be detected by __has_feature(objc_generics_variance). Implements rdar://problem/20217490. llvm-svn: 241549 --- clang/lib/Serialization/ASTReaderDecl.cpp | 2 ++ clang/lib/Serialization/ASTWriterDecl.cpp | 2 ++ 2 files changed, 4 insertions(+) (limited to 'clang/lib/Serialization') diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index c54c5697e59..52019fcd328 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -904,7 +904,9 @@ void ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) { void ASTDeclReader::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) { VisitTypedefNameDecl(D); + D->Variance = Record[Idx++]; D->Index = Record[Idx++]; + D->VarianceLoc = ReadSourceLocation(Record, Idx); D->ColonLoc = ReadSourceLocation(Record, Idx); } diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 4d3fb78b080..371aea8088a 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -581,7 +581,9 @@ void ASTDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) { void ASTDeclWriter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) { VisitTypedefNameDecl(D); + Record.push_back(D->Variance); Record.push_back(D->Index); + Writer.AddSourceLocation(D->VarianceLoc, Record); Writer.AddSourceLocation(D->ColonLoc, Record); Code = serialization::DECL_OBJC_TYPE_PARAM; -- cgit v1.2.3