Skip to content

Commit 7074346

Browse files
committed
Change MarkerTrait to be invariant. This is a (small) loss of expressiveness,
but is necessary for now to work around #22806. Fixes #22655.
1 parent 880fb89 commit 7074346

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

src/libcore/marker.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,13 @@ macro_rules! impls{
275275
/// any methods, but instead is used to gate access to data.
276276
///
277277
/// FIXME. Better documentation needed here!
278-
pub trait MarkerTrait : PhantomFn<Self> { }
278+
pub trait MarkerTrait : PhantomFn<Self,Self> { }
279+
// ~~~~~ <-- FIXME(#22806)?
280+
//
281+
// Marker trait has been made invariant so as to avoid inf recursion,
282+
// but we should ideally solve the underlying problem. That's a bit
283+
// complicated.
284+
279285
impl<T:?Sized> MarkerTrait for T { }
280286

281287
/// `PhantomFn` is a marker trait for use with traits that contain
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// Regression test for issue #22655: This test should not lead to
12+
// infinite recursion.
13+
14+
unsafe impl<T: Send + ?Sized> Send for Unique<T> { }
15+
16+
pub struct Unique<T:?Sized> {
17+
pointer: *const T,
18+
}
19+
20+
pub struct Node<V> {
21+
vals: V,
22+
edges: Unique<Node<V>>,
23+
}
24+
25+
fn is_send<T: Send>() {}
26+
27+
fn main() {
28+
is_send::<Node<&'static ()>>();
29+
}

0 commit comments

Comments
 (0)