forked from OSchip/llvm-project
Teach BugReporter to "escape" the occurance of '%' characters in diagnostic messages when emitted results to the standard Diagnostics output. Fixes PR 6033.
llvm-svn: 93507
This commit is contained in:
parent
959990b840
commit
d74cc397c8
|
@ -1818,8 +1818,23 @@ void BugReporter::FlushReport(BugReportEquivClass& EQ) {
|
||||||
R->getRanges(Beg, End);
|
R->getRanges(Beg, End);
|
||||||
Diagnostic& Diag = getDiagnostic();
|
Diagnostic& Diag = getDiagnostic();
|
||||||
FullSourceLoc L(R->getLocation(), getSourceManager());
|
FullSourceLoc L(R->getLocation(), getSourceManager());
|
||||||
unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning,
|
|
||||||
R->getShortDescription());
|
// Search the description for '%', as that will be interpretted as a
|
||||||
|
// format character by FormatDiagnostics.
|
||||||
|
llvm::StringRef desc = R->getShortDescription();
|
||||||
|
unsigned ErrorDiag;
|
||||||
|
{
|
||||||
|
llvm::SmallString<512> TmpStr;
|
||||||
|
llvm::raw_svector_ostream Out(TmpStr);
|
||||||
|
for (llvm::StringRef::iterator I=desc.begin(), E=desc.end(); I!=E; ++I)
|
||||||
|
if (*I == '%')
|
||||||
|
Out << "%%";
|
||||||
|
else
|
||||||
|
Out << *I;
|
||||||
|
|
||||||
|
Out.flush();
|
||||||
|
ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning, TmpStr);
|
||||||
|
}
|
||||||
|
|
||||||
switch (End-Beg) {
|
switch (End-Beg) {
|
||||||
default: assert(0 && "Don't handle this many ranges yet!");
|
default: assert(0 && "Don't handle this many ranges yet!");
|
||||||
|
|
|
@ -801,3 +801,13 @@ void test_bad_msg(TestBadArg *p) {
|
||||||
[p testBadArg:y]; // expected-warning{{Pass-by-value argument in message expression is undefined}}
|
[p testBadArg:y]; // expected-warning{{Pass-by-value argument in message expression is undefined}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// PR 6033 - Test emitting the correct output in a warning where we use '%'
|
||||||
|
// with operands that are undefined.
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
int pr6033(int x) {
|
||||||
|
int y;
|
||||||
|
return x % y; // expected-warning{{The right operand of '%' is a garbage value}}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue