File tree Expand file tree Collapse file tree 2 files changed +47
-1
lines changed Expand file tree Collapse file tree 2 files changed +47
-1
lines changed Original file line number Diff line number Diff line change @@ -768,13 +768,27 @@ ExprPatternMatchRequest::evaluate(Evaluator &evaluator,
768
768
DeclNameLoc (EP->getLoc ()));
769
769
matchOp->setImplicit ();
770
770
771
+ auto subExpr = EP->getSubExpr ();
772
+
773
+ // Pull off the outer "unsafe" expression.
774
+ UnsafeExpr *unsafeExpr = dyn_cast<UnsafeExpr>(subExpr);
775
+ if (unsafeExpr) {
776
+ subExpr = unsafeExpr->getSubExpr ();
777
+ }
778
+
771
779
// Note we use getEndLoc here to have the BinaryExpr source range be the same
772
780
// as the expr pattern source range.
773
781
auto *matchVarRef =
774
782
new (ctx) DeclRefExpr (matchVar, DeclNameLoc (EP->getEndLoc ()),
775
783
/* Implicit=*/ true );
776
- auto *matchCall = BinaryExpr::create (ctx, EP-> getSubExpr () , matchOp,
784
+ Expr *matchCall = BinaryExpr::create (ctx, subExpr , matchOp,
777
785
matchVarRef, /* implicit*/ true );
786
+
787
+ // If there was an "unsafe", put it outside of the match call.
788
+ if (unsafeExpr) {
789
+ matchCall = UnsafeExpr::createImplicit (ctx, unsafeExpr->getLoc (), matchCall);
790
+ }
791
+
778
792
return {matchVar, matchCall};
779
793
}
780
794
Original file line number Diff line number Diff line change @@ -317,3 +317,35 @@ extension Slice {
317
317
}
318
318
}
319
319
}
320
+
321
+ @unsafe enum SomeEnum {
322
+ case first
323
+ case second
324
+ }
325
+
326
+ @unsafe var someEnumValue : SomeEnum = unsafe . first
327
+
328
+ func testSwitch( se: SomeEnum ) {
329
+ switch unsafe se {
330
+ case unsafe someEnumValue: break
331
+ default : break
332
+ }
333
+
334
+ switch unsafe se {
335
+ case someEnumValue: break
336
+ // expected-warning@-1{{expression uses unsafe constructs but is not marked with 'unsafe'}}{{8-8=unsafe }}
337
+ // expected-note@-2{{argument #0 in call to operator function '~=' has unsafe type 'T'}}
338
+ // expected-note@-3{{argument #1 in call to operator function '~=' has unsafe type 'T'}}
339
+ // expected-note@-4{{reference to unsafe type 'SomeEnum'}}
340
+ // expected-note@-5{{reference to unsafe var 'someEnumValue'}}
341
+ // expected-note@-6{{reference to let '$match' involves unsafe type 'SomeEnum'}}
342
+ default : break
343
+ }
344
+
345
+ // expected-note@+2{{reference to parameter 'se' involves unsafe type 'SomeEnum'}}
346
+ // expected-warning@+1{{expression uses unsafe constructs but is not marked with 'unsafe'}}{{10-10=unsafe }}
347
+ switch se {
348
+ case unsafe someEnumValue: break
349
+ default : break
350
+ }
351
+ }
You can’t perform that action at this time.
0 commit comments