diff --git a/src/racket/src/string.c b/src/racket/src/string.c index b574fdfcaa..44a7a94965 100644 --- a/src/racket/src/string.c +++ b/src/racket/src/string.c @@ -960,7 +960,8 @@ void scheme_out_of_string_range(const char *name, const char *which, "%s: %sindex %s out of range [%d, %d] for %s%s: %t", name, which, scheme_make_provided_string(i, 2, NULL), - start, len, + ((start < 0) ? 0 : start), + ((start < 0) ? (len - 1) : len), is_byte ? "byte-" : "", SCHEME_CHAPERONE_VECTORP(s) ? "vector" : "string", sstr, slen); diff --git a/src/racket/src/strops.inc b/src/racket/src/strops.inc index fce37b914f..20b47c338f 100644 --- a/src/racket/src/strops.inc +++ b/src/racket/src/strops.inc @@ -245,7 +245,7 @@ X_(scheme_checked, string_ref) (int argc, Scheme_Object *argv[]) i = scheme_extract_index(XSTRINGSTR "-ref", 1, argc, argv, len, 0); if (i >= len) { - scheme_out_of_string_range(XSTRINGSTR "-ref", "", argv[1], argv[0], 0, len - 1); + scheme_out_of_string_range(XSTRINGSTR "-ref", "", argv[1], argv[0], -1, len); return NULL; }