diff --git a/src/expression.c b/src/expression.c index 9b3b333516e6..4975bd734093 100644 --- a/src/expression.c +++ b/src/expression.c @@ -10765,7 +10765,7 @@ Expression *IndexExp::semantic(Scope *sc) e2 = e2->optimize(WANTvalue); dinteger_t length = el->toInteger(); if (length) - skipboundscheck = IntRange(SignExtendedNumber(0), SignExtendedNumber(length)).contains(getIntRange(e2)); + skipboundscheck = IntRange(SignExtendedNumber(0), SignExtendedNumber(length-1)).contains(getIntRange(e2)); } } diff --git a/test/runnable/bug12928.d b/test/runnable/bug12928.d new file mode 100644 index 000000000000..92ce78eeda7c --- /dev/null +++ b/test/runnable/bug12928.d @@ -0,0 +1,13 @@ +// PERMUTE_ARGS: -inline -g -O +import core.exception : RangeError; +void main(string[] args) +{ + int[2] a; + try + { + foreach(const i; 0..3) + a[i] = i; + assert(0); + } + catch(RangeError){} +}