[Serialization] Support factory initializers.

These never appear in Swift code, but they can appear when serializing the
full output of SILGen ("SIB" format) because that includes code synthesized
for imported Clang declarations.

rdar://problem/22098491

Swift SVN r31364
This commit is contained in:
Jordan Rose
2015-08-20 19:28:22 +00:00
parent 340716da16
commit 3e0cf08daa
4 changed files with 26 additions and 13 deletions

View File

@@ -167,9 +167,11 @@ using AccessorKindField = BCFixed<3>;
// VERSION_MAJOR. // VERSION_MAJOR.
enum CtorInitializerKind : uint8_t { enum CtorInitializerKind : uint8_t {
Designated = 0, Designated = 0,
Convenience = 1 Convenience = 1,
Factory = 2,
ConvenienceFactory = 3,
}; };
using CtorInitializerKindField = BCFixed<1>; using CtorInitializerKindField = BCFixed<2>;
// These IDs must \em not be renumbered or reordered without incrementing // These IDs must \em not be renumbered or reordered without incrementing
// VERSION_MAJOR. // VERSION_MAJOR.

View File

@@ -955,11 +955,14 @@ bool ModuleFile::readMembers(SmallVectorImpl<Decl *> &Members) {
static Optional<swift::CtorInitializerKind> static Optional<swift::CtorInitializerKind>
getActualCtorInitializerKind(uint8_t raw) { getActualCtorInitializerKind(uint8_t raw) {
switch (serialization::CtorInitializerKind(raw)) { switch (serialization::CtorInitializerKind(raw)) {
case serialization::Designated: #define CASE(NAME) \
return swift::CtorInitializerKind::Designated; case serialization::CtorInitializerKind::NAME: \
return swift::CtorInitializerKind::NAME;
case serialization::Convenience: CASE(Designated)
return swift::CtorInitializerKind::Convenience; CASE(Convenience)
CASE(Factory)
CASE(ConvenienceFactory)
#undef CASE
} }
return None; return None;
} }

View File

@@ -1257,16 +1257,12 @@ static serialization::AccessorKind getStableAccessorKind(swift::AccessorKind K){
static serialization::CtorInitializerKind static serialization::CtorInitializerKind
getStableCtorInitializerKind(swift::CtorInitializerKind K){ getStableCtorInitializerKind(swift::CtorInitializerKind K){
switch (K) { switch (K) {
case swift::CtorInitializerKind::ConvenienceFactory:
llvm_unreachable("Convenience factory initializers cannot be uttered");
case swift::CtorInitializerKind::Factory:
llvm_unreachable("Factory initializers cannot be uttered");
#define CASE(NAME) \ #define CASE(NAME) \
case swift::CtorInitializerKind::NAME: return serialization::NAME; case swift::CtorInitializerKind::NAME: return serialization::NAME;
CASE(Designated) CASE(Designated)
CASE(Convenience) CASE(Convenience)
CASE(Factory)
CASE(ConvenienceFactory)
#undef CASE #undef CASE
} }
} }

View File

@@ -0,0 +1,12 @@
// RUN: rm -rf %t && mkdir %t
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-sib -o %t -primary-file %s -module-name main
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-ir -o /dev/null -primary-file %t/clang_sib.sib -module-name main
// REQUIRES: objc_interop
import Foundation
func test() {
// Use a factory initializer.
_ = Hive(queen: Bee())
}