diff options
author | Richard Trieu <rtrieu@google.com> | 2013-01-30 20:04:31 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2013-01-30 20:04:31 +0000 |
commit | 90c31f51c60749dd4f3361f24ff7579b27343c3b (patch) | |
tree | 0c0fd812a4cef005e34ac3fc7be0c2ded3c9973e /clang/lib/Basic/Diagnostic.cpp | |
parent | 0f86433efbaaf1aa5ac8b524f4e4b94ec9af6c12 (diff) | |
download | bcm5719-llvm-90c31f51c60749dd4f3361f24ff7579b27343c3b.tar.gz bcm5719-llvm-90c31f51c60749dd4f3361f24ff7579b27343c3b.zip |
Handle passing non-Qualtypes to %diff better. Instead of asserting, fall back
to printing the default case. This is a fix for PR15023.
llvm-svn: 173965
Diffstat (limited to 'clang/lib/Basic/Diagnostic.cpp')
-rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index f8e21481403..1c8b3728c14 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -726,15 +726,33 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, unsigned ArgNo2 = ArgNo; DiagnosticsEngine::ArgumentKind Kind = getArgKind(ArgNo); - if (Kind == DiagnosticsEngine::ak_qualtype && - ModifierIs(Modifier, ModifierLen, "diff")) { - Kind = DiagnosticsEngine::ak_qualtype_pair; + if (ModifierIs(Modifier, ModifierLen, "diff")) { assert(*DiagStr == ',' && isdigit(*(DiagStr + 1)) && "Invalid format for diff modifier"); ++DiagStr; // Comma. ArgNo2 = *DiagStr++ - '0'; - assert(getArgKind(ArgNo2) == DiagnosticsEngine::ak_qualtype && - "Second value of type diff must be a qualtype"); + DiagnosticsEngine::ArgumentKind Kind2 = getArgKind(ArgNo2); + if (Kind == DiagnosticsEngine::ak_qualtype && + Kind2 == DiagnosticsEngine::ak_qualtype) + Kind = DiagnosticsEngine::ak_qualtype_pair; + else { + // %diff only supports QualTypes. For other kinds of arguments, + // use the default printing. For example, if the modifier is: + // "%diff{compare $ to $|other text}1,2" + // treat it as: + // "compare %1 to %2" + const char *Pipe = ScanFormat(Argument, Argument + ArgumentLen, '|'); + const char *FirstDollar = ScanFormat(Argument, Pipe, '$'); + const char *SecondDollar = ScanFormat(FirstDollar + 1, Pipe, '$'); + const char ArgStr1[] = { '%', '0' + ArgNo }; + const char ArgStr2[] = { '%', '0' + ArgNo2 }; + FormatDiagnostic(Argument, FirstDollar, OutStr); + FormatDiagnostic(ArgStr1, ArgStr1 + 2, OutStr); + FormatDiagnostic(FirstDollar + 1, SecondDollar, OutStr); + FormatDiagnostic(ArgStr2, ArgStr2 + 2, OutStr); + FormatDiagnostic(SecondDollar + 1, Pipe, OutStr); + continue; + } } switch (Kind) { |