summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2018-05-29 15:52:27 -0400
committerGitHub <noreply@github.com>2018-05-29 15:52:27 -0400
commit1f097ddd484f57eb9e81a1d0872494ee1d0f6ad0 (patch)
tree5b93e79efbf075b0be4f61f45270b76cbca1627d /src
parentede60540247b7ffebaac880d5f978e079edb1c39 (diff)
parentc63a095d65a9f3271b32b3d76a1916483d5a8575 (diff)
Auto merge of #1321 - stouset:check-if-num-template-args-is-loaded, r=emilio
Check if `clang_Type_getNumTemplateArguments` is loaded before use Fixes #1304, which reapplies #916 which was regressed by #915.
Diffstat (limited to 'src')
-rw-r--r--src/clang.rs14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/clang.rs b/src/clang.rs
index 04d5c9d3..80cc77de 100644
--- a/src/clang.rs
+++ b/src/clang.rs
@@ -911,6 +911,13 @@ impl Type {
/// Get the number of template arguments this type has, or `None` if it is
/// not some kind of template.
pub fn num_template_args(&self) -> Option<u32> {
+ // If an old libclang is loaded, we have no hope of answering this
+ // question correctly. However, that's no reason to panic when
+ // generating bindings for simple C headers with an old libclang.
+ if !clang_Type_getNumTemplateArguments::is_loaded() {
+ return None
+ }
+
let n = unsafe { clang_Type_getNumTemplateArguments(self.x) };
if n >= 0 {
Some(n as u32)
@@ -1639,8 +1646,11 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult {
depth,
format!(" {}spelling = \"{}\"", prefix, ty.spelling()),
);
- let num_template_args =
- unsafe { clang_Type_getNumTemplateArguments(ty.x) };
+ let num_template_args = if clang_Type_getNumTemplateArguments::is_loaded() {
+ unsafe { clang_Type_getNumTemplateArguments(ty.x) }
+ } else {
+ -1
+ };
if num_template_args >= 0 {
print_indent(
depth,