Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

<locale>: missing some locale names #1275

Open
fsb4000 opened this issue Sep 7, 2020 · 0 comments
Open

<locale>: missing some locale names #1275

fsb4000 opened this issue Sep 7, 2020 · 0 comments
Labels
test Related to test code

Comments

@fsb4000
Copy link
Contributor

fsb4000 commented Sep 7, 2020

Describe the bug
Some libc++ tests use UTF_8 locale. But they use ANSI locale on Windows. Also the tests may fail for another reasons.

Command-line test case

#ifndef PLATFORM_SUPPORT_H
#define PLATFORM_SUPPORT_H

// locale names
#ifdef _WIN32
    // WARNING: Windows does not support UTF-8 codepages.
    // Locales are "converted" using https://docs.moodle.org/dev/Table_of_locales
#   define LOCALE_en_US           "en-US"
#   define LOCALE_en_US_UTF_8     "en-US"
#   define LOCALE_cs_CZ_ISO8859_2 "cs-CZ"
#   define LOCALE_fr_FR_UTF_8     "fr-FR"
#   define LOCALE_fr_CA_ISO8859_1 "fr-CA"
#   define LOCALE_ru_RU_UTF_8     "ru-RU"
#   define LOCALE_zh_CN_UTF_8     "zh-CN"
#elif defined(__CloudABI__)
    // Timezones are integrated into locales through LC_TIMEZONE_MASK on
    // CloudABI. LC_ALL_MASK can only be used if a timezone has also been
    // provided. UTC should be all right.
#   define LOCALE_en_US           "en_US"
#   define LOCALE_en_US_UTF_8     "en_US.UTF-8@UTC"
#   define LOCALE_fr_FR_UTF_8     "fr_FR.UTF-8@UTC"
#   define LOCALE_fr_CA_ISO8859_1 "fr_CA.ISO-8859-1@UTC"
#   define LOCALE_cs_CZ_ISO8859_2 "cs_CZ.ISO-8859-2@UTC"
#   define LOCALE_ru_RU_UTF_8     "ru_RU.UTF-8@UTC"
#   define LOCALE_zh_CN_UTF_8     "zh_CN.UTF-8@UTC"
#else
#   define LOCALE_en_US           "en_US"
#   define LOCALE_en_US_UTF_8     "en_US.UTF-8"
#   define LOCALE_fr_FR_UTF_8     "fr_FR.UTF-8"
#   ifdef __linux__
#       define LOCALE_fr_CA_ISO8859_1 "fr_CA.ISO-8859-1"
#       define LOCALE_cs_CZ_ISO8859_2 "cs_CZ.ISO-8859-2"
#   else
#       define LOCALE_fr_CA_ISO8859_1 "fr_CA.ISO8859-1"
#       define LOCALE_cs_CZ_ISO8859_2 "cs_CZ.ISO8859-2"
#   endif
#   define LOCALE_ru_RU_UTF_8     "ru_RU.UTF-8"
#   define LOCALE_zh_CN_UTF_8     "zh_CN.UTF-8"
#endif

#include <stdio.h>
#include <stdlib.h>
#include <codecvt>
#include <locale>
#include <string>
#if defined(_WIN32) || defined(__MINGW32__)
#   include <io.h> // _mktemp_s
#else
#   include <unistd.h> // close
#endif

#if defined(_NEWLIB_VERSION) && defined(__STRICT_ANSI__)
// Newlib provides this, but in the header it's under __STRICT_ANSI__
extern "C" {
  int mkstemp(char*);
}
#endif

#ifndef __CloudABI__
inline
std::string get_temp_file_name()
{
#if defined(__MINGW32__)
    char Path[MAX_PATH + 1];
    char FN[MAX_PATH + 1];
    do { } while (0 == GetTempPath(MAX_PATH+1, Path));
    do { } while (0 == GetTempFileName(Path, "libcxx", 0, FN));
    return FN;
#elif defined(_WIN32)
    char Name[] = "libcxx.XXXXXX";
    if (_mktemp_s(Name, sizeof(Name)) != 0) abort();
    return Name;
#else
    std::string Name;
    int FD = -1;
    do {
        Name = "libcxx.XXXXXX";
        FD = mkstemp(&Name[0]);
        if (FD == -1 && errno == EINVAL) {
            perror("mkstemp");
            abort();
        }
    } while (FD == -1);
    close(FD);
    return Name;
#endif
}

#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
inline
std::wstring get_wide_temp_file_name()
{
    return std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> >().from_bytes(
        get_temp_file_name());
}
#endif // _LIBCPP_HAS_OPEN_WITH_WCHAR

#endif // __CloudABI__

#endif // PLATFORM_SUPPORT_H

Expected behavior
Tests should pass

STL version
Microsoft Visual Studio Community 2019 Preview Version 16.8.0 Preview 2.0

Additional context
Skipped libc++ tests

# STL test bug: We don't have the locale names libcxx wants specialized in platform_support.hpp
# More bugs may be uncovered when the locale names are present.
# move.pass.cpp can crash.
std/input.output/iostreams.base/ios/basic.ios.members/move.pass.cpp SKIPPED
std/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp FAIL
std/localization/locale.categories/category.ctype/locale.ctype.byname/is_1.pass.cpp FAIL
std/localization/locale.categories/category.ctype/locale.ctype.byname/is_many.pass.cpp FAIL
std/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_1.pass.cpp FAIL
std/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_many.pass.cpp FAIL
std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_is.pass.cpp FAIL
std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_not.pass.cpp FAIL
std/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp FAIL
std/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp FAIL
std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp FAIL
std/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp FAIL
std/localization/locale.categories/category.monetary/locale.moneypunct.byname/grouping.pass.cpp FAIL
std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp FAIL
std/localization/locale.categories/category.monetary/locale.moneypunct.byname/negative_sign.pass.cpp FAIL
std/localization/locale.categories/category.monetary/locale.moneypunct.byname/pos_format.pass.cpp FAIL
std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp FAIL
std/localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp FAIL
std/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp FAIL
std/localization/locale.categories/category.time/locale.time.get.byname/get_monthname.pass.cpp FAIL
std/localization/locale.categories/category.time/locale.time.get.byname/get_monthname_wide.pass.cpp FAIL
std/localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp FAIL
std/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp FAIL
std/localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp FAIL
std/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp FAIL
std/localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp FAIL
std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp FAIL
std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp FAIL

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
test Related to test code
Projects
None yet
Development

No branches or pull requests

2 participants