diff --git a/lib/comp.c b/lib/comp.c index 6c4f56e..1d5b8fd 100644 --- a/lib/comp.c +++ b/lib/comp.c @@ -4305,7 +4305,9 @@ static int compile_cons_xlist_expression (hcl_t* hcl, hcl_cnode_t* obj, int nret } else { - hcl_setsynerrbfmt (hcl, HCL_SYNERR_CALLABLE, HCL_CNODE_GET_LOC(car), HCL_CNODE_GET_TOK(car), "invalid callable in function call"); + hcl_setsynerrbfmt (hcl, HCL_SYNERR_CALLABLE, HCL_CNODE_GET_LOC(car), HCL_NULL, + "invalid callable '%.*js' in function call", + HCL_CNODE_GET_TOKLEN(car), HCL_CNODE_GET_TOKPTR(car)); return -1; } @@ -4679,9 +4681,8 @@ HCL_UNUSED static int string_to_ooi (hcl_t* hcl, hcl_oocs_t* str, int radixed, h if (base < 2 || base > 36) { - invalid_radix_value: hcl_seterrbfmt (hcl, HCL_EINVAL, - "invalid radix value '%d' in radixed number '%.*js'", base, str->len, str->ptr); + "unsupported radix '%d' in radixed number '%.*js'", base, str->len, str->ptr); return -1; } } @@ -4731,7 +4732,10 @@ static hcl_oop_t string_to_num (hcl_t* hcl, hcl_oocs_t* str, const hcl_loc_t* lo end = str->ptr + str->len; /* [NOTE] - * The code here assumes that the reader ensures that + * - this is not a generic conversion functionu + * - it assumes a certain pre-sanity check on the string + * done by the lexical analyzer. + * - it also assumes that the reader ensures that * there is at least 1 valid digit after radix specifier. */ HCL_ASSERT (hcl, ptr < end); @@ -4774,13 +4778,14 @@ static hcl_oop_t string_to_num (hcl_t* hcl, hcl_oocs_t* str, const hcl_loc_t* lo ptr++; } + HCL_ASSERT (hcl, base >= 2 && base <= 36); /* the lexer must guarantee this */ + /* if (base < 2 || base > 36) { - invalid_radix_value: hcl_setsynerrbfmt (hcl, HCL_SYNERR_RADIX, loc, HCL_NULL, - "invalid radix value '%d' in radixed number '%.*js'", base, str->len, str->ptr); + "unsupported radix '%d' in radixed number '%.*js'", base, str->len, str->ptr); return HCL_NULL; - } + }*/ } /* TODO: handle floating point numbers ... etc */ diff --git a/lib/read.c b/lib/read.c index 1173b32..ecd5052 100644 --- a/lib/read.c +++ b/lib/read.c @@ -3124,10 +3124,10 @@ static int flx_plain_number (hcl_t* hcl, hcl_ooci_t c) /* number */ if (!pn->fpdec && pn->tok_type == HCL_TOK_NUMLIT && pn->digit_count[0] > 0 && c == 'r') { /* 16rABCD */ - if (pn->radix_cand_overflown) + if (pn->radix_cand_overflown || pn->radix_cand < 2 || pn->radix_cand > 36) { hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, TOKEN_LOC(hcl), HCL_NULL, - "radix too large '%.*js' before '%jc'", + "unsupported radix '%.*js' before '%jc'", TOKEN_NAME_LEN(hcl), TOKEN_NAME_PTR(hcl), c); return -1; } diff --git a/t/feed-5001.err b/t/feed-5001.err index 0037698..fad872e 100644 --- a/t/feed-5001.err +++ b/t/feed-5001.err @@ -111,7 +111,22 @@ printf "%O\n" 35rabcdefghijklzabcd ##ERROR: syntax error - invalid numeric lite --- -+ 12389127398127389217382197283197321897r11221 1 ##ERROR: syntax error - radix too large '12389127398127389217382197283197321897' before 'r' ++ 12389127398127389217382197283197321897r11221 1 ##ERROR: syntax error - unsupported radix '12389127398127389217382197283197321897' before 'r' + +--- + ++ 0000r11221 1 ##ERROR: syntax error - unsupported radix '0000' before 'r' +--- + ++ 0r11221 1 ##ERROR: syntax error - unsupported radix '0' before 'r' + +--- + ++ 1r11221 1 ##ERROR: syntax error - unsupported radix '1' before 'r' + +--- + ++ 37r11221 1 ##ERROR: syntax error - unsupported radix '37' before 'r' ---