Make QLocale consistent about special handling of the C locale

QLocale::matchingLocales() simply created each locale using the basic
data, without (unless the matching conditions stipulated Language C)
applying number-options hacks that it applies everywhere else, when
creating the C locale.  Thus the C locale in its returned list (if it
wasn't the only entry) ended up with the default number options,
without omiting separators in numbers.  Thus QLocale::c() didn't
actually appear as an entry in the list.  Discovered while
investigating QTBUG-58947.

Added a dumb autotest that checks various ways of getting the C locale
do actually give us equal locale objects.  Fixed matchingLocales() to
apply the same hack as is used elsewhere for the C locale.

Change-Id: I263f31da623052b63171f5b5a83c65802383df21
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Edward Welbourne 2017-03-02 14:23:05 +01:00
parent f2e103296f
commit a1c27748d2
2 changed files with 12 additions and 2 deletions

View File

@ -2115,8 +2115,8 @@ QList<QLocale> QLocale::matchingLocales(QLocale::Language language,
&& (language == QLocale::AnyLanguage || data->m_language_id == uint(language))) {
if ((script == QLocale::AnyScript || data->m_script_id == uint(script))
&& (country == QLocale::AnyCountry || data->m_country_id == uint(country))) {
QLocale locale(*QLocalePrivate::create(data));
result.append(locale);
result.append(QLocale(*(data->m_language_id == C ? c_private()
: QLocalePrivate::create(data))));
}
++data;
}

View File

@ -80,6 +80,7 @@ private slots:
void ctor();
void emptyCtor();
void legacyNames();
void consistentC();
void unixLocaleName();
void matchingLocales();
void stringToDouble_data();
@ -579,6 +580,15 @@ void tst_QLocale::legacyNames()
#undef TEST_CTOR
}
void tst_QLocale::consistentC()
{
const QLocale c(QLocale::C);
QCOMPARE(c, QLocale::c());
QCOMPARE(c, QLocale(QLocale::C, QLocale::AnyScript, QLocale::AnyCountry));
QVERIFY(QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript,
QLocale::AnyCountry).contains(c));
}
void tst_QLocale::matchingLocales()
{
const QLocale c(QLocale::C);