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

Infinite recursion in rustdoc #16274

Closed
SimonSapin opened this issue Aug 5, 2014 · 6 comments
Closed

Infinite recursion in rustdoc #16274

SimonSapin opened this issue Aug 5, 2014 · 6 comments
Labels
T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.

Comments

@SimonSapin
Copy link
Contributor

When running rustdoc on Servo’s style crate, it currently exists with task '<unknown>' has overflowed its stack. Running it in gdb, the stack trace repeats these four lines a large number of times:

#100 0x00007ffff793300d in visit_ast::RustdocVisitor$LT$$x27a$GT$::visit_item::h868ff071f9f54492HFr ()
   from /home/simon/tmp/servo-build/x86_64-unknown-linux-gnu/rust_snapshot/rust-0.12.0-pre-x86_64-unknown-linux-gnu/lib/librustdoc-4e7c5e5c.so
#101 0x00007ffff793802d in visit_ast::RustdocVisitor$LT$$x27a$GT$::resolve_id::hbba5c6cb8d56390bDCr ()
   from /home/simon/tmp/servo-build/x86_64-unknown-linux-gnu/rust_snapshot/rust-0.12.0-pre-x86_64-unknown-linux-gnu/lib/librustdoc-4e7c5e5c.so
#102 0x00007ffff7931316 in visit_ast::RustdocVisitor$LT$$x27a$GT$::visit_view_item::h500efb8576c4bd72Cyr ()
   from /home/simon/tmp/servo-build/x86_64-unknown-linux-gnu/rust_snapshot/rust-0.12.0-pre-x86_64-unknown-linux-gnu/lib/librustdoc-4e7c5e5c.so
#103 0x00007ffff792c960 in visit_ast::RustdocVisitor$LT$$x27a$GT$::visit_mod_contents::hfd92063fb62d99ackwr ()
   from /home/simon/tmp/servo-build/x86_64-unknown-linux-gnu/rust_snapshot/rust-0.12.0-pre-x86_64-unknown-linux-gnu/lib/librustdoc-4e7c5e5c.so

Running it with RUST_LOG=rustdoc::visit_ast after adding debug!() lines in visit_mod_contents() and resolve_id(), this is a repeating pattern in the output after piping it through cut -d'"' -f 1-2

DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "longhands
DEBUG:rustdoc::visit_ast: Visiting module Some("longhands
DEBUG:rustdoc::visit_ast: Resolve ID: 10021
DEBUG:rustdoc::visit_ast: Resolve ID: 8287
DEBUG:rustdoc::visit_ast: Resolve ID: 8295
DEBUG:rustdoc::visit_ast: Resolve ID: 8296
DEBUG:rustdoc::visit_ast: Resolve ID: 8297
DEBUG:rustdoc::visit_ast: Resolve ID: 8298
DEBUG:rustdoc::visit_ast: Resolve ID: 8302
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "one_component_value
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "get_ident_lower
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Resolve ID: 8303
DEBUG:rustdoc::visit_ast: Resolve ID: 8311
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "CSSFloat
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "DEFAULT_LINE_HEIGHT
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "specified
DEBUG:rustdoc::visit_ast: Visiting module Some("specified
DEBUG:rustdoc::visit_ast: Resolve ID: 8327
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "Length
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "Length.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_PX
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_IN
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_CM
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_MM
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_PT
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_PC
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "Length
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "computed
DEBUG:rustdoc::visit_ast: Visiting module Some("computed
DEBUG:rustdoc::visit_ast: Resolve ID: 9115
DEBUG:rustdoc::visit_ast: Resolve ID: 9116
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "computed_as_specified
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Resolve ID: 9119
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "Context
DEBUG:rustdoc::visit_ast: Visiting struct
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "compute_Au
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "compute_Au_with_font_size
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage.::std::cmp::PartialEq
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "compute_LengthOrPercentage
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto.::std::cmp::PartialEq
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "compute_LengthOrPercentageOrAuto
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone.::std::cmp::PartialEq
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "compute_LengthOrPercentageOrNone
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "parse_url
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Resolve ID: 8305
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "PropertyBitField
DEBUG:rustdoc::visit_ast: Visiting struct
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "common_types
DEBUG:rustdoc::visit_ast: Visiting module Some("common_types
DEBUG:rustdoc::visit_ast: Resolve ID: 8311
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "CSSFloat
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "DEFAULT_LINE_HEIGHT
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "specified
DEBUG:rustdoc::visit_ast: Visiting module Some("specified
DEBUG:rustdoc::visit_ast: Resolve ID: 8327
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "Length
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "Length.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_PX
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_IN
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_CM
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_MM
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_PT
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "AU_PER_PC
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "Length
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "computed
DEBUG:rustdoc::visit_ast: Visiting module Some("computed
DEBUG:rustdoc::visit_ast: Resolve ID: 9115
DEBUG:rustdoc::visit_ast: Resolve ID: 9116
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "computed_as_specified
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Resolve ID: 9119
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "Context
DEBUG:rustdoc::visit_ast: Visiting struct
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "compute_Au
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "compute_Au_with_font_size
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentage.::std::cmp::PartialEq
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "compute_LengthOrPercentage
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrAuto.::std::cmp::PartialEq
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "compute_LengthOrPercentageOrAuto
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone
DEBUG:rustdoc::visit_ast: Visiting enum
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone.::std::clone::Clone
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "LengthOrPercentageOrNone.::std::cmp::PartialEq
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "compute_LengthOrPercentageOrNone
DEBUG:rustdoc::visit_ast: Visiting fn
DEBUG:rustdoc::visit_ast: Visiting item Item { ident: "parse_url
DEBUG:rustdoc::visit_ast: Visiting fn

I don’t know how to go from here. I don’t really understand what’s going on in the above log.

CC: @eddyb

@SimonSapin
Copy link
Contributor Author

Steps to reproduce:

  • Build Servo
  • Remove style from DOC_BLACKLISTED near the beginning of mk/doc.mk
  • Run make doc-style

I don’t have a smaller test case yet, sorry.

@pczarn
Copy link
Contributor

pczarn commented Aug 5, 2014

This part is very suspicious:

// servo / src / components / style / properties / common_types.rs
pub mod computed {
    //...
    use super::*;
    //...
}

in https:/servo/servo/blob/3670ee6f1fc5066101cc5a357443494552ea37f2/src/components/style/properties/common_types.rs#L165-L170

@SimonSapin
Copy link
Contributor Author

I even have this:

pub mod longhands {
    pub use super::*;
    pub mod ${property.ident} {
        use super::*;
        // ...

(… which rustc is perfectly happy with, for what it’s worth.)

@pczarn
Copy link
Contributor

pczarn commented Aug 5, 2014

This circular reexport is worse:

#![feature(globs)]

pub mod longhands {
    pub use super::*;

    pub use to_computed_value = super::common_types::computed::compute_CSSColor;

    pub fn computed_as_specified() {}
}

pub mod common_types {
    pub mod computed {
        pub use compute_CSSColor = super::super::longhands::computed_as_specified;
    }
}

My rustdoc is not happy: task '<unnamed>' failed at 'couldn't find node id 0 in the AST map', /build/rust-git/src/rust/src/libsyntax/ast_map/mod.rs:220

edit: one more reexport

@SSheldon
Copy link
Contributor

I've encountered the not-infinite-recursion form mentioned above; here's a simple case to repro:

#![crate_type = "lib"]
#![feature(globs)]

pub use a::Foo;

mod a {
    pub struct Foo;
}

mod b {
    pub use super::*;
}

rustdoc prints out:

task '<unnamed>' failed at 'couldn't find node id 0 in the AST map', /Users/rustbuild/src/rust-buildbot/slave/nightly-mac/build/src/libsyntax/ast_map/mod.rs:225
task '<unnamed>' failed at 'called `Result::unwrap()` on an `Err` value: Box<core::any::Any:Send>', /Users/rustbuild/src/rust-buildbot/slave/nightly-mac/build/src/libcore/result.rs:548

If you replace the super glob with pub use super::Foo; there's no error.

@SSheldon
Copy link
Contributor

A smaller test case to reproduce the infinite recursion is:

#![crate_type = "lib"]
#![feature(globs)]

mod m {
    pub use self::a::Foo;

    mod a {
        pub struct Foo;
    }

    mod b {
        pub use super::*;
    }
}

rustdoc prints out:

task '<unknown>' has overflowed its stack
Illegal instruction: 4

Interestingly, if you make pub mod m there's no more infinite recursion.

@brson brson added A-servo T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue. labels Sep 16, 2014
alexcrichton added a commit to alexcrichton/rust that referenced this issue Sep 23, 2014
SimonSapin added a commit to servo/servo that referenced this issue Sep 26, 2014
We’re now at a Rust version that has a fix for
rust-lang/rust#16274
SimonSapin added a commit to servo/servo that referenced this issue Sep 26, 2014
We’re now at a Rust version that has a fix for
rust-lang/rust#16274
SimonSapin added a commit to servo/servo that referenced this issue Sep 27, 2014
We’re now at a Rust version that has a fix for
rust-lang/rust#16274
SimonSapin added a commit to servo/servo that referenced this issue Sep 29, 2014
We’re now at a Rust version that has a fix for
rust-lang/rust#16274
SimonSapin added a commit to servo/servo that referenced this issue Sep 29, 2014
We’re now at a Rust version that has a fix for
rust-lang/rust#16274
SimonSapin added a commit to servo/servo that referenced this issue Sep 29, 2014
We’re now at a Rust version that has a fix for
rust-lang/rust#16274
bors added a commit to rust-lang-ci/rust that referenced this issue Jan 15, 2024
Add notable_trait predicate to `CompletionRelevance`

Given a score of 1 for now, will change as per reviews needed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

4 participants