Array dup ignores copy constructor with qualified argument · Issue #17212 · dlang/dmd (original) (raw)
Paul Backus (@pbackus) reported this on 2024-03-08T15:15:00Z
Transferred from https://issues.dlang.org/show_bug.cgi?id=24432
Description
As of DMD 2.107.1, the following program fails to compile:
struct S { int* dummy; this(ref immutable S) {} }
void main() { immutable(S) s1; S s2 = s1; // ok
auto arr1 = [immutable(S)()];
auto arr2 = arr1.dup; // error
}
The error message is:
bug.d(13): Error: none of the overloads of template object.dup
are callable using argument types !()(immutable(S)[])
/usr/include/dmd/druntime/import/object.d(3007): Candidates are: dup(T : V[K], K, V)(T aa)
/usr/include/dmd/druntime/import/object.d(3045): dup(T : V[K], K, V)(T* aa)
/usr/include/dmd/druntime/import/object.d(3835): dup(T)(T[] a)
with T = immutable(S)
must satisfy the following constraint:
!is(const(T) : T)
/usr/include/dmd/druntime/import/object.d(3858): dup(T)(const(T)[] a)
with T = S
must satisfy the following constraint:
is(const(T) : T)
dup should be able to create a mutable copy of an immutable S using the appropriately-qualified copy constructor. However, it fails to do so, because its template constraint is too strict.
This bug was originally reported in issue 20879.