Skip to content

Commit e694837

Browse files
committed
[Sema] Don't make argument paren target of RebindSelfInConstructorExpr
For `use(self.init())`, target of RebindSelfInConstructorExpr should be call expression instead of paren expression. rdar://problem/41416911 Possibly: rdar://problem/41593987
1 parent e3aa53c commit e694837

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,9 +1099,11 @@ namespace {
10991099
if (isa<IdentityExpr>(ancestor) ||
11001100
isa<ForceValueExpr>(ancestor) ||
11011101
isa<AnyTryExpr>(ancestor)) {
1102-
if (target)
1103-
target = ancestor;
1104-
continue;
1102+
if (!CallArgs.count(ancestor)) {
1103+
if (target)
1104+
target = ancestor;
1105+
continue;
1106+
}
11051107
}
11061108

11071109
// No other expression kinds are permitted.

test/expr/postfix/dot/init_ref_delegation.swift

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,8 @@ class TestNestedExpr {
338338
}
339339

340340
convenience init(b: Int) {
341-
func use(_ x: ()) {} // expected-note {{'use' declared here}}
342-
use(self.init())
343-
// FIXME: rdar://41416911 // expected-error@-1 {{missing argument for parameter #1 in call}}
341+
func use(_ x: ()) {}
342+
use(self.init()) // expected-error {{initializer delegation ('self.init') cannot be nested in another expression}}
344343
}
345344

346345
convenience init(c: Int) {
@@ -353,9 +352,8 @@ class TestNestedExpr {
353352
}
354353

355354
convenience init(e: Int) {
356-
func use(_ x: ()) {} // expected-note {{'use' declared here}}
357-
use(self.init(fail: true)!)
358-
// FIXME: rdar://41416911 // expected-error@-1 {{missing argument for parameter #1 in call}}
355+
func use(_ x: ()) {}
356+
use(self.init(fail: true)!) // expected-error {{initializer delegation ('self.init') cannot be nested in another expression}}
359357
}
360358

361359
convenience init(f: Int) {
@@ -368,9 +366,8 @@ class TestNestedExpr {
368366
}
369367

370368
convenience init(h: Int) {
371-
func use(_ x: ()) {} // expected-note {{'use' declared here}}
372-
use(try! self.init(error: true))
373-
// FIXME: rdar://41416911 // expected-error@-1 {{missing argument for parameter #1 in call}}
369+
func use(_ x: ()) {}
370+
use(try! self.init(error: true)) // expected-error {{initializer delegation ('self.init') cannot be nested in another expression}}
374371
}
375372

376373
convenience init(i: Int) {
@@ -400,6 +397,11 @@ class TestNestedExpr {
400397
// expected-error@-1 {{initializer delegation ('self.init') cannot be nested in another expression}}
401398
}
402399
}
400+
401+
convenience init(k: Int) {
402+
func use(_ x: Any...) {}
403+
use(self.init()) // expected-error {{initializer delegation ('self.init') cannot be nested in another expression}}
404+
}
403405
}
404406

405407
class TestNestedExprSub : TestNestedExpr {
@@ -409,9 +411,8 @@ class TestNestedExprSub : TestNestedExpr {
409411
}
410412

411413
init(b: Int) {
412-
func use(_ x: ()) {} // expected-note {{'use' declared here}}
413-
use(super.init())
414-
// FIXME: rdar://41416911 // expected-error@-1 {{missing argument for parameter #1 in call}}
414+
func use(_ x: ()) {}
415+
use(super.init()) // expected-error {{initializer chaining ('super.init') cannot be nested in another expression}}
415416
}
416417

417418
init(c: Int) {
@@ -424,9 +425,8 @@ class TestNestedExprSub : TestNestedExpr {
424425
}
425426

426427
init(e: Int) {
427-
func use(_ x: ()) {} // expected-note {{'use' declared here}}
428-
use(super.init(fail: true)!)
429-
// FIXME: rdar://41416911 // expected-error@-1 {{missing argument for parameter #1 in call}}
428+
func use(_ x: ()) {}
429+
use(super.init(fail: true)!) // expected-error {{initializer chaining ('super.init') cannot be nested in another expression}}
430430
}
431431

432432
init(f: Int) {
@@ -439,14 +439,18 @@ class TestNestedExprSub : TestNestedExpr {
439439
}
440440

441441
init(h: Int) {
442-
func use(_ x: ()) {} // expected-note {{'use' declared here}}
443-
use(try! super.init(error: true))
444-
// FIXME: rdar://41416911 // expected-error@-1 {{missing argument for parameter #1 in call}}
442+
func use(_ x: ()) {}
443+
use(try! super.init(error: true)) // expected-error {{initializer chaining ('super.init') cannot be nested in another expression}}
445444
}
446445

447446
init(i: Int) {
448447
_ = ((), try! super.init(error: true)) // expected-error {{initializer chaining ('super.init') cannot be nested in another expression}}
449448
}
449+
450+
init(j: Int) {
451+
func use(_ x: Any...) {}
452+
use(super.init()) // expected-error {{initializer chaining ('super.init') cannot be nested in another expression}}
453+
}
450454
}
451455

452456

0 commit comments

Comments
 (0)