@@ -57,10 +57,9 @@ static std::optional<text_encoding::id> getKnownCharSet(StringRef CSName) {
5757 return std::nullopt ;
5858}
5959
60- #if defined(HAVE_ICONV) || defined(HAVE_ICU)
61- static void HandleOverflow (size_t &Capacity, char *&Output,
62- size_t &OutputLength,
63- SmallVectorImpl<char > &Result) {
60+ LLVM_ATTRIBUTE_UNUSED static void
61+ HandleOverflow (size_t &Capacity, char *&Output, size_t &OutputLength,
62+ SmallVectorImpl<char > &Result) {
6463 // No space left in output buffer. Double the size of the underlying
6564 // memory in the SmallVectorImpl, adjust pointer and length and continue
6665 // the conversion.
@@ -72,7 +71,6 @@ static void HandleOverflow(size_t &Capacity, char *&Output,
7271 Output = static_cast <char *>(Result.data ());
7372 OutputLength = Capacity;
7473}
75- #endif
7674
7775namespace {
7876enum ConversionType {
@@ -290,8 +288,8 @@ void CharSetConverterIconv::reset() {
290288#endif // HAVE_ICONV
291289} // namespace
292290
293- CharSetConverter CharSetConverter::create (text_encoding::id CPFrom,
294- text_encoding::id CPTo) {
291+ ErrorOr< CharSetConverter> CharSetConverter::create (text_encoding::id CPFrom,
292+ text_encoding::id CPTo) {
295293
296294 assert (CPFrom != CPTo && " Text encodings should be distinct" );
297295
@@ -302,19 +300,22 @@ CharSetConverter CharSetConverter::create(text_encoding::id CPFrom,
302300 CPTo == text_encoding::id::UTF8)
303301 Conversion = IBM1047ToUTF8;
304302 else
305- llvm_unreachable (" Invalid ConversionType!" );
303+ return std::error_code (errno, std::generic_category ());
304+
306305 std::unique_ptr<details::CharSetConverterImplBase> Converter =
307306 std::make_unique<CharSetConverterTable>(Conversion);
308-
309307 return CharSetConverter (std::move (Converter));
310308}
311309
312310ErrorOr<CharSetConverter> CharSetConverter::create (StringRef CSFrom,
313311 StringRef CSTo) {
314312 std::optional<text_encoding::id> From = getKnownCharSet (CSFrom);
315313 std::optional<text_encoding::id> To = getKnownCharSet (CSTo);
316- if (From && To)
317- return create (*From, *To);
314+ if (From && To) {
315+ ErrorOr<CharSetConverter> Converter = create (*From, *To);
316+ if (Converter)
317+ return Converter;
318+ }
318319#ifdef HAVE_ICU
319320 UErrorCode EC = U_ZERO_ERROR;
320321 UConverterUniquePtr FromConvDesc (ucnv_open (CSFrom.str ().c_str (), &EC));
0 commit comments