/// CheckResults - This compares the expected results to those that /// were actually reported. It emits any discrepencies. Return "true" if there /// were problems. Return "false" otherwise. /// static bool CheckResults(Preprocessor &PP, const DiagList &ExpectedErrors, const DiagList &ExpectedWarnings, const DiagList &ExpectedNotes) { const DiagnosticClient *DiagClient = PP.getDiagnostics().getClient(); assert(DiagClient != 0 && "DiagChecker requires a valid TextDiagnosticBuffer"); const TextDiagnosticBuffer &Diags = static_cast<const TextDiagnosticBuffer&>(*DiagClient); SourceManager &SourceMgr = PP.getSourceManager(); // We want to capture the delta between what was expected and what was // seen. // // Expected \ Seen - set expected but not seen // Seen \ Expected - set seen but not expected bool HadProblem = false; // See if there are error mismatches. HadProblem |= CompareDiagLists(SourceMgr, ExpectedErrors.begin(), ExpectedErrors.end(), Diags.err_begin(), Diags.err_end(), "Errors expected but not seen:", "Errors seen but not expected:"); // See if there are warning mismatches. HadProblem |= CompareDiagLists(SourceMgr, ExpectedWarnings.begin(), ExpectedWarnings.end(), Diags.warn_begin(), Diags.warn_end(), "Warnings expected but not seen:", "Warnings seen but not expected:"); // See if there are note mismatches. HadProblem |= CompareDiagLists(SourceMgr, ExpectedNotes.begin(), ExpectedNotes.end(), Diags.note_begin(), Diags.note_end(), "Notes expected but not seen:", "Notes seen but not expected:"); return HadProblem; }
/// CompareDiagLists - Compare two diagnostic lists and return the difference /// between them. /// static bool CompareDiagLists(SourceManager &SourceMgr, const_diag_iterator d1_begin, const_diag_iterator d1_end, const_diag_iterator d2_begin, const_diag_iterator d2_end, const char *MsgLeftOnly, const char *MsgRightOnly) { DiagList LeftOnly; DiagList Left(d1_begin, d1_end); DiagList Right(d2_begin, d2_end); for (const_diag_iterator I = Left.begin(), E = Left.end(); I != E; ++I) { unsigned LineNo1 = SourceMgr.getInstantiationLineNumber(I->first); const std::string &Diag1 = I->second; DiagList::iterator II, IE; for (II = Right.begin(), IE = Right.end(); II != IE; ++II) { unsigned LineNo2 = SourceMgr.getInstantiationLineNumber(II->first); if (LineNo1 != LineNo2) continue; const std::string &Diag2 = II->second; if (Diag2.find(Diag1) != std::string::npos || Diag1.find(Diag2) != std::string::npos) { break; } } if (II == IE) { // Not found. LeftOnly.push_back(*I); } else { // Found. The same cannot be found twice. Right.erase(II); } } // Now all that's left in Right are those that were not matched. return PrintProblem(SourceMgr, LeftOnly.begin(), LeftOnly.end(), MsgLeftOnly) | PrintProblem(SourceMgr, Right.begin(), Right.end(), MsgRightOnly); }