1
- - Feature Name: ` repr_pack `
1
+ - Feature Name: ` repr_packed `
2
2
- Start Date: 2015-12-06
3
- - RFC PR: (leave this empty )
4
- - Rust Issue: (leave this empty )
3
+ - RFC PR: [ rust-lang/rfcs # 1399 ] ( https://github.com/rust-lang/rfcs/pull/1399 )
4
+ - Rust Issue: [ rust-lang/rust # 33158 ] ( https://github.com/rust-lang/rust/issues/33158 )
5
5
6
6
# Summary
7
7
[ summary ] : #summary
8
8
9
- Extend the existing ` #[repr] ` attribute on structs with a ` pack = "N"` option to
9
+ Extend the existing ` #[repr] ` attribute on structs with a ` packed = "N"` option to
10
10
specify a custom packing for ` struct ` types.
11
11
12
12
# Motivation
@@ -19,7 +19,7 @@ C/C++ libraries (such as Windows API which uses it pervasively making writing
19
19
Rust libraries such as ` winapi ` challenging).
20
20
21
21
At the moment the only way to work around the lack of a proper
22
- ` #[repr(pack = "N")] ` attribute is to use ` #[repr(packed)] ` and then manually
22
+ ` #[repr(packed = "N")] ` attribute is to use ` #[repr(packed)] ` and then manually
23
23
fill in padding which is a burdensome task. Even then that isn't quite right
24
24
because the overall alignment of the struct would end up as 1 even though it
25
25
needs to be N (or the default if that is smaller than N), so this fills in a gap
@@ -31,7 +31,7 @@ which is impossible to do in Rust at the moment.
31
31
The ` #[repr] ` attribute on ` struct ` s will be extended to include a form such as:
32
32
33
33
``` rust
34
- #[repr(pack = " 2" )]
34
+ #[repr(packed = " 2" )]
35
35
struct LessAligned (i16 , i32 );
36
36
```
37
37
@@ -42,7 +42,7 @@ alignment of 4 and a size of 8, and the second field would have an offset of 4
42
42
from the base of the struct.
43
43
44
44
Syntactically, the ` repr ` meta list will be extended to accept a meta item
45
- name/value pair with the name "pack " and the value as a string which can be
45
+ name/value pair with the name "packed " and the value as a string which can be
46
46
parsed as a ` u64 ` . The restrictions on where this attribute can be placed along
47
47
with the accepted values are:
48
48
@@ -61,34 +61,29 @@ struct, then the alignment and layout of the struct should be unaffected.
61
61
When combined with ` #[repr(C)] ` the size alignment and layout of the struct
62
62
should match the equivalent struct in C.
63
63
64
- ` #[repr(packed)] ` and ` #[repr(pack = "1")] ` should have identical behavior.
64
+ ` #[repr(packed)] ` and ` #[repr(packed = "1")] ` should have identical behavior.
65
65
66
66
Because this lowers the effective alignment of fields in the same way that
67
67
` #[repr(packed)] ` does (which caused [ issue #27060 ] [ gh27060 ] ), while accessing a
68
68
field should be safe, borrowing a field should be unsafe.
69
69
70
- Specifying ` #[repr(packed)] ` and ` #[repr(pack = "N")] ` where N is not 1 should
70
+ Specifying ` #[repr(packed)] ` and ` #[repr(packed = "N")] ` where N is not 1 should
71
71
result in an error.
72
72
73
- Specifying ` #[repr(pack = "A")] ` and ` #[repr(align = "B")] ` should still pack
73
+ Specifying ` #[repr(packed = "A")] ` and ` #[repr(align = "B")] ` should still pack
74
74
together fields with the packing specified, but then increase the overall
75
75
alignment to the alignment specified. Depends on [ RFC #1358 ] [ rfc1358 ] landing.
76
76
77
77
# Drawbacks
78
78
[ drawbacks ] : #drawbacks
79
79
80
- Duplication in the language where ` #[repr(packed)] ` and ` #[repr(pack = "1")] `
81
- have identical behavior.
82
-
83
80
# Alternatives
84
81
[ alternatives ] : #alternatives
85
82
86
83
* The alternative is not doing this and forcing people to continue using
87
84
` #[repr(packed)] ` with manual padding, although such structs would always have
88
85
an alignment of 1 which is often wrong.
89
86
* Alternatively a new attribute could be used such as ` #[pack] ` .
90
- * ` #[repr(packed)] ` could be extended as either ` #[repr(packed(N))] ` or
91
- ` #[repr(packed = "N")] ` .
92
87
93
88
# Unresolved questions
94
89
[ unresolved ] : #unresolved-questions
0 commit comments