microsoft / microsoft/STL

<locale>: missing some locale names

Open
#1,275 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

test
Dominant language
C++
Stars
11.1k
Forks
1.7k
Avg merge
4d 15h
Merged PRs (30d)
22

Description

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
https://github.com/microsoft/STL/blob/06827feb4cdc4d2328dfbfab9fd5302de6058dd9/tests/libcxx/expected_results.txt#L599-L629

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the skipped libc++ entries in tests/libcxx/expected_results.txt at the linked lines and compare them with the locale definitions in the reported platform-support code. Run the affected tests with the listed Visual Studio configuration, then verify that the locale cases no longer need to be skipped and pass on Windows.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
operating-systems, testing-qa
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.