Skip to content

Commit 7085923

Browse files
authored
Merge pull request #18210 from rintaro/4.2-refactoring-rdar42098130
[4.2][Refactoring] Fix crasher in switch with non-nominal subject type
2 parents a0f0f0d + 39fa9cb commit 7085923

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

lib/IDE/Refactoring.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2394,7 +2394,8 @@ collectAvailableRefactoringsAtCursor(SourceFile *SF, unsigned Line,
23942394

23952395
static EnumDecl* getEnumDeclFromSwitchStmt(SwitchStmt *SwitchS) {
23962396
if (auto SubjectTy = SwitchS->getSubjectExpr()->getType()) {
2397-
return SubjectTy->getAnyNominal()->getAsEnumOrEnumExtensionContext();
2397+
// FIXME: Support more complex subject like '(Enum1, Enum2)'.
2398+
return dyn_cast_or_null<EnumDecl>(SubjectTy->getAnyNominal());
23982399
}
23992400
return nullptr;
24002401
}

test/refactoring/RefactoringKind/crashers.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,21 @@ func test() {
2020

2121
// RUN: %refactor -source-filename %s -pos=17:3 -end-pos=18:15 | %FileCheck %s -check-prefix=CHECK2
2222
// CHECK2: Action begins
23+
24+
// rdar://42098130
25+
enum E_42098130 { case foo, bar }
26+
func test_42098130<T>(e1: T, e2: E_42098130) {
27+
switch e1 {
28+
default:
29+
break
30+
}
31+
switch (e2, e2) {
32+
default:
33+
break
34+
}
35+
}
36+
// RUN: %refactor -source-filename %s -pos=27:3 | %FileCheck %s -check-prefix=CHECK3
37+
// RUN: %refactor -source-filename %s -pos=28:3 | %FileCheck %s -check-prefix=CHECK3
38+
// RUN: %refactor -source-filename %s -pos=31:3 | %FileCheck %s -check-prefix=CHECK3
39+
// RUN: %refactor -source-filename %s -pos=32:3 | %FileCheck %s -check-prefix=CHECK3
40+
// CHECK3: Action begins

0 commit comments

Comments
 (0)