aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/Warnings.cpp
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2011-11-15 12:26:39 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2011-11-15 12:26:39 +0000
commitdce6327160a6e333137b34cce77e2dfc2cd5aab6 (patch)
treeb3c9761cd9f8857e4cc879fc515e0e5b22fdf9a5 /lib/Frontend/Warnings.cpp
parentf7ce19400ba4d7e7f17f804490b76035de6fdf5e (diff)
Warning option typo correction: When two options have the same edit_distance don't display either.
Also add a maximum edit distance threshold, so we don't correct "-Wx" to "-W#pragma-messages". git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144644 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/Warnings.cpp')
-rw-r--r--lib/Frontend/Warnings.cpp32
1 files changed, 18 insertions, 14 deletions
diff --git a/lib/Frontend/Warnings.cpp b/lib/Frontend/Warnings.cpp
index ba0cd38045..4e41e22138 100644
--- a/lib/Frontend/Warnings.cpp
+++ b/lib/Frontend/Warnings.cpp
@@ -31,6 +31,21 @@
#include <algorithm>
using namespace clang;
+// EmitUnkownDiagWarning - Emit a warning and typo hint for unknown warning opts
+static void EmitUnkownDiagWarning(DiagnosticsEngine &Diags,
+ StringRef Prefix, StringRef Opt,
+ bool isPositive) {
+ StringRef Suggestion = DiagnosticIDs::getNearestWarningOption(Opt);
+ if (!Suggestion.empty())
+ Diags.Report(isPositive? diag::warn_unknown_warning_option_suggest :
+ diag::warn_unknown_negative_warning_option_suggest)
+ << (Prefix.str() += Opt) << (Prefix.str() += Suggestion);
+ else
+ Diags.Report(isPositive? diag::warn_unknown_warning_option :
+ diag::warn_unknown_negative_warning_option)
+ << (Prefix.str() += Opt);
+}
+
void clang::ProcessWarningOptions(DiagnosticsEngine &Diags,
const DiagnosticOptions &Opts) {
Diags.setSuppressSystemWarnings(true); // Default to -Wno-system-headers
@@ -118,11 +133,7 @@ void clang::ProcessWarningOptions(DiagnosticsEngine &Diags,
// Set the warning as error flag for this specifier.
Diags.setDiagnosticGroupWarningAsError(Specifier, isPositive);
} else if (DiagIDs->getDiagnosticsInGroup(Specifier, _Diags)) {
- Diags.Report(isPositive ? diag::warn_unknown_warning_option :
- diag::warn_unknown_negative_warning_option)
- << ("-W" + Opt.str())
- << ("-Werror=" +
- DiagnosticIDs::getNearestWarningOption(Specifier).str());
+ EmitUnkownDiagWarning(Diags, "-Werror", Specifier, isPositive);
}
continue;
}
@@ -150,20 +161,13 @@ void clang::ProcessWarningOptions(DiagnosticsEngine &Diags,
// Set the error as fatal flag for this specifier.
Diags.setDiagnosticGroupErrorAsFatal(Specifier, isPositive);
} else if (DiagIDs->getDiagnosticsInGroup(Specifier, _Diags)) {
- Diags.Report(isPositive ? diag::warn_unknown_warning_option :
- diag::warn_unknown_negative_warning_option)
- << ("-W" + Opt.str())
- << ("-Wfatal-errors=" +
- DiagnosticIDs::getNearestWarningOption(Specifier).str());
+ EmitUnkownDiagWarning(Diags, "-Wfatal-errors", Specifier, isPositive);
}
continue;
}
if (Report && DiagIDs->getDiagnosticsInGroup(Opt, _Diags)) {
- Diags.Report(isPositive ? diag::warn_unknown_warning_option :
- diag::warn_unknown_negative_warning_option)
- << ("-W" + Opt.str())
- << ("-W" + DiagnosticIDs::getNearestWarningOption(Opt).str());
+ EmitUnkownDiagWarning(Diags, "-W", Opt, isPositive);
} else {
Diags.setDiagnosticGroupMapping(Opt, Mapping);
}