From 5a25e1dad4b50fcda0f86fd188536f212d751c6f Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 20 Aug 2017 16:49:03 +0200 Subject: [PATCH] Make sure crates not opting in to staged_api don't use staged_api --- src/librustc/middle/stability.rs | 12 +++++++++++- src/libtest/lib.rs | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs index 5158c7e94af4c..d2ed29a3a0ff6 100644 --- a/src/librustc/middle/stability.rs +++ b/src/librustc/middle/stability.rs @@ -123,7 +123,8 @@ impl<'a, 'tcx: 'a> Annotator<'a, 'tcx> { item_sp: Span, kind: AnnotationKind, visit_children: F) where F: FnOnce(&mut Self) { - if self.index.staged_api[&LOCAL_CRATE] { + if self.tcx.sess.features.borrow().staged_api { + // This crate explicitly wants staged API. debug!("annotate(id = {:?}, attrs = {:?})", id, attrs); if let Some(..) = attr::find_deprecation(self.tcx.sess.diagnostic(), attrs, item_sp) { self.tcx.sess.span_err(item_sp, "`#[deprecated]` cannot be used in staged api, \ @@ -204,6 +205,15 @@ impl<'a, 'tcx: 'a> Annotator<'a, 'tcx> { } } + // Propagate unstability. This can happen even for non-staged-api crates in case + // -Zforce-unstable-if-unmarked is set. + if let Some(stab) = self.parent_stab { + if stab.level.is_unstable() { + let def_id = self.tcx.hir.local_def_id(id); + self.index.stab_map.insert(def_id, Some(stab)); + } + } + if let Some(depr) = attr::find_deprecation(self.tcx.sess.diagnostic(), attrs, item_sp) { if kind == AnnotationKind::Prohibited { self.tcx.sess.span_err(item_sp, "This deprecation annotation is useless"); diff --git a/src/libtest/lib.rs b/src/libtest/lib.rs index 5451ec24aa8fc..5e34688f8cb8f 100644 --- a/src/libtest/lib.rs +++ b/src/libtest/lib.rs @@ -37,6 +37,7 @@ #![feature(libc)] #![feature(set_stdio)] #![feature(panic_unwind)] +#![feature(staged_api)] extern crate getopts; extern crate term;