summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Gjengset <jon@thesquareplanet.com>2019-11-14 08:02:21 -0500
committerEmilio Cobos Álvarez <emilio@crisal.io>2019-11-14 15:10:05 +0100
commitf27fe97089b5c124dae4afbbbfeb66a3b44579d5 (patch)
treed7ede300653634cb6fe99b05fbd2408cdbfbe04e
parent8d85c3b2cfa55b16b28cd72a4e8fa6cff387b68d (diff)
Warn rather than panic on unknown namespace prefix
When a #defined token was used before a namespace, like so (#1676): #define nssv_inline_ns inline nssv_inline_ns namespace literals {} bindgen would crash when encountering the unknown token preceding the namespace token. This is because we don't get to see "past" the ifdef to the underlying token. The true fix to this is to find a way to extract ifdef info through clang, but for the time being we simply change the panic into a warning when such a token is encountered, and then proceed as if it were empty. Fixes #1676.
-rw-r--r--src/ir/context.rs23
-rw-r--r--tests/expectations/tests/issue-1676-macro-namespace-prefix.rs8
-rw-r--r--tests/headers/issue-1676-macro-namespace-prefix.hpp2
3 files changed, 30 insertions, 3 deletions
diff --git a/src/ir/context.rs b/src/ir/context.rs
index 127c0a24..384edb95 100644
--- a/src/ir/context.rs
+++ b/src/ir/context.rs
@@ -2166,10 +2166,27 @@ If you encounter an error missing from this list, please file an issue or a PR!"
}
break;
}
- _ => {
+ spelling if !found_namespace_keyword => {
+ // This is _likely_, but not certainly, a macro that's been placed just before
+ // the namespace keyword. Unfortunately, clang tokens don't let us easily see
+ // through the ifdef tokens, so we don't know what this token should really be.
+ // Instead of panicking though, we warn the user that we assumed the token was
+ // blank, and then move on.
+ //
+ // See also https://github.com/rust-lang/rust-bindgen/issues/1676.
+ warn!(
+ "Ignored unknown namespace prefix '{}' at {:?} in {:?}",
+ String::from_utf8_lossy(spelling),
+ token,
+ cursor
+ );
+ }
+ spelling => {
panic!(
- "Unknown token while processing namespace: {:?}",
- token
+ "Unknown token '{}' while processing namespace at {:?} in {:?}",
+ String::from_utf8_lossy(spelling),
+ token,
+ cursor
);
}
}
diff --git a/tests/expectations/tests/issue-1676-macro-namespace-prefix.rs b/tests/expectations/tests/issue-1676-macro-namespace-prefix.rs
new file mode 100644
index 00000000..d6776794
--- /dev/null
+++ b/tests/expectations/tests/issue-1676-macro-namespace-prefix.rs
@@ -0,0 +1,8 @@
+/* automatically generated by rust-bindgen */
+
+#![allow(
+ dead_code,
+ non_snake_case,
+ non_camel_case_types,
+ non_upper_case_globals
+)]
diff --git a/tests/headers/issue-1676-macro-namespace-prefix.hpp b/tests/headers/issue-1676-macro-namespace-prefix.hpp
new file mode 100644
index 00000000..297927b6
--- /dev/null
+++ b/tests/headers/issue-1676-macro-namespace-prefix.hpp
@@ -0,0 +1,2 @@
+#define nssv_inline_ns inline
+nssv_inline_ns namespace literals {}