summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/Diagnostic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Basic/Diagnostic.cpp')
-rw-r--r--clang/lib/Basic/Diagnostic.cpp33
1 files changed, 25 insertions, 8 deletions
diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp
index e1183c602ca..8a897f57669 100644
--- a/clang/lib/Basic/Diagnostic.cpp
+++ b/clang/lib/Basic/Diagnostic.cpp
@@ -116,6 +116,14 @@ namespace clang {
// Common Diagnostic implementation
//===----------------------------------------------------------------------===//
+static void DummyQTToStringFnTy(intptr_t QT, const char *Modifier, unsigned ML,
+ const char *Argument, unsigned ArgLen,
+ llvm::SmallVectorImpl<char> &Output) {
+ const char *Str = "<can't format QualType>";
+ Output.append(Str, Str+strlen(Str));
+}
+
+
Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) {
IgnoreAllWarnings = false;
WarningsAsErrors = false;
@@ -130,6 +138,8 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) {
NumErrors = 0;
CustomDiagInfo = 0;
CurDiagID = ~0U;
+
+ QualTypeToString = DummyQTToStringFnTy;
}
Diagnostic::~Diagnostic() {
@@ -468,29 +478,29 @@ FormatDiagnostic(llvm::SmallVectorImpl<char> &OutStr) const {
}
assert(isdigit(*DiagStr) && "Invalid format for argument in diagnostic");
- unsigned StrNo = *DiagStr++ - '0';
+ unsigned ArgNo = *DiagStr++ - '0';
- switch (getArgKind(StrNo)) {
+ switch (getArgKind(ArgNo)) {
case Diagnostic::ak_std_string: {
- const std::string &S = getArgStdStr(StrNo);
+ const std::string &S = getArgStdStr(ArgNo);
assert(ModifierLen == 0 && "No modifiers for strings yet");
OutStr.append(S.begin(), S.end());
break;
}
case Diagnostic::ak_c_string: {
- const char *S = getArgCStr(StrNo);
+ const char *S = getArgCStr(ArgNo);
assert(ModifierLen == 0 && "No modifiers for strings yet");
OutStr.append(S, S + strlen(S));
break;
}
case Diagnostic::ak_identifierinfo: {
- const IdentifierInfo *II = getArgIdentifier(StrNo);
+ const IdentifierInfo *II = getArgIdentifier(ArgNo);
assert(ModifierLen == 0 && "No modifiers for strings yet");
OutStr.append(II->getName(), II->getName() + II->getLength());
break;
}
case Diagnostic::ak_sint: {
- int Val = getArgSInt(StrNo);
+ int Val = getArgSInt(ArgNo);
if (ModifierIs(Modifier, ModifierLen, "select")) {
HandleSelectModifier((unsigned)Val, Argument, ArgumentLen, OutStr);
@@ -507,7 +517,7 @@ FormatDiagnostic(llvm::SmallVectorImpl<char> &OutStr) const {
break;
}
case Diagnostic::ak_uint: {
- unsigned Val = getArgUInt(StrNo);
+ unsigned Val = getArgUInt(ArgNo);
if (ModifierIs(Modifier, ModifierLen, "select")) {
HandleSelectModifier(Val, Argument, ArgumentLen, OutStr);
@@ -521,9 +531,16 @@ FormatDiagnostic(llvm::SmallVectorImpl<char> &OutStr) const {
// FIXME: Optimize
std::string S = llvm::utostr_32(Val);
OutStr.append(S.begin(), S.end());
- break;
}
+ break;
}
+ case Diagnostic::ak_qualtype:
+ OutStr.push_back('\'');
+ getDiags()->ConvertQualTypeToString(getRawArg(ArgNo),
+ Modifier, ModifierLen,
+ Argument, ArgumentLen, OutStr);
+ OutStr.push_back('\'');
+ break;
}
}
}
OpenPOWER on IntegriCloud