2010-06-17 08:34:59 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2010-11-17 06:09:02 +08:00
|
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
|
|
// Source Licenses. See LICENSE.TXT for details.
|
2010-06-17 08:34:59 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
// <regex>
|
|
|
|
|
|
|
|
// template <class charT> struct regex_traits;
|
|
|
|
|
|
|
|
// int value(charT ch, int radix) const;
|
|
|
|
|
|
|
|
#include <regex>
|
2010-06-22 05:01:43 +08:00
|
|
|
#include <cassert>
|
2016-04-27 00:24:44 +08:00
|
|
|
#include "test_macros.h"
|
2010-06-17 08:34:59 +08:00
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
2010-06-22 05:01:43 +08:00
|
|
|
{
|
|
|
|
std::regex_traits<char> t;
|
|
|
|
|
|
|
|
for (char c = 0; c < '0'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == -1);
|
|
|
|
}
|
|
|
|
for (char c = '0'; c < '8'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == c - '0');
|
|
|
|
assert(t.value(c, 10) == c - '0');
|
|
|
|
assert(t.value(c, 16) == c - '0');
|
|
|
|
}
|
|
|
|
for (char c = '8'; c < ':'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == c - '0');
|
|
|
|
assert(t.value(c, 16) == c - '0');
|
|
|
|
}
|
|
|
|
for (char c = ':'; c < 'A'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == -1);
|
|
|
|
}
|
|
|
|
for (char c = 'A'; c < 'G'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == c - 'A' +10);
|
|
|
|
}
|
|
|
|
for (char c = 'G'; c < 'a'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == -1);
|
|
|
|
}
|
|
|
|
for (char c = 'a'; c < 'g'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == c - 'a' +10);
|
|
|
|
}
|
|
|
|
for (int c = 'g'; c < 256; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(char(c), 8) == -1);
|
|
|
|
assert(t.value(char(c), 10) == -1);
|
|
|
|
assert(t.value(char(c), 16) == -1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
std::regex_traits<wchar_t> t;
|
|
|
|
|
|
|
|
for (wchar_t c = 0; c < '0'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == -1);
|
|
|
|
}
|
|
|
|
for (wchar_t c = '0'; c < '8'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == c - '0');
|
|
|
|
assert(t.value(c, 10) == c - '0');
|
|
|
|
assert(t.value(c, 16) == c - '0');
|
|
|
|
}
|
|
|
|
for (wchar_t c = '8'; c < ':'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == c - '0');
|
|
|
|
assert(t.value(c, 16) == c - '0');
|
|
|
|
}
|
|
|
|
for (wchar_t c = ':'; c < 'A'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == -1);
|
|
|
|
}
|
|
|
|
for (wchar_t c = 'A'; c < 'G'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == c - 'A' +10);
|
|
|
|
}
|
|
|
|
for (wchar_t c = 'G'; c < 'a'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == -1);
|
|
|
|
}
|
|
|
|
for (wchar_t c = 'a'; c < 'g'; ++c)
|
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == c - 'a' +10);
|
|
|
|
}
|
[libcxx] [test] Fix MSVC warning C4244 "conversion from 'X' to 'Y', possible loss of data", part 7/7.
test/std/input.output/iostream.format/input.streams/istream.unformatted/get.pass.cpp
Add static_cast<char> because basic_istream::get() returns int_type (N4606 27.7.2.3 [istream.unformatted]/4).
test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.arithmetic/minus1.pass.cpp
Add static_cast<char> because toupper() returns int (C11 7.4.2.2/1).
test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp
This test is intentionally writing doubles to ostream_iterator<int>.
It's silencing -Wliteral-conversion for Clang, so I'm adding C4244 silencing for MSVC.
test/std/language.support/support.limits/limits/numeric.limits.members/infinity.pass.cpp
Given `extern float zero;`, the expression `1./zero` has type double, which emits a truncation warning
when being passed to test<float>() taking float. The fix is to say `1.f/zero` which has type float.
test/std/numerics/complex.number/cmplx.over/arg.pass.cpp
test/std/numerics/complex.number/cmplx.over/norm.pass.cpp
These tests were constructing std::complex<double>(x, 0), emitting truncation warnings when x is long long.
Saying static_cast<double>(x) avoids this.
test/std/numerics/rand/rand.eng/rand.eng.lcong/seed_result_type.pass.cpp
This was using `int s` to construct and seed a linear_congruential_engine<T, stuff>, where T is
unsigned short/unsigned int/unsigned long/unsigned long long. That emits a truncation warning in the
unsigned short case. Because the range [0, 20) is tiny and we aren't doing anything else with the index,
we can just iterate with `T s`.
test/std/re/re.traits/value.pass.cpp
regex_traits<wchar_t>::value()'s first parameter is wchar_t (N4606 28.7 [re.traits]/13). This loop is
using int to iterate through ['g', 0xFFFF), emitting a truncation warning from int to wchar_t
(which is 16-bit for some of us). Because the bound is exclusive, we can just iterate with wchar_t.
test/std/strings/basic.string/string.cons/size_char_alloc.pass.cpp
This test is a little strange. It's trying to verify that basic_string's (InIt, InIt) range constructor
isn't confused by "N copies of C" when N and C have the same integral type. To do this, it was
testing (100, 65), but that eventually emits truncation warnings from int to char. There's a simple way
to avoid this - passing (static_cast<char>(100), static_cast<char>(65)) also exercises the disambiguation.
(And 100 is representable even when char has a signed range.)
test/std/strings/string.view/string.view.hash/string_view.pass.cpp
Add static_cast<char_type> because `'0' + i` has type int.
test/std/utilities/function.objects/bind/func.bind/func.bind.bind/nested.pass.cpp
What's more horrible than nested bind()? pow() overloads! This operator()(T a, T b) was assuming that
std::pow(a, b) can be returned as T. (In this case, T is int.) However, N4606 26.9.1 [cmath.syn]/2
says that pow(int, int) returns double, so this was truncating double to int.
Adding static_cast<T> silences this.
test/std/utilities/function.objects/unord.hash/integral.pass.cpp
This was iterating `for (int i = 0; i <= 5; ++i)` and constructing `T t(i);` but that's truncating
when T is short. (And super truncating when T is bool.) Adding static_cast<T> silences this.
test/std/utilities/utility/exchange/exchange.pass.cpp
First, this was exchanging 67.2 into an int, but that's inherently truncating.
Changing this to static_cast<short>(67) avoids the truncation while preserving the
"what if T and U are different" test coverage.
Second, this was exchanging {} with the explicit type float into an int, and that's also
inherently truncating. Specifying short is just as good.
test/std/utilities/utility/pairs/pairs.spec/make_pair.pass.cpp
Add static_cast<short>. Note that this affects template argument deduction for make_pair(),
better fulfilling the test's intent. For example, this was saying
`typedef std::pair<int, short> P1; P1 p1 = std::make_pair(3, 4);` but that was asking
make_pair() to return pair<int, int>, which was then being converted to pair<int, short>.
(pair's converting constructors are tested elsewhere.)
Now, std::make_pair(3, static_cast<short>(4)) actually returns pair<int, short>.
(There's still a conversion from pair<nullptr_t, short> to pair<unique_ptr<int>, short>.)
Fixes D27544.
llvm-svn: 289111
2016-12-09 05:38:57 +08:00
|
|
|
for (wchar_t c = 'g'; c < 0xFFFF; ++c)
|
2010-06-22 05:01:43 +08:00
|
|
|
{
|
|
|
|
assert(t.value(c, 8) == -1);
|
|
|
|
assert(t.value(c, 10) == -1);
|
|
|
|
assert(t.value(c, 16) == -1);
|
|
|
|
}
|
|
|
|
}
|
2010-06-17 08:34:59 +08:00
|
|
|
}
|