diff options
| -rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 15 | ||||
| -rw-r--r-- | clang/test/Misc/diag-special-chars.c | 11 |
2 files changed, 26 insertions, 0 deletions
diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index a8929466084..83228ad3c55 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -19,6 +19,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/CrashRecoveryContext.h" +#include "llvm/Support/Locale.h" #include "llvm/Support/raw_ostream.h" using namespace clang; @@ -629,6 +630,20 @@ void Diagnostic:: FormatDiagnostic(const char *DiagStr, const char *DiagEnd, SmallVectorImpl<char> &OutStr) const { + // When the diagnostic string is only "%0", the entire string is being given + // by an outside source. Remove unprintable characters from this string + // and skip all the other string processing. + if (DiagEnd - DiagStr == 2 && DiagStr[0] == '%' && DiagStr[1] == '0' && + getArgKind(0) == DiagnosticsEngine::ak_std_string) { + const std::string &S = getArgStdStr(0); + for (char c : S) { + if (llvm::sys::locale::isPrint(c) || c == '\t') { + OutStr.push_back(c); + } + } + return; + } + /// FormattedArgs - Keep track of all of the arguments formatted by /// ConvertArgToString and pass them into subsequent calls to /// ConvertArgToString, allowing the implementation to avoid redundancies in diff --git a/clang/test/Misc/diag-special-chars.c b/clang/test/Misc/diag-special-chars.c new file mode 100644 index 00000000000..007f9d04f03 --- /dev/null +++ b/clang/test/Misc/diag-special-chars.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 %s -verify +// RUN: not %clang_cc1 %s 2>&1 | FileCheck %s + +// There are two special characters on the following line, one which is used +// as a marker character for diagnostic printing. Ensure diagnostics involving +// these characters do not cause problems with the diagnostic printer. +#error Hi Bye +//expected-error@-1 {{Hi Bye}} + +// CHECK: error: Hi Bye +// CHECK: #error Hi <U+007F> <U+0080> Bye |

