From 4e16e30b07c24b6ae5db1269c894d618eb55b1c0 Mon Sep 17 00:00:00 2001 From: Virgil Palanciuc Date: Wed, 25 Oct 2017 16:56:13 -0700 Subject: [PATCH] =?UTF-8?q?fix=20#44953=20-=20The=20=E2=80=9Cuse=20of=20un?= =?UTF-8?q?stable=20library=20feature=20'rustc=5Fprivate'=E2=80=9D=20error?= =?UTF-8?q?=20is=20very=20repetitive?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/librustc/middle/stability.rs | 30 +++++++++++++++++++++++++++--- src/librustc/session/mod.rs | 4 ++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs index 4e4fc8b3118f..d83560963f76 100644 --- a/src/librustc/middle/stability.rs +++ b/src/librustc/middle/stability.rs @@ -19,7 +19,7 @@ use hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefId, LOCAL_CRATE}; use ty::{self, TyCtxt}; use middle::privacy::AccessLevels; use syntax::symbol::Symbol; -use syntax_pos::{Span, DUMMY_SP}; +use syntax_pos::{Span, MultiSpan, DUMMY_SP}; use syntax::ast; use syntax::ast::{NodeId, Attribute}; use syntax::feature_gate::{GateIssue, emit_feature_err, find_lang_feature_accepted_version}; @@ -597,8 +597,32 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { feature.as_str(), &r), None => format!("use of unstable library feature '{}'", &feature) }; - emit_feature_err(&self.sess.parse_sess, &feature.as_str(), span, - GateIssue::Library(Some(issue)), &msg); + + let msp: MultiSpan = span.into(); + let cm = &self.sess.parse_sess.codemap(); + let real_file_location = + msp.primary_span().and_then(|sp:Span| + if sp != DUMMY_SP { + let fname = cm.lookup_char_pos(sp.lo()).file.as_ref().name.clone(); + if fname.starts_with("<") && fname.ends_with(" macros>") { + None + } else { + Some(fname) + } + } else { + None + } + ); + + if let Some(_) = real_file_location { + let tuple = (None, Some(span), msg.clone()); + let fresh = self.sess.one_time_diagnostics.borrow_mut().insert(tuple); + if fresh { + emit_feature_err(&self.sess.parse_sess, &feature.as_str(), span, + GateIssue::Library(Some(issue)), &msg); + } + } + } Some(_) => { // Stable APIs are always ok to call and deprecated APIs are diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 42c633dc83fe..177e595273b8 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -78,7 +78,7 @@ pub struct Session { /// Set of (LintId, Option, message) tuples tracking lint /// (sub)diagnostics that have been set once, but should not be set again, /// in order to avoid redundantly verbose output (Issue #24690). - pub one_time_diagnostics: RefCell, String)>>, + pub one_time_diagnostics: RefCell, Option, String)>>, pub plugin_llvm_passes: RefCell>, pub plugin_attributes: RefCell>, pub crate_types: RefCell>, @@ -361,7 +361,7 @@ impl Session { }, _ => { let lint_id = lint::LintId::of(lint); - let id_span_message = (lint_id, span, message.to_owned()); + let id_span_message = (Some(lint_id), span, message.to_owned()); let fresh = self.one_time_diagnostics.borrow_mut().insert(id_span_message); if fresh { do_method()