diff --git a/src/builtins/select.c b/src/builtins/select.c index 1d836dec..8fd2c09f 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -946,7 +946,10 @@ B select_ucw(B t, B o, B w, B x) { B rep; if (isArr(o) && RNK(x)>0) { i64 buf[2]; - if (wia!=0 && (!getRange_fns[we](tyany_ptr(w), buf, wia) || buf[0]<-(i64)xia || buf[1]>=xia)) thrF("π”½βŒΎ(a⊸⊏)𝕩: Indexing out-of-bounds (%l∊a, %H≑≒𝕩)", buf[1]>=xia?buf[1]:buf[0], x); + if (wia!=0 && (!getRange_fns[we](tyany_ptr(w), buf, wia) || buf[0]<-(i64)xia || buf[1]>=xia)) { + C2(select, w, x); + fatal("select_ucw expected to error"); + } rep = incG(o); } else { rep = c1(o, C2(select, incG(w), incG(x))); diff --git a/test/cases/under.bqn b/test/cases/under.bqn index 972b4eab..82831ddb 100644 --- a/test/cases/under.bqn +++ b/test/cases/under.bqn @@ -2,6 +2,7 @@ %DEF tvar %USE var β‹„ _tvar ← {F _𝕣 x: (CLR@) ⊒ {F 𝕩 V x}Β¨ LV 𝕩; w F _𝕣 x: (CLR@) ⊒ (LV 𝕨) {(𝕨 V w) F 𝕩 V x}⌜ LV 𝕩} %DEF eqvar %USE tvar β‹„ _eqvar ← {r ← 𝕨 𝔽 _tvar 𝕩 β‹„ !βˆ˜β‰‘βŸœ(βŠ‘r)Β¨ r β‹„ βŠ‘r} %DEF evar %USE tvar β‹„ _evar ← {ok←{⇐} β‹„ r←β₯Šπ•¨ okβˆ˜π”½βŽŠ{π•Š: β€’CurrentError@} _tvar 𝕩 β‹„ {βŠ‘ok∊r? !"TEST FAIL: variation didn't error"; ("TEST FAIL: varying error messages"βŠΈβ‹ˆ ! 1=β‰ )⍷r β‹„ !βŠ‘r}} +%DEF eqerr %USE eqvar β‹„ _eqerr ← {ok←{⇐} β‹„ r←β₯Šπ•¨ okβˆ˜π”½βŽŠ{π•Š: β€’CurrentError@}⌜ 𝕩 β‹„ {βŠ‘ok∊r? !"TEST FAIL: case didn't error"; ("TEST FAIL: varying error messages"βŠΈβ‹ˆ ! 1=β‰ )⍷r β‹„ !βŠ‘r}} # Β¨ & ˘ # !% ⊒⌾(⊒¨) 4 # TODO enable # !% ⊒⌾(⊒˘) 4 # TODO enable @@ -46,9 +47,13 @@ a←10β€Ώ10β€Ώ10β₯Šβ†•1000 β‹„ ! a ≑ a⌾((↕≒a)βŠΈβŠ‘) a n←500 β‹„ a←↕n β‹„ i←(-n)+↕2Γ—n β‹„ rβ†βŒ½(2Γ—n)β₯Ša β‹„ ! (⌽a) ≑ r⌾(i⊸⊏) a !"π•¨βŠπ•©: 𝕩 cannot be a unit" % 0β€Ώ0⌾(0β€Ώ0⊸⊏) <0 !"π•¨βŠπ•©: 𝕩 cannot be a unit" % %USE evar β‹„ (↕0) {⊒⌾(π•¨βŠΈβŠ)𝕩}_evar <0 -!"π”½βŒΎ(a⊸⊏)𝕩: Indexing out-of-bounds (Β―11∊a, ⟨10βŸ©β‰‘β‰’π•©)" % %USE evar β‹„ 5β€ΏΒ―11 {0β€Ώ1⌾(π•¨βŠΈβŠ)𝕩}_evar 10β₯Š1β€Ώ0β€Ώ1 -!"π”½βŒΎ(a⊸⊏)𝕩: Indexing out-of-bounds (10∊a, ⟨10βŸ©β‰‘β‰’π•©)" % %USE evar β‹„ 9β€Ώ10 {0β€Ώ1⌾(π•¨βŠΈβŠ)𝕩}_evar 10β₯Š1β€Ώ0β€Ώ1 -!"π”½βŒΎ(a⊸⊏)𝕩: Indexing out-of-bounds (10∊a, ⟨10βŸ©β‰‘β‰’π•©)" % %USE evar β‹„ "ab" {π•¨βŒΎ(9β€Ώ10⊸⊏)𝕩}_evar 10β₯Š"foo" +!"π•¨βŠπ•©: Indexing out-of-bounds (Β―11βˆŠπ•¨, 10≑≠𝕩)" % %USE evar β‹„ 5β€ΏΒ―11 {0β€Ώ1⌾(π•¨βŠΈβŠ)𝕩}_evar 10β₯Š1β€Ώ0β€Ώ1 +!"π•¨βŠπ•©: Indexing out-of-bounds (10βˆŠπ•¨, 10≑≠𝕩)" % %USE evar β‹„ 9β€Ώ10 {0β€Ώ1⌾(π•¨βŠΈβŠ)𝕩}_evar 10β₯Š1β€Ώ0β€Ώ1 +!"π•¨βŠπ•©: Indexing out-of-bounds (10βˆŠπ•¨, 10≑≠𝕩)" % %USE evar β‹„ "ab" {π•¨βŒΎ(9β€Ώ10⊸⊏)𝕩}_evar 10β₯Š"foo" +!"π•¨βŠπ•©: Indexing out-of-bounds (4.611686018427388e18βˆŠπ•¨, 3≑≠𝕩)" % %USE eqerr β‹„ {π•©βŒΎ((3β₯Š2⋆62)⊸⊏) "abc"}_eqerr ⟨"abc", {π•Š: "abc"}⟩ +!"Integer out of range: 9.223372036854776e18" % %USE eqerr β‹„ {π•©βŒΎ((3β₯Š2⋆63)⊸⊏) "abc"}_eqerr ⟨"abc", {π•Š: "abc"}⟩ +!"Expected integer, got 1.1" % %USE eqerr β‹„ {π•©βŒΎ((3β₯Š1.1)⊸⊏) ↕3}_eqerr βŸ¨β†•3, {1+𝕩}⟩ +!"π•¨βŠπ•©: Indexing out-of-bounds (10βˆŠπ•¨, 3≑≠𝕩)" % %USE eqerr β‹„ {π•©βŒΎ(10β€Ώ11β€Ώ12⊸⊏) ↕3}_eqerr βŸ¨β†•3, {1+𝕩}⟩ 100⊸+⌾(⟨1β€Ώ2β€Ώ4⟩⊸⊏) <¨↕10 %% <Β¨ 0β€Ώ101β€Ώ102β€Ώ3β€Ώ104β€Ώ5β€Ώ6β€Ώ7β€Ώ8β€Ώ9 100⊸+⌾(1β€Ώ2β€Ώ4⊸⊏) <¨↕10 %% <Β¨ 0β€Ώ101β€Ώ102β€Ώ3β€Ώ104β€Ώ5β€Ώ6β€Ώ7β€Ώ8β€Ώ9 100⊸+⌾(1β€Ώ2β€Ώ4⊸⊏) ↕10 %% 0β€Ώ101β€Ώ102β€Ώ3β€Ώ104β€Ώ5β€Ώ6β€Ώ7β€Ώ8β€Ώ9