Commit 1fa8356
committed
fix(rust-patterns-book): make Lifetime Branding example enforce compile-time safety
The arena/handle lifetime branding example used covariant PhantomData<&'a ()>,
which allowed the compiler to unify lifetimes across different arena instances.
The cross-arena usage compiled successfully but panicked at runtime.
Fix by:
- Making ArenaHandle invariant over 'arena with PhantomData<*mut &'arena ()>
so handles from different arenas can't be mixed
- Using a with_arena() closure that creates a unique, opaque lifetime per call,
preventing the compiler from unifying lifetimes across arena instances
- Changing get() to take &ArenaHandle to avoid ownership conflicts
Fixes #1071 parent 19510c1 commit 1fa8356
1 file changed
Lines changed: 27 additions & 17 deletions
Lines changed: 27 additions & 17 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
52 | | - | |
| 52 | + | |
| 53 | + | |
53 | 54 | | |
54 | 55 | | |
55 | | - | |
| 56 | + | |
56 | 57 | | |
57 | 58 | | |
58 | | - | |
| 59 | + | |
| 60 | + | |
59 | 61 | | |
| 62 | + | |
60 | 63 | | |
61 | 64 | | |
62 | | - | |
63 | | - | |
64 | | - | |
65 | | - | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
66 | 74 | | |
| 75 | + | |
67 | 76 | | |
68 | | - | |
| 77 | + | |
69 | 78 | | |
70 | 79 | | |
71 | 80 | | |
72 | 81 | | |
73 | 82 | | |
74 | 83 | | |
75 | 84 | | |
76 | | - | |
| 85 | + | |
77 | 86 | | |
78 | 87 | | |
79 | 88 | | |
80 | 89 | | |
81 | 90 | | |
82 | 91 | | |
83 | | - | |
84 | | - | |
85 | | - | |
86 | | - | |
87 | | - | |
88 | | - | |
89 | | - | |
90 | | - | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
91 | 101 | | |
92 | 102 | | |
93 | 103 | | |
| |||
0 commit comments