Auto merge of #40758 - frewsxcv:rollup, r=frewsxcv
Rollup of 5 pull requests - Successful merges: #40612, #40627, #40668, #40715, #40753 - Failed merges:
This commit is contained in:
commit
d5580374d7
@ -64,17 +64,17 @@ COPY patches/ /tmp/patches/
|
||||
COPY s390x-linux-gnu.config build-s390x-toolchain.sh /tmp/
|
||||
RUN ./build-s390x-toolchain.sh
|
||||
|
||||
USER root
|
||||
|
||||
COPY build-netbsd-toolchain.sh /tmp/
|
||||
RUN ./build-netbsd-toolchain.sh
|
||||
|
||||
ENV PATH=$PATH:/x-tools/s390x-ibm-linux-gnu/bin
|
||||
USER root
|
||||
|
||||
ENV PATH=$PATH:/x-tools/s390x-ibm-linux-gnu/bin:/x-tools/x86_64-unknown-netbsd/bin
|
||||
|
||||
ENV \
|
||||
AR_x86_64_unknown_netbsd=x86_64-unknown-netbsd-ar \
|
||||
CC_x86_64_unknown_netbsd=x86_64-unknown-netbsd-gcc \
|
||||
CXX_x86_64_unknown_netbsd=x86_64-unknown-netbsd-g++ \
|
||||
AR_x86_64_unknown_netbsd=x86_64--netbsd-ar \
|
||||
CC_x86_64_unknown_netbsd=x86_64--netbsd-gcc-sysroot \
|
||||
CXX_x86_64_unknown_netbsd=x86_64--netbsd-g++-sysroot \
|
||||
CC_s390x_unknown_linux_gnu=s390x-ibm-linux-gnu-gcc \
|
||||
AR_s390x_unknown_linux_gnu=s390x-ibm-linux-gnu-ar \
|
||||
CXX_s390x_unknown_linux_gnu=s390x-ibm-linux-gnu-g++
|
||||
|
@ -13,108 +13,71 @@
|
||||
|
||||
set -ex
|
||||
|
||||
BINUTILS=2.25.1
|
||||
GCC=5.3.0
|
||||
hide_output() {
|
||||
set +x
|
||||
on_err="
|
||||
echo ERROR: An error was encountered with the build.
|
||||
cat /tmp/build.log
|
||||
exit 1
|
||||
"
|
||||
trap "$on_err" ERR
|
||||
bash -c "while true; do sleep 30; echo \$(date) - building ...; done" &
|
||||
PING_LOOP_PID=$!
|
||||
$@ &> /tmp/build.log
|
||||
rm /tmp/build.log
|
||||
trap - ERR
|
||||
kill $PING_LOOP_PID
|
||||
set -x
|
||||
}
|
||||
|
||||
# First up, build binutils
|
||||
mkdir binutils
|
||||
cd binutils
|
||||
curl https://ftp.gnu.org/gnu/binutils/binutils-$BINUTILS.tar.bz2 | tar xjf -
|
||||
mkdir binutils-build
|
||||
cd binutils-build
|
||||
../binutils-$BINUTILS/configure \
|
||||
--target=x86_64-unknown-netbsd
|
||||
make -j10
|
||||
make install
|
||||
cd ../..
|
||||
rm -rf binutils
|
||||
|
||||
# Next, download the NetBSD libc and relevant header files
|
||||
mkdir netbsd
|
||||
# originally from:
|
||||
# https://ftp.netbsd.org/pub/NetBSD/NetBSD-7.0/amd64/binary/sets/base.tgz
|
||||
curl https://s3.amazonaws.com/rust-lang-ci/rust-ci-mirror/2017-01-16-netbsd-base.tgz | \
|
||||
tar xzf - -C netbsd ./usr/include ./usr/lib ./lib
|
||||
# originally from:
|
||||
# https://ftp.netbsd.org/pub/NetBSD/NetBSD-7.0/amd64/binary/sets/comp.tgz
|
||||
curl https://s3.amazonaws.com/rust-lang-ci/rust-ci-mirror/2017-01-16-netbsd-comp.tgz | \
|
||||
tar xzf - -C netbsd ./usr/include ./usr/lib
|
||||
cd netbsd
|
||||
|
||||
dst=/usr/local/x86_64-unknown-netbsd
|
||||
cp -r netbsd/usr/include $dst
|
||||
cp netbsd/usr/lib/crt0.o $dst/lib
|
||||
cp netbsd/usr/lib/crti.o $dst/lib
|
||||
cp netbsd/usr/lib/crtn.o $dst/lib
|
||||
cp netbsd/usr/lib/crtbeginS.o $dst/lib
|
||||
cp netbsd/usr/lib/crtendS.o $dst/lib
|
||||
cp netbsd/usr/lib/crtbegin.o $dst/lib
|
||||
cp netbsd/usr/lib/crtend.o $dst/lib
|
||||
cp netbsd/usr/lib/gcrt0.o $dst/lib
|
||||
cp netbsd/usr/lib/libc.a $dst/lib
|
||||
cp netbsd/usr/lib/libc_p.a $dst/lib
|
||||
cp netbsd/usr/lib/libc_pic.a $dst/lib
|
||||
cp netbsd/lib/libc.so.12.193.1 $dst/lib
|
||||
cp netbsd/lib/libutil.so.7.21 $dst/lib
|
||||
cp netbsd/usr/lib/libm.a $dst/lib
|
||||
cp netbsd/usr/lib/libm_p.a $dst/lib
|
||||
cp netbsd/usr/lib/libm_pic.a $dst/lib
|
||||
cp netbsd/lib/libm.so.0.11 $dst/lib
|
||||
cp netbsd/usr/lib/librt.so.1.1 $dst/lib
|
||||
cp netbsd/usr/lib/libpthread.a $dst/lib
|
||||
cp netbsd/usr/lib/libpthread_p.a $dst/lib
|
||||
cp netbsd/usr/lib/libpthread_pic.a $dst/lib
|
||||
cp netbsd/usr/lib/libpthread.so.1.2 $dst/lib
|
||||
mkdir -p /x-tools/x86_64-unknown-netbsd/sysroot
|
||||
|
||||
ln -s libc.so.12.193.1 $dst/lib/libc.so
|
||||
ln -s libc.so.12.193.1 $dst/lib/libc.so.12
|
||||
ln -s libm.so.0.11 $dst/lib/libm.so
|
||||
ln -s libm.so.0.11 $dst/lib/libm.so.0
|
||||
ln -s libutil.so.7.21 $dst/lib/libutil.so
|
||||
ln -s libutil.so.7.21 $dst/lib/libutil.so.7
|
||||
ln -s libpthread.so.1.2 $dst/lib/libpthread.so
|
||||
ln -s libpthread.so.1.2 $dst/lib/libpthread.so.1
|
||||
ln -s librt.so.1.1 $dst/lib/librt.so
|
||||
URL=https://s3.amazonaws.com/rust-lang-ci/rust-ci-mirror
|
||||
|
||||
rm -rf netbsd
|
||||
# Originally from ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-$BSD/source/sets/*.tgz
|
||||
curl $URL/2017-03-17-netbsd-src.tgz | tar xzf -
|
||||
curl $URL/2017-03-17-netbsd-gnusrc.tgz | tar xzf -
|
||||
curl $URL/2017-03-17-netbsd-sharesrc.tgz | tar xzf -
|
||||
curl $URL/2017-03-17-netbsd-syssrc.tgz | tar xzf -
|
||||
|
||||
# Finally, download and build gcc to target NetBSD
|
||||
mkdir gcc
|
||||
cd gcc
|
||||
curl https://ftp.gnu.org/gnu/gcc/gcc-$GCC/gcc-$GCC.tar.bz2 | tar xjf -
|
||||
cd gcc-$GCC
|
||||
./contrib/download_prerequisites
|
||||
# Originally from ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-$BSD/amd64/binary/sets/*.tgz
|
||||
curl $URL/2017-03-17-netbsd-base.tgz | \
|
||||
tar xzf - -C /x-tools/x86_64-unknown-netbsd/sysroot ./usr/include ./usr/lib ./lib
|
||||
curl $URL/2017-03-17-netbsd-comp.tgz | \
|
||||
tar xzf - -C /x-tools/x86_64-unknown-netbsd/sysroot ./usr/include ./usr/lib
|
||||
|
||||
# Originally from
|
||||
# ftp://ftp.netbsd.org/pub/pkgsrc/pkgsrc-2016Q4/pkgsrc/lang/gcc5/patches/patch-libstdc%2B%2B-v3_config_os_bsd_netbsd_ctype__base.h
|
||||
PATCHES="https://s3.amazonaws.com/rust-lang-ci/rust-ci-mirror/2017-01-13-netbsd-patch1.patch"
|
||||
cd usr/src
|
||||
|
||||
# Originally from
|
||||
# ftp://ftp.netbsd.org/pub/pkgsrc/pkgsrc-2016Q4/pkgsrc/lang/gcc5/patches/patch-libstdc%2B%2B-v3_config_os_bsd_netbsd_ctype__configure__char.cc
|
||||
PATCHES="$PATCHES https://s3.amazonaws.com/rust-lang-ci/rust-ci-mirror/2017-01-13-netbsd-patch2.patch"
|
||||
|
||||
for patch in $PATCHES; do
|
||||
curl $patch | patch -Np0
|
||||
done
|
||||
|
||||
mkdir ../gcc-build
|
||||
cd ../gcc-build
|
||||
../gcc-$GCC/configure \
|
||||
--enable-languages=c,c++ \
|
||||
--target=x86_64-unknown-netbsd \
|
||||
--disable-libcilkrts \
|
||||
--disable-multilib \
|
||||
--disable-nls \
|
||||
--disable-libgomp \
|
||||
--disable-libquadmath \
|
||||
--disable-libssp \
|
||||
--disable-libvtv \
|
||||
--disable-libcilkrt \
|
||||
--disable-libada \
|
||||
--disable-libsanitizer \
|
||||
--disable-libquadmath-support \
|
||||
--disable-lto
|
||||
make -j10
|
||||
make install
|
||||
# The options, in order, do the following
|
||||
# * this is an unpriviledged build
|
||||
# * output to a predictable location
|
||||
# * disable various uneeded stuff
|
||||
MKUNPRIVED=yes TOOLDIR=/x-tools/x86_64-unknown-netbsd \
|
||||
MKSHARE=no MKDOC=no MKHTML=no MKINFO=no MKKMOD=no MKLINT=no MKMAN=no MKNLS=no MKPROFILE=no \
|
||||
hide_output ./build.sh -j10 -m amd64 tools
|
||||
|
||||
cd ../..
|
||||
rm -rf gcc
|
||||
|
||||
rm -rf usr
|
||||
|
||||
cat > /x-tools/x86_64-unknown-netbsd/bin/x86_64--netbsd-gcc-sysroot <<'EOF'
|
||||
#!/bin/bash
|
||||
exec /x-tools/x86_64-unknown-netbsd/bin/x86_64--netbsd-gcc --sysroot=/x-tools/x86_64-unknown-netbsd/sysroot "$@"
|
||||
EOF
|
||||
|
||||
cat > /x-tools/x86_64-unknown-netbsd/bin/x86_64--netbsd-g++-sysroot <<'EOF'
|
||||
#!/bin/bash
|
||||
exec /x-tools/x86_64-unknown-netbsd/bin/x86_64--netbsd-g++ --sysroot=/x-tools/x86_64-unknown-netbsd/sysroot "$@"
|
||||
EOF
|
||||
|
||||
GCC_SHA1=`sha1sum -b /x-tools/x86_64-unknown-netbsd/bin/x86_64--netbsd-gcc | cut -d' ' -f1`
|
||||
GPP_SHA1=`sha1sum -b /x-tools/x86_64-unknown-netbsd/bin/x86_64--netbsd-g++ | cut -d' ' -f1`
|
||||
|
||||
echo "# $GCC_SHA1" >> /x-tools/x86_64-unknown-netbsd/bin/x86_64--netbsd-gcc-sysroot
|
||||
echo "# $GPP_SHA1" >> /x-tools/x86_64-unknown-netbsd/bin/x86_64--netbsd-g++-sysroot
|
||||
|
||||
chmod +x /x-tools/x86_64-unknown-netbsd/bin/x86_64--netbsd-gcc-sysroot
|
||||
chmod +x /x-tools/x86_64-unknown-netbsd/bin/x86_64--netbsd-g++-sysroot
|
||||
|
@ -536,9 +536,9 @@ fn next_back(&mut self) -> Option<I::Item> { (**self).next_back() }
|
||||
/// # }
|
||||
/// # }
|
||||
/// impl ExactSizeIterator for Counter {
|
||||
/// // We already have the number of iterations, so we can use it directly.
|
||||
/// // We can easily calculate the remaining number of iterations.
|
||||
/// fn len(&self) -> usize {
|
||||
/// self.count
|
||||
/// 5 - self.count
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
@ -546,7 +546,7 @@ fn next_back(&mut self) -> Option<I::Item> { (**self).next_back() }
|
||||
///
|
||||
/// let counter = Counter::new();
|
||||
///
|
||||
/// assert_eq!(0, counter.len());
|
||||
/// assert_eq!(5, counter.len());
|
||||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub trait ExactSizeIterator: Iterator {
|
||||
|
@ -46,7 +46,7 @@ pub fn error_msg(&self) -> Cow<'static, str> {
|
||||
"the trait cannot require that `Self : Sized`".into(),
|
||||
ObjectSafetyViolation::SupertraitSelf =>
|
||||
"the trait cannot use `Self` as a type parameter \
|
||||
in the supertrait listing".into(),
|
||||
in the supertraits or where-clauses".into(),
|
||||
ObjectSafetyViolation::Method(name, MethodViolationCode::StaticMethod) =>
|
||||
format!("method `{}` has no receiver", name).into(),
|
||||
ObjectSafetyViolation::Method(name, MethodViolationCode::ReferencesSelf) =>
|
||||
|
@ -2059,55 +2059,7 @@ pub fn custom_coerce_unsized_kind(self, did: DefId) -> adjustment::CustomCoerceU
|
||||
}
|
||||
|
||||
pub fn associated_item(self, def_id: DefId) -> AssociatedItem {
|
||||
if !def_id.is_local() {
|
||||
return queries::associated_item::get(self, DUMMY_SP, def_id);
|
||||
}
|
||||
|
||||
self.maps.associated_item.memoize(def_id, || {
|
||||
// When the user asks for a given associated item, we
|
||||
// always go ahead and convert all the associated items in
|
||||
// the container. Note that we are also careful only to
|
||||
// ever register a read on the *container* of the assoc
|
||||
// item, not the assoc item itself. This prevents changes
|
||||
// in the details of an item (for example, the type to
|
||||
// which an associated type is bound) from contaminating
|
||||
// those tasks that just need to scan the names of items
|
||||
// and so forth.
|
||||
|
||||
let id = self.hir.as_local_node_id(def_id).unwrap();
|
||||
let parent_id = self.hir.get_parent(id);
|
||||
let parent_def_id = self.hir.local_def_id(parent_id);
|
||||
let parent_item = self.hir.expect_item(parent_id);
|
||||
match parent_item.node {
|
||||
hir::ItemImpl(.., ref impl_trait_ref, _, ref impl_item_refs) => {
|
||||
for impl_item_ref in impl_item_refs {
|
||||
let assoc_item =
|
||||
self.associated_item_from_impl_item_ref(parent_def_id,
|
||||
impl_trait_ref.is_some(),
|
||||
impl_item_ref);
|
||||
self.maps.associated_item.borrow_mut()
|
||||
.insert(assoc_item.def_id, assoc_item);
|
||||
}
|
||||
}
|
||||
|
||||
hir::ItemTrait(.., ref trait_item_refs) => {
|
||||
for trait_item_ref in trait_item_refs {
|
||||
let assoc_item =
|
||||
self.associated_item_from_trait_item_ref(parent_def_id, trait_item_ref);
|
||||
self.maps.associated_item.borrow_mut()
|
||||
.insert(assoc_item.def_id, assoc_item);
|
||||
}
|
||||
}
|
||||
|
||||
ref r => {
|
||||
panic!("unexpected container of associated items: {:?}", r)
|
||||
}
|
||||
}
|
||||
|
||||
// memoize wants us to return something, so return
|
||||
// the one we generated for this def-id
|
||||
*self.maps.associated_item.borrow().get(&def_id).unwrap()
|
||||
})
|
||||
queries::associated_item::get(self, DUMMY_SP, def_id)
|
||||
}
|
||||
|
||||
fn associated_item_from_trait_item_ref(self,
|
||||
@ -2643,3 +2595,45 @@ pub fn with_freevars<T, F>(self, fid: NodeId, f: F) -> T where
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn associated_item<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId)
|
||||
-> AssociatedItem
|
||||
{
|
||||
let id = tcx.hir.as_local_node_id(def_id).unwrap();
|
||||
let parent_id = tcx.hir.get_parent(id);
|
||||
let parent_def_id = tcx.hir.local_def_id(parent_id);
|
||||
let parent_item = tcx.hir.expect_item(parent_id);
|
||||
match parent_item.node {
|
||||
hir::ItemImpl(.., ref impl_trait_ref, _, ref impl_item_refs) => {
|
||||
if let Some(impl_item_ref) = impl_item_refs.iter().find(|i| i.id.node_id == id) {
|
||||
let assoc_item =
|
||||
tcx.associated_item_from_impl_item_ref(parent_def_id,
|
||||
impl_trait_ref.is_some(),
|
||||
impl_item_ref);
|
||||
debug_assert_eq!(assoc_item.def_id, def_id);
|
||||
return assoc_item;
|
||||
}
|
||||
}
|
||||
|
||||
hir::ItemTrait(.., ref trait_item_refs) => {
|
||||
if let Some(trait_item_ref) = trait_item_refs.iter().find(|i| i.id.node_id == id) {
|
||||
let assoc_item =
|
||||
tcx.associated_item_from_trait_item_ref(parent_def_id, trait_item_ref);
|
||||
debug_assert_eq!(assoc_item.def_id, def_id);
|
||||
return assoc_item;
|
||||
}
|
||||
}
|
||||
|
||||
ref r => {
|
||||
panic!("unexpected container of associated items: {:?}", r)
|
||||
}
|
||||
}
|
||||
panic!("associated item not found for def_id: {:?}", def_id);
|
||||
}
|
||||
|
||||
pub fn provide(providers: &mut ty::maps::Providers) {
|
||||
*providers = ty::maps::Providers {
|
||||
associated_item,
|
||||
..*providers
|
||||
};
|
||||
}
|
||||
|
@ -889,6 +889,7 @@ macro_rules! try_with_f {
|
||||
let mut local_providers = ty::maps::Providers::default();
|
||||
mir::provide(&mut local_providers);
|
||||
typeck::provide(&mut local_providers);
|
||||
ty::provide(&mut local_providers);
|
||||
|
||||
let mut extern_providers = ty::maps::Providers::default();
|
||||
cstore::provide(&mut extern_providers);
|
||||
|
@ -131,6 +131,12 @@ fn main() {
|
||||
if is_crossed && flag.starts_with("-m") {
|
||||
continue;
|
||||
}
|
||||
|
||||
// -Wdate-time is not supported by the netbsd cross compiler
|
||||
if is_crossed && target.contains("netbsd") && flag.contains("date-time") {
|
||||
continue;
|
||||
}
|
||||
|
||||
cfg.flag(flag);
|
||||
}
|
||||
|
||||
@ -227,16 +233,21 @@ fn main() {
|
||||
}
|
||||
}
|
||||
|
||||
// OpenBSD has a particular C++ runtime library name
|
||||
let llvm_static_stdcpp = env::var_os("LLVM_STATIC_STDCPP");
|
||||
|
||||
let stdcppname = if target.contains("openbsd") {
|
||||
// OpenBSD has a particular C++ runtime library name
|
||||
"estdc++"
|
||||
} else if target.contains("netbsd") && llvm_static_stdcpp.is_some() {
|
||||
// NetBSD uses a separate library when relocation is required
|
||||
"stdc++_pic"
|
||||
} else {
|
||||
"stdc++"
|
||||
};
|
||||
|
||||
// C++ runtime library
|
||||
if !target.contains("msvc") {
|
||||
if let Some(s) = env::var_os("LLVM_STATIC_STDCPP") {
|
||||
if let Some(s) = llvm_static_stdcpp {
|
||||
assert!(!cxxflags.contains("stdlib=libc++"));
|
||||
let path = PathBuf::from(s);
|
||||
println!("cargo:rustc-link-search=native={}",
|
||||
|
@ -4626,7 +4626,7 @@ pub fn parse_impl_item(&mut self) -> PResult<'a, ImplItem> {
|
||||
|
||||
let mut attrs = self.parse_outer_attributes()?;
|
||||
let lo = self.span.lo;
|
||||
let vis = self.parse_visibility()?;
|
||||
let vis = self.parse_visibility(false)?;
|
||||
let defaultness = self.parse_defaultness()?;
|
||||
let (name, node) = if self.eat_keyword(keywords::Type) {
|
||||
let name = self.parse_ident()?;
|
||||
@ -4939,25 +4939,8 @@ pub fn parse_tuple_struct_body(&mut self) -> PResult<'a, Vec<StructField>> {
|
||||
|p| {
|
||||
let attrs = p.parse_outer_attributes()?;
|
||||
let lo = p.span.lo;
|
||||
let mut vis = p.parse_visibility()?;
|
||||
let ty_is_interpolated =
|
||||
p.token.is_interpolated() || p.look_ahead(1, |t| t.is_interpolated());
|
||||
let mut ty = p.parse_ty()?;
|
||||
|
||||
// Handle `pub(path) type`, in which `vis` will be `pub` and `ty` will be `(path)`.
|
||||
if vis == Visibility::Public && !ty_is_interpolated &&
|
||||
p.token != token::Comma && p.token != token::CloseDelim(token::Paren) {
|
||||
ty = if let TyKind::Paren(ref path_ty) = ty.node {
|
||||
if let TyKind::Path(None, ref path) = path_ty.node {
|
||||
vis = Visibility::Restricted { path: P(path.clone()), id: path_ty.id };
|
||||
Some(p.parse_ty()?)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}.unwrap_or(ty);
|
||||
}
|
||||
let vis = p.parse_visibility(true)?;
|
||||
let ty = p.parse_ty()?;
|
||||
Ok(StructField {
|
||||
span: mk_sp(lo, p.span.hi),
|
||||
vis: vis,
|
||||
@ -4996,18 +4979,25 @@ pub fn parse_single_struct_field(&mut self,
|
||||
fn parse_struct_decl_field(&mut self) -> PResult<'a, StructField> {
|
||||
let attrs = self.parse_outer_attributes()?;
|
||||
let lo = self.span.lo;
|
||||
let vis = self.parse_visibility()?;
|
||||
let vis = self.parse_visibility(false)?;
|
||||
self.parse_single_struct_field(lo, vis, attrs)
|
||||
}
|
||||
|
||||
// Parse `pub`, `pub(crate)` and `pub(in path)` plus shortcuts
|
||||
// `pub(self)` for `pub(in self)` and `pub(super)` for `pub(in super)`.
|
||||
fn parse_visibility(&mut self) -> PResult<'a, Visibility> {
|
||||
/// Parse `pub`, `pub(crate)` and `pub(in path)` plus shortcuts `pub(self)` for `pub(in self)`
|
||||
/// and `pub(super)` for `pub(in super)`. If the following element can't be a tuple (i.e. it's
|
||||
/// a function definition, it's not a tuple struct field) and the contents within the parens
|
||||
/// isn't valid, emit a proper diagnostic.
|
||||
fn parse_visibility(&mut self, can_take_tuple: bool) -> PResult<'a, Visibility> {
|
||||
if !self.eat_keyword(keywords::Pub) {
|
||||
return Ok(Visibility::Inherited)
|
||||
}
|
||||
|
||||
if self.check(&token::OpenDelim(token::Paren)) {
|
||||
let start_span = self.span;
|
||||
// We don't `self.bump()` the `(` yet because this might be a struct definition where
|
||||
// `()` or a tuple might be allowed. For example, `struct Struct(pub (), pub (usize));`.
|
||||
// Because of this, we only `bump` the `(` if we're assured it is appropriate to do so
|
||||
// by the following tokens.
|
||||
if self.look_ahead(1, |t| t.is_keyword(keywords::Crate)) {
|
||||
// `pub(crate)`
|
||||
self.bump(); // `(`
|
||||
@ -5032,6 +5022,28 @@ fn parse_visibility(&mut self) -> PResult<'a, Visibility> {
|
||||
let vis = Visibility::Restricted { path: P(path), id: ast::DUMMY_NODE_ID };
|
||||
self.expect(&token::CloseDelim(token::Paren))?; // `)`
|
||||
return Ok(vis)
|
||||
} else if !can_take_tuple { // Provide this diagnostic if this is not a tuple struct
|
||||
// `pub(something) fn ...` or `struct X { pub(something) y: Z }`
|
||||
self.bump(); // `(`
|
||||
let msg = "incorrect visibility restriction";
|
||||
let suggestion = r##"some possible visibility restrictions are:
|
||||
`pub(crate)`: visible only on the current crate
|
||||
`pub(super)`: visible only in the current module's parent
|
||||
`pub(in path::to::module)`: visible only on the specified path"##;
|
||||
let path = self.parse_path(PathStyle::Mod)?;
|
||||
let path_span = self.prev_span;
|
||||
let help_msg = format!("to make this visible only to module `{}`, add `in` before \
|
||||
the path:",
|
||||
path);
|
||||
self.expect(&token::CloseDelim(token::Paren))?; // `)`
|
||||
let sp = Span {
|
||||
lo: start_span.lo,
|
||||
hi: self.prev_span.hi,
|
||||
expn_id: start_span.expn_id,
|
||||
};
|
||||
let mut err = self.span_fatal_help(sp, &msg, &suggestion);
|
||||
err.span_suggestion(path_span, &help_msg, format!("in {}", path));
|
||||
err.emit(); // emit diagnostic, but continue with public visibility
|
||||
}
|
||||
}
|
||||
|
||||
@ -5508,7 +5520,7 @@ fn parse_item_(&mut self, attrs: Vec<Attribute>,
|
||||
|
||||
let lo = self.span.lo;
|
||||
|
||||
let visibility = self.parse_visibility()?;
|
||||
let visibility = self.parse_visibility(false)?;
|
||||
|
||||
if self.eat_keyword(keywords::Use) {
|
||||
// USE ITEM
|
||||
@ -5787,7 +5799,7 @@ fn parse_item_(&mut self, attrs: Vec<Attribute>,
|
||||
fn parse_foreign_item(&mut self) -> PResult<'a, Option<ForeignItem>> {
|
||||
let attrs = self.parse_outer_attributes()?;
|
||||
let lo = self.span.lo;
|
||||
let visibility = self.parse_visibility()?;
|
||||
let visibility = self.parse_visibility(false)?;
|
||||
|
||||
if self.check_keyword(keywords::Static) {
|
||||
// FOREIGN STATIC ITEM
|
||||
|
@ -24,7 +24,7 @@ fn make_bar<T:Bar<u32>>(t: &T) -> &Bar<u32> {
|
||||
|
||||
fn make_baz<T:Baz>(t: &T) -> &Baz {
|
||||
//~^ ERROR E0038
|
||||
//~| NOTE the trait cannot use `Self` as a type parameter in the supertrait listing
|
||||
//~| NOTE the trait cannot use `Self` as a type parameter in the supertraits or where-clauses
|
||||
//~| NOTE the trait `Baz` cannot be made into an object
|
||||
t
|
||||
}
|
||||
|
@ -10,7 +10,8 @@
|
||||
|
||||
mod foo {
|
||||
type T = ();
|
||||
struct S1(pub(foo) (), pub(T), pub(crate) (), pub(((), T)));
|
||||
struct S2(pub((foo)) ()); //~ ERROR expected `,`, found `(`
|
||||
struct S1(pub(in foo) (), pub(T), pub(crate) (), pub(((), T)));
|
||||
struct S2(pub((foo)) ());
|
||||
//~^ ERROR expected `,`, found `(`
|
||||
//~| ERROR expected one of `;` or `where`, found `(`
|
||||
}
|
||||
|
@ -11,8 +11,9 @@
|
||||
macro_rules! define_struct {
|
||||
($t:ty) => {
|
||||
struct S1(pub $t);
|
||||
struct S2(pub (foo) ());
|
||||
struct S3(pub $t ()); //~ ERROR expected `,`, found `(`
|
||||
struct S2(pub (in foo) ());
|
||||
struct S3(pub $t ());
|
||||
//~^ ERROR expected `,`, found `(`
|
||||
//~| ERROR expected one of `;` or `where`, found `(`
|
||||
}
|
||||
}
|
||||
|
@ -11,8 +11,9 @@
|
||||
macro_rules! define_struct {
|
||||
($t:ty) => {
|
||||
struct S1(pub($t));
|
||||
struct S2(pub (foo) ());
|
||||
struct S3(pub($t) ()); //~ ERROR expected `,`, found `(`
|
||||
struct S2(pub (in foo) ());
|
||||
struct S3(pub($t) ());
|
||||
//~^ ERROR expected `,`, found `(`
|
||||
//~| ERROR expected one of `;` or `where`, found `(`
|
||||
}
|
||||
}
|
||||
|
13
src/test/ui/pub/pub-restricted-error-fn.rs
Normal file
13
src/test/ui/pub/pub-restricted-error-fn.rs
Normal file
@ -0,0 +1,13 @@
|
||||
// Copyright 2017 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(pub_restricted)]
|
||||
|
||||
pub(crate) () fn foo() {}
|
8
src/test/ui/pub/pub-restricted-error-fn.stderr
Normal file
8
src/test/ui/pub/pub-restricted-error-fn.stderr
Normal file
@ -0,0 +1,8 @@
|
||||
error: unmatched visibility `pub`
|
||||
--> $DIR/pub-restricted-error-fn.rs:13:10
|
||||
|
|
||||
13 | pub(crate) () fn foo() {}
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
19
src/test/ui/pub/pub-restricted-error.rs
Normal file
19
src/test/ui/pub/pub-restricted-error.rs
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright 2017 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(pub_restricted)]
|
||||
|
||||
struct Bar(pub(()));
|
||||
|
||||
struct Foo {
|
||||
pub(crate) () foo: usize,
|
||||
}
|
||||
|
||||
|
8
src/test/ui/pub/pub-restricted-error.stderr
Normal file
8
src/test/ui/pub/pub-restricted-error.stderr
Normal file
@ -0,0 +1,8 @@
|
||||
error: expected identifier, found `(`
|
||||
--> $DIR/pub-restricted-error.rs:16:16
|
||||
|
|
||||
16 | pub(crate) () foo: usize,
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
15
src/test/ui/pub/pub-restricted-non-path.rs
Normal file
15
src/test/ui/pub/pub-restricted-non-path.rs
Normal file
@ -0,0 +1,15 @@
|
||||
// Copyright 2017 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(pub_restricted)]
|
||||
|
||||
pub (.) fn afn() {}
|
||||
|
||||
fn main() {}
|
8
src/test/ui/pub/pub-restricted-non-path.stderr
Normal file
8
src/test/ui/pub/pub-restricted-non-path.stderr
Normal file
@ -0,0 +1,8 @@
|
||||
error: expected identifier, found `.`
|
||||
--> $DIR/pub-restricted-non-path.rs:13:6
|
||||
|
|
||||
13 | pub (.) fn afn() {}
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
37
src/test/ui/pub/pub-restricted.rs
Normal file
37
src/test/ui/pub/pub-restricted.rs
Normal file
@ -0,0 +1,37 @@
|
||||
// Copyright 2017 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(pub_restricted)]
|
||||
|
||||
mod a {}
|
||||
|
||||
pub (a) fn afn() {}
|
||||
pub (b) fn bfn() {}
|
||||
pub fn privfn() {}
|
||||
mod x {
|
||||
mod y {
|
||||
pub (in x) fn foo() {}
|
||||
pub (super) fn bar() {}
|
||||
pub (crate) fn qux() {}
|
||||
}
|
||||
}
|
||||
|
||||
mod y {
|
||||
struct Foo {
|
||||
pub (crate) c: usize,
|
||||
pub (super) s: usize,
|
||||
valid_private: usize,
|
||||
pub (in y) valid_in_x: usize,
|
||||
pub (a) invalid: usize,
|
||||
pub (in x) non_parent_invalid: usize,
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
47
src/test/ui/pub/pub-restricted.stderr
Normal file
47
src/test/ui/pub/pub-restricted.stderr
Normal file
@ -0,0 +1,47 @@
|
||||
error: incorrect visibility restriction
|
||||
--> $DIR/pub-restricted.rs:15:5
|
||||
|
|
||||
15 | pub (a) fn afn() {}
|
||||
| ^^^
|
||||
|
|
||||
= help: some possible visibility restrictions are:
|
||||
`pub(crate)`: visible only on the current crate
|
||||
`pub(super)`: visible only in the current module's parent
|
||||
`pub(in path::to::module)`: visible only on the specified path
|
||||
help: to make this visible only to module `a`, add `in` before the path:
|
||||
| pub (in a) fn afn() {}
|
||||
|
||||
error: incorrect visibility restriction
|
||||
--> $DIR/pub-restricted.rs:16:5
|
||||
|
|
||||
16 | pub (b) fn bfn() {}
|
||||
| ^^^
|
||||
|
|
||||
= help: some possible visibility restrictions are:
|
||||
`pub(crate)`: visible only on the current crate
|
||||
`pub(super)`: visible only in the current module's parent
|
||||
`pub(in path::to::module)`: visible only on the specified path
|
||||
help: to make this visible only to module `b`, add `in` before the path:
|
||||
| pub (in b) fn bfn() {}
|
||||
|
||||
error: incorrect visibility restriction
|
||||
--> $DIR/pub-restricted.rs:32:13
|
||||
|
|
||||
32 | pub (a) invalid: usize,
|
||||
| ^^^
|
||||
|
|
||||
= help: some possible visibility restrictions are:
|
||||
`pub(crate)`: visible only on the current crate
|
||||
`pub(super)`: visible only in the current module's parent
|
||||
`pub(in path::to::module)`: visible only on the specified path
|
||||
help: to make this visible only to module `a`, add `in` before the path:
|
||||
| pub (in a) invalid: usize,
|
||||
|
||||
error: visibilities can only be restricted to ancestor modules
|
||||
--> $DIR/pub-restricted.rs:33:17
|
||||
|
|
||||
33 | pub (in x) non_parent_invalid: usize,
|
||||
| ^
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
Loading…
Reference in New Issue
Block a user