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

Panic in bindgen: "Not an item" #1127

Closed
cbourjau opened this issue Oct 30, 2017 · 5 comments
Closed

Panic in bindgen: "Not an item" #1127

cbourjau opened this issue Oct 30, 2017 · 5 comments
Assignees

Comments

@cbourjau
Copy link

I am trying to wrap some large c++ framework and bumped into the following issue using bindgen 0.31.1. It is a panic in bindgen. Frankly, I'm not sure what exactly is going on and the creduced sample is still quite cryptic to me. The panic message seems similar to issue #67. Thanks a lot in advance and for the fantastic thing that bindgen is! Here it goes:

Input C/C++ Header

template <typename> struct A;
struct _Select1st;
template <typename, typename, typename, typename, typename, typename, typename,
          typename, typename, typename, bool>
struct _Map_base;
template <typename _Key, typename _Pair, typename _Alloc, typename _Equal,
          typename _H1, typename _H2, typename _Hash, typename _RehashPolicy,
          typename _Traits>
struct _Map_base<_Key, _Pair, _Alloc, _Select1st, _Equal, _H1, _H2, _Hash,
                 _RehashPolicy, _Traits, true> {
  using __hashtable_base = A<_Traits>;
  using key_type = typename __hashtable_base::key_type;
  using mapped_type = typename _Pair::type;
  mapped_type &at(const key_type &);
};
template <typename _Key, typename _Pair, typename _Alloc, typename _Equal,
          typename _H1, typename _H2, typename _Hash, typename _RehashPolicy,
          typename _Traits>
auto _Map_base<_Key, _Pair, _Alloc, _Select1st, _Equal, _H1, _H2, _Hash,
               _RehashPolicy, _Traits, true>::at(const key_type &)
  -> mapped_type & {}

Bindgen Invocation

bindgen  \
    ./__bindgen.ii  \
    -- -x c++ --std=c++14  2>&1

Actual Results

ERROR:bindgen::ir::item: Unhandled cursor kind 21: Cursor(at kind: CXXMethod, loc: ./__bindgen.ii:20:47, usr: Some("c:@SP>9#T#T#T#T#T#T#T#T#T@_Map_base>#t0.0#t0.1#t0.2#$@S@_Select1st#t0.3#t0.4#t0.5#t0.6#t0.7#t0.8#Vb1@F@at#&1^A<type-parameter-0-8>:::key_type#"))
thread 'main' panicked at 'Not an item: ItemId(21)', /home/christian/.cargo/registry/src/github.com-1ecc6299db9ec823/bindgen-0.31.1/src/ir/context.rs:1481:20
stack backtrace:
   0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace
             at /checkout/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
   1: std::sys_common::backtrace::_print
             at /checkout/src/libstd/sys_common/backtrace.rs:71
   2: std::panicking::default_hook::{{closure}}
             at /checkout/src/libstd/sys_common/backtrace.rs:60
             at /checkout/src/libstd/panicking.rs:380
   3: std::panicking::default_hook
             at /checkout/src/libstd/panicking.rs:396
   4: std::panicking::rust_panic_with_hook
             at /checkout/src/libstd/panicking.rs:610
   5: std::panicking::begin_panic
             at /checkout/src/libstd/panicking.rs:571
   6: std::panicking::begin_panic_fmt
             at /checkout/src/libstd/panicking.rs:521
   7: <bindgen::ir::item::Item as bindgen::parse::ClangItemParser>::from_ty_with_id
   8: bindgen::ir::item::visit_child
   9: bindgen::clang::visit_children
  10: <unknown>
  11: <unknown>
  12: <unknown>
  13: <unknown>
  14: <unknown>
  15: <unknown>
  16: <unknown>
  17: <unknown>
  18: <unknown>
  19: <unknown>
  20: clang_visitChildren
  21: clang_sys::clang_visitChildren
  22: bindgen::clang::Cursor::visit
  23: <bindgen::ir::item::Item as bindgen::parse::ClangItemParser>::from_ty_with_id
  24: <bindgen::ir::item::Item as bindgen::parse::ClangItemParser>::from_ty_or_ref_with_id
  25: <bindgen::ir::item::Item as bindgen::parse::ClangItemParser>::from_ty_or_ref
  26: bindgen::ir::ty::Type::from_clang_ty
  27: <bindgen::ir::item::Item as bindgen::parse::ClangItemParser>::from_ty_with_id
  28: <bindgen::ir::item::Item as bindgen::parse::ClangItemParser>::from_ty_or_ref_with_id
  29: <bindgen::ir::item::Item as bindgen::parse::ClangItemParser>::from_ty_or_ref
  30: bindgen::ir::ty::Type::from_clang_ty
  31: <bindgen::ir::item::Item as bindgen::parse::ClangItemParser>::from_ty_with_id
  32: bindgen::ir::context::BindgenContext::gen
  33: bindgen::codegen::codegen
  34: bindgen::Builder::generate
  35: std::panicking::try::do_call
  36: __rust_maybe_catch_panic
             at /checkout/src/libpanic_unwind/lib.rs:98
  37: std::panic::catch_unwind
  38: bindgen::main
  39: __rust_maybe_catch_panic
             at /checkout/src/libpanic_unwind/lib.rs:98
  40: std::rt::lang_start
             at /checkout/src/libstd/panicking.rs:458
             at /checkout/src/libstd/panic.rs:361
             at /checkout/src/libstd/rt.rs:61
  41: __libc_start_main
  42: _start

