From 7074346e4f092064c5a5fa276be81d08951f56c9 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Wed, 25 Feb 2015 12:21:15 -0500 Subject: [PATCH] Change MarkerTrait to be invariant. This is a (small) loss of expressiveness, but is necessary for now to work around #22806. Fixes #22655. --- src/libcore/marker.rs | 8 ++++++- src/test/run-pass/traits-issue-22655.rs | 29 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/traits-issue-22655.rs diff --git a/src/libcore/marker.rs b/src/libcore/marker.rs index 6c934a998de2d..868a671b9560e 100644 --- a/src/libcore/marker.rs +++ b/src/libcore/marker.rs @@ -275,7 +275,13 @@ macro_rules! impls{ /// any methods, but instead is used to gate access to data. /// /// FIXME. Better documentation needed here! -pub trait MarkerTrait : PhantomFn { } +pub trait MarkerTrait : PhantomFn { } +// ~~~~~ <-- FIXME(#22806)? +// +// Marker trait has been made invariant so as to avoid inf recursion, +// but we should ideally solve the underlying problem. That's a bit +// complicated. + impl MarkerTrait for T { } /// `PhantomFn` is a marker trait for use with traits that contain diff --git a/src/test/run-pass/traits-issue-22655.rs b/src/test/run-pass/traits-issue-22655.rs new file mode 100644 index 0000000000000..18c7cfb0850ce --- /dev/null +++ b/src/test/run-pass/traits-issue-22655.rs @@ -0,0 +1,29 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Regression test for issue #22655: This test should not lead to +// infinite recursion. + +unsafe impl Send for Unique { } + +pub struct Unique { + pointer: *const T, +} + +pub struct Node { + vals: V, + edges: Unique>, +} + +fn is_send() {} + +fn main() { + is_send::>(); +}