Correct semantic and documentation for the ReportUnrecognizedFlags interface
PiperOrigin-RevId: 516411395
Change-Id: I442fc9435bd7a829802c325e2e4106aa6775c263
diff --git a/absl/flags/parse.cc b/absl/flags/parse.cc
index fcd6a52..236d31b 100644
--- a/absl/flags/parse.cc
+++ b/absl/flags/parse.cc
@@ -22,7 +22,6 @@
#include <cstdlib>
#include <fstream>
#include <iostream>
-#include <iterator>
#include <string>
#include <tuple>
#include <utility>
@@ -600,6 +599,34 @@
return false;
}
+// --------------------------------------------------------------------
+
+void ReportUnrecognizedFlags(
+ const std::vector<UnrecognizedFlag>& unrecognized_flags,
+ bool report_as_fatal_error) {
+ for (const auto& unrecognized : unrecognized_flags) {
+ // Verify if flag_name has the "no" already removed
+ std::vector<std::string> misspelling_hints;
+ if (unrecognized.source == UnrecognizedFlag::kFromArgv) {
+ misspelling_hints =
+ flags_internal::GetMisspellingHints(unrecognized.flag_name);
+ }
+
+ if (misspelling_hints.empty()) {
+ flags_internal::ReportUsageError(
+ absl::StrCat("Unknown command line flag '", unrecognized.flag_name,
+ "'"),
+ report_as_fatal_error);
+ } else {
+ flags_internal::ReportUsageError(
+ absl::StrCat("Unknown command line flag '", unrecognized.flag_name,
+ "'. Did you mean: ",
+ absl::StrJoin(misspelling_hints, ", "), " ?"),
+ report_as_fatal_error);
+ }
+ }
+}
+
} // namespace
// --------------------------------------------------------------------
@@ -674,12 +701,15 @@
argc, argv, positional_args, unrecognized_flags);
if (undef_flag_action != OnUndefinedFlag::kIgnoreUndefined) {
- ReportUnrecognizedFlags(
- unrecognized_flags,
- undef_flag_action ==
- flags_internal::OnUndefinedFlag::kAbortIfUndefined);
+ if (parse_successful &&
+ undef_flag_action == OnUndefinedFlag::kAbortIfUndefined) {
+ if (!unrecognized_flags.empty()) { parse_successful = false; }
+ }
- if (!unrecognized_flags.empty()) { parse_successful = false; }
+ flags_internal::ReportUnrecognizedFlags(
+ unrecognized_flags,
+ !parse_successful &&
+ (undef_flag_action == OnUndefinedFlag::kAbortIfUndefined));
}
#if ABSL_FLAGS_STRIP_NAMES
@@ -871,29 +901,8 @@
// --------------------------------------------------------------------
void ReportUnrecognizedFlags(
- const std::vector<UnrecognizedFlag>& unrecognized_flags,
- bool report_fatal_error) {
- for (const auto& unrecognized : unrecognized_flags) {
- // Verify if flag_name has the "no" already removed
- std::vector<std::string> misspelling_hints;
- if (unrecognized.source == UnrecognizedFlag::kFromArgv) {
- misspelling_hints =
- flags_internal::GetMisspellingHints(unrecognized.flag_name);
- }
-
- if (misspelling_hints.empty()) {
- flags_internal::ReportUsageError(
- absl::StrCat("Unknown command line flag '", unrecognized.flag_name,
- "'"),
- report_fatal_error);
- } else {
- flags_internal::ReportUsageError(
- absl::StrCat("Unknown command line flag '", unrecognized.flag_name,
- "'. Did you mean: ",
- absl::StrJoin(misspelling_hints, ", "), " ?"),
- report_fatal_error);
- }
- }
+ const std::vector<UnrecognizedFlag>& unrecognized_flags) {
+ flags_internal::ReportUnrecognizedFlags(unrecognized_flags, true);
}
// --------------------------------------------------------------------
diff --git a/absl/flags/parse.h b/absl/flags/parse.h
index a562937..9732727 100644
--- a/absl/flags/parse.h
+++ b/absl/flags/parse.h
@@ -90,17 +90,10 @@
// ReportUnrecognizedFlags()
//
-// Reports an error for all non-ignored unrecognized flags in the provided
-// `unrecognized_flags` list.
-//
-// If `report_fatal_error` is true, the fatal error is reported and program is
-// aborted. Otherwise non-fatal error is reported for all flags.
-//
-// This function returns true if any non-ignored unrecognized flags were
-// located in the list and false otherwise.
+// Reports an error to `stderr` for all non-ignored unrecognized flags in
+// the provided `unrecognized_flags` list.
void ReportUnrecognizedFlags(
- const std::vector<UnrecognizedFlag>& unrecognized_flags,
- bool report_fatal_error);
+ const std::vector<UnrecognizedFlag>& unrecognized_flags);
// ParseCommandLine()
//