From ad7e93f6fa42b1c619fffab921d44cb7fb44625a Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Mon, 13 Jul 2026 22:08:28 +0100 Subject: [PATCH] Fix spurious 'default construction is disabled' error for class Fixes #23392. Bug introduced in #23212. --- compiler/src/dmd/expressionsem.d | 3 ++- compiler/test/compilable/class_struct_disable_default.d | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 compiler/test/compilable/class_struct_disable_default.d diff --git a/compiler/src/dmd/expressionsem.d b/compiler/src/dmd/expressionsem.d index 995a003aad96..41d295ea95a6 100644 --- a/compiler/src/dmd/expressionsem.d +++ b/compiler/src/dmd/expressionsem.d @@ -4541,7 +4541,8 @@ private bool functionParameters(Loc loc, Scope* sc, { // Look for misaligned pointer, etc., in @safe mode err |= checkUnsafeAccess(sc, arg, false, true); - err |= checkDefCtor(arg.loc, t); // t must be default constructible + if (!t.isClassHandle()) + err |= checkDefCtor(arg.loc, t); // t must be default constructible } arg = arg.toLvalue(sc, "create `out` parameter from"); } diff --git a/compiler/test/compilable/class_struct_disable_default.d b/compiler/test/compilable/class_struct_disable_default.d new file mode 100644 index 000000000000..82ec6c54ec78 --- /dev/null +++ b/compiler/test/compilable/class_struct_disable_default.d @@ -0,0 +1,9 @@ +// https://github.com/dlang/dmd/issues/23392 +struct Parser { @disable this(); this(int) {} } +class Client { Parser parser; this() { parser = Parser(0); } } +void sink(out Client r) {} +void main() { + Client c; + // passing c just sets it to null, so no @disable error needed + sink(c); +}