diff --git a/compiler/src/dmd/expressionsem.d b/compiler/src/dmd/expressionsem.d index 995a003aad96..d33f1d08c488 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.baseElemOf().isTypeClass()) + 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); +}