From 3275a9c5d39e81b0ae4961872735ea10a35426c0 Mon Sep 17 00:00:00 2001
From: Shane Carr <shane@unicode.org>
Date: Tue, 8 May 2018 21:52:26 +0000
Subject: [PATCH] ICU-13437 Adding makeBogusString() utility function and
 returning bogus strings on failed FormattedNumber toString() calls.

X-SVN-Rev: 41361
---
 icu4c/source/common/util.h                    |  7 +++++++
 icu4c/source/i18n/number_fluent.cpp           | 18 +++++++-----------
 icu4c/source/test/intltest/numbertest_api.cpp |  3 +++
 3 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/icu4c/source/common/util.h b/icu4c/source/common/util.h
index e7822490665..e197cab7882 100644
--- a/icu4c/source/common/util.h
+++ b/icu4c/source/common/util.h
@@ -46,6 +46,13 @@ class U_COMMON_API ICU_Utility /* not : public UObject because all methods are s
                                        int32_t radix = 10,
                                        int32_t minDigits = 1);
 
+    /** Returns a bogus UnicodeString by value. */
+    static inline UnicodeString makeBogusString() {
+        UnicodeString result;
+        result.setToBogus();
+        return result;
+    }
+
     /**
      * Return true if the character is NOT printable ASCII.
      *
diff --git a/icu4c/source/i18n/number_fluent.cpp b/icu4c/source/i18n/number_fluent.cpp
index ea4c10156a4..a5e7f894baf 100644
--- a/icu4c/source/i18n/number_fluent.cpp
+++ b/icu4c/source/i18n/number_fluent.cpp
@@ -12,6 +12,7 @@
 #include "umutex.h"
 #include "number_skeletons.h"
 #include "number_utypes.h"
+#include "util.h"
 
 using namespace icu;
 using namespace icu::number;
@@ -745,29 +746,24 @@ int32_t LocalizedNumberFormatter::getCallCount() const {
 }
 
 UnicodeString FormattedNumber::toString() const {
-    if (fResults == nullptr) {
-        return {};
-    }
-    return fResults->string.toUnicodeString();
+    UErrorCode localStatus = U_ZERO_ERROR;
+    return toString(localStatus);
 }
 
 UnicodeString FormattedNumber::toString(UErrorCode& status) const {
     if (U_FAILURE(status)) {
-        return {};
+        return ICU_Utility::makeBogusString();
     }
     if (fResults == nullptr) {
         status = fErrorCode;
-        return {};
+        return ICU_Utility::makeBogusString();
     }
     return fResults->string.toUnicodeString();
 }
 
 Appendable& FormattedNumber::appendTo(Appendable& appendable) {
-    if (fResults == nullptr) {
-        return appendable;
-    }
-    appendable.appendString(fResults->string.chars(), fResults->string.length());
-    return appendable;
+    UErrorCode localStatus = U_ZERO_ERROR;
+    return appendTo(appendable, localStatus);
 }
 
 Appendable& FormattedNumber::appendTo(Appendable& appendable, UErrorCode& status) {
diff --git a/icu4c/source/test/intltest/numbertest_api.cpp b/icu4c/source/test/intltest/numbertest_api.cpp
index 95a5114ea31..1295d29ce24 100644
--- a/icu4c/source/test/intltest/numbertest_api.cpp
+++ b/icu4c/source/test/intltest/numbertest_api.cpp
@@ -2227,6 +2227,9 @@ void NumberFormatterApiTest::errors() {
             "Should fail on UnicodeString terminal method with correct error code",
             U_NUMBER_ARG_OUTOFBOUNDS_ERROR,
             status);
+    assertTrue(
+            "Terminal UnicodeString on error object should be bogus",
+            output.isBogus());
 
     // CopyErrorTo
     status = U_ZERO_ERROR;
-- 
2.40.0