Auto merge of #42262 - Mark-Simulacrum:issue-40350, r=eddyb

Don't ICE with nested enums in missing docs lint.

Fixes #40350.
This commit is contained in:
bors 2017-05-29 09:04:08 +00:00
commit be5f4fe6cc
2 changed files with 29 additions and 44 deletions

View File

@ -259,12 +259,6 @@ declare_lint! {
}
pub struct MissingDoc {
/// Stack of IDs of struct definitions.
struct_def_stack: Vec<ast::NodeId>,
/// True if inside variant definition
in_variant: bool,
/// Stack of whether #[doc(hidden)] is set
/// at each level which has lint attributes.
doc_hidden_stack: Vec<bool>,
@ -276,8 +270,6 @@ pub struct MissingDoc {
impl MissingDoc {
pub fn new() -> MissingDoc {
MissingDoc {
struct_def_stack: vec![],
in_variant: false,
doc_hidden_stack: vec![false],
private_traits: HashSet::new(),
}
@ -345,25 +337,6 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc {
self.doc_hidden_stack.pop().expect("empty doc_hidden_stack");
}
fn check_struct_def(&mut self,
_: &LateContext,
_: &hir::VariantData,
_: ast::Name,
_: &hir::Generics,
item_id: ast::NodeId) {
self.struct_def_stack.push(item_id);
}
fn check_struct_def_post(&mut self,
_: &LateContext,
_: &hir::VariantData,
_: ast::Name,
_: &hir::Generics,
item_id: ast::NodeId) {
let popped = self.struct_def_stack.pop().expect("empty struct_def_stack");
assert!(popped == item_id);
}
fn check_crate(&mut self, cx: &LateContext, krate: &hir::Crate) {
self.check_missing_docs_attrs(cx, None, &krate.attrs, krate.span, "crate");
}
@ -451,16 +424,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc {
fn check_struct_field(&mut self, cx: &LateContext, sf: &hir::StructField) {
if !sf.is_positional() {
if sf.vis == hir::Public || self.in_variant {
let cur_struct_def = *self.struct_def_stack
.last()
.expect("empty struct_def_stack");
self.check_missing_docs_attrs(cx,
Some(cur_struct_def),
&sf.attrs,
sf.span,
"a struct field")
}
self.check_missing_docs_attrs(cx,
Some(sf.id),
&sf.attrs,
sf.span,
"a struct field")
}
}
@ -470,13 +438,6 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc {
&v.node.attrs,
v.span,
"a variant");
assert!(!self.in_variant);
self.in_variant = true;
}
fn check_variant_post(&mut self, _: &LateContext, _: &hir::Variant, _: &hir::Generics) {
assert!(self.in_variant);
self.in_variant = false;
}
}

View File

@ -0,0 +1,24 @@
// 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(rustc_attrs)]
#![allow(warnings)]
enum E {
A = {
enum F { B }
0
}
}
#[rustc_error]
fn main() {}
//~^ ERROR compilation successful