Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve the error messages for missing stability attributes #58276

Merged
merged 3 commits into from
Feb 14, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions src/librustc/middle/stability.rs
Original file line number Diff line number Diff line change
Expand Up @@ -322,14 +322,17 @@ struct MissingStabilityAnnotations<'a, 'tcx: 'a> {
}

impl<'a, 'tcx: 'a> MissingStabilityAnnotations<'a, 'tcx> {
fn check_missing_stability(&self, id: NodeId, span: Span) {
fn check_missing_stability(&self, id: NodeId, span: Span, name: &str) {
let hir_id = self.tcx.hir().node_to_hir_id(id);
let stab = self.tcx.stability().local_stability(hir_id);
let is_error = !self.tcx.sess.opts.test &&
stab.is_none() &&
self.access_levels.is_reachable(id);
if is_error {
self.tcx.sess.span_err(span, "This node does not have a stability attribute");
self.tcx.sess.span_err(
span,
&format!("{} has missing stability attribute", name),
);
}
}
}
Expand All @@ -347,42 +350,44 @@ impl<'a, 'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'a, 'tcx> {
// optional. They inherit stability from their parents when unannotated.
hir::ItemKind::Impl(.., None, _, _) | hir::ItemKind::ForeignMod(..) => {}

_ => self.check_missing_stability(i.id, i.span)
hir::ItemKind::Mod(..) => self.check_missing_stability(i.id, i.span, "module"),

_ => self.check_missing_stability(i.id, i.span, "node")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using i.node.descriptive_variant() might be better than specifying a name manually. Not sure if there is an equivalent for the other functions.

}

intravisit::walk_item(self, i)
}

fn visit_trait_item(&mut self, ti: &'tcx hir::TraitItem) {
self.check_missing_stability(ti.id, ti.span);
self.check_missing_stability(ti.id, ti.span, "node");
intravisit::walk_trait_item(self, ti);
}

fn visit_impl_item(&mut self, ii: &'tcx hir::ImplItem) {
let impl_def_id = self.tcx.hir().local_def_id(self.tcx.hir().get_parent(ii.id));
if self.tcx.impl_trait_ref(impl_def_id).is_none() {
self.check_missing_stability(ii.id, ii.span);
self.check_missing_stability(ii.id, ii.span, "node");
}
intravisit::walk_impl_item(self, ii);
}

fn visit_variant(&mut self, var: &'tcx Variant, g: &'tcx Generics, item_id: NodeId) {
self.check_missing_stability(var.node.data.id(), var.span);
self.check_missing_stability(var.node.data.id(), var.span, "variant");
intravisit::walk_variant(self, var, g, item_id);
}

fn visit_struct_field(&mut self, s: &'tcx StructField) {
self.check_missing_stability(s.id, s.span);
self.check_missing_stability(s.id, s.span, "field");
intravisit::walk_struct_field(self, s);
}

fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem) {
self.check_missing_stability(i.id, i.span);
self.check_missing_stability(i.id, i.span, "node");
intravisit::walk_foreign_item(self, i);
}

fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef) {
self.check_missing_stability(md.id, md.span);
self.check_missing_stability(md.id, md.span, "macro");
}
}

Expand Down Expand Up @@ -867,7 +872,7 @@ pub fn check_unused_or_stable_features<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
tcx,
access_levels,
};
missing.check_missing_stability(ast::CRATE_NODE_ID, krate.span);
missing.check_missing_stability(ast::CRATE_NODE_ID, krate.span, "crate");
intravisit::walk_crate(&mut missing, krate);
krate.visit_all_item_likes(&mut missing.as_deep_visitor());
}
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/missing/missing-stability.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#![stable(feature = "stable_test_feature", since = "1.0.0")]

pub fn unmarked() {
//~^ ERROR This node does not have a stability attribute
//~^ ERROR node has missing stability attribute
()
}

Expand All @@ -20,5 +20,5 @@ pub mod foo {
pub mod bar {
// #[stable] is not inherited
pub fn unmarked() {}
//~^ ERROR This node does not have a stability attribute
//~^ ERROR node has missing stability attribute
}
6 changes: 3 additions & 3 deletions src/test/ui/missing/missing-stability.stderr
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
error: This node does not have a stability attribute
error: node has missing stability attribute
--> $DIR/missing-stability.rs:8:1
|
LL | / pub fn unmarked() {
LL | | //~^ ERROR This node does not have a stability attribute
LL | | //~^ ERROR node has missing stability attribute
LL | | ()
LL | | }
| |_^

error: This node does not have a stability attribute
error: node has missing stability attribute
--> $DIR/missing-stability.rs:22:5
|
LL | pub fn unmarked() {}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#![feature(staged_api)]
//~^ ERROR crate has missing stability attribute

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error: crate has missing stability attribute
--> $DIR/missing-stability-attr-at-top-level.rs:1:1
|
LL | / #![feature(staged_api)]
LL | | //~^ ERROR crate has missing stability attribute
LL | |
LL | | fn main() {}
| |____________^

error: aborting due to previous error

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#![stable(feature = "test", since = "0")]

#[stable(feature = "test", since = "0")]
pub struct Reverse<T>(pub T); //~ ERROR This node does not have a stability attribute
pub struct Reverse<T>(pub T); //~ ERROR field has missing stability attribute

fn main() {
// Make sure the field is used to fill the stability cache
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
error: This node does not have a stability attribute
error: field has missing stability attribute
--> $DIR/stability-attribute-issue-43027.rs:5:23
|
LL | pub struct Reverse<T>(pub T); //~ ERROR This node does not have a stability attribute
LL | pub struct Reverse<T>(pub T); //~ ERROR field has missing stability attribute
| ^^^^^

error: aborting due to previous error
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#![stable(feature = "stable_test_feature", since = "1.0.0")]

#[macro_export]
macro_rules! mac { //~ ERROR This node does not have a stability attribute
macro_rules! mac { //~ ERROR macro has missing stability attribute
() => ()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
error: This node does not have a stability attribute
error: macro has missing stability attribute
--> $DIR/stability-attribute-sanity-3.rs:8:1
|
LL | / macro_rules! mac { //~ ERROR This node does not have a stability attribute
LL | / macro_rules! mac { //~ ERROR macro has missing stability attribute
LL | | () => ()
LL | | }
| |_^
Expand Down