fix 𝕗⌾(-2⋆63)𝕩

This commit is contained in:
dzaima 2025-03-12 02:25:24 +02:00
parent e33b3b95ee
commit bfce527096
2 changed files with 13 additions and 7 deletions

View File

@ -56,6 +56,10 @@ B catch_c1(Md2D* d, B x) { return c1(d->f, x); }
B catch_c2(Md2D* d, B w, B x) { return c2(d->f, w,x); }
#endif
static NOINLINE NORETURN void repeat_bad_num() {
thrM("⍟: 𝔾 contained non-integer or integer was out of range");
}
extern GLOBAL B rt_undo;
void repeat_bounds(i64* bound, B g) { // doesn't consume
#define UPD_BOUNDS(B,I) ({ i64 i_ = (I); if (i_<bound[0]) bound[0] = i_; if (i_>bound[1]) bound[1] = i_; })
@ -65,7 +69,7 @@ void repeat_bounds(i64* bound, B g) { // doesn't consume
u8 ge = TI(g,elType);
if (elNum(ge)) {
i64 bres[2];
if (!getRange_fns[ge](tyany_ptr(g), bres, ia)) thrM("⍟: 𝔾 contained non-integer (or integer was out of range)");
if (!getRange_fns[ge](tyany_ptr(g), bres, ia)) repeat_bad_num();
if (bres[0]<bound[0]) bound[0] = bres[0];
if (bres[1]>bound[1]) bound[1] = bres[1];
} else {
@ -73,7 +77,7 @@ void repeat_bounds(i64* bound, B g) { // doesn't consume
for (usz i = 0; i < ia; i++) repeat_bounds(bound, GetU(g, i));
}
} else if (isNum(g)) {
if (!q_i64(g)) thrM("⍟: 𝔾 contained non-integer (or integer was out of range)");
if (!q_i64(g)) repeat_bad_num();
i64 c = o2i64G(g);
if (c<bound[0]) bound[0] = c;
if (c>bound[1]) bound[1] = c;
@ -104,7 +108,8 @@ NOINLINE B repeat_replaceR(B g, B* q) {
} \
i64 bound[2] = {0,0}; \
repeat_bounds(bound, g); \
i64 min=(u64)-bound[0]; i64 max=(u64)bound[1]; \
i64 min=-(u64)bound[0]; i64 max=bound[1]; \
if ((min|max) >> 48 != 0) repeat_bad_num(); \
TALLOC(B, all, min+max+1); \
B* q = all+min; \
q[0] = inc(x); \

View File

@ -462,10 +462,11 @@ a←↕2 ⋄ ! "e" ≡ (↕10){b←a‿a‿a‿a‿a‿a‿a‿a‿a‿a ⋄
!"⍟: 𝔾 contained non-number" % 1+1,,3 0
!"Expected integer, got 1.5" % 1+1.5 0
!"Integer out of range: 1e20" % 1+1e20 0
!"⍟: 𝔾 contained non-integer (or integer was out of range)" % %USE evar {1+𝕩 0}_evar 1.5
!"⍟: 𝔾 contained non-integer (or integer was out of range)" % %USE evar {1+𝕩 0}_evar 1e20
!"⍟: 𝔾 contained non-integer (or integer was out of range)" % %USE evar {1+𝕩 0}_evar 9, 1.5
!"⍟: 𝔾 contained non-integer (or integer was out of range)" % %USE evar {1+𝕩 0}_evar 1.5, 9
!"⍟: 𝔾 contained non-integer or integer was out of range" % %USE evar {1+𝕩 0}_evar 1.5
!"⍟: 𝔾 contained non-integer or integer was out of range" % %USE evar {1+𝕩 0}_evar 1e20
!"⍟: 𝔾 contained non-integer or integer was out of range" % %USE evar {1+𝕩 0}_evar 9, 1.5
!"⍟: 𝔾 contained non-integer or integer was out of range" % %USE evar {1+𝕩 0}_evar 1.5, 9
!"⍟: 𝔾 contained non-integer or integer was out of range" % %USE eqerr {1+𝕩𝕩 2}_eqerr - 263, 260
# ◶
!"𝔽◶𝕘𝕩: 𝕘 must have rank 1 when index is a number" % 1[12,34] 3