Skip to content

Commit 45a6283

Browse files
committed
implicit_unsafe_autorefs: more std fixes
1 parent af4ade4 commit 45a6283

File tree

7 files changed

+26
-27
lines changed

7 files changed

+26
-27
lines changed

library/alloc/src/collections/btree/node.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
544544
fn set_parent_link(&mut self, parent: NonNull<InternalNode<K, V>>, parent_idx: usize) {
545545
let leaf = Self::as_leaf_ptr(self);
546546
unsafe { (*leaf).parent = Some(parent) };
547-
unsafe { (*leaf).parent_idx.write(parent_idx as u16) };
547+
unsafe { (*leaf).parent_idx = MaybeUninit::new(parent_idx as u16) };
548548
}
549549
}
550550

library/alloc/src/rc.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,9 +457,9 @@ impl<T> Rc<T> {
457457
let inner = init_ptr.as_ptr();
458458
ptr::write(ptr::addr_of_mut!((*inner).value), data);
459459

460-
let prev_value = (*inner).strong.get();
460+
let prev_value = (&(*inner).strong).get();
461461
debug_assert_eq!(prev_value, 0, "No prior strong references should exist");
462-
(*inner).strong.set(1);
462+
(&mut (*inner).strong).set(1);
463463

464464
Rc::from_inner(init_ptr)
465465
};

