Skip to content

Commit def6ca6

Browse files
committed
Remove potential UB for homogeneous tuples
See rust-lang/unsafe-code-guidelines#36
1 parent 4131424 commit def6ca6

File tree

2 files changed

+13
-27
lines changed

2 files changed

+13
-27
lines changed

src/fun.rs

+3-7
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ impl<R> FunctionPointer for fn() -> R {
2020
#[cfg_attr(docsrs, doc(fake_variadic))]
2121
#[cfg_attr(
2222
docsrs,
23-
doc = "This trait is implemented for function pointers with up to 16 arguments."
23+
doc = "This trait is implemented for function pointers with up to 12 arguments."
2424
)]
2525
impl<A1, R> Primitive for fn(A1) -> R {}
2626

2727
#[cfg_attr(docsrs, doc(fake_variadic))]
2828
#[cfg_attr(
2929
docsrs,
30-
doc = "This trait is implemented for function pointers with up to 16 arguments."
30+
doc = "This trait is implemented for function pointers with up to 12 arguments."
3131
)]
3232
impl<A1, R> FunctionPointer for fn(A1) -> R {
3333
type Args = (A1,);
@@ -55,7 +55,7 @@ macro_rules! impl_fn {
5555
}
5656

5757
/*
58-
for n in range(2, 17):
58+
for n in range(2, 13):
5959
print(f"impl_fn!({', '.join(f'A{i + 1} {i}' for i in range(n))});")
6060
*/
6161
impl_fn!(A1 0, A2 1);
@@ -69,10 +69,6 @@ impl_fn!(A1 0, A2 1, A3 2, A4 3, A5 4, A6 5, A7 6, A8 7, A9 8);
6969
impl_fn!(A1 0, A2 1, A3 2, A4 3, A5 4, A6 5, A7 6, A8 7, A9 8, A10 9);
7070
impl_fn!(A1 0, A2 1, A3 2, A4 3, A5 4, A6 5, A7 6, A8 7, A9 8, A10 9, A11 10);
7171
impl_fn!(A1 0, A2 1, A3 2, A4 3, A5 4, A6 5, A7 6, A8 7, A9 8, A10 9, A11 10, A12 11);
72-
impl_fn!(A1 0, A2 1, A3 2, A4 3, A5 4, A6 5, A7 6, A8 7, A9 8, A10 9, A11 10, A12 11, A13 12);
73-
impl_fn!(A1 0, A2 1, A3 2, A4 3, A5 4, A6 5, A7 6, A8 7, A9 8, A10 9, A11 10, A12 11, A13 12, A14 13);
74-
impl_fn!(A1 0, A2 1, A3 2, A4 3, A5 4, A6 5, A7 6, A8 7, A9 8, A10 9, A11 10, A12 11, A13 12, A14 13, A15 14);
75-
impl_fn!(A1 0, A2 1, A3 2, A4 3, A5 4, A6 5, A7 6, A8 7, A9 8, A10 9, A11 10, A12 11, A13 12, A14 13, A15 14, A16 15);
7672

7773
#[cfg(test)]
7874
mod test {

src/tuple.rs

+10-20
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use core::mem::{forget, transmute_copy};
2-
31
use crate::{array::Array, primitive::Primitive};
42

53
pub trait Tuple: Primitive {
@@ -38,14 +36,14 @@ impl<T> HomogeneousTuple<T> for () {
3836
#[cfg_attr(docsrs, doc(fake_variadic))]
3937
#[cfg_attr(
4038
docsrs,
41-
doc = "This trait is implemented for tuples up to 16 items long."
39+
doc = "This trait is implemented for tuples up to 12 items long."
4240
)]
4341
impl<T1: ?Sized> Primitive for (T1,) {}
4442

4543
#[cfg_attr(docsrs, doc(fake_variadic))]
4644
#[cfg_attr(
4745
docsrs,
48-
doc = "This trait is implemented for tuples up to 16 items long."
46+
doc = "This trait is implemented for tuples up to 12 items long."
4947
)]
5048
impl<T1: ?Sized> Tuple for (T1,) {
5149
const N: usize = 1;
@@ -54,7 +52,7 @@ impl<T1: ?Sized> Tuple for (T1,) {
5452
#[cfg_attr(docsrs, doc(fake_variadic))]
5553
#[cfg_attr(
5654
docsrs,
57-
doc = "This trait is implemented for tuples up to 16 items long."
55+
doc = "This trait is implemented for tuples up to 12 items long."
5856
)]
5957
impl<T> HomogeneousTuple<T> for (T,) {
6058
type Array = [T; 1];
@@ -63,13 +61,11 @@ impl<T> HomogeneousTuple<T> for (T,) {
6361
where
6462
Self: Sized,
6563
{
66-
[self.0]
64+
self.into()
6765
}
6866

6967
fn from_array(array: Self::Array) -> Self {
70-
let res = unsafe { transmute_copy::<Self::Array, Self>(&array) };
71-
forget(array);
72-
res
68+
array.into()
7369
}
7470
}
7571

@@ -108,20 +104,18 @@ macro_rules! impl_tuple {
108104
where
109105
Self: Sized
110106
{
111-
[$(self.$i,)* self.$last_i]
107+
self.into()
112108
}
113109

114110
fn from_array(array: Self::Array) -> Self {
115-
let res = unsafe { transmute_copy::<Self::Array, Self>(&array) };
116-
forget(array);
117-
res
111+
array.into()
118112
}
119113
}
120114
}
121115
}
122116

