@@ -3289,16 +3289,6 @@ class StoreInst
3289
3289
3290
3290
class EndBorrowInst ;
3291
3291
3292
- struct UseToEndBorrow {
3293
- Optional<EndBorrowInst *> operator ()(Operand *use) const {
3294
- if (auto endBorrow = dyn_cast<EndBorrowInst>(use->getUser ())) {
3295
- return endBorrow;
3296
- } else {
3297
- return None;
3298
- }
3299
- }
3300
- };
3301
-
3302
3292
// / Represents a load of a borrowed value. Must be paired with an end_borrow
3303
3293
// / instruction in its use-def list.
3304
3294
class LoadBorrowInst :
@@ -3312,14 +3302,14 @@ class LoadBorrowInst :
3312
3302
LValue->getType ().getObjectType()) {}
3313
3303
3314
3304
using EndBorrowRange =
3315
- OptionalTransformRange<use_range, UseToEndBorrow, use_iterator> ;
3305
+ decltype (std::declval<ValueBase>().getUsersOfType<EndBorrowInst>()) ;
3316
3306
3317
3307
// / Return a range over all EndBorrow instructions for this BeginBorrow.
3318
3308
EndBorrowRange getEndBorrows () const ;
3319
3309
};
3320
3310
3321
3311
inline auto LoadBorrowInst::getEndBorrows () const -> EndBorrowRange {
3322
- return EndBorrowRange ( getUses (), UseToEndBorrow () );
3312
+ return getUsersOfType<EndBorrowInst>( );
3323
3313
}
3324
3314
3325
3315
// / Represents the begin scope of a borrowed value. Must be paired with an
@@ -3335,7 +3325,7 @@ class BeginBorrowInst
3335
3325
3336
3326
public:
3337
3327
using EndBorrowRange =
3338
- OptionalTransformRange<use_range, UseToEndBorrow, use_iterator> ;
3328
+ decltype (std::declval<ValueBase>().getUsersOfType<EndBorrowInst>()) ;
3339
3329
3340
3330
// / Return a range over all EndBorrow instructions for this BeginBorrow.
3341
3331
EndBorrowRange getEndBorrows () const ;
@@ -3350,7 +3340,7 @@ class BeginBorrowInst
3350
3340
};
3351
3341
3352
3342
inline auto BeginBorrowInst::getEndBorrows () const -> EndBorrowRange {
3353
- return EndBorrowRange ( getUses (), UseToEndBorrow () );
3343
+ return getUsersOfType<EndBorrowInst>( );
3354
3344
}
3355
3345
3356
3346
// / Represents a store of a borrowed value into an address. Returns the borrowed
@@ -3489,6 +3479,8 @@ enum class SILAccessEnforcement : uint8_t {
3489
3479
};
3490
3480
StringRef getSILAccessEnforcementName (SILAccessEnforcement enforcement);
3491
3481
3482
+ class EndAccessInst ;
3483
+
3492
3484
// / Begins an access scope. Must be paired with an end_access instruction
3493
3485
// / along every path.
3494
3486
class BeginAccessInst
@@ -3560,13 +3552,8 @@ class BeginAccessInst
3560
3552
return getOperand ();
3561
3553
}
3562
3554
3563
- private:
3564
- // / Predicate used to filter EndAccessRange.
3565
- struct UseToEndAccess ;
3566
-
3567
- public:
3568
3555
using EndAccessRange =
3569
- OptionalTransformRange<use_range, UseToEndAccess, use_iterator> ;
3556
+ decltype (std::declval<ValueBase>().getUsersOfType<EndAccessInst>()) ;
3570
3557
3571
3558
// / Find all the associated end_access instructions for this begin_access.
3572
3559
EndAccessRange getEndAccesses () const ;
@@ -3607,18 +3594,8 @@ class EndAccessInst
3607
3594
}
3608
3595
};
3609
3596
3610
- struct BeginAccessInst ::UseToEndAccess {
3611
- Optional<EndAccessInst *> operator ()(Operand *use) const {
3612
- if (auto access = dyn_cast<EndAccessInst>(use->getUser ())) {
3613
- return access;
3614
- } else {
3615
- return None;
3616
- }
3617
- }
3618
- };
3619
-
3620
3597
inline auto BeginAccessInst::getEndAccesses () const -> EndAccessRange {
3621
- return EndAccessRange ( getUses (), UseToEndAccess () );
3598
+ return getUsersOfType<EndAccessInst>( );
3622
3599
}
3623
3600
3624
3601
// / Begins an access without requiring a paired end_access.
0 commit comments