Closed
Description
This is a competing proposal with #3803. It solves the same problem in a different way, which is arguably simpler, and safer by default.
It's pretty easy to explain: make all aggregate types non-copyable by default. So this would be an error:
const Point = struct {
x: i32,
y: i32,
};
test "copy a point" {
var pt = Point{.x = 1, .y = 2};
var pt2 = pt; // error: copy of struct which does not have the `copyok` attribute
}
But this would work:
const Point2 = struct copyok {
x: i32,
y: i32,
};
test "copy a point" {
var pt = Point{.x = 1, .y = 2};
var pt2 = pt; // OK
}
Some notes:
- Enums, anonymous struct literals and anonymous list literals would be copyable
- Non-copyable types would be always passed as a reference when the parameter used pass-by-value parameter syntax
- This would probably be too inconvenient without result locations: unwrap optional and error unions so that the payload can be non-copied #2761 and result location: ability to refer to the return result location before the
return
statement #2765 implemented.