Skip to content

Commit 3e892eb

Browse files
committed
---
yaml --- r: 348654 b: refs/heads/master c: 2ff5de5 h: refs/heads/master
1 parent c544402 commit 3e892eb

37 files changed

+535
-223
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: e010cb4cd45c57874edf75b83802103102109cac
2+
refs/heads/master: 2ff5de58b24d11ec51da7c8ea0d51511e740cce3
33
refs/heads/master-next: 203b3026584ecad859eb328b2e12490099409cd5
44
refs/tags/osx-passed: b6b74147ef8a386f532cf9357a1bde006e552c54
55
refs/tags/swift-2.2-SNAPSHOT-2015-12-01-a: 6bb18e013c2284f2b45f5f84f2df2887dc0f7dea

trunk/docs/ABI/Mangling.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ Entities
290290
entity-spec ::= type 'fu' INDEX // implicit anonymous closure
291291
entity-spec ::= 'fA' INDEX // default argument N+1 generator
292292
entity-spec ::= 'fi' // non-local variable initializer
293+
entity-spec ::= 'fP' // property wrapper backing initializer
293294
entity-spec ::= 'fD' // deallocating destructor; untyped
294295
entity-spec ::= 'fd' // non-deallocating destructor; untyped
295296
entity-spec ::= 'fE' // ivar destroyer; untyped

trunk/include/swift/AST/ASTMangler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ class ASTMangler : public Mangler {
124124
SymbolKind SKind);
125125

126126
std::string mangleInitializerEntity(const VarDecl *var, SymbolKind SKind);
127+
std::string mangleBackingInitializerEntity(const VarDecl *var,
128+
SymbolKind SKind);
127129

128130
std::string mangleNominalType(const NominalTypeDecl *decl);
129131

