[Modules][ObjC] ASTReader should add protocols for class extensions

During deserialization clang is currently missing the merging of
protocols into the canonical interface for the class extension.

This merging only currently happens during parsing and should also
be considered during deserialization.

rdar://problem/38724303

llvm-svn: 331063
This commit is contained in:
Bruno Cardoso Lopes 2018-04-27 18:01:23 +00:00
parent a6322924e6
commit fbff2fafb3
6 changed files with 43 additions and 0 deletions

View File

@ -1205,6 +1205,12 @@ void ASTDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) {
ProtoLocs.push_back(ReadSourceLocation());
CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
Reader.getContext());
// Protocols in the class extension belong to the class.
if (NumProtoRefs > 0 && CD->ClassInterface && CD->IsClassExtension())
CD->ClassInterface->mergeClassExtensionProtocolList(
(ObjCProtocolDecl *const *)ProtoRefs.data(), NumProtoRefs,
Reader.getContext());
}
void ASTDeclReader::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *CAD) {

View File

@ -0,0 +1,5 @@
#import "a.h"
#import "a-proto.h"
@interface A () <AProto>
@end

View File

@ -0,0 +1,7 @@
@protocol NSObject
@end
@protocol AProto <NSObject>
@property (nonatomic, readwrite, assign) int p0;
@property (nonatomic, readwrite, assign) int p1;
@end

View File

@ -0,0 +1,5 @@
@interface NSObject
@end
@interface A : NSObject
@end

View File

@ -0,0 +1,11 @@
module A {
header "a.h"
header "a-proto.h"
export *
}
module AP {
header "a-private.h"
export *
}

View File

@ -0,0 +1,9 @@
// RUN: rm -rf %t.cache
// RUN: %clang_cc1 %s -fsyntax-only -fmodules -fimplicit-module-maps -fmodules-cache-path=%t.cache -I%S/Inputs/class-extension -verify
// expected-no-diagnostics
#import "a-private.h"
int foo(A *X) {
return X.p0 + X.p1;
}