mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Fix <rdar://problem/23086402> Swift compiler crash in CSDiag
This commit is contained in:
@@ -2530,18 +2530,24 @@ static void eraseOpenedExistentials(Expr *&expr) {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
std::pair<bool, Expr *> walkToExprPre(Expr *expr) override {
|
std::pair<bool, Expr *> walkToExprPre(Expr *expr) override {
|
||||||
if (auto openExistentialExpr = dyn_cast<OpenExistentialExpr>(expr)) {
|
if (auto OOE = dyn_cast<OpenExistentialExpr>(expr)) {
|
||||||
auto archetypeVal = openExistentialExpr->getOpaqueValue();
|
auto archetypeVal = OOE->getOpaqueValue();
|
||||||
auto base = openExistentialExpr->getExistentialValue();
|
auto base = OOE->getExistentialValue();
|
||||||
|
|
||||||
|
// Walk the base expression to ensure we erase any existentials within
|
||||||
|
// it.
|
||||||
|
base = base->walk(*this);
|
||||||
|
|
||||||
bool inserted = OpenExistentials.insert({archetypeVal, base}).second;
|
bool inserted = OpenExistentials.insert({archetypeVal, base}).second;
|
||||||
assert(inserted);
|
assert(inserted && "OpaqueValue appears multiple times?");
|
||||||
(void) inserted;
|
(void)inserted;
|
||||||
return { true, openExistentialExpr->getSubExpr() };
|
return { true, OOE->getSubExpr() };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto opaqueValueExpr = dyn_cast<OpaqueValueExpr>(expr)) {
|
if (auto OVE = dyn_cast<OpaqueValueExpr>(expr)) {
|
||||||
auto value = OpenExistentials.find(opaqueValueExpr);
|
auto value = OpenExistentials.find(OVE);
|
||||||
assert(value != OpenExistentials.end());
|
assert(value != OpenExistentials.end() &&
|
||||||
|
"didn't see this OVE in a containing OpenExistentialExpr?");
|
||||||
return { true, value->second };
|
return { true, value->second };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2572,7 +2578,7 @@ static void eraseOpenedExistentials(Expr *&expr) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
expr->walk(ExistentialEraser());
|
expr = expr->walk(ExistentialEraser());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Rewrite any type variables & archetypes in the specified type with
|
/// Rewrite any type variables & archetypes in the specified type with
|
||||||
|
|||||||
@@ -683,3 +683,18 @@ func r22387625() {
|
|||||||
let _= 5 // expected-error{{postfix '=' is reserved}} {{8-8= }}
|
let _= 5 // expected-error{{postfix '=' is reserved}} {{8-8= }}
|
||||||
let _ =5 // expected-error{{prefix '=' is reserved}} {{10-10= }}
|
let _ =5 // expected-error{{prefix '=' is reserved}} {{10-10= }}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// <rdar://problem/23086402> Swift compiler crash in CSDiag
|
||||||
|
protocol A23086402 {
|
||||||
|
var b: B23086402 { get }
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol B23086402 {
|
||||||
|
var c: [String] { get }
|
||||||
|
}
|
||||||
|
|
||||||
|
func test23086402(a: A23086402) {
|
||||||
|
print(a.b.c + "") // expected-error {{cannot convert value of type '[String]' to expected argument type '[Any]'}}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user