123117
/*
124-
for n in range(2, 17):
118+
for n in range(2, 13):
125119
print(f"impl_tuple!({n} => {', '.join(f'T{i} {i - 1}' for i in range(1, n))}; T{n} {n - 1});")
126120
*/
127121
impl_tuple!(2 => T1 0; T2 1);
@@ -135,10 +129,6 @@ impl_tuple!(9 => T1 0, T2 1, T3 2, T4 3, T5 4, T6 5, T7 6, T8 7; T9 8);
135129
impl_tuple!(10 => T1 0, T2 1, T3 2, T4 3, T5 4, T6 5, T7 6, T8 7, T9 8; T10 9);
136130
impl_tuple!(11 => T1 0, T2 1, T3 2, T4 3, T5 4, T6 5, T7 6, T8 7, T9 8, T10 9; T11 10);
137131
impl_tuple!(12 => T1 0, T2 1, T3 2, T4 3, T5 4, T6 5, T7 6, T8 7, T9 8, T10 9, T11 10; T12 11);
138-
impl_tuple!(13 => T1 0, T2 1, T3 2, T4 3, T5 4, T6 5, T7 6, T8 7, T9 8, T10 9, T11 10, T12 11; T13 12);
139-
impl_tuple!(14 => T1 0, T2 1, T3 2, T4 3, T5 4, T6 5, T7 6, T8 7, T9 8, T10 9, T11 10, T12 11, T13 12; T14 13);
140-
impl_tuple!(15 => T1 0, T2 1, T3 2, T4 3, T5 4, T6 5, T7 6, T8 7, T9 8, T10 9, T11 10, T12 11, T13 12, T14 13; T15 14);
141-
impl_tuple!(16 => T1 0, T2 1, T3 2, T4 3, T5 4, T6 5, T7 6, T8 7, T9 8, T10 9, T11 10, T12 11, T13 12, T14 13, T15 14; T16 15);
142132

143133
#[cfg(test)]
144134
mod test {
@@ -189,10 +179,10 @@ mod test {
189179
}
190180

191181
#[test]
192-
fn test_from_array_16() {
182+
fn test_from_array_12() {
193183
test_from_array!(
194184
String, String, String, String, String, String, String, String, String, String, String,
195-
String, String, String, String, String
185+
String
196186
);
197187
}
198188
}

0 commit comments

Comments
 (0)