aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Analysis/PathSensitive/BugReporter.h3
-rw-r--r--lib/Analysis/BugReporter.cpp30
-rw-r--r--lib/Analysis/CheckObjCDealloc.cpp43
-rw-r--r--lib/Analysis/CheckObjCInstMethSignature.cpp12
4 files changed, 39 insertions, 49 deletions
diff --git a/include/clang/Analysis/PathSensitive/BugReporter.h b/include/clang/Analysis/PathSensitive/BugReporter.h
index d1c430fc96..1bbba40418 100644
--- a/include/clang/Analysis/PathSensitive/BugReporter.h
+++ b/include/clang/Analysis/PathSensitive/BugReporter.h
@@ -189,6 +189,9 @@ public:
void EmitWarning(BugReport& R);
+ void EmitBasicReport(const char* BugName, const char* BugStr,
+ SourceLocation Loc);
+
static bool classof(const BugReporter* R) { return true; }
};
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp
index 081e7925ee..cbd61f8d25 100644
--- a/lib/Analysis/BugReporter.cpp
+++ b/lib/Analysis/BugReporter.cpp
@@ -731,12 +731,12 @@ void BugReporter::EmitWarning(BugReport& R) {
// Determine the range.
const SourceRange *Beg, *End;
-
+
if (!D->empty()) {
Beg = D->back()->ranges_begin();
End = D->back()->ranges_end();
}
- else
+ else
R.getRanges(*this, Beg, End);
if (PD) {
@@ -745,18 +745,18 @@ void BugReporter::EmitWarning(BugReport& R) {
for ( ; Beg != End; ++Beg)
piece->addRange(*Beg);
- D->push_back(piece);
+ D->push_back(piece);
PD->HandlePathDiagnostic(D.take());
}
else {
- std::ostringstream os;
-
+ std::ostringstream os;
+
if (D->empty())
os << R.getDescription();
else
os << D->back()->getString();
-
-
+
+
Diagnostic& Diag = getDiagnostic();
unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning,
os.str().c_str());
@@ -764,3 +764,19 @@ void BugReporter::EmitWarning(BugReport& R) {
Diag.Report(L, ErrorDiag, NULL, 0, Beg, End - Beg);
}
}
+
+void
+BugReporter::EmitBasicReport(const char* name, const char* str,
+ SourceLocation Loc) {
+
+ SimpleBugType BT(name);
+ DiagCollector C(BT);
+ Diagnostic& Diag = getDiagnostic();
+ Diag.Report(&C, getContext().getFullLoc(Loc),
+ Diag.getCustomDiagID(Diagnostic::Warning, str),
+ 0, 0, 0, 0);
+
+ for (DiagCollector::iterator I = C.begin(), E = C.end(); I != E; ++I)
+ EmitWarning(*I);
+}
+
diff --git a/lib/Analysis/CheckObjCDealloc.cpp b/lib/Analysis/CheckObjCDealloc.cpp
index 3e21f016df..0c9100951c 100644
--- a/lib/Analysis/CheckObjCDealloc.cpp
+++ b/lib/Analysis/CheckObjCDealloc.cpp
@@ -83,8 +83,7 @@ void clang::CheckObjCDealloc(ObjCImplementationDecl* D,
// Get the "dealloc" selector.
IdentifierInfo* II = &Ctx.Idents.get("dealloc");
- Selector S = Ctx.Selectors.getSelector(0, &II);
-
+ Selector S = Ctx.Selectors.getSelector(0, &II);
ObjCMethodDecl* MD = 0;
// Scan the instance methods for "dealloc".
@@ -99,52 +98,32 @@ void clang::CheckObjCDealloc(ObjCImplementationDecl* D,
if (!MD) { // No dealloc found.
- // FIXME: This code should be reduced to three lines if possible (Refactor).
- SimpleBugType BT(LOpts.getGCMode() == LangOptions::NonGC
- ? "missing -dealloc"
- : "missing -dealloc (Hybrid MM, non-GC)");
-
- DiagCollector C(BT);
+ const char* name = LOpts.getGCMode() == LangOptions::NonGC
+ ? "missing -dealloc"
+ : "missing -dealloc (Hybrid MM, non-GC)";
std::ostringstream os;
os << "Objective-C class '" << D->getName()
<< "' lacks a 'dealloc' instance method";
- Diagnostic& Diag = BR.getDiagnostic();
- Diag.Report(&C,
- Ctx.getFullLoc(D->getLocStart()),
- Diag.getCustomDiagID(Diagnostic::Warning, os.str().c_str()),
- NULL, 0, NULL, 0);
-
- for (DiagCollector::iterator I = C.begin(), E = C.end(); I != E; ++I)
- BR.EmitWarning(*I);
-
+ BR.EmitBasicReport(name, os.str().c_str(), D->getLocStart());
return;
}
// dealloc found. Scan for missing [super dealloc].
if (MD->getBody() && !scan_dealloc(MD->getBody(), S)) {
- // FIXME: This code should be reduced to three lines if possible (Refactor).
- SimpleBugType BT(LOpts.getGCMode() == LangOptions::NonGC
- ? "missing [super dealloc]"
- : "missing [super dealloc] (Hybrid MM, non-GC)");
-
- DiagCollector C(BT);
+ const char* name = LOpts.getGCMode() == LangOptions::NonGC
+ ? "missing [super dealloc]"
+ : "missing [super dealloc] (Hybrid MM, non-GC)";
std::ostringstream os;
os << "The 'dealloc' instance method in Objective-C class '" << D->getName()
<< "' does not send a 'dealloc' message to its super class"
" (missing [super dealloc])";
- Diagnostic& Diag = BR.getDiagnostic();
- Diag.Report(&C,
- Ctx.getFullLoc(MD->getLocStart()),
- Diag.getCustomDiagID(Diagnostic::Warning, os.str().c_str()),
- NULL, 0, NULL, 0);
-
- for (DiagCollector::iterator I = C.begin(), E = C.end(); I != E; ++I)
- BR.EmitWarning(*I);
- }
+ BR.EmitBasicReport(name, os.str().c_str(), D->getLocStart());
+ return;
+ }
}
diff --git a/lib/Analysis/CheckObjCInstMethSignature.cpp b/lib/Analysis/CheckObjCInstMethSignature.cpp
index f5966ecc72..ffaef42b23 100644
--- a/lib/Analysis/CheckObjCInstMethSignature.cpp
+++ b/lib/Analysis/CheckObjCInstMethSignature.cpp
@@ -64,16 +64,8 @@ static void CompareReturnTypes(ObjCMethodDecl* MethDerived,
<< "'. These two types are incompatible, and may result in undefined "
"behavior for clients of these classes.";
- // Refactor.
- SimpleBugType BT("incompatible instance method return type");
- DiagCollector C(BT);
- Diagnostic& Diag = BR.getDiagnostic();
- Diag.Report(&C, Ctx.getFullLoc(MethDerived->getLocStart()),
- Diag.getCustomDiagID(Diagnostic::Warning, os.str().c_str()),
- NULL, 0, NULL, 0);
-
- for (DiagCollector::iterator I = C.begin(), E = C.end(); I != E; ++I)
- BR.EmitWarning(*I);
+ BR.EmitBasicReport("incompatible instance method return type",
+ os.str().c_str(), MethDerived->getLocStart());
}
}