Skip to content

Commit 0487ea0

Browse files
committed
A few more tests demonstrating usage.
1 parent 8c18cc7 commit 0487ea0

File tree

3 files changed

+47
-29
lines changed

3 files changed

+47
-29
lines changed

include/swift/Sema/Constraint.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ enum class ConversionRestrictionKind {
269269
/// Implicit conversion from a value of CGFloat type to a value of Double type
270270
/// via an implicit Double initializer call passing a CGFloat value.
271271
CGFloatToDouble,
272-
/// Implicit conversion where an init(implicit:) initializer is vailable
272+
/// Implicit conversion where an init(implicit:) initializer is available.
273273
ImplicitConversion,
274274
};
275275

lib/Sema/CSSimplify.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5000,7 +5000,6 @@ ConstructorDecl *ConstraintSystem::implicitConversionAvailable(Type fromType, Ty
50005000
trace("TO", toType);
50015001
if (NominalTypeDecl *toNominal = toType->getAnyNominal()) {
50025002
auto &ctx = getASTContext();
5003-
auto implicitArgId = ctx.Id_implicit;
50045003
if (!toNominal->setConversionsComputed())
50055004
for (ExtensionDecl *extension : toNominal->getExtensions()) {
50065005
Type extType = extension->getExtendedType()->getCanonicalType();
@@ -5010,8 +5009,8 @@ ConstructorDecl *ConstraintSystem::implicitConversionAvailable(Type fromType, Ty
50105009
ParameterList *parameters = initDecl->getParameters();
50115010
ParamDecl *param; // could be @implicit instead..
50125011
if (parameters->size() == 1 && (param = parameters->get(0)) &&
5013-
(param->getArgumentName() == implicitArgId ||
5014-
param->getParameterName() == implicitArgId)) {
5012+
(param->getArgumentName() == ctx.Id_implicit ||
5013+
param->getParameterName() == ctx.Id_implicit)) {
50155014
Type argType = param->getType()->getCanonicalType();
50165015
if (!arged++)
50175016
trace("\nEXT", extType);

test/TypeCoercion/immutable_mutable.swift

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,49 @@ import Foundation
55

66
extension Double {
77
init(implicit: CGFloat) {
8+
print("Double.init(implicit: CGFloat)")
89
self.init(implicit)
910
}
1011
}
1112
extension CGFloat {
1213
init(implicit: Double) {
14+
print("CGFloat.init(implicit: Double)")
1315
self.init(implicit)
1416
}
1517
}
18+
public struct III {
19+
var i: Int
20+
}
21+
extension Int {
22+
init(implicit: Int16) {
23+
print("Int.init(implicit: Int16)")
24+
self.init(implicit)
25+
}
26+
init(implicit: Int32) {
27+
print("Int.init(implicit: Int32)")
28+
self.init(implicit)
29+
}
30+
init(_ implicit: III) {
31+
print("Int.init(implicit: I)")
32+
self.init(implicit.i)
33+
}
34+
}
35+
extension Int32 {
36+
init(implicit: Int8) {
37+
print("Int32.init(implicit: Int8)")
38+
self.init(implicit)
39+
}
40+
init(implicit: Int16) {
41+
print("Int32.init(implicit: Int16)")
42+
self.init(implicit)
43+
}
44+
}
45+
extension III {
46+
public init(_ implicit: Int) {
47+
print("III.init(implicit: Int)")
48+
self.init(i: implicit)
49+
}
50+
}
1651

1752
extension UnsafeRawPointer {
1853
init(implicit: UnsafeMutableRawPointer) {
@@ -40,6 +75,15 @@ let x: Double = 99.1
4075
let y: CGFloat = x
4176
let z: Double? = y
4277

78+
let a: Int32 = 997
79+
let b: Int = a
80+
let c: Int8 = 97
81+
let d: Int = c // expected-error {{cannot convert value of type 'Int8' to specified type 'Int'}}
82+
let e = III(i: 888)
83+
let f: Int = e
84+
let h: Int16 = 45
85+
let j: Int32 = h
86+
4387
let optionalMutableRawPointer = UnsafeMutableRawPointer(bitPattern: -3)
4488
let mutableRawPointer = optionalMutableRawPointer!
4589
let immutable: UnsafeRawPointer = mutableRawPointer
@@ -91,28 +135,3 @@ array.withUnsafeMutableBufferPointer {
91135
_ = demutable(immutable: $0.baseAddress!)
92136
_ = demutable(optionalImmutable: $0.baseAddress)
93137
}
94-
95-
extension Int {
96-
init(implicit: Int8) {
97-
self.init(implicit)
98-
}
99-
init(implicit: Int16) {
100-
self.init(implicit)
101-
}
102-
init(implicit: Int32) {
103-
self.init(implicit)
104-
}
105-
}
106-
extension Int32 {
107-
init(implicit: Int8) {
108-
self.init(implicit)
109-
}
110-
init(implicit: Int16) {
111-
self.init(implicit)
112-
}
113-
}
114-
115-
let a: Int32 = 997
116-
let b: Int = a
117-
let c: Int8 = 97
118-
let d: Int = c

0 commit comments

Comments
 (0)