library/alloc/src/sync.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ impl<T> Arc<T> {
456456
//
457457
// These side effects do not impact us in any way, and no other side effects are
458458
// possible with safe code alone.
459-
let prev_value = (*inner).strong.fetch_add(1, Release);
459+
let prev_value = (&(*inner).strong).fetch_add(1, Release);
460460
debug_assert_eq!(prev_value, 0, "No prior strong references should exist");
461461

462462
Arc::from_inner(init_ptr)

library/std/src/sync/mpsc/mpsc_queue.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ impl<T> Queue<T> {
7070
unsafe {
7171
let n = Node::new(Some(t));
7272
let prev = self.head.swap(n, Ordering::AcqRel);
73-
(*prev).next.store(n, Ordering::Release);
73+
(&(*prev).next).store(n, Ordering::Release);
7474
}
7575
}
7676

@@ -87,13 +87,13 @@ impl<T> Queue<T> {
8787
pub fn pop(&self) -> PopResult<T> {
8888
unsafe {
8989
let tail = *self.tail.get();
90-
let next = (*tail).next.load(Ordering::Acquire);
90+
let next = (&(*tail).next).load(Ordering::Acquire);
9191

9292
if !next.is_null() {
9393
*self.tail.get() = next;
94-
assert!((*tail).value.is_none());
95-
assert!((*next).value.is_some());
96-
let ret = (*next).value.take().unwrap();
94+
assert!((&(*tail).value).is_none());
95+
assert!((&(*next).value).is_some());
96+
let ret = (&mut (*next).value).take().unwrap();
9797
let _: Box<Node<T>> = Box::from_raw(tail);
9898
return Data(ret);
9999
}
@@ -108,7 +108,7 @@ impl<T> Drop for Queue<T> {
108108
unsafe {
109109
let mut cur = *self.tail.get();
110110
while !cur.is_null() {
111-
let next = (*cur).next.load(Ordering::Relaxed);
111+
let next = (&(*cur).next).load(Ordering::Relaxed);
112112
let _: Box<Node<T>> = Box::from_raw(cur);
113113
cur = next;
114114
}

library/std/src/sync/mpsc/spsc_queue.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ impl<T, ProducerAddition, ConsumerAddition> Queue<T, ProducerAddition, ConsumerA
102102
) -> Self {
103103
let n1 = Node::new();
104104
let n2 = Node::new();
105-
(*n1).next.store(n2, Ordering::Relaxed);
105+
(&(*n1).next).store(n2, Ordering::Relaxed);
106106
Queue {
107107
consumer: CacheAligned::new(Consumer {
108108
tail: UnsafeCell::new(n2),
@@ -127,10 +127,10 @@ impl<T, ProducerAddition, ConsumerAddition> Queue<T, ProducerAddition, ConsumerA
127127
// Acquire a node (which either uses a cached one or allocates a new
128128
// one), and then append this to the 'head' node.
129129
let n = self.alloc();
130-
assert!((*n).value.is_none());
130+
assert!((&(*n).value).is_none());
131131
(*n).value = Some(t);
132-
(*n).next.store(ptr::null_mut(), Ordering::Relaxed);
133-
(**self.producer.head.get()).next.store(n, Ordering::Release);
132+
(&(*n).next).store(ptr::null_mut(), Ordering::Relaxed);
133+
(&(**self.producer.head.get()).next).store(n, Ordering::Release);
134134
*(&self.producer.head).get() = n;
135135
}
136136
}
@@ -139,15 +139,15 @@ impl<T, ProducerAddition, ConsumerAddition> Queue<T, ProducerAddition, ConsumerA
139139
// First try to see if we can consume the 'first' node for our uses.
140140
if *self.producer.first.get() != *self.producer.tail_copy.get() {
141141
let ret = *self.producer.first.get();
142-
*self.producer.0.first.get() = (*ret).next.load(Ordering::Relaxed);
142+
*self.producer.0.first.get() = (&(*ret).next).load(Ordering::Relaxed);
143143
return ret;
144144
}
145145
// If the above fails, then update our copy of the tail and try
146146
// again.
147147
*self.producer.0.tail_copy.get() = self.consumer.tail_prev.load(Ordering::Acquire);
148148
if *self.producer.first.get() != *self.producer.tail_copy.get() {
149149
let ret = *self.producer.first.get();
150-
*self.producer.0.first.get() = (*ret).next.load(Ordering::Relaxed);
150+
*self.producer.0.first.get() = (&(*ret).next).load(Ordering::Relaxed);
151151
return ret;
152152
}
153153
// If all of that fails, then we have to allocate a new node
@@ -164,12 +164,12 @@ impl<T, ProducerAddition, ConsumerAddition> Queue<T, ProducerAddition, ConsumerA
164164
// tail's next field and see if we can use it. If we do a pop, then
165165
// the current tail node is a candidate for going into the cache.
166166
let tail = *self.consumer.tail.get();
167-
let next = (*tail).next.load(Ordering::Acquire);
167+
let next = (&(*tail).next).load(Ordering::Acquire);
168168
if next.is_null() {
169169
return None;
170170
}
171-
assert!((*next).value.is_some());
172-
let ret = (*next).value.take();
171+
assert!((&(*next).value).is_some());
172+
let ret = (&mut (*next).value).take();
173173

174174
*self.consumer.0.tail.get() = next;
175175
if self.consumer.cache_bound == 0 {
@@ -184,8 +184,7 @@ impl<T, ProducerAddition, ConsumerAddition> Queue<T, ProducerAddition, ConsumerA
184184
if (*tail).cached {
185185
self.consumer.tail_prev.store(tail, Ordering::Release);
186186
} else {
187-
(*self.consumer.tail_prev.load(Ordering::Relaxed))
188-
.next
187+
(&(*self.consumer.tail_prev.load(Ordering::Relaxed)).next)
189188
.store(next, Ordering::Relaxed);
190189
// We have successfully erased all references to 'tail', so
191190
// now we can safely drop it.
@@ -208,8 +207,8 @@ impl<T, ProducerAddition, ConsumerAddition> Queue<T, ProducerAddition, ConsumerA
208207
// stripped out.
209208
unsafe {
210209
let tail = *self.consumer.tail.get();
211-
let next = (*tail).next.load(Ordering::Acquire);
212-
if next.is_null() { None } else { (*next).value.as_mut() }
210+
let next = (&(*tail).next).load(Ordering::Acquire);
211+
if next.is_null() { None } else { (&mut (*next).value).as_mut() }
213212
}
214213
}
215214

@@ -227,7 +226,7 @@ impl<T, ProducerAddition, ConsumerAddition> Drop for Queue<T, ProducerAddition,
227226
unsafe {
228227
let mut cur = *self.producer.first.get();
229228
while !cur.is_null() {
230-
let next = (*cur).next.load(Ordering::Relaxed);
229+
let next = (&(*cur).next).load(Ordering::Relaxed);
231230
let _n: Box<Node<T>> = Box::from_raw(cur);
232231
cur = next;
233232
}

library/std/src/sync/mpsc/sync.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ impl Queue {
489489
}
490490
unsafe {
491491
(*node).next = ptr::null_mut();
492-
Some((*node).token.take().unwrap())
492+
Some((&mut (*node).token).take().unwrap())
493493
}
494494
}
495495
}

library/std/src/thread/local.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,8 +1029,8 @@ pub mod fast {
10291029
// causes future calls to `get` to run `try_initialize_drop` again,
10301030
// which will now fail, and return `None`.
10311031
unsafe {
1032-
let value = (*ptr).inner.take();
1033-
(*ptr).dtor_state.set(DtorState::RunningOrHasRun);
1032+
let value = (&mut (*ptr).inner).take();
1033+
(&(*ptr).dtor_state).set(DtorState::RunningOrHasRun);
10341034
drop(value);
10351035
}
10361036
}

0 commit comments

Comments
 (0)