forked from OSchip/llvm-project
				
			unique_ptr-ify PathDiagnosticPiece ownership
llvm-svn: 216751
This commit is contained in:
		
							parent
							
								
									f6ee7a7cdd
								
							
						
					
					
						commit
						d15481ccea
					
				| 
						 | 
					@ -66,17 +66,15 @@ public:
 | 
				
			||||||
  /// If returns NULL the default implementation will be used.
 | 
					  /// If returns NULL the default implementation will be used.
 | 
				
			||||||
  /// Also note that at most one visitor of a BugReport should generate a
 | 
					  /// Also note that at most one visitor of a BugReport should generate a
 | 
				
			||||||
  /// non-NULL end of path diagnostic piece.
 | 
					  /// non-NULL end of path diagnostic piece.
 | 
				
			||||||
  virtual PathDiagnosticPiece *getEndPath(BugReporterContext &BRC,
 | 
					  virtual std::unique_ptr<PathDiagnosticPiece>
 | 
				
			||||||
                                          const ExplodedNode *N,
 | 
					  getEndPath(BugReporterContext &BRC, const ExplodedNode *N, BugReport &BR);
 | 
				
			||||||
                                          BugReport &BR);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  virtual void Profile(llvm::FoldingSetNodeID &ID) const = 0;
 | 
					  virtual void Profile(llvm::FoldingSetNodeID &ID) const = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// \brief Generates the default final diagnostic piece.
 | 
					  /// \brief Generates the default final diagnostic piece.
 | 
				
			||||||
  static PathDiagnosticPiece *getDefaultEndPath(BugReporterContext &BRC,
 | 
					  static std::unique_ptr<PathDiagnosticPiece>
 | 
				
			||||||
                                                const ExplodedNode *N,
 | 
					  getDefaultEndPath(BugReporterContext &BRC, const ExplodedNode *N,
 | 
				
			||||||
                    BugReport &BR);
 | 
					                    BugReport &BR);
 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// This class provides a convenience implementation for clone() using the
 | 
					/// This class provides a convenience implementation for clone() using the
 | 
				
			||||||
| 
						 | 
					@ -268,7 +266,7 @@ public:
 | 
				
			||||||
    return nullptr;
 | 
					    return nullptr;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PathDiagnosticPiece *getEndPath(BugReporterContext &BRC,
 | 
					  std::unique_ptr<PathDiagnosticPiece> getEndPath(BugReporterContext &BRC,
 | 
				
			||||||
                                                  const ExplodedNode *N,
 | 
					                                                  const ExplodedNode *N,
 | 
				
			||||||
                                                  BugReport &BR) override;
 | 
					                                                  BugReport &BR) override;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -420,8 +420,8 @@ private:
 | 
				
			||||||
                                   BugReporterContext &BRC,
 | 
					                                   BugReporterContext &BRC,
 | 
				
			||||||
                                   BugReport &BR) override;
 | 
					                                   BugReport &BR) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PathDiagnosticPiece* getEndPath(BugReporterContext &BRC,
 | 
					    std::unique_ptr<PathDiagnosticPiece>
 | 
				
			||||||
                                    const ExplodedNode *EndPathNode,
 | 
					    getEndPath(BugReporterContext &BRC, const ExplodedNode *EndPathNode,
 | 
				
			||||||
               BugReport &BR) override {
 | 
					               BugReport &BR) override {
 | 
				
			||||||
      if (!IsLeak)
 | 
					      if (!IsLeak)
 | 
				
			||||||
        return nullptr;
 | 
					        return nullptr;
 | 
				
			||||||
| 
						 | 
					@ -430,7 +430,8 @@ private:
 | 
				
			||||||
        PathDiagnosticLocation::createEndOfPath(EndPathNode,
 | 
					        PathDiagnosticLocation::createEndOfPath(EndPathNode,
 | 
				
			||||||
                                                BRC.getSourceManager());
 | 
					                                                BRC.getSourceManager());
 | 
				
			||||||
      // Do not add the statement itself as a range in case of leak.
 | 
					      // Do not add the statement itself as a range in case of leak.
 | 
				
			||||||
      return new PathDiagnosticEventPiece(L, BR.getDescription(), false);
 | 
					      return llvm::make_unique<PathDiagnosticEventPiece>(L, BR.getDescription(),
 | 
				
			||||||
 | 
					                                                         false);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1717,7 +1717,7 @@ namespace {
 | 
				
			||||||
                                   BugReporterContext &BRC,
 | 
					                                   BugReporterContext &BRC,
 | 
				
			||||||
                                   BugReport &BR) override;
 | 
					                                   BugReport &BR) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PathDiagnosticPiece *getEndPath(BugReporterContext &BRC,
 | 
					    std::unique_ptr<PathDiagnosticPiece> getEndPath(BugReporterContext &BRC,
 | 
				
			||||||
                                                    const ExplodedNode *N,
 | 
					                                                    const ExplodedNode *N,
 | 
				
			||||||
                                                    BugReport &BR) override;
 | 
					                                                    BugReport &BR) override;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -1728,7 +1728,7 @@ namespace {
 | 
				
			||||||
                           const SummaryLogTy &log)
 | 
					                           const SummaryLogTy &log)
 | 
				
			||||||
       : CFRefReportVisitor(sym, GCEnabled, log) {}
 | 
					       : CFRefReportVisitor(sym, GCEnabled, log) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PathDiagnosticPiece *getEndPath(BugReporterContext &BRC,
 | 
					    std::unique_ptr<PathDiagnosticPiece> getEndPath(BugReporterContext &BRC,
 | 
				
			||||||
                                                    const ExplodedNode *N,
 | 
					                                                    const ExplodedNode *N,
 | 
				
			||||||
                                                    BugReport &BR) override;
 | 
					                                                    BugReport &BR) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2219,18 +2219,16 @@ GetAllocationSite(ProgramStateManager& StateMgr, const ExplodedNode *N,
 | 
				
			||||||
                        InterestingMethodContext);
 | 
					                        InterestingMethodContext);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PathDiagnosticPiece*
 | 
					std::unique_ptr<PathDiagnosticPiece>
 | 
				
			||||||
