From 6b9a1ecb46c73d83b14a841351addfcc78775880 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@336031 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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 ++++ test/Modules/protocol-redefinition.m | 6 ++++++ 6 files changed, 28 insertions(+) create mode 100644 test/Modules/Inputs/protocol-redefinition/Base.framework/Headers/Base.h create mode 100644 test/Modules/Inputs/protocol-redefinition/Base.framework/Modules/module.modulemap create mode 100644 test/Modules/Inputs/protocol-redefinition/Kit.framework/Headers/Kit.h create mode 100644 test/Modules/Inputs/protocol-redefinition/Kit.framework/Modules/module.modulemap create mode 100644 test/Modules/protocol-redefinition.m diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index d7544ecfaf..6809b48dc8 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/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/test/Modules/Inputs/protocol-redefinition/Base.framework/Headers/Base.h b/test/Modules/Inputs/protocol-redefinition/Base.framework/Headers/Base.h new file mode 100644 index 0000000000..e3fe33c1bd --- /dev/null +++ b/test/Modules/Inputs/protocol-redefinition/Base.framework/Headers/Base.h @@ -0,0 +1,3 @@ +@protocol Foo +- (void)someMethodOnFoo; +@end diff --git a/test/Modules/Inputs/protocol-redefinition/Base.framework/Modules/module.modulemap b/test/Modules/Inputs/protocol-redefinition/Base.framework/Modules/module.modulemap new file mode 100644 index 0000000000..0366bb4f03 --- /dev/null +++ b/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/test/Modules/Inputs/protocol-redefinition/Kit.framework/Headers/Kit.h b/test/Modules/Inputs/protocol-redefinition/Kit.framework/Headers/Kit.h new file mode 100644 index 0000000000..93384c294f --- /dev/null +++ b/test/Modules/Inputs/protocol-redefinition/Kit.framework/Headers/Kit.h @@ -0,0 +1,6 @@ +#import + +// REDECLARATION +@protocol Foo +- (void)someMethodOnFoo; +@end diff --git a/test/Modules/Inputs/protocol-redefinition/Kit.framework/Modules/module.modulemap b/test/Modules/Inputs/protocol-redefinition/Kit.framework/Modules/module.modulemap new file mode 100644 index 0000000000..2b790f4496 --- /dev/null +++ b/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/test/Modules/protocol-redefinition.m b/test/Modules/protocol-redefinition.m new file mode 100644 index 0000000000..85a957bbfd --- /dev/null +++ b/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; -- 2.40.0