forked from OSchip/llvm-project
clang-cl: print diagnostics as "error(clang): foo" in /fallback mode
This solves two problems: 1) MSBuild will not flag the build as unsuccessful just because we print an error in the output, since "error(clang):" doesn't seem to match the regex it's using. 2) It becomes more clear that the diagnostic is coming from clang as supposed to cl.exe. Differential Revision: http://llvm-reviews.chandlerc.com/D1735 llvm-svn: 191250
This commit is contained in:
parent
8a2d496e18
commit
f4aee18086
|
@ -72,6 +72,7 @@ DIAGOPT(VerifyDiagnostics, 1, 0) /// Check that diagnostics match the expected
|
|||
|
||||
DIAGOPT(ElideType, 1, 0) /// Elide identical types in template diffing
|
||||
DIAGOPT(ShowTemplateTree, 1, 0) /// Print a template tree when diffing
|
||||
DIAGOPT(CLFallbackMode, 1, 0) /// Format for clang-cl fallback mode
|
||||
|
||||
VALUE_DIAGOPT(ErrorLimit, 32, 0) /// Limit # errors emitted.
|
||||
/// Limit depth of macro expansion backtrace.
|
||||
|
|
|
@ -51,7 +51,8 @@ public:
|
|||
/// TextDiagnostic logic requires.
|
||||
static void printDiagnosticLevel(raw_ostream &OS,
|
||||
DiagnosticsEngine::Level Level,
|
||||
bool ShowColors);
|
||||
bool ShowColors,
|
||||
bool CLFallbackMode = false);
|
||||
|
||||
/// \brief Pretty-print a diagnostic message to a raw_ostream.
|
||||
///
|
||||
|
|
|
@ -3783,6 +3783,9 @@ void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
|
|||
|
||||
if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
|
||||
CmdArgs.push_back("-fdiagnostics-format");
|
||||
if (Args.hasArg(options::OPT__SLASH_fallback))
|
||||
CmdArgs.push_back("msvc-fallback");
|
||||
else
|
||||
CmdArgs.push_back("msvc");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -589,7 +589,10 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
|
|||
Opts.setFormat(DiagnosticOptions::Clang);
|
||||
else if (Format == "msvc")
|
||||
Opts.setFormat(DiagnosticOptions::Msvc);
|
||||
else if (Format == "vi")
|
||||
else if (Format == "msvc-fallback") {
|
||||
Opts.setFormat(DiagnosticOptions::Msvc);
|
||||
Opts.CLFallbackMode = true;
|
||||
} else if (Format == "vi")
|
||||
Opts.setFormat(DiagnosticOptions::Vi);
|
||||
else {
|
||||
Success = false;
|
||||
|
|
|
@ -693,7 +693,8 @@ TextDiagnostic::emitDiagnosticMessage(SourceLocation Loc,
|
|||
if (DiagOpts->ShowColors)
|
||||
OS.resetColor();
|
||||
|
||||
printDiagnosticLevel(OS, Level, DiagOpts->ShowColors);
|
||||
printDiagnosticLevel(OS, Level, DiagOpts->ShowColors,
|
||||
DiagOpts->CLFallbackMode);
|
||||
printDiagnosticMessage(OS, Level, Message,
|
||||
OS.tell() - StartOfLocationInfo,
|
||||
DiagOpts->MessageLength, DiagOpts->ShowColors);
|
||||
|
@ -702,7 +703,8 @@ TextDiagnostic::emitDiagnosticMessage(SourceLocation Loc,
|
|||
/*static*/ void
|
||||
TextDiagnostic::printDiagnosticLevel(raw_ostream &OS,
|
||||
DiagnosticsEngine::Level Level,
|
||||
bool ShowColors) {
|
||||
bool ShowColors,
|
||||
bool CLFallbackMode) {
|
||||
if (ShowColors) {
|
||||
// Print diagnostic category in bold and color
|
||||
switch (Level) {
|
||||
|
@ -718,12 +720,21 @@ TextDiagnostic::printDiagnosticLevel(raw_ostream &OS,
|
|||
switch (Level) {
|
||||
case DiagnosticsEngine::Ignored:
|
||||
llvm_unreachable("Invalid diagnostic type");
|
||||
case DiagnosticsEngine::Note: OS << "note: "; break;
|
||||
case DiagnosticsEngine::Warning: OS << "warning: "; break;
|
||||
case DiagnosticsEngine::Error: OS << "error: "; break;
|
||||
case DiagnosticsEngine::Fatal: OS << "fatal error: "; break;
|
||||
case DiagnosticsEngine::Note: OS << "note"; break;
|
||||
case DiagnosticsEngine::Warning: OS << "warning"; break;
|
||||
case DiagnosticsEngine::Error: OS << "error"; break;
|
||||
case DiagnosticsEngine::Fatal: OS << "fatal error"; break;
|
||||
}
|
||||
|
||||
// In clang-cl /fallback mode, print diagnostics as "error(clang):". This
|
||||
// makes it more clear whether a message is coming from clang or cl.exe,
|
||||
// and it prevents MSBuild from concluding that the build failed just because
|
||||
// there is an "error:" in the output.
|
||||
if (CLFallbackMode)
|
||||
OS << "(clang)";
|
||||
|
||||
OS << ": ";
|
||||
|
||||
if (ShowColors)
|
||||
OS.resetColor();
|
||||
}
|
||||
|
|
|
@ -132,7 +132,8 @@ void TextDiagnosticPrinter::HandleDiagnostic(DiagnosticsEngine::Level Level,
|
|||
// diagnostics in a context that lacks language options, a source manager, or
|
||||
// other infrastructure necessary when emitting more rich diagnostics.
|
||||
if (!Info.getLocation().isValid()) {
|
||||
TextDiagnostic::printDiagnosticLevel(OS, Level, DiagOpts->ShowColors);
|
||||
TextDiagnostic::printDiagnosticLevel(OS, Level, DiagOpts->ShowColors,
|
||||
DiagOpts->CLFallbackMode);
|
||||
TextDiagnostic::printDiagnosticMessage(OS, Level, DiagMessageStream.str(),
|
||||
OS.tell() - StartOfLocationInfo,
|
||||
DiagOpts->MessageLength,
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
// RUN: %clang_cl /fallback /Dfoo=bar /Ubaz /Ifoo /O0 /Ox /GR /GR- /LD /LDd \
|
||||
// RUN: /MD /MDd /MTd /MT -### -- %s 2>&1 | FileCheck %s
|
||||
// CHECK: "-fdiagnostics-format" "msvc-fallback"
|
||||
// CHECK: ||
|
||||
// CHECK: cl.exe
|
||||
// CHECK: "/c"
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
//
|
||||
// RUN: %clang -fsyntax-only -fno-show-column %s 2>&1 | FileCheck %s -check-prefix=NO_COLUMN
|
||||
//
|
||||
|
||||
// RUN: not %clang -fsyntax-only -Werror -fdiagnostics-format=msvc-fallback %s 2>&1 | FileCheck %s -check-prefix=MSVC-FALLBACK
|
||||
|
||||
|
||||
|
||||
|
@ -31,4 +31,5 @@
|
|||
// VI: {{.*}} +28:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]
|
||||
// MSVC_ORIG: {{.*}}(28) : warning: extra tokens at end of #endif directive [-Wextra-tokens]
|
||||
// NO_COLUMN: {{.*}}:28: warning: extra tokens at end of #endif directive [-Wextra-tokens]
|
||||
// MSVC-FALLBACK: {{.*}}(28,7) : error(clang): extra tokens at end of #endif directive
|
||||
int x;
|
||||
|
|
Loading…
Reference in New Issue