February 03, 2023
https://issues.dlang.org/show_bug.cgi?id=23668

          Issue ID: 23668
           Summary: Can't stable sort structs with disabled default
                    constructor.
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: minor
          Priority: P1
         Component: phobos
          Assignee: nobody@puremagic.com
          Reporter: default_357-line@yahoo.de

Consider the following code:

```
import std;

struct S {
    int a;
    this(int a) { this.a = a; }
    int opCmp(S other) { return a > other.a ? 1 : a < other.a ? -1 : 0; }
    @disable this();
}

void main() {
    S[] foo = [S(3), S(2)];
    foo.sort!"a > b";
    foo.sort!("a < b", SwapStrategy.stable);
}
```

This will error with

```
/dlang/dmd-nightly/linux/bin64/../../src/phobos/std/algorithm/sorting.d(2602):
Error: struct `onlineapp.S` default construction is disabled
```

This happens because TimSort (the stable sort) tries to run a simpler codepath if called during CTFE which does `array.length = ...`, which calls the default constructors. Even though we're not in CTFE, this codepath still has to be semantically valid (because `__ctfe` is a runtime variable), so it errors.

The CTFE optimization should only be done if the struct has a default constructor.

--