From 7dcf23ed83d0094386aa438db3b47ec0aacf149d Mon Sep 17 00:00:00 2001 From: Bruno Cardoso Lopes Date: Sat, 30 Jun 2018 00:49:27 +0000 Subject: [PATCH] Add protocol redefinition to the current scope/context Not doing so causes the AST writter to assert since the decl in question never gets emitted. This is fine when modules is not used, but otherwise we need to serialize something other than garbage. rdar://problem/39844933 Differential Revision: https://reviews.llvm.org/D47297 llvm-svn: 336031 --- clang/lib/Sema/SemaDeclObjC.cpp | 5 +++++ .../protocol-redefinition/Base.framework/Headers/Base.h | 3 +++ .../Base.framework/Modules/module.modulemap | 4 ++++ .../protocol-redefinition/Kit.framework/Headers/Kit.h | 6 ++++++ .../Kit.framework/Modules/module.modulemap | 4 ++++ clang/test/Modules/protocol-redefinition.m | 6 ++++++ 6 files changed, 28 insertions(+) create mode 100644 clang/test/Modules/Inputs/protocol-redefinition/Base.framework/Headers/Base.h create mode 100644 clang/test/Modules/Inputs/protocol-redefinition/Base.framework/Modules/module.modulemap create mode 100644 clang/test/Modules/Inputs/protocol-redefinition/Kit.framework/Headers/Kit.h create mode 100644 clang/test/Modules/Inputs/protocol-redefinition/Kit.framework/Modules/module.modulemap create mode 100644 clang/test/Modules/protocol-redefinition.m diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index d7544ecfaf79c..6809b48dc8a48 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -1210,6 +1210,11 @@ Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc, PDecl = ObjCProtocolDecl::Create(Context, CurContext, ProtocolName, ProtocolLoc, AtProtoInterfaceLoc, /*PrevDecl=*/nullptr); + + // If we are using modules, add the decl to the context in order to + // serialize something meaningful. + if (getLangOpts().Modules) + PushOnScopeChains(PDecl, TUScope); PDecl->startDefinition(); } else { if (PrevDecl) { diff --git a/clang/test/Modules/Inputs/protocol-redefinition/Base.framework/Headers/Base.h b/clang/test/Modules/Inputs/protocol-redefinition/Base.framework/Headers/Base.h new file mode 100644 index 0000000000000..e3fe33c1bdb91 --- /dev/null +++ b/clang/test/Modules/Inputs/protocol-redefinition/Base.framework/Headers/Base.h @@ -0,0 +1,3 @@ +@protocol Foo +- (void)someMethodOnFoo; +@end diff --git a/clang/test/Modules/Inputs/protocol-redefinition/Base.framework/Modules/module.modulemap b/clang/test/Modules/Inputs/protocol-redefinition/Base.framework/Modules/module.modulemap new file mode 100644 index 0000000000000..0366bb4f03903 --- /dev/null +++ b/clang/test/Modules/Inputs/protocol-redefinition/Base.framework/Modules/module.modulemap @@ -0,0 +1,4 @@ +framework module Base { + header "Base.h" + export * +} \ No newline at end of file diff --git a/clang/test/Modules/Inputs/protocol-redefinition/Kit.framework/Headers/Kit.h b/clang/test/Modules/Inputs/protocol-redefinition/Kit.framework/Headers/Kit.h new file mode 100644 index 0000000000000..93384c294f135 --- /dev/null +++ b/clang/test/Modules/Inputs/protocol-redefinition/Kit.framework/Headers/Kit.h @@ -0,0 +1,6 @@ +#import + +// REDECLARATION +@protocol Foo +- (void)someMethodOnFoo; +@end diff --git a/clang/test/Modules/Inputs/protocol-redefinition/Kit.framework/Modules/module.modulemap b/clang/test/Modules/Inputs/protocol-redefinition/Kit.framework/Modules/module.modulemap new file mode 100644 index 0000000000000..2b790f4496549 --- /dev/null +++ b/clang/test/Modules/Inputs/protocol-redefinition/Kit.framework/Modules/module.modulemap @@ -0,0 +1,4 @@ +framework module Kit { + header "Kit.h" + export * +} \ No newline at end of file diff --git a/clang/test/Modules/protocol-redefinition.m b/clang/test/Modules/protocol-redefinition.m new file mode 100644 index 0000000000000..85a957bbfd70a --- /dev/null +++ b/clang/test/Modules/protocol-redefinition.m @@ -0,0 +1,6 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -F%S/Inputs/protocol-redefinition -fsyntax-only %s -Wno-private-module -verify + +// expected-no-diagnostics + +@import Kit;