Skip to content

Recursion limit reached while evaluating requirement #183

Closed
@Michael-F-Bryan

Description

@Michael-F-Bryan

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!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions