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()
 //