mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 03:51:18 +00:00
- String.to_integer does not correctly return in some cases where it should #2590.
This commit is contained in:
@@ -1067,14 +1067,10 @@ macro String.to_integer(self, $Type, int base = 10)
|
||||
{
|
||||
if (is_negative)
|
||||
{
|
||||
$Type new_value = value * base_used - c;
|
||||
if (new_value > value) return INTEGER_OVERFLOW?;
|
||||
value = new_value;
|
||||
value = value.overflow_mul(base_used).overflow_sub(c) ?? INTEGER_OVERFLOW?!;
|
||||
break;
|
||||
}
|
||||
$Type new_value = value * base_used + c;
|
||||
if (new_value < value) return INTEGER_OVERFLOW?;
|
||||
value = new_value;
|
||||
value = value.overflow_mul(base_used).overflow_add(c) ?? INTEGER_OVERFLOW?!;
|
||||
};
|
||||
}
|
||||
return value;
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
- With project.json, when overriding with an empty list the base settings would still be used. #2583
|
||||
- Add sigsegv stacktrace in test and regular errors for Darwin Arm64. #1105
|
||||
- Incorrect error message when using generic type that isn't imported #2589
|
||||
- `String.to_integer` does not correctly return in some cases where it should #2590.
|
||||
|
||||
### Stdlib changes
|
||||
- Add `CGFloat` `CGPoint` `CGSize` `CGRect` types to core_foundation (macOS).
|
||||
|
||||
42
test/unit/stdlib/core/string_to_int.c3
Normal file
42
test/unit/stdlib/core/string_to_int.c3
Normal file
@@ -0,0 +1,42 @@
|
||||
module string_to_int;
|
||||
import std::io, std::math;
|
||||
|
||||
const N = 2560;
|
||||
macro String[] m() @const
|
||||
{
|
||||
var $strings = {};
|
||||
$foreach $i : math::iota(int[N]):
|
||||
$strings +++= @sprintf("%s", $i);
|
||||
$endforeach
|
||||
return $strings;
|
||||
}
|
||||
|
||||
macro String[] m2() @const
|
||||
{
|
||||
var $strings = {};
|
||||
$foreach $i : math::iota(int[N]):
|
||||
$strings +++= @sprintf("%s", -$i);
|
||||
$endforeach
|
||||
return $strings;
|
||||
}
|
||||
|
||||
fn void string_to_char() @test
|
||||
{
|
||||
int valid = 0;
|
||||
foreach (str : m())
|
||||
{
|
||||
char? x = str.to_integer(char);
|
||||
if (try x) valid++;
|
||||
}
|
||||
assert(valid == 256);
|
||||
}
|
||||
fn void string_to_ichar() @test
|
||||
{
|
||||
int valid = 0;
|
||||
foreach (str : m2())
|
||||
{
|
||||
ichar? x = str.to_integer(ichar);
|
||||
if (try x) valid++;
|
||||
}
|
||||
assert(valid == 129);
|
||||
}
|
||||
Reference in New Issue
Block a user