@@ -311,6 +313,7 @@ class ASTMangler : public Mangler {
311313
void appendDefaultArgumentEntity(const DeclContext *ctx, unsigned index);
312314

313315
void appendInitializerEntity(const VarDecl *var);
316+
void appendBackingInitializerEntity(const VarDecl *var);
314317

315318
CanType getDeclTypeForMangling(const ValueDecl *decl,
316319
GenericSignature *&genericSig,

trunk/include/swift/AST/DiagnosticsSema.def

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4528,8 +4528,6 @@ ERROR(property_wrapper_wrong_initial_value_init, none,
45284528
(DeclName, Type, Type))
45294529
ERROR(property_wrapper_failable_init, none,
45304530
"%0 cannot be failable", (DeclName))
4531-
ERROR(property_wrapper_ambiguous_initial_value_init, none,
4532-
"property wrapper type %0 has multiple initial-value initializers", (Type))
45334531
ERROR(property_wrapper_ambiguous_default_value_init, none,
45344532
"property wrapper type %0 has multiple default-value initializers", (Type))
45354533
ERROR(property_wrapper_type_requirement_not_accessible,none,

trunk/include/swift/AST/PropertyWrappers.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,13 @@ struct PropertyWrapperTypeInfo {
3535
/// directed.
3636
VarDecl *valueVar = nullptr;
3737

38-
/// The initializer init(wrappedValue:) that will be called when the
38+
/// Whether there is an init(wrappedValue:) that will be called when the
3939
/// initializing the property wrapper type from a value of the property type.
40-
///
41-
/// This initializer is optional, but if present will be used for the `=`
42-
/// initialization syntax.
43-
ConstructorDecl *wrappedValueInit = nullptr;
40+
enum {
41+
NoWrappedValueInit = 0,
42+
HasWrappedValueInit,
43+
HasInitialValueInit
44+
} wrappedValueInit = NoWrappedValueInit;
4445

4546
/// The initializer `init()` that will be called to default-initialize a
4647
/// value with an attached property wrapper.

trunk/include/swift/Demangling/DemangleNodes.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ NODE(PostfixOperator)
157157
NODE(PrefixOperator)
158158
NODE(PrivateDeclName)
159159
NODE(PropertyDescriptor)
160+
CONTEXT_NODE(PropertyWrapperBackingInitializer)
160161
CONTEXT_NODE(Protocol)
161162
CONTEXT_NODE(ProtocolSymbolicReference)
162163
NODE(ProtocolConformance)

trunk/include/swift/SIL/SILDeclRef.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,10 @@ struct SILDeclRef {
133133
/// routines have an ivar destroyer, which is emitted as
134134
/// .cxx_destruct.
135135
IVarDestroyer,
136+
137+
/// References the wrapped value injection function used to initialize
138+
/// the backing storage property from a wrapped value.
139+
PropertyWrapperBackingInitializer,
136140
};
137141

138142
/// The ValueDecl or AbstractClosureExpr represented by this SILDeclRef.

trunk/lib/AST/ASTMangler.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,14 @@ std::string ASTMangler::mangleInitializerEntity(const VarDecl *var,
155155
return finalize();
156156
}
157157

158+
std::string ASTMangler::mangleBackingInitializerEntity(const VarDecl *var,
159+
SymbolKind SKind) {
160+
beginMangling();
161+
appendBackingInitializerEntity(var);
162+
appendSymbolKind(SKind);
163+
return finalize();
164+
}
165+
158166
std::string ASTMangler::mangleNominalType(const NominalTypeDecl *decl) {
159167
beginMangling();
160168
appendAnyGenericType(decl);
@@ -2334,6 +2342,11 @@ void ASTMangler::appendInitializerEntity(const VarDecl *var) {
23342342
appendOperator("fi");
23352343
}
23362344

2345+
void ASTMangler::appendBackingInitializerEntity(const VarDecl *var) {
2346+
appendEntity(var, "vp", var->isStatic());
2347+
appendOperator("fP");
2348+
}
2349+
23372350
/// Is this declaration a method for mangling purposes? If so, we'll leave the
23382351
/// Self type out of its mangling.
23392352
static bool isMethodDecl(const Decl *decl) {

trunk/lib/AST/Decl.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5482,7 +5482,8 @@ bool VarDecl::hasAttachedPropertyWrapper() const {
54825482
return !getAttachedPropertyWrappers().empty();
54835483
}
54845484

5485-
/// Whether all of the attached property wrappers have an init(initialValue:) initializer.
5485+
/// Whether all of the attached property wrappers have an init(wrappedValue:)
5486+
/// initializer.
54865487
bool VarDecl::allAttachedPropertyWrappersHaveInitialValueInit() const {
54875488
for (unsigned i : indices(getAttachedPropertyWrappers())) {
54885489
if (!getAttachedPropertyWrapperTypeInfo(i).wrappedValueInit)

trunk/lib/AST/TypeCheckRequests.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -564,11 +564,6 @@ void swift::simple_display(
564564
out << propertyWrapper.valueVar->printRef();
565565
else
566566
out << "null";
567-
out << ", ";
568-
if (propertyWrapper.wrappedValueInit)
569-
out << propertyWrapper.wrappedValueInit->printRef();
570-
else
571-
out << "null";
572567
out << " }";
573568
}
574569

trunk/lib/Demangling/Demangler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1577,6 +1577,7 @@ bool Demangle::nodeConsumesGenericArgs(Node *node) {
15771577
case Node::Kind::ExplicitClosure:
15781578
case Node::Kind::DefaultArgumentInitializer:
15791579
case Node::Kind::Initializer:
1580+
case Node::Kind::PropertyWrapperBackingInitializer:
15801581
return false;
15811582
default:
15821583
return true;
@@ -2934,6 +2935,10 @@ NodePointer Demangler::demangleFunctionEntity() {
29342935
case 'u': Args = TypeAndIndex; Kind = Node::Kind::ImplicitClosure; break;
29352936
case 'A': Args = Index; Kind = Node::Kind::DefaultArgumentInitializer; break;
29362937
case 'p': return demangleEntity(Node::Kind::GenericTypeParamDecl);
2938+
case 'P':
2939+
Args = None;
2940+
Kind = Node::Kind::PropertyWrapperBackingInitializer;
2941+
break;
29372942
default: return nullptr;
29382943
}
29392944

trunk/lib/Demangling/NodePrinter.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ class NodePrinter {
398398
case Node::Kind::InOut:
399399
case Node::Kind::InfixOperator:
400400
case Node::Kind::Initializer:
401+
case Node::Kind::PropertyWrapperBackingInitializer:
401402
case Node::Kind::KeyPathGetterThunkHelper:
402403
case Node::Kind::KeyPathSetterThunkHelper:
403404
case Node::Kind::KeyPathEqualsThunkHelper:
@@ -1125,6 +1126,10 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
11251126
case Node::Kind::Initializer:
11261127
return printEntity(Node, asPrefixContext, TypePrinting::NoType,
11271128
/*hasName*/false, "variable initialization expression");
1129+
case Node::Kind::PropertyWrapperBackingInitializer:
1130+
return printEntity(
1131+
Node, asPrefixContext, TypePrinting::NoType,
1132+
/*hasName*/false, "property wrapper backing initializer");
11281133
case Node::Kind::DefaultArgumentInitializer:
11291134
return printEntity(Node, asPrefixContext, TypePrinting::NoType,
11301135
/*hasName*/false, "default argument ",
@@ -2447,7 +2452,8 @@ printEntity(NodePointer Entity, bool asPrefixContext, TypePrinting TypePr,
24472452
if (!asPrefixContext && PostfixContext) {
24482453
// Print any left over context which couldn't be printed in prefix form.
24492454
if (Entity->getKind() == Node::Kind::DefaultArgumentInitializer ||
2450-
Entity->getKind() == Node::Kind::Initializer) {
2455+
Entity->getKind() == Node::Kind::Initializer ||
2456+
Entity->getKind() == Node::Kind::PropertyWrapperBackingInitializer) {
24512457
Printer << " of ";
24522458
} else {
24532459
Printer << " in ";

trunk/lib/Demangling/OldRemangler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,11 @@ void Remangler::mangleInitializer(Node *node, EntityContext &ctx) {
796796
mangleSimpleEntity(node, 'I', "i", ctx);
797797
}
798798

799+
void Remangler::manglePropertyWrapperBackingInitializer(Node *node,
800+
EntityContext &ctx) {
801+
mangleSimpleEntity(node, 'I', "P", ctx);
802+
}
803+
799804
void Remangler::mangleDefaultArgumentInitializer(Node *node,
800805
EntityContext &ctx) {
801806
mangleNamedEntity(node, 'I', "A", ctx);

trunk/lib/Demangling/Remangler.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,7 @@ void Remangler::mangleGenericArgs(Node *node, char &Separator,
518518
case Node::Kind::ImplicitClosure:
519519
case Node::Kind::DefaultArgumentInitializer:
520520
case Node::Kind::Initializer:
521+
case Node::Kind::PropertyWrapperBackingInitializer:
521522
if (!fullSubstitutionMap)
522523
break;
523524

@@ -1525,6 +1526,11 @@ void Remangler::mangleInitializer(Node *node) {
15251526
Buffer << "fi";
15261527
}
15271528

1529+
void Remangler::manglePropertyWrapperBackingInitializer(Node *node) {
1530+
mangleChildNodes(node);
1531+
Buffer << "fP";
1532+
}
1533+
15281534
void Remangler::mangleLazyProtocolWitnessTableAccessor(Node *node) {
15291535
mangleChildNodes(node);
15301536
Buffer << "Wl";
@@ -2482,6 +2488,7 @@ bool Demangle::isSpecialized(Node *node) {
24822488
case Node::Kind::ExplicitClosure:
24832489
case Node::Kind::ImplicitClosure:
24842490
case Node::Kind::Initializer:
2491+
case Node::Kind::PropertyWrapperBackingInitializer:
24852492
case Node::Kind::DefaultArgumentInitializer:
24862493
case Node::Kind::Getter:
24872494
case Node::Kind::Setter:
@@ -2521,6 +2528,7 @@ NodePointer Demangle::getUnspecialized(Node *node, NodeFactory &Factory) {
25212528
case Node::Kind::ExplicitClosure:
25222529
case Node::Kind::ImplicitClosure:
25232530
case Node::Kind::Initializer:
2531+
case Node::Kind::PropertyWrapperBackingInitializer:
25242532
case Node::Kind::DefaultArgumentInitializer:
25252533
NumToCopy = node->getNumChildren();
25262534
LLVM_FALLTHROUGH;

trunk/lib/IRGen/GenObjC.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ namespace {
458458
case SILDeclRef::Kind::StoredPropertyInitializer:
459459
case SILDeclRef::Kind::EnumElement:
460460
case SILDeclRef::Kind::GlobalAccessor:
461+
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
461462
llvm_unreachable("Method does not have a selector");
462463

463464
case SILDeclRef::Kind::Destroyer:

trunk/lib/ParseSIL/ParseSIL.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,6 +1518,9 @@ bool SILParser::parseSILDeclRef(SILDeclRef &Result,
15181518
} else if (!ParseState && Id.str() == "propertyinit") {
15191519
Kind = SILDeclRef::Kind::StoredPropertyInitializer;
15201520
ParseState = 1;
1521+
} else if (!ParseState && Id.str() == "backinginit") {
1522+
Kind = SILDeclRef::Kind::PropertyWrapperBackingInitializer;
1523+
ParseState = 1;
15211524
} else if (Id.str() == "foreign") {
15221525
IsObjC = true;
15231526
break;

trunk/lib/SIL/SILDeclRef.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,13 @@ SILLinkage SILDeclRef::getLinkage(ForDefinition_t forDefinition) const {
313313
limit = Limit::NeverPublic;
314314
}
315315

316+
// The property wrapper backing initializer is never public for resilient
317+
// properties.
318+
if (kind == SILDeclRef::Kind::PropertyWrapperBackingInitializer) {
319+
if (cast<VarDecl>(d)->isResilient())
320+
limit = Limit::NeverPublic;
321+
}
322+
316323
// Stored property initializers get the linkage of their containing type.
317324
if (isStoredPropertyInitializer()) {
318325
// Three cases:
@@ -788,6 +795,11 @@ std::string SILDeclRef::mangle(ManglingKind MKind) const {
788795
case SILDeclRef::Kind::StoredPropertyInitializer:
789796
assert(!isCurried);
790797
return mangler.mangleInitializerEntity(cast<VarDecl>(getDecl()), SKind);
798+
799+
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
800+
assert(!isCurried);
801+
return mangler.mangleBackingInitializerEntity(cast<VarDecl>(getDecl()),
802+
SKind);
791803
}
792804

793805
llvm_unreachable("bad entity kind!");

trunk/lib/SIL/SILFunctionType.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,6 +1288,7 @@ static CanSILFunctionType getNativeSILFunctionType(
12881288
case SILDeclRef::Kind::GlobalAccessor:
12891289
case SILDeclRef::Kind::DefaultArgGenerator:
12901290
case SILDeclRef::Kind::StoredPropertyInitializer:
1291+
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
12911292
case SILDeclRef::Kind::IVarInitializer:
12921293
case SILDeclRef::Kind::IVarDestroyer: {
12931294
auto conv = DefaultConventions(NormalParameterConvention::Guaranteed);
@@ -1815,6 +1816,7 @@ static ObjCSelectorFamily getObjCSelectorFamily(SILDeclRef c) {
18151816
case SILDeclRef::Kind::GlobalAccessor:
18161817
case SILDeclRef::Kind::DefaultArgGenerator:
18171818
case SILDeclRef::Kind::StoredPropertyInitializer:
1819+
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
18181820
llvm_unreachable("Unexpected Kind of foreign SILDeclRef");
18191821
}
18201822

@@ -2045,6 +2047,7 @@ TypeConverter::getDeclRefRepresentation(SILDeclRef c) {
20452047
case SILDeclRef::Kind::GlobalAccessor:
20462048
case SILDeclRef::Kind::DefaultArgGenerator:
20472049
case SILDeclRef::Kind::StoredPropertyInitializer:
2050+
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
20482051
return SILFunctionTypeRepresentation::Thin;
20492052

20502053
case SILDeclRef::Kind::Func:
@@ -2594,6 +2597,7 @@ static AbstractFunctionDecl *getBridgedFunction(SILDeclRef declRef) {
25942597
case SILDeclRef::Kind::GlobalAccessor:
25952598
case SILDeclRef::Kind::DefaultArgGenerator:
25962599
case SILDeclRef::Kind::StoredPropertyInitializer:
2600+
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
25972601
case SILDeclRef::Kind::IVarInitializer:
25982602
case SILDeclRef::Kind::IVarDestroyer:
25992603
return nullptr;

trunk/lib/SIL/SILPrinter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,9 @@ void SILDeclRef::print(raw_ostream &OS) const {
333333
case SILDeclRef::Kind::StoredPropertyInitializer:
334334
OS << "!propertyinit";
335335
break;
336+
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
337+
OS << "!backinginit";
338+
break;
336339
}
337340

338341
auto uncurryLevel = getParameterListCount() - 1;

trunk/lib/SIL/TypeLowering.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1807,6 +1807,27 @@ static CanAnyFunctionType getStoredPropertyInitializerInterfaceType(
18071807
{}, resultTy);
18081808
}
18091809

1810+
/// Get the type of a property wrapper backing initializer,
1811+
/// (property-type) -> backing-type.
1812+
static CanAnyFunctionType getPropertyWrapperBackingInitializerInterfaceType(
1813+
TypeConverter &TC,
1814+
VarDecl *VD) {
1815+
CanType resultType =
1816+
VD->getPropertyWrapperBackingPropertyType()->getCanonicalType();
1817+
1818+
auto *DC = VD->getInnermostDeclContext();
1819+
CanType inputType =
1820+
VD->getParentPattern()->getType()->mapTypeOutOfContext()
1821+
->getCanonicalType();
1822+
1823+
auto sig = DC->getGenericSignatureOfContext();
1824+
1825+
AnyFunctionType::Param param(
1826+
inputType, Identifier(),
1827+
ParameterTypeFlags().withValueOwnership(ValueOwnership::Owned));
1828+
return CanAnyFunctionType::get(getCanonicalSignatureOrNull(sig), {param},
1829+
resultType);
1830+
}
18101831
/// Get the type of a destructor function.
18111832
static CanAnyFunctionType getDestructorInterfaceType(DestructorDecl *dd,
18121833
bool isDeallocating,
@@ -1941,6 +1962,9 @@ CanAnyFunctionType TypeConverter::makeConstantInterfaceType(SILDeclRef c) {
19411962
return getDefaultArgGeneratorInterfaceType(c);
19421963
case SILDeclRef::Kind::StoredPropertyInitializer:
19431964
return getStoredPropertyInitializerInterfaceType(cast<VarDecl>(vd));
1965+
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
1966+
return getPropertyWrapperBackingInitializerInterfaceType(*this,
1967+
cast<VarDecl>(vd));
19441968
case SILDeclRef::Kind::IVarInitializer:
19451969
return getIVarInitDestroyerInterfaceType(cast<ClassDecl>(vd),
19461970
c.isForeign, false);
@@ -1979,6 +2003,7 @@ TypeConverter::getConstantGenericSignature(SILDeclRef c) {
19792003
case SILDeclRef::Kind::EnumElement:
19802004
case SILDeclRef::Kind::GlobalAccessor:
19812005
case SILDeclRef::Kind::StoredPropertyInitializer:
2006+
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
19822007
return vd->getDeclContext()->getGenericSignatureOfContext();
19832008
}
19842009

trunk/lib/SILGen/SILGen.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,23 @@ emitStoredPropertyInitialization(PatternBindingDecl *pbd, unsigned i) {
11401140
});
11411141
}
11421142

1143+
void SILGenModule::
1144+
emitPropertyWrapperBackingInitializer(VarDecl *var) {
1145+
SILDeclRef constant(var, SILDeclRef::Kind::PropertyWrapperBackingInitializer);
1146+
emitOrDelayFunction(*this, constant, [this, constant, var](SILFunction *f) {
1147+
preEmitFunction(constant, var, f, var);
1148+
PrettyStackTraceSILFunction X(
1149+
"silgen emitPropertyWrapperBackingInitializer", f);
1150+
f->createProfiler(var, constant, ForDefinition);
1151+
auto varDC = var->getInnermostDeclContext();
1152+
auto wrapperInfo = var->getPropertyWrapperBackingPropertyInfo();
1153+
assert(wrapperInfo.initializeFromOriginal);
1154+
SILGenFunction SGF(*this, *f, varDC);
1155+
SGF.emitGeneratorFunction(constant, wrapperInfo.initializeFromOriginal);
1156+
postEmitFunction(constant, f);
1157+
});
1158+
}
1159+
11431160
SILFunction *SILGenModule::emitLazyGlobalInitializer(StringRef funcName,
11441161
PatternBindingDecl *binding,
11451162
unsigned pbdEntry) {

trunk/lib/SILGen/SILGen.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,9 @@ class LLVM_LIBRARY_VISIBILITY SILGenModule : public ASTVisitor<SILGenModule> {
239239
/// Emits the stored property initializer for the given pattern.
240240
void emitStoredPropertyInitialization(PatternBindingDecl *pd, unsigned i);
241241

242+
/// Emits the backing initializer for a property with an attached wrapper.
243+
void emitPropertyWrapperBackingInitializer(VarDecl *var);
244+
242245
/// Emits default argument generators for the given parameter list.
243246
void emitDefaultArgGenerators(SILDeclRef::Loc decl,
244247
ParameterList *paramList);

0 commit comments

Comments
 (0)