February 03, 2023 [Issue 23668] New: Can't stable sort structs with disabled default constructor. | ||||
---|---|---|---|---|
| ||||
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. -- |
Copyright © 1999-2021 by the D Language Foundation