CFRefReportVisitor::getEndPath(BugReporterContext &BRC,
 | 
					CFRefReportVisitor::getEndPath(BugReporterContext &BRC,
 | 
				
			||||||
                               const ExplodedNode *EndN,
 | 
					                               const ExplodedNode *EndN, BugReport &BR) {
 | 
				
			||||||
                               BugReport &BR) {
 | 
					 | 
				
			||||||
  BR.markInteresting(Sym);
 | 
					  BR.markInteresting(Sym);
 | 
				
			||||||
  return BugReporterVisitor::getDefaultEndPath(BRC, EndN, BR);
 | 
					  return BugReporterVisitor::getDefaultEndPath(BRC, EndN, BR);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PathDiagnosticPiece*
 | 
					std::unique_ptr<PathDiagnosticPiece>
 | 
				
			||||||
CFRefLeakReportVisitor::getEndPath(BugReporterContext &BRC,
 | 
					CFRefLeakReportVisitor::getEndPath(BugReporterContext &BRC,
 | 
				
			||||||
                                   const ExplodedNode *EndN,
 | 
					                                   const ExplodedNode *EndN, BugReport &BR) {
 | 
				
			||||||
                                   BugReport &BR) {
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Tell the BugReporterContext to report cases when the tracked symbol is
 | 
					  // Tell the BugReporterContext to report cases when the tracked symbol is
 | 
				
			||||||
  // assigned to different variables, etc.
 | 
					  // assigned to different variables, etc.
 | 
				
			||||||
| 
						 | 
					@ -2310,7 +2308,7 @@ CFRefLeakReportVisitor::getEndPath(BugReporterContext &BRC,
 | 
				
			||||||
    os << " is not referenced later in this execution path and has a retain "
 | 
					    os << " is not referenced later in this execution path and has a retain "
 | 
				
			||||||
          "count of +" << RV->getCount();
 | 
					          "count of +" << RV->getCount();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return new PathDiagnosticEventPiece(L, os.str());
 | 
					  return llvm::make_unique<PathDiagnosticEventPiece>(L, os.str());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CFRefLeakReport::CFRefLeakReport(CFRefBug &D, const LangOptions &LOpts,
 | 
					CFRefLeakReport::CFRefLeakReport(CFRefBug &D, const LangOptions &LOpts,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3153,16 +3153,17 @@ bool GRBugReporter::generatePathDiagnostic(PathDiagnostic& PD,
 | 
				
			||||||
      std::unique_ptr<PathDiagnosticPiece> LastPiece;
 | 
					      std::unique_ptr<PathDiagnosticPiece> LastPiece;
 | 
				
			||||||
      for (BugReport::visitor_iterator I = visitors.begin(), E = visitors.end();
 | 
					      for (BugReport::visitor_iterator I = visitors.begin(), E = visitors.end();
 | 
				
			||||||
          I != E; ++I) {
 | 
					          I != E; ++I) {
 | 
				
			||||||
        if (PathDiagnosticPiece *Piece = (*I)->getEndPath(PDB, N, *R)) {
 | 
					        if (std::unique_ptr<PathDiagnosticPiece> Piece =
 | 
				
			||||||
 | 
					                (*I)->getEndPath(PDB, N, *R)) {
 | 
				
			||||||
          assert (!LastPiece &&
 | 
					          assert (!LastPiece &&
 | 
				
			||||||
              "There can only be one final piece in a diagnostic.");
 | 
					              "There can only be one final piece in a diagnostic.");
 | 
				
			||||||
          LastPiece.reset(Piece);
 | 
					          LastPiece = std::move(Piece);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (ActiveScheme != PathDiagnosticConsumer::None) {
 | 
					      if (ActiveScheme != PathDiagnosticConsumer::None) {
 | 
				
			||||||
        if (!LastPiece)
 | 
					        if (!LastPiece)
 | 
				
			||||||
          LastPiece.reset(BugReporterVisitor::getDefaultEndPath(PDB, N, *R));
 | 
					          LastPiece = BugReporterVisitor::getDefaultEndPath(PDB, N, *R);
 | 
				
			||||||
        assert(LastPiece);
 | 
					        assert(LastPiece);
 | 
				
			||||||
        PD.setEndOfPath(LastPiece.release());
 | 
					        PD.setEndOfPath(LastPiece.release());
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,17 +100,14 @@ const Stmt *bugreporter::GetRetValExpr(const ExplodedNode *N) {
 | 
				
			||||||
// Definitions for bug reporter visitors.
 | 
					// Definitions for bug reporter visitors.
 | 
				
			||||||
//===----------------------------------------------------------------------===//
 | 
					//===----------------------------------------------------------------------===//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PathDiagnosticPiece*
 | 
					std::unique_ptr<PathDiagnosticPiece>
 | 
				
			||||||
BugReporterVisitor::getEndPath(BugReporterContext &BRC,
 | 
					BugReporterVisitor::getEndPath(BugReporterContext &BRC,
 | 
				
			||||||
                               const ExplodedNode *EndPathNode,
 | 
					                               const ExplodedNode *EndPathNode, BugReport &BR) {
 | 
				
			||||||
                               BugReport &BR) {
 | 
					 | 
				
			||||||
  return nullptr;
 | 
					  return nullptr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PathDiagnosticPiece*
 | 
					std::unique_ptr<PathDiagnosticPiece> BugReporterVisitor::getDefaultEndPath(
 | 
				
			||||||
BugReporterVisitor::getDefaultEndPath(BugReporterContext &BRC,
 | 
					    BugReporterContext &BRC, const ExplodedNode *EndPathNode, BugReport &BR) {
 | 
				
			||||||
                                      const ExplodedNode *EndPathNode,
 | 
					 | 
				
			||||||
                                      BugReport &BR) {
 | 
					 | 
				
			||||||
  PathDiagnosticLocation L =
 | 
					  PathDiagnosticLocation L =
 | 
				
			||||||
    PathDiagnosticLocation::createEndOfPath(EndPathNode,BRC.getSourceManager());
 | 
					    PathDiagnosticLocation::createEndOfPath(EndPathNode,BRC.getSourceManager());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -119,13 +116,12 @@ BugReporterVisitor::getDefaultEndPath(BugReporterContext &BRC,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Only add the statement itself as a range if we didn't specify any
 | 
					  // Only add the statement itself as a range if we didn't specify any
 | 
				
			||||||
  // special ranges for this report.
 | 
					  // special ranges for this report.
 | 
				
			||||||
  PathDiagnosticPiece *P = new PathDiagnosticEventPiece(L,
 | 
					  auto P = llvm::make_unique<PathDiagnosticEventPiece>(L, BR.getDescription(),
 | 
				
			||||||
      BR.getDescription(),
 | 
					 | 
				
			||||||
                                                       Beg == End);
 | 
					                                                       Beg == End);
 | 
				
			||||||
  for (; Beg != End; ++Beg)
 | 
					  for (; Beg != End; ++Beg)
 | 
				
			||||||
    P->addRange(*Beg);
 | 
					    P->addRange(*Beg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return P;
 | 
					  return std::move(P);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -399,7 +395,7 @@ public:
 | 
				
			||||||
    llvm_unreachable("Invalid visit mode!");
 | 
					    llvm_unreachable("Invalid visit mode!");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PathDiagnosticPiece *getEndPath(BugReporterContext &BRC,
 | 
					  std::unique_ptr<PathDiagnosticPiece> getEndPath(BugReporterContext &BRC,
 | 
				
			||||||
                                                  const ExplodedNode *N,
 | 
					                                                  const ExplodedNode *N,
 | 
				
			||||||
                                                  BugReport &BR) override {
 | 
					                                                  BugReport &BR) override {
 | 
				
			||||||
    if (EnableNullFPSuppression)
 | 
					    if (EnableNullFPSuppression)
 | 
				
			||||||
| 
						 | 
					@ -1517,8 +1513,7 @@ static bool isInStdNamespace(const Decl *D) {
 | 
				
			||||||
  return ND->isStdNamespace();
 | 
					  return ND->isStdNamespace();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::unique_ptr<PathDiagnosticPiece>
 | 
				
			||||||
PathDiagnosticPiece *
 | 
					 | 
				
			||||||
LikelyFalsePositiveSuppressionBRVisitor::getEndPath(BugReporterContext &BRC,
 | 
					LikelyFalsePositiveSuppressionBRVisitor::getEndPath(BugReporterContext &BRC,
 | 
				
			||||||
                                                    const ExplodedNode *N,
 | 
					                                                    const ExplodedNode *N,
 | 
				
			||||||
                                                    BugReport &BR) {
 | 
					                                                    BugReport &BR) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue