On Friday, 17 September 2021 at 11:10:33 UTC, seany wrote:
Compile with `dub build --compiler=ldc2 `. this should enable array bound checking options.

By default, yes. run `dub -v build --compiler=ldc2` to see the exact commands that dub runs.

    But should it not be caught by range error ?

Based on what you've said, yes it should.

If I do `print l`in gdb, i find :
        $1 = {length = 0, ptr = 0x0}
With `print l[0]` i get: `Attempt to take address of value not located in memory.`.

i.e., a segfault. null (or 0x0 (or 0)) isn't part of the memory addresses your program is allowed to access, so memory protection prevents the attempt to access it.

What absolute rookie mistake am I committing?

From this it doesn't sound like you are committing one, but if you're wanting bounds checking to be a normal part of program logic, and not something that only ever happens due to a programmer's error, then I think you're cutting against the grain of the language, where

- bounds checking is easily removed from all but @safe functions with normal flags

- flags exist to remove it from @safe functions also

- the *Error family of exceptions, including RangeError are not intended to be catchable

- raising and immediately catching an exception like this is slower and more verbose than an explicit test.

Rather than returning an empty array on an error and expecting a caller to catch RangeError, you could throw a normal exception on error, and then you have tools like `std.exception.ifThrown` to make dealing with that exception nicer.

Reply via email to