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

Recursion limit reached while evaluating requirement #183

Closed
Michael-F-Bryan opened this issue Jun 25, 2019 · 1 comment
Closed

Recursion limit reached while evaluating requirement #183

Michael-F-Bryan opened this issue Jun 25, 2019 · 1 comment

Comments

@Michael-F-Bryan
Copy link
Contributor

Michael-F-Bryan commented Jun 25, 2019

It looks like the latest nightly rustc overflowed while trying to prove proc_macro2::Group satisfies the Unpin oibit.

Strangely, I couldn't reproduce this by adding just proc-macro2 to a dummy project and building. It needed to be used by another crate (may have something to do with generics or feature flags?).

Documenting proc-macro2 v0.4.30
    Checking proc-macro2 v0.4.30
 
...

error[E0275]: overflow evaluating the requirement `proc_macro2::Group: std::marker::Unpin`
  |
  = help: consider adding a `#![recursion_limit="128"]` attribute to your crate
  = note: required because it appears within the type `proc_macro2::TokenTree`
  = note: required because it appears within the type `*const proc_macro2::TokenTree`
  = note: required because it appears within the type `std::ptr::Unique<proc_macro2::TokenTree>`
  = note: required because it appears within the type `alloc::raw_vec::RawVec<proc_macro2::TokenTree>`
  = note: required because it appears within the type `std::vec::Vec<proc_macro2::TokenTree>`
  = note: required because it appears within the type `proc_macro2::fallback::TokenStream`
  = note: required because it appears within the type `proc_macro2::imp::TokenStream`
  = note: required because it appears within the type `proc_macro2::TokenStream`
  = note: required because it appears within the type `syn::Macro`
  = note: required because it appears within the type `syn::PatMacro`
  = note: required because it appears within the type `syn::Pat`
  = note: required because it appears within the type `(syn::Pat, syn::token::Or)`
  = note: required because it appears within the type `*const (syn::Pat, syn::token::Or)`
  = note: required because it appears within the type `std::ptr::Unique<(syn::Pat, syn::token::Or)>`
  = note: required because it appears within the type `alloc::raw_vec::RawVec<(syn::Pat, syn::token::Or)>`
  = note: required because it appears within the type `std::vec::Vec<(syn::Pat, syn::token::Or)>`
  = note: required because it appears within the type `syn::punctuated::Punctuated<syn::Pat, syn::token::Or>`
  = note: required because it appears within the type `syn::ExprLet`
  = note: required because it appears within the type `syn::Expr`
  = note: required because it appears within the type `syn::TypeArray`
  = note: required because it appears within the type `syn::Type`
  = note: required because it appears within the type `syn::GenericArgument`
  = note: required because it appears within the type `(syn::GenericArgument, syn::token::Comma)`
  = note: required because it appears within the type `*const (syn::GenericArgument, syn::token::Comma)`
  = note: required because it appears within the type `std::ptr::Unique<(syn::GenericArgument, syn::token::Comma)>`
  = note: required because it appears within the type `alloc::raw_vec::RawVec<(syn::GenericArgument, syn::token::Comma)>`
  = note: required because it appears within the type `std::vec::Vec<(syn::GenericArgument, syn::token::Comma)>`
  = note: required because it appears within the type `syn::punctuated::Punctuated<syn::GenericArgument, syn::token::Comma>`
  = note: required because it appears within the type `syn::AngleBracketedGenericArguments`
  = note: required because it appears within the type `syn::PathArguments`
  = note: required because it appears within the type `syn::PathSegment`
  = note: required because it appears within the type `(syn::PathSegment, syn::token::Colon2)`
  = note: required because it appears within the type `*const (syn::PathSegment, syn::token::Colon2)`
  = note: required because it appears within the type `std::ptr::Unique<(syn::PathSegment, syn::token::Colon2)>`
  = note: required because it appears within the type `alloc::raw_vec::RawVec<(syn::PathSegment, syn::token::Colon2)>`
  = note: required because it appears within the type `std::vec::Vec<(syn::PathSegment, syn::token::Colon2)>`
  = note: required because it appears within the type `syn::punctuated::Punctuated<syn::PathSegment, syn::token::Colon2>`
  = note: required because it appears within the type `syn::Path`
  = note: required because it appears within the type `syn::Attribute`
  = note: required because it appears within the type `*const syn::Attribute`
  = note: required because it appears within the type `std::ptr::Unique<syn::Attribute>`
  = note: required because it appears within the type `alloc::raw_vec::RawVec<syn::Attribute>`
  = note: required because it appears within the type `std::vec::Vec<syn::Attribute>`
  = note: required because it appears within the type `syn::LifetimeDef`
  = note: required because it appears within the type `(syn::LifetimeDef, syn::token::Comma)`
  = note: required because it appears within the type `*const (syn::LifetimeDef, syn::token::Comma)`
  = note: required because it appears within the type `std::ptr::Unique<(syn::LifetimeDef, syn::token::Comma)>`
  = note: required because it appears within the type `alloc::raw_vec::RawVec<(syn::LifetimeDef, syn::token::Comma)>`
  = note: required because it appears within the type `std::vec::Vec<(syn::LifetimeDef, syn::token::Comma)>`
  = note: required because it appears within the type `syn::punctuated::Punctuated<syn::LifetimeDef, syn::token::Comma>`
  = note: required because it appears within the type `syn::BoundLifetimes`
  = note: required because it appears within the type `std::option::Option<syn::BoundLifetimes>`
  = note: required because it appears within the type `syn::PredicateType`
  = note: required because it appears within the type `syn::WherePredicate`
  = note: required because it appears within the type `*const syn::WherePredicate`
  = note: required because it appears within the type `std::ptr::Unique<syn::WherePredicate>`
  = note: required because it appears within the type `alloc::raw_vec::RawVec<syn::WherePredicate>`
  = note: required because it appears within the type `std::vec::Vec<syn::WherePredicate>`
  = note: required because it appears within the type `std::option::Option<std::vec::Vec<syn::WherePredicate>>`
  = note: required because it appears within the type `attr::InputClone`
  = note: required because it appears within the type `std::option::Option<attr::InputClone>`
  = note: required because it appears within the type `attr::Input`
  = note: required because it appears within the type `ast::Input<'a>`

error: aborting due to previous error

I was able to reproduce this quite reliably by doing the following on my Linux laptop:

$ rustc --version
rustc 1.37.0-nightly (8aa42ed7c 2019-06-24)
$ cargo --version
cargo 1.37.0-nightly (807429e1b 2019-06-11)
$ cd /tmp
$cargo new --lib whatever
     Created library `whatever` package
$ cd whatever
$ cargo add specs
      Adding specs v0.14.3 to dependencies
$ cargo doc
    BOOM!!1!
@dtolnay
Copy link
Owner

dtolnay commented Jun 25, 2019

Thanks, this is being tracked in rust-lang/rust#62059.

@dtolnay dtolnay closed this as completed Jun 25, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants