@@ -185,13 +185,11 @@ class CheckerManager {
185
185
StringRef OptionName,
186
186
StringRef ExpectedValueDesc) const ;
187
187
188
- using CheckerRef = CheckerBase *;
189
188
using CheckerTag = const void *;
190
- using CheckerDtor = CheckerFn<void ()>;
191
189
192
- // ===-- --------------------------------------------------------------------===//
193
- // Checker registration.
194
- // ===-- --------------------------------------------------------------------===//
190
+ // ===--------------------------------------------------------------------===//
191
+ // Checker registration.
192
+ // ===--------------------------------------------------------------------===//
195
193
196
194
// / Used to register checkers.
197
195
// / All arguments are automatically passed through to the checker
@@ -200,25 +198,25 @@ class CheckerManager {
200
198
// / \returns a pointer to the checker object.
201
199
template <typename CHECKER, typename ... AT>
202
200
CHECKER *registerChecker (AT &&... Args) {
203
- CheckerTag tag = getTag<CHECKER>();
204
- CheckerRef &ref = CheckerTags[tag ];
205
- assert (!ref && " Checker already registered, use getChecker!" );
206
-
207
- CHECKER *checker = new CHECKER ( std::forward<AT>(Args)...);
208
- checker-> Name = CurrentCheckerName ;
209
- CheckerDtors. push_back ( CheckerDtor (checker, destruct<CHECKER>)) ;
210
- CHECKER::_register (checker , *this );
211
- ref = checker ;
212
- return checker ;
201
+ CheckerTag Tag = getTag<CHECKER>();
202
+ std::unique_ptr<CheckerBase> &Ref = CheckerTags[Tag ];
203
+ assert (!Ref && " Checker already registered, use getChecker!" );
204
+
205
+ std::unique_ptr<CHECKER> Checker =
206
+ std::make_unique<CHECKER>(std::forward<AT>(Args)...) ;
207
+ Checker-> Name = CurrentCheckerName ;
208
+ CHECKER::_register (Checker. get () , *this );
209
+ Ref = std::move (Checker) ;
210
+ return static_cast <CHECKER *>(Ref. get ()) ;
213
211
}
214
212
215
213
template <typename CHECKER>
216
214
CHECKER *getChecker () {
217
- CheckerTag tag = getTag<CHECKER>();
218
- assert (CheckerTags. count (tag) != 0 &&
219
- " Requested checker is not registered! Maybe you should add it as a "
220
- " dependency in Checkers.td?" );
221
- return static_cast <CHECKER *>(CheckerTags[tag] );
215
+ CheckerTag Tag = getTag<CHECKER>();
216
+ std::unique_ptr<CheckerBase> &Ref = CheckerTags[Tag];
217
+ assert (Ref && " Requested checker is not registered! Maybe you should add it"
218
+ " as a dependency in Checkers.td?" );
219
+ return static_cast <CHECKER *>(Ref. get () );
222
220
}
223
221
224
222
template <typename CHECKER> bool isRegisteredChecker () {
@@ -462,9 +460,9 @@ class CheckerManager {
462
460
unsigned int Space = 0 ,
463
461
bool IsDot = false ) const ;
464
462
465
- // ===---------------------------------------------------------------------- ===//
463
+ // ===--------------------------------------------------------------------===//
466
464
// Internal registration functions for AST traversing.
467
- // ===---------------------------------------------------------------------- ===//
465
+ // ===--------------------------------------------------------------------===//
468
466
469
467
// Functions used by the registration mechanism, checkers should not touch
470
468
// these directly.
@@ -478,9 +476,9 @@ class CheckerManager {
478
476
479
477
void _registerForBody (CheckDeclFunc checkfn);
480
478
481
- // ===-- --------------------------------------------------------------------===//
482
- // Internal registration functions for path-sensitive checking.
483
- // ===-- --------------------------------------------------------------------===//
479
+ // ===--------------------------------------------------------------------===//
480
+ // Internal registration functions for path-sensitive checking.
481
+ // ===--------------------------------------------------------------------===//
484
482
485
483
using CheckStmtFunc = CheckerFn<void (const Stmt *, CheckerContext &)>;
486
484
@@ -582,9 +580,9 @@ class CheckerManager {
582
580
583
581
void _registerForEndOfTranslationUnit (CheckEndOfTranslationUnit checkfn);
584
582
585
- // ===-- --------------------------------------------------------------------===//
586
- // Internal registration functions for events.
587
- // ===-- --------------------------------------------------------------------===//
583
+ // ===--------------------------------------------------------------------===//
584
+ // Internal registration functions for events.
585
+ // ===--------------------------------------------------------------------===//
588
586
589
587
using EventTag = void *;
590
588
using CheckEventFunc = CheckerFn<void (const void *event)>;
@@ -611,20 +609,15 @@ class CheckerManager {
611
609
Checker (&event);
612
610
}
613
611
614
- // ===-- --------------------------------------------------------------------===//
615
- // Implementation details.
616
- // ===-- --------------------------------------------------------------------===//
612
+ // ===--------------------------------------------------------------------===//
613
+ // Implementation details.
614
+ // ===--------------------------------------------------------------------===//
617
615
618
616
private:
619
- template <typename CHECKER>
620
- static void destruct (void *obj) { delete static_cast <CHECKER *>(obj); }
621
-
622
617
template <typename T>
623
618
static void *getTag () { static int tag; return &tag; }
624
619
625
- llvm::DenseMap<CheckerTag, CheckerRef> CheckerTags;
626
-
627
- std::vector<CheckerDtor> CheckerDtors;
620
+ llvm::DenseMap<CheckerTag, std::unique_ptr<CheckerBase>> CheckerTags;
628
621
629
622
struct DeclCheckerInfo {
630
623
CheckDeclFunc CheckFn;
0 commit comments