Expected Results

I don't really expect bindgen to generate bindings for c++ code which I don't understand myself. But I would hope for a hint on what is going wrong.

@cbourjau cbourjau changed the title "Not an item" Panic in bindgen: "Not an item" Oct 30, 2017
@cbourjau
Copy link
Author

Hello again,
here is a slightly simplified version reproducing the bug:

template <typename> struct A;
template <typename, typename, bool> struct _Map_base;
template <typename _Pair, typename _Traits>
struct _Map_base<_Pair, _Traits, true> {
  using __hashtable_base = A<_Traits>;
  using key_type = typename __hashtable_base::key_type;
  using mapped_type = typename _Pair::type;
  mapped_type &at(const key_type &);
};
template <typename _Pair, typename _Traits>
auto _Map_base<_Pair, _Traits, true>::at(const key_type &) -> mapped_type & {}

@emilio
Copy link
Contributor

emilio commented Oct 31, 2017

Thanks so much for the test-case, makes it much easier :)

@emilio
Copy link
Contributor

emilio commented Oct 31, 2017

I happen to be hitting this today, so I'm investigating a bit.

@emilio emilio self-assigned this Oct 31, 2017
emilio added a commit to emilio/rust-bindgen that referenced this issue Oct 31, 2017
…ng AlreadyResolved.

The item may come from a recursive check down the stack, and as we say there:

> Unchecked because we haven't finished this type yet.

Fixes rust-lang#1127
emilio added a commit to emilio/rust-bindgen that referenced this issue Oct 31, 2017
…ng AlreadyResolved.

The item may come from a recursive check down the stack, and as we say there:

> Unchecked because we haven't finished this type yet.

Fixes rust-lang#1127
@emilio
Copy link
Contributor

emilio commented Oct 31, 2017

Fix at #1128

bors-servo pushed a commit that referenced this issue Oct 31, 2017
ir: We can't guarantee the type to be in the item map while propagating AlreadyResolved

The item may come from a recursive check down the stack, and as we say there:

> Unchecked because we haven't finished this type yet.

Fixes #1127
bors-servo pushed a commit that referenced this issue Oct 31, 2017
ir: We can't guarantee the type to be in the item map while propagating AlreadyResolved

The item may come from a recursive check down the stack, and as we say there:

> Unchecked because we haven't finished this type yet.

Fixes #1127
@cbourjau
Copy link
Author

Thanks a lot for this super fast fix!

emilio added a commit to emilio/rust-bindgen that referenced this issue Oct 31, 2017
…ng AlreadyResolved.

The item may come from a recursive check down the stack, and as we say there:

> Unchecked because we haven't finished this type yet.

Fixes rust-lang#1127
bors-servo pushed a commit that referenced this issue Oct 31, 2017
ir: We can't guarantee the type to be in the item map while propagating AlreadyResolved

The item may come from a recursive check down the stack, and as we say there:

> Unchecked because we haven't finished this type yet.

Fixes #1127
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants