rust/src
Alex Crichton e6166b7498 rollup merge of #23712: nikomatsakis/reflect-trait
This PR introduces a `Reflect` marker trait which is a supertrait of `Any`. The idea is that `Reflect` is defined for all concrete types, but is not defined for type parameters unless there is a `T:Reflect` bound. This is intended to preserve the parametricity property. This allows the `Any` interface to be stabilized without committing us to unbounded reflection that is not easily detectable by the caller.

The implementation of `Reflect` relies on an experimental variant of OIBIT. This variant behaves differently for objects, since it requires that all types exposed as part of the object's *interface* are `Reflect`, but isn't concerned about other types that may be closed over. In other words, you don't have to write `Foo+Reflect` in order for `Foo: Reflect` to hold (where `Foo` is a trait).

Given that `Any` is slated to stabilization and hence that we are committed to some form of reflection, the goal of this PR is to leave our options open with respect to parametricity. I see the options for full stabilization as follows (I think an RFC would be an appropriate way to confirm whichever of these three routes we take):

1. We make `Reflect` a lang-item.
2. We stabilize some version of the OIBIT variation I implemented as a general mechanism that may be appropriate for other use cases.
3. We give up on preserving parametricity here and just have `impl<T> Reflect for T` instead. In that case, `Reflect` is a harmless but not especially useful trait going forward.

cc @aturon
cc @alexcrichton
cc @glaebhoerl (this is more-or-less your proposal, as I understood it)
cc @reem (this is more-or-less what we discussed on IRC at some point)
cc @FlaPer87 (vaguely pertains to OIBIT)
2015-03-27 10:07:43 -07:00
..
compiler-rt@58ab642c30
compiletest
doc rollup merge of #23690: wettowelreactor/patch-1 2015-03-27 10:07:42 -07:00
driver
etc
grammar
jemalloc@e24a1a025a
liballoc rollup merge of #23712: nikomatsakis/reflect-trait 2015-03-27 10:07:43 -07:00
libarena
libbacktrace
libcollections rollup merge of #23535: pnkfelix/fsk-filling-drop 2015-03-27 10:07:41 -07:00
libcollectionstest
libcore rollup merge of #23712: nikomatsakis/reflect-trait 2015-03-27 10:07:43 -07:00
libcoretest
libflate
libfmt_macros
libgetopts
libgraphviz
liblibc
liblog
librand
librbml
librustc rollup merge of #23712: nikomatsakis/reflect-trait 2015-03-27 10:07:43 -07:00
librustc_back
librustc_bitflags
librustc_borrowck
librustc_driver
librustc_lint
librustc_llvm
librustc_privacy
librustc_resolve default => or_insert per RFC 2015-03-27 07:42:03 -04:00
librustc_trans Use -Z force-dropflag-checks=on/off for emitting sanity-check. 2015-03-26 14:08:55 +01:00
librustc_typeck rollup merge of #23712: nikomatsakis/reflect-trait 2015-03-27 10:07:43 -07:00
librustdoc default => or_insert per RFC 2015-03-27 07:42:03 -04:00
libserialize
libstd rollup merge of #23651: alexcrichton/unwind-try 2015-03-27 10:07:42 -07:00
libsyntax rollup merge of #23712: nikomatsakis/reflect-trait 2015-03-27 10:07:43 -07:00
libterm
libtest
libunicode
llvm@bff6907697
rt
rust-installer@60fd8abfca
rustbook
rustllvm
test rollup merge of #23712: nikomatsakis/reflect-trait 2015-03-27 10:07:43 -07:00
snapshots.txt