[Issue 23668] New: Can't stable sort structs with disabled default constructor.
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Fri Feb  3 13:26:59 UTC 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 at puremagic.com
          Reporter: default_357-line at 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.
--
    
    
More information about the Digitalmars-d-bugs
mailing list