summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/clang.rs36
1 files changed, 17 insertions, 19 deletions
diff --git a/src/clang.rs b/src/clang.rs
index e02d363f..b470e224 100644
--- a/src/clang.rs
+++ b/src/clang.rs
@@ -1875,27 +1875,25 @@ impl EvalResult {
return None;
}
- // Clang has an internal assertion we can trigger if we try to evaluate
- // a cursor containing a variadic template type reference. Triggering
- // the assertion aborts the process, and we don't want that. Clang
- // *also* doesn't expose any API for finding variadic vs non-variadic
- // template type references, let alone whether a type referenced is a
- // template type, instead they seem to show up as type references to an
- // unexposed type. Our solution is to just flat out ban all
- // `CXType_Unexposed` from evaluation.
- let mut found_cant_eval = false;
- cursor.visit(|c| if c.kind() == CXCursor_TypeRef &&
- c.cur_type().kind() == CXType_Unexposed
+ // Work around https://bugs.llvm.org/show_bug.cgi?id=42532, see:
+ // * https://github.com/rust-lang/rust-bindgen/issues/283
+ // * https://github.com/rust-lang/rust-bindgen/issues/1590
{
- found_cant_eval = true;
- CXChildVisit_Break
- } else {
- CXChildVisit_Recurse
- });
- if found_cant_eval {
- return None;
- }
+ let mut found_cant_eval = false;
+ cursor.visit(|c| {
+ if c.kind() == CXCursor_TypeRef &&
+ c.cur_type().canonical_type().kind() == CXType_Unexposed {
+ found_cant_eval = true;
+ return CXChildVisit_Break;
+ }
+
+ CXChildVisit_Recurse
+ });
+ if found_cant_eval {
+ return None;
+ }
+ }
Some(EvalResult {
x: unsafe { clang_Cursor_Evaluate(cursor.x) },
})