diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
new file mode 100644
index 0000000..4fa2e6b
--- /dev/null
+++ b/.cargo_vcs_info.json
@@ -0,0 +1,5 @@
+{
+  "git": {
+    "sha1": "4d0ce68f60cb9d9ce6c1e0f1794af7b1a5671bee"
+  }
+}
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..176a458
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..09b05f5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.docs/
+target/
+
+Cargo.lock
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..fef4737
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,28 @@
+language: rust
+
+addons:
+  apt:
+    sources:
+      - ubuntu-toolchain-r-test
+    packages:
+      - gcc-5
+
+os:
+  - linux
+
+rust:
+  - 1.36.0
+  - stable
+
+env:
+  - LLVM_VERSION=3.5 CLANG_VERSION=clang_3_5
+  - LLVM_VERSION=7.0 CLANG_VERSION=clang_7_0
+
+cache:
+  directories:
+    - $HOME/.cargo
+    - $HOME/.llvm
+
+before_install: . ./ci/before_install.sh
+
+script: . ./ci/script.sh
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..32ee34f
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,376 @@
+## [0.29.3] - 2020-03-31
+
+### Added
+- Added ability to determine version of runtime-linked instance of `libclang`
+
+## [0.29.2] - 2020-03-09
+
+### Added
+- Revert unnecessary increase of minimum version of `libc` and `libloading`
+
+## [0.29.2] - 2020-03-09
+
+### Added
+- Revert unnecessary increase of minimum version of `libc` and `libloading`
+
+## [0.29.1] - 2020-03-06
+
+### Added
+- Added support for finding instances of `libclang` matching `libclang-*.so.*`
+
+## [0.29.0] - 2020-02-17
+
+### Changed
+- Wrapped function pointer fields in `Option` in the `CXCursorAndRangeVisitor`
+and `IndexerCallbacks` structs (to permit nullability and to avoid undefined
+behavior caused by `Default` implementations for these structs which returns a
+zeroed value)
+
+### Added
+- Added support for `clang` 9.0.x
+- Added missing `CXCallingConv_AArch64VectorCall` variant to `CXCallingConv` enum
+- Added missing `clang_CompileCommand_getNumMappedSources` function
+
+## [0.28.1] - 2019-07-28
+
+### Changed
+- Bumped `glob` version to `0.3.0`
+- Improved error message when an invocation of an executable is not successful
+- Allowed `LIBCLANG_PATH` to refer to a specific `libclang` instance (e.g.,
+  `/usr/local/lib/libclang.so.10`)
+
+### Fixed
+- Fixed
+  [`libclang-cpp`](https://github.com/llvm-mirror/clang/commit/90d6722bdcbc2af52306f7e948c556ad6185ac48)
+  being linked instead of `libclang`
+
+## [0.28.0] - 2019-02-17
+
+### Changed
+- Changed `llvm-config` to be first search candidate on macOS
+
+### Added
+- Added support for `clang` 8.0.x
+
+### Removed
+- Removed `assert-minimum` feature
+- Removed version detection for libraries without versions embedded in the filename
+
+## [0.27.0] - 2019-01-10
+
+### Changed
+- Added version detection for libraries without versions embedded in the filename
+
+### Added
+- Added `assert-minimum` feature (see `README.md` for details)
+
+## [0.26.4] - 2018-12-29
+
+### Changed
+- Added shared library path to `SharedLibrary` struct
+
+## [0.26.3] - 2018-11-14
+
+### Changed
+- Disable default features of `libc` dependency
+
+## [0.26.2] - 2018-11-03
+
+### Fixed
+- Fixed dynamic linking on macOS
+
+## [0.26.1] - 2018-10-10
+
+### Fixed
+- Fixed support for finding libraries in `bin` directories on Windows
+
+## [0.26.0] - 2018-10-07
+
+### Changed
+- Added support for finding libraries with version suffixes on Linux when using runtime linking (e.g., `libclang.so.1`)
+
+## [0.25.0] - 2018-10-06
+
+### Changed
+- Added support for versioned libraries on BSDs
+
+## [0.24.0] - 2018-09-15
+
+### Changed
+- Reworked finding of libraries (see `README.md` for details)
+
+### Added
+- Added support for `clang` 7.0.x
+
+## [0.23.0] - 2018-06-16
+
+### Changed
+- Changed `Clang::find` to skip dynamic libraries for an incorrect architecture on Windows
+
+## [0.22.0] - 2018-03-11
+
+### Added
+- Added support for `clang` 6.0.x
+- Bumped `libc` version to `0.2.39`
+- Bumped `libloading` version to `0.5.0`
+
+## [0.21.2] - 2018-02-17
+
+### Changed
+- Added original errors to error messages
+- Added support for searching for libraries in `LD_LIBRARY_PATH` directories
+
+## [0.21.1] - 2017-11-24
+
+### Changed
+- Improved finding of versioned libraries (e.g., `libclang-3.9.so`)
+
+### Fixed
+* Fixed compilation failures on the beta and nightly channels caused by a [compiler bug](https://github.com/KyleMayes/clang-sys/pull/69)
+
+## [0.21.0] - 2017-10-11
+
+### Changed
+* Replaced `bitflags` usage with constants which avoids crashes on 32-bit Linux platforms
+
+## [0.20.1] - 2017-09-16
+
+### Fixed
+- Fixed static linking
+
+## [0.20.0] - 2017-09-14
+
+### Added
+- Added support for `clang` 5.0.x
+- Added `clang` as a link target of this package
+- Added dummy implementations of `is_loaded` for builds with the `static` Cargo feature enabled
+
+## [0.19.0] - 2017-07-02
+
+### Changed
+- Bumped `bitflags` version to `0.9.1`
+- Added `args` parameter to `Clang::new` function which passes arguments to the Clang executable
+
+## [0.18.0] - 2017-05-16
+
+### Changed
+- Improved finding of versioned libraries (e.g., `libclang.so.3.9`)
+
+## [0.17.0] - 2017-05-08
+
+### Changed
+- Changed storage type of include search paths from `Vec<PathBuf>` to `Option<Vec<PathBuf>>`
+
+## [0.16.0] - 2017-05-02
+
+### Changed
+- Bumped `libloading` version to `0.4.0`
+
+## [0.15.2] - 2017-04-28
+
+### Fixed
+- Fixed finding of `libclang.so.1` on Linux
+
+## [0.15.1] - 2017-03-29
+
+### Fixed
+- Fixed static linking when libraries are in [different directories](https://github.com/KyleMayes/clang-sys/issues/50)
+
+## [0.15.0] - 2017-03-13
+
+### Added
+- Added support for `clang` 4.0.x
+
+### Changed
+- Changed functions in the `Functions` struct to be `unsafe` (`runtime` feature only)
+- Changed `Clang::find` method to ignore directories and non-executable files
+- Changed `Clang::find` to skip dynamic libraries for an incorrect architecture on FreeBSD and Linux
+- Bumped `bitflags` version to `0.7.0`
+
+## [0.14.0] - 2017-01-30
+
+### Changed
+- Changed all enum types from tuple structs to raw integers to avoid
+  [segmentation faults](https://github.com/rust-lang/rust/issues/39394) on some platforms
+
+## [0.13.0] - 2017-01-29
+
+### Changed
+- Changed all opaque pointers types from tuple structs to raw pointers to avoid
+  [segmentation faults](https://github.com/rust-lang/rust/issues/39394) on some platforms
+
+## [0.12.0] - 2016-12-13
+
+### Changed
+- Altered the runtime linking API to allow for testing the presence of functions
+
+## [0.11.1] - 2016-12-07
+
+### Added
+- Added support for linking to Clang on Windows from unofficial LLVM sources such as MSYS and MinGW
+
+## [0.11.0] - 2016-10-07
+
+### Changed
+- Changed all enums from Rust enums to typed constants to avoid
+  [undefined behavior](https://github.com/KyleMayes/clang-sys/issues/42)
+
+## [0.10.1] - 2016-08-21
+
+### Changed
+- Changed static linking on FreeBSD and macOS to link against `libc++` instead of `libstd++`
+
+## [0.10.0] - 2016-08-01
+
+### Changed
+- Added `runtime` Cargo feature that links to `libclang` shared library at runtime
+- Added `from_raw` method to `CXTypeLayoutError` enum
+- Added implementations of `Deref` for opaque FFI structs
+- Changed `Default` implementations for structs to zero out the struct
+
+## [0.9.0] - 2016-07-21
+
+### Added
+- Added documentation bindings
+
+## [0.8.1] - 2016-07-20
+
+### Changed
+- Added `CLANG_PATH` environment variable for providing a path to `clang` executable
+- Added usage of `llvm-config` to search for `clang`
+- Added usage of `xcodebuild` to search for `clang` on macOS
+
+## [0.8.0] - 2016-07-18
+
+### Added
+- Added support for `clang` 3.9.x
+
+### Changed
+- Bumped `libc` version to `0.2.14`
+
+### Fixed
+- Fixed `LIBCLANG_PATH` usage on Windows to search both the `bin` and `lib` directories
+- Fixed search path parsing on macOS
+- Fixed search path parsing on Windows
+- Fixed default search path ordering on macOS
+
+## [0.7.2] - 2016-06-17
+
+### Fixed
+- Fixed finding of `clang` executables when system has executables matching `clang-*`
+  (e.g., `clang-format`)
+
+## [0.7.1] - 2016-06-10
+
+### Changed
+- Bumped `libc` version to `0.2.12`
+
+### Fixed
+- Fixed finding of `clang` executables suffixed by their version (e.g., `clang-3.5`)
+
+## [0.7.0] - 2016-05-31
+
+### Changed
+- Changed `Clang` struct `version` field type to `Option<CXVersion>`
+
+## [0.6.0] - 2016-05-26
+
+### Added
+- Added `support` module
+
+### Fixed
+- Fixed `libclang` linking on FreeBSD
+- Fixed `libclang` linking on Windows with the MSVC toolchain
+- Improved `libclang` static linking
+
+## [0.5.4] - 20160-5-19
+
+### Changed
+- Added implementations of `Default` for FFI structs
+
+## [0.5.3] - 2016-05-17
+
+### Changed
+- Bumped `bitflags` version to `0.7.0`
+
+## [0.5.2] - 2016-05-12
+
+### Fixed
+- Fixed `libclang` static linking
+
+## [0.5.1] - 2016-05-10
+
+### Fixed
+- Fixed `libclang` linking on macOS
+- Fixed `libclang` linking on Windows
+
+## [0.5.0] - 2016-05-10
+
+### Removed
+- Removed `rustc_version` dependency
+- Removed support for `LIBCLANG_STATIC` environment variable
+
+### Changed
+- Bumped `bitflags` version to `0.6.0`
+- Bumped `libc` version to `0.2.11`
+- Improved `libclang` search path
+- Improved `libclang` static linking
+
+## [0.4.2] - 2016-04-20
+
+### Changed
+- Bumped `libc` version to `0.2.10`
+
+## [0.4.1] - 2016-04-02
+
+### Changed
+- Bumped `libc` version to `0.2.9`
+- Bumped `rustc_version` version to `0.1.7`
+
+## [0.4.0] - 2016-03-28
+
+### Removed
+- Removed support for `clang` 3.4.x
+
+## [0.3.1] - 2016-03-21
+
+### Added
+- Added support for finding `libclang`
+
+## [0.3.0] - 2016-03-16
+
+### Removed
+- Removed build system types and functions
+
+### Added
+- Added support for `clang` 3.4.x
+
+### Changed
+- Bumped `bitflags` version to `0.5.0`
+- Bumped `libc` version to `0.2.8`
+
+## [0.2.1] - 2016-02-13
+
+### Changed
+- Simplified internal usage of conditional compilation
+- Bumped `bitflags` version to `0.4.0`
+- Bumped `libc` version to `0.2.7`
+- Bumped `rustc_version` version to `0.1.6`
+
+## [0.2.0] - 2016-02-12
+
+### Added
+- Added support for `clang` 3.8.x
+
+## [0.1.2] - 2015-12-29
+
+### Added
+- Added derivations of `Debug` for FFI structs
+
+## [0.1.1] - 2015-12-26
+
+### Added
+- Added derivations of `PartialOrd` and `Ord` for FFI enums
+
+## [0.1.0] - 2015-12-22
+- Initial release
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..904014d
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,62 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "clang-sys"
+version = "0.29.3"
+authors = ["Kyle Mayes <kyle@mayeses.com>"]
+build = "build.rs"
+links = "clang"
+description = "Rust bindings for libclang."
+documentation = "https://kylemayes.github.io/clang-sys/runtime/clang_sys"
+readme = "README.md"
+license = "Apache-2.0"
+repository = "https://github.com/KyleMayes/clang-sys"
+[package.metadata.docs.rs]
+features = ["clang_9_0", "runtime"]
+[dependencies.glob]
+version = "0.3"
+
+[dependencies.libc]
+version = "0.2.39"
+default-features = false
+
+[dependencies.libloading]
+version = "0.5"
+optional = true
+[build-dependencies.glob]
+version = "0.3"
+
+[features]
+clang_3_5 = []
+clang_3_6 = ["gte_clang_3_6"]
+clang_3_7 = ["gte_clang_3_6", "gte_clang_3_7"]
+clang_3_8 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8"]
+clang_3_9 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9"]
+clang_4_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0"]
+clang_5_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0", "gte_clang_5_0"]
+clang_6_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0", "gte_clang_5_0", "gte_clang_6_0"]
+clang_7_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0", "gte_clang_5_0", "gte_clang_6_0", "gte_clang_7_0"]
+clang_8_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0", "gte_clang_5_0", "gte_clang_6_0", "gte_clang_7_0", "gte_clang_8_0"]
+clang_9_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0", "gte_clang_5_0", "gte_clang_6_0", "gte_clang_7_0", "gte_clang_8_0", "gte_clang_9_0"]
+gte_clang_3_6 = []
+gte_clang_3_7 = []
+gte_clang_3_8 = []
+gte_clang_3_9 = []
+gte_clang_4_0 = []
+gte_clang_5_0 = []
+gte_clang_6_0 = []
+gte_clang_7_0 = []
+gte_clang_8_0 = []
+gte_clang_9_0 = []
+runtime = ["libloading"]
+static = []
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
new file mode 100644
index 0000000..5a35957
--- /dev/null
+++ b/Cargo.toml.orig
@@ -0,0 +1,59 @@
+[package]
+
+name = "clang-sys"
+authors = ["Kyle Mayes <kyle@mayeses.com>"]
+
+version = "0.29.3"
+
+readme = "README.md"
+license = "Apache-2.0"
+
+description = "Rust bindings for libclang."
+
+documentation = "https://kylemayes.github.io/clang-sys/runtime/clang_sys"
+repository = "https://github.com/KyleMayes/clang-sys"
+
+links = "clang"
+build = "build.rs"
+
+[features]
+
+clang_3_5 = []
+clang_3_6 = ["gte_clang_3_6"]
+clang_3_7 = ["gte_clang_3_6", "gte_clang_3_7"]
+clang_3_8 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8"]
+clang_3_9 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9"]
+clang_4_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0"]
+clang_5_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0", "gte_clang_5_0"]
+clang_6_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0", "gte_clang_5_0", "gte_clang_6_0"]
+clang_7_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0", "gte_clang_5_0", "gte_clang_6_0", "gte_clang_7_0"]
+clang_8_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0", "gte_clang_5_0", "gte_clang_6_0", "gte_clang_7_0", "gte_clang_8_0"]
+clang_9_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0", "gte_clang_5_0", "gte_clang_6_0", "gte_clang_7_0", "gte_clang_8_0", "gte_clang_9_0"]
+
+gte_clang_3_6 = []
+gte_clang_3_7 = []
+gte_clang_3_8 = []
+gte_clang_3_9 = []
+gte_clang_4_0 = []
+gte_clang_5_0 = []
+gte_clang_6_0 = []
+gte_clang_7_0 = []
+gte_clang_8_0 = []
+gte_clang_9_0 = []
+
+runtime = ["libloading"]
+static = []
+
+[dependencies]
+
+glob = "0.3"
+libc = { version = "0.2.39", default-features = false }
+libloading = { version = "0.5", optional = true }
+
+[build-dependencies]
+
+glob = "0.3"
+
+[package.metadata.docs.rs]
+
+features = ["clang_9_0", "runtime"]
diff --git a/LICENSE b/LICENSE
new file mode 120000
index 0000000..85de3d4
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1 @@
+LICENSE.txt
\ No newline at end of file
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/METADATA b/METADATA
new file mode 100644
index 0000000..77bae4d
--- /dev/null
+++ b/METADATA
@@ -0,0 +1,19 @@
+name: "clang-sys"
+description: "Rust bindings for libclang."
+third_party {
+  url {
+    type: HOMEPAGE
+    value: "https://crates.io/crates/clang-sys"
+  }
+  url {
+    type: GIT
+    value: "https://github.com/KyleMayes/clang-sys"
+  }
+  version: "0.29.3"
+  license_type: NOTICE
+  last_upgrade_date {
+    year: 2020
+    month: 3
+    day: 31
+  }
+}
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_APACHE2
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..46fc303
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1 @@
+include platform/prebuilts/rust:/OWNERS
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2c9ba06
--- /dev/null
+++ b/README.md
@@ -0,0 +1,132 @@
+# clang-sys
+
+[![crates.io](https://img.shields.io/crates/v/clang-sys.svg)](https://crates.io/crates/clang-sys)
+[![Travis CI](https://travis-ci.org/KyleMayes/clang-sys.svg?branch=master)](https://travis-ci.org/KyleMayes/clang-sys)
+[![AppVeyor](https://ci.appveyor.com/api/projects/status/7tv5mjyg55rof356/branch/master?svg=true)](https://ci.appveyor.com/project/KyleMayes/clang-sys-vtvy5/branch/master)
+
+Rust bindings for `libclang`.
+
+If you are interested in a Rust wrapper for these bindings, see
+[clang-rs](https://github.com/KyleMayes/clang-rs).
+
+Supported on the stable, beta, and nightly Rust channels.<br/>
+Minimum supported Rust version: **1.36.0**
+
+Released under the Apache License 2.0.
+
+## Documentation
+
+There are two versions of the documentation, one for the API exposed when
+linking dynamically or statically and one for the API exposed when linking at
+runtime (see the
+[Dependencies](https://github.com/KyleMayes/clang-sys#dependencies) section
+of the README for more information on the linking options).
+
+The only difference between the APIs exposed is that when linking at runtime a
+few additional types and functions are exposed to manage the loaded `libclang`
+shared library.
+
+* Runtime - [Documentation](https://kylemayes.github.io/clang-sys/runtime/clang_sys)
+* Dynamic / Static - [Documentation](https://kylemayes.github.io/clang-sys/default/clang_sys)
+
+## Supported Versions
+
+To target a version of `libclang`, enable one of the following Cargo features:
+
+* `clang_3_5` - requires `libclang` 3.5 or later
+* `clang_3_6` - requires `libclang` 3.6 or later
+* `clang_3_7` - requires `libclang` 3.7 or later
+* `clang_3_8` - requires `libclang` 3.8 or later
+* `clang_3_9` - requires `libclang` 3.9 or later
+* `clang_4_0` - requires `libclang` 4.0 or later
+* `clang_5_0` - requires `libclang` 5.0 or later
+* `clang_6_0` - requires `libclang` 6.0 or later
+* `clang_7_0` - requires `libclang` 7.0 or later
+* `clang_8_0` - requires `libclang` 8.0 or later
+* `clang_9_0` - requires `libclang` 9.0 or later
+
+If you do not enable one of these features, the API provided by `libclang` 3.5 will be available by
+default.
+
+## Dependencies
+
+By default, this crate will attempt to link to `libclang` dynamically. In this case, this crate
+depends on the `libclang` shared library (`libclang.so` on Linux, `libclang.dylib` on macOS,
+`libclang.dll` on Windows). If you want to link to `libclang` statically instead, enable the
+`static` Cargo feature. In this case, this crate depends on the LLVM and Clang static libraries. If
+you don't want to link to `libclang` at compiletime but instead want to load it at runtime, enable
+the `runtime` Cargo feature.
+
+These libraries can be either be installed as a part of Clang or downloaded
+[here](http://llvm.org/releases/download.html).
+
+**Note:** The downloads for LLVM and Clang 3.8 and later do not include the `libclang.a` static
+library. This means you cannot link to any of these versions of `libclang` statically unless you
+build it from source.
+
+### Versioned Dependencies
+
+This crate supports finding versioned instances of `libclang.so` (e.g.,`libclang-3.9.so`).
+In the case where there are multiple instances to choose from, this crate will prefer instances with
+higher versions. For example, the following instances of `libclang.so` are listed in descending
+order of preference:
+
+1. `libclang-4.0.so`
+2. `libclang-4.so`
+3. `libclang-3.9.so`
+4. `libclang-3.so`
+5. `libclang.so`
+
+**Note:** On BSD distributions, versioned instances of `libclang.so` matching the pattern
+`libclang.so.*` (e.g., `libclang.so.7.0`) are also included.
+
+**Note:** On Linux distributions when the `runtime` features is enabled, versioned instances of
+`libclang.so` matching the pattern `libclang.so.*` (e.g., `libclang.so.1`) are also included.
+
+## Environment Variables
+
+The following environment variables, if set, are used by this crate to find the required libraries
+and executables:
+
+* `LLVM_CONFIG_PATH` **(compiletime)** - provides a full path to an `llvm-config` executable
+  (including the executable itself [i.e., `/usr/local/bin/llvm-config-8.0`])
+* `LIBCLANG_PATH` **(compiletime)** - provides a path to a directory containing a `libclang` shared
+  library or a full path to a specific `libclang` shared library
+* `LIBCLANG_STATIC_PATH` **(compiletime)** - provides a path to a directory containing LLVM and
+  Clang static libraries
+* `CLANG_PATH` **(runtime)** - provides a path to a `clang` executable
+
+## Linking
+
+### Dynamic
+
+`libclang` shared libraries will be searched for in the following directories:
+
+* the directory provided by the `LIBCLANG_PATH` environment variable
+* the `bin` and `lib` directories in the directory provided by `llvm-config --libdir`
+* the directories provided by `LD_LIBRARY_PATH` environment variable
+* a list of likely directories for the target platform (e.g., `/usr/local/lib` on Linux)
+* **macOS only:** the toolchain directory in the directory provided by `xcode-select --print-path`
+
+On Linux, running an executable that has been dynamically linked to `libclang` may require you to
+add a path to `libclang.so` to the `LD_LIBRARY_PATH` environment variable. The same is true on OS
+X, except the `DYLD_LIBRARY_PATH` environment variable is used instead.
+
+On Windows, running an executable that has been dynamically linked to `libclang` requires that
+`libclang.dll` can be found by the executable at runtime. See
+[here](https://msdn.microsoft.com/en-us/library/7d83bc18.aspx) for more information.
+
+### Static
+
+The availability of `llvm-config` is not optional for static linking. Ensure that an instance of
+this executable can be found on your system's path or set the `LLVM_CONFIG_PATH` environment
+variable. The required LLVM and Clang static libraries will be searched for in the same way as
+shared libraries are searched for, except the `LIBCLANG_STATIC_PATH` environment variable is used in
+place of the `LIBCLANG_PATH` environment variable.
+
+### Runtime
+
+The `clang_sys::load` function is used to load a `libclang` shared library for use in the thread in
+which it is called. The `clang_sys::unload` function will unload the `libclang` shared library.
+`clang_sys::load` searches for a `libclang` shared library in the same way one is searched for when
+linking to `libclang` dynamically at compiletime.
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..060cf73
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,12 @@
+environment:
+  matrix:
+    - LLVM_VERSION: 7.0.0
+      CLANG_VERSION: clang_7_0
+
+install:
+  - .\ci\install.bat
+
+build: false
+
+test_script:
+  - .\ci\test_script.bat
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..cf5baa3
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,85 @@
+// Copyright 2016 Kyle Mayes
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Finds `libclang` static or dynamic libraries and links to them.
+//!
+//! # Environment Variables
+//!
+//! This build script can make use of several environment variables to help it
+//! find the required static or dynamic libraries.
+//!
+//! * `LLVM_CONFIG_PATH` - provides a path to an `llvm-config` executable
+//! * `LIBCLANG_PATH` - provides a path to a directory containing a `libclang`
+//!    shared library or a path to a specific `libclang` shared library
+//! * `LIBCLANG_STATIC_PATH` - provides a path to a directory containing LLVM
+//!    and Clang static libraries
+
+#![allow(unused_attributes)]
+
+extern crate glob;
+
+use std::path::Path;
+
+#[path = "build/common.rs"]
+pub mod common;
+#[path = "build/dynamic.rs"]
+pub mod dynamic;
+#[path = "build/static.rs"]
+pub mod static_;
+
+/// Copy the file from the supplied source to the supplied destination.
+#[cfg(feature = "runtime")]
+fn copy(source: &str, destination: &Path) {
+    use std::fs::File;
+    use std::io::{Read, Write};
+
+    let mut string = String::new();
+    File::open(source)
+        .unwrap()
+        .read_to_string(&mut string)
+        .unwrap();
+    File::create(destination)
+        .unwrap()
+        .write_all(string.as_bytes())
+        .unwrap();
+}
+
+/// Generates the finding and linking code so that it may be used at runtime.
+#[cfg(feature = "runtime")]
+fn main() {
+    use std::env;
+
+    if cfg!(feature = "static") {
+        panic!("`runtime` and `static` features can't be combined");
+    }
+
+    let out = env::var("OUT_DIR").unwrap();
+    copy("build/common.rs", &Path::new(&out).join("common.rs"));
+    copy("build/dynamic.rs", &Path::new(&out).join("dynamic.rs"));
+}
+
+/// Finds and links to the required libraries.
+#[cfg(not(feature = "runtime"))]
+fn main() {
+    if cfg!(feature = "static") {
+        static_::link();
+    } else {
+        dynamic::link();
+    }
+
+    if let Some(output) = common::run_llvm_config(&["--includedir"]) {
+        let directory = Path::new(output.trim_end());
+        println!("cargo:include={}", directory.display());
+    }
+}
diff --git a/build/common.rs b/build/common.rs
new file mode 100644
index 0000000..958ef9b
--- /dev/null
+++ b/build/common.rs
@@ -0,0 +1,221 @@
+// Copyright 2018 Kyle Mayes
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+extern crate glob;
+
+use std::env;
+use std::path::{Path, PathBuf};
+use std::process::Command;
+
+use glob::MatchOptions;
+
+/// `libclang` directory patterns for FreeBSD and Linux.
+const DIRECTORIES_LINUX: &[&str] = &[
+    "/usr/lib*",
+    "/usr/lib*/*",
+    "/usr/lib*/*/*",
+    "/usr/local/lib*",
+    "/usr/local/lib*/*",
+    "/usr/local/lib*/*/*",
+    "/usr/local/llvm*/lib*",
+];
+
+/// `libclang` directory patterns for macOS.
+const DIRECTORIES_MACOS: &[&str] = &[
+    "/usr/local/opt/llvm*/lib",
+    "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib",
+    "/Library/Developer/CommandLineTools/usr/lib",
+    "/usr/local/opt/llvm*/lib/llvm*/lib",
+];
+
+/// `libclang` directory patterns for Windows.
+const DIRECTORIES_WINDOWS: &[&str] = &[
+    "C:\\LLVM\\lib",
+    "C:\\Program Files*\\LLVM\\lib",
+    "C:\\MSYS*\\MinGW*\\lib",
+];
+
+/// Executes the supplied console command, returning the `stdout` output if the
+/// command was successfully executed.
+fn run_command(command: &str, arguments: &[&str]) -> Option<String> {
+    macro_rules! warn {
+        ($error:expr) => {
+            println!(
+                "cargo:warning=couldn't execute `{} {}` ({})",
+                command,
+                arguments.join(" "),
+                $error,
+            );
+        };
+    }
+
+    let output = match Command::new(command).args(arguments).output() {
+        Ok(output) => output,
+        Err(error) => {
+            warn!(format!("error: {}", error));
+            return None;
+        }
+    };
+
+    if !output.status.success() {
+        warn!(format!("exit code: {}", output.status));
+        return None;
+    }
+
+    Some(String::from_utf8_lossy(&output.stdout).into_owned())
+}
+
+/// Executes `llvm-config`, returning the `stdout` output if the command was
+/// successfully executed.
+pub fn run_llvm_config(arguments: &[&str]) -> Option<String> {
+    let path = env::var("LLVM_CONFIG_PATH").unwrap_or_else(|_| "llvm-config".into());
+
+    let output = run_command(&path, arguments);
+    if output.is_none() {
+        println!(
+            "cargo:warning=set the LLVM_CONFIG_PATH environment variable to \
+            the full path to a valid `llvm-config` executable (including the \
+            executable itself)"
+        );
+    }
+
+    output
+}
+
+/// Returns the paths to and the filenames of the files matching the supplied
+/// filename patterns in the supplied directory.
+fn search_directory(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, String)> {
+    // Join the directory to the filename patterns to obtain the path patterns.
+    let paths = filenames
+        .iter()
+        .filter_map(|f| directory.join(f).to_str().map(ToOwned::to_owned));
+
+    // Prevent wildcards from matching path separators.
+    let mut options = MatchOptions::new();
+    options.require_literal_separator = true;
+
+    paths
+        .flat_map(|p| {
+            if let Ok(paths) = glob::glob_with(&p, options) {
+                paths.filter_map(Result::ok).collect()
+            } else {
+                vec![]
+            }
+        })
+        .filter_map(|p| {
+            let filename = p.file_name().and_then(|f| f.to_str())?;
+
+            // The `libclang_shared` library has been renamed to `libclang-cpp`
+            // in Clang 10. This can cause instances of this library (e.g.,
+            // `libclang-cpp.so.10`) to be matched by patterns looking for
+            // instances of `libclang`.
+            if filename.contains("-cpp.") {
+                return None;
+            }
+
+            Some((directory.to_owned(), filename.into()))
+        })
+        .collect::<Vec<_>>()
+}
+
+/// Returns the paths to and the filenames of the files matching the supplied
+/// filename patterns in the supplied directory, checking any relevant sibling
+/// directories.
+fn search_directories(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, String)> {
+    let mut results = search_directory(directory, filenames);
+
+    // On Windows, `libclang.dll` is usually found in the LLVM `bin` directory
+    // while `libclang.lib` is usually found in the LLVM `lib` directory. To
+    // keep things consistent with other platforms, only LLVM `lib` directories
+    // are included in the backup search directory globs so we need to search
+    // the LLVM `bin` directory here.
+    if cfg!(target_os = "windows") && directory.ends_with("lib") {
+        let sibling = directory.parent().unwrap().join("bin");
+        results.extend(search_directory(&sibling, filenames).into_iter());
+    }
+
+    results
+}
+
+/// Returns the paths to and the filenames of the `libclang` static or dynamic
+/// libraries matching the supplied filename patterns.
+pub fn search_libclang_directories(files: &[String], variable: &str) -> Vec<(PathBuf, String)> {
+    // Use the path provided by the relevant environment variable.
+    if let Ok(path) = env::var(variable).map(|d| Path::new(&d).to_path_buf()) {
+        // Check if the path is referring to a matching file already.
+        if let Some(parent) = path.parent() {
+            let filename = path.file_name().unwrap().to_str().unwrap();
+            let libraries = search_directories(parent, files);
+            if libraries.iter().any(|(_, f)| f == filename) {
+                return vec![(parent.into(), filename.into())];
+            }
+        }
+
+        return search_directories(&path, files);
+    }
+
+    let mut found = vec![];
+
+    // Search the `bin` and `lib` directories in directory provided by
+    // `llvm-config --prefix`.
+    if let Some(output) = run_llvm_config(&["--prefix"]) {
+        let directory = Path::new(output.lines().next().unwrap()).to_path_buf();
+        found.extend(search_directories(&directory.join("bin"), files));
+        found.extend(search_directories(&directory.join("lib"), files));
+        found.extend(search_directories(&directory.join("lib64"), files));
+    }
+
+    // Search the toolchain directory in the directory provided by
+    // `xcode-select --print-path`.
+    if cfg!(target_os = "macos") {
+        if let Some(output) = run_command("xcode-select", &["--print-path"]) {
+            let directory = Path::new(output.lines().next().unwrap()).to_path_buf();
+            let directory = directory.join("Toolchains/XcodeDefault.xctoolchain/usr/lib");
+            found.extend(search_directories(&directory, files));
+        }
+    }
+
+    // Search the directories provided by the `LD_LIBRARY_PATH` environment
+    // variable.
+    if let Ok(path) = env::var("LD_LIBRARY_PATH") {
+        for directory in path.split(':').map(Path::new) {
+            found.extend(search_directories(&directory, files));
+        }
+    }
+
+    // Determine the `libclang` directory patterns.
+    let directories = if cfg!(any(target_os = "freebsd", target_os = "linux")) {
+        DIRECTORIES_LINUX
+    } else if cfg!(target_os = "macos") {
+        DIRECTORIES_MACOS
+    } else if cfg!(target_os = "windows") {
+        DIRECTORIES_WINDOWS
+    } else {
+        &[]
+    };
+
+    // Search the directories provided by the `libclang` directory patterns.
+    let mut options = MatchOptions::new();
+    options.case_sensitive = false;
+    options.require_literal_separator = true;
+    for directory in directories.iter().rev() {
+        if let Ok(directories) = glob::glob_with(directory, options) {
+            for directory in directories.filter_map(Result::ok).filter(|p| p.is_dir()) {
+                found.extend(search_directories(&directory, files));
+            }
+        }
+    }
+
+    found
+}
diff --git a/build/dynamic.rs b/build/dynamic.rs
new file mode 100644
index 0000000..2054ba0
--- /dev/null
+++ b/build/dynamic.rs
@@ -0,0 +1,244 @@
+// Copyright 2018 Kyle Mayes
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use std::env;
+use std::fs::File;
+use std::io::{self, Error, ErrorKind, Read, Seek, SeekFrom};
+use std::path::{Path, PathBuf};
+
+use super::common;
+
+/// Returns the ELF class from the ELF header in the supplied file.
+fn parse_elf_header(path: &Path) -> io::Result<u8> {
+    let mut file = File::open(path)?;
+    let mut buffer = [0; 5];
+    file.read_exact(&mut buffer)?;
+    if buffer[..4] == [127, 69, 76, 70] {
+        Ok(buffer[4])
+    } else {
+        Err(Error::new(ErrorKind::InvalidData, "invalid ELF header"))
+    }
+}
+
+/// Returns the magic number from the PE header in the supplied file.
+fn parse_pe_header(path: &Path) -> io::Result<u16> {
+    let mut file = File::open(path)?;
+
+    // Determine the header offset.
+    let mut buffer = [0; 4];
+    let start = SeekFrom::Start(0x3C);
+    file.seek(start)?;
+    file.read_exact(&mut buffer)?;
+    let offset = i32::from_le_bytes(buffer);
+
+    // Determine the validity of the header.
+    file.seek(SeekFrom::Start(offset as u64))?;
+    file.read_exact(&mut buffer)?;
+    if buffer != [80, 69, 0, 0] {
+        return Err(Error::new(ErrorKind::InvalidData, "invalid PE header"));
+    }
+
+    // Find the magic number.
+    let mut buffer = [0; 2];
+    file.seek(SeekFrom::Current(20))?;
+    file.read_exact(&mut buffer)?;
+    Ok(u16::from_le_bytes(buffer))
+}
+
+/// Validates the header for the supplied `libclang` shared library.
+fn validate_header(path: &Path) -> Result<(), String> {
+    if cfg!(any(target_os = "freebsd", target_os = "linux")) {
+        let class = parse_elf_header(path).map_err(|e| e.to_string())?;
+
+        if cfg!(target_pointer_width = "32") && class != 1 {
+            return Err("invalid ELF class (64-bit)".into());
+        }
+
+        if cfg!(target_pointer_width = "64") && class != 2 {
+            return Err("invalid ELF class (32-bit)".into());
+        }
+
+        Ok(())
+    } else if cfg!(target_os = "windows") {
+        let magic = parse_pe_header(path).map_err(|e| e.to_string())?;
+
+        if cfg!(target_pointer_width = "32") && magic != 267 {
+            return Err("invalid DLL (64-bit)".into());
+        }
+
+        if cfg!(target_pointer_width = "64") && magic != 523 {
+            return Err("invalid DLL (32-bit)".into());
+        }
+
+        Ok(())
+    } else {
+        Ok(())
+    }
+}
+
+/// Returns the components of the version in the supplied `libclang` shared
+// library filename.
+fn parse_version(filename: &str) -> Vec<u32> {
+    let version = if filename.starts_with("libclang.so.") {
+        &filename[12..]
+    } else if filename.starts_with("libclang-") {
+        &filename[9..filename.len() - 3]
+    } else {
+        return vec![];
+    };
+
+    version.split('.').map(|s| s.parse().unwrap_or(0)).collect()
+}
+
+/// Returns the paths to, the filenames, and the versions of the `libclang`
+// shared libraries.
+fn search_libclang_directories(runtime: bool) -> Result<Vec<(PathBuf, String, Vec<u32>)>, String> {
+    let mut files = vec![format!(
+        "{}clang{}",
+        env::consts::DLL_PREFIX,
+        env::consts::DLL_SUFFIX
+    )];
+
+    if cfg!(target_os = "linux") {
+        // Some Linux distributions don't create a `libclang.so` symlink, so we
+        // need to look for versioned files (e.g., `libclang-3.9.so`).
+        files.push("libclang-*.so".into());
+
+        // Some Linux distributions don't create a `libclang.so` symlink and
+        // don't have versioned files as described above, so we need to look for
+        // suffix versioned files (e.g., `libclang.so.1`). However, `ld` cannot
+        // link to these files, so this will only be included when linking at
+        // runtime.
+        if runtime {
+            files.push("libclang.so.*".into());
+            files.push("libclang-*.so.*".into());
+        }
+    }
+
+    if cfg!(any(
+        target_os = "openbsd",
+        target_os = "freebsd",
+        target_os = "netbsd"
+    )) {
+        // Some BSD distributions don't create a `libclang.so` symlink either,
+        // but use a different naming scheme for versioned files (e.g.,
+        // `libclang.so.7.0`).
+        files.push("libclang.so.*".into());
+    }
+
+    if cfg!(target_os = "windows") {
+        // The official LLVM build uses `libclang.dll` on Windows instead of
+        // `clang.dll`. However, unofficial builds such as MinGW use `clang.dll`.
+        files.push("libclang.dll".into());
+    }
+
+    // Validate the `libclang` shared libraries and collect the versions.
+    let mut valid = vec![];
+    let mut invalid = vec![];
+    for (directory, filename) in common::search_libclang_directories(&files, "LIBCLANG_PATH") {
+        let path = directory.join(&filename);
+        match validate_header(&path) {
+            Ok(()) => {
+                let version = parse_version(&filename);
+                valid.push((directory, filename, version))
+            }
+            Err(message) => invalid.push(format!("({}: {})", path.display(), message)),
+        }
+    }
+
+    if !valid.is_empty() {
+        return Ok(valid);
+    }
+
+    let message = format!(
+        "couldn't find any valid shared libraries matching: [{}], set the \
+         `LIBCLANG_PATH` environment variable to a path where one of these files \
+         can be found (invalid: [{}])",
+        files
+            .iter()
+            .map(|f| format!("'{}'", f))
+            .collect::<Vec<_>>()
+            .join(", "),
+        invalid.join(", "),
+    );
+
+    Err(message)
+}
+
+/// Returns the directory and filename of the "best" available `libclang` shared
+/// library.
+pub fn find(runtime: bool) -> Result<(PathBuf, String), String> {
+    search_libclang_directories(runtime)?
+        .iter()
+        .max_by_key(|f| &f.2)
+        .cloned()
+        .map(|(path, filename, _)| (path, filename))
+        .ok_or_else(|| "unreachable".into())
+}
+
+/// Find and link to `libclang` dynamically.
+#[cfg(not(feature = "runtime"))]
+pub fn link() {
+    use std::fs;
+
+    let (directory, filename) = find(false).unwrap();
+    println!("cargo:rustc-link-search={}", directory.display());
+
+    if cfg!(all(target_os = "windows", target_env = "msvc")) {
+        // Find the `libclang` stub static library required for the MSVC
+        // toolchain.
+        let lib = if !directory.ends_with("bin") {
+            directory
+        } else {
+            directory.parent().unwrap().join("lib")
+        };
+
+        if lib.join("libclang.lib").exists() {
+            println!("cargo:rustc-link-search={}", lib.display());
+        } else if lib.join("libclang.dll.a").exists() {
+            // MSYS and MinGW use `libclang.dll.a` instead of `libclang.lib`.
+            // It is linkable with the MSVC linker, but Rust doesn't recognize
+            // the `.a` suffix, so we need to copy it with a different name.
+            //
+            // FIXME: Maybe we can just hardlink or symlink it?
+            let out = env::var("OUT_DIR").unwrap();
+            fs::copy(
+                lib.join("libclang.dll.a"),
+                Path::new(&out).join("libclang.lib"),
+            )
+            .unwrap();
+            println!("cargo:rustc-link-search=native={}", out);
+        } else {
+            panic!(
+                "using '{}', so 'libclang.lib' or 'libclang.dll.a' must be \
+                 available in {}",
+                filename,
+                lib.display(),
+            );
+        }
+
+        println!("cargo:rustc-link-lib=dylib=libclang");
+    } else {
+        let name = filename.trim_start_matches("lib");
+
+        // Strip extensions and trailing version numbers (e.g., the `.so.7.0` in
+        // `libclang.so.7.0`).
+        let name = match name.find(".dylib").or_else(|| name.find(".so")) {
+            Some(index) => &name[0..index],
+            None => &name,
+        };
+
+        println!("cargo:rustc-link-lib=dylib={}", name);
+    }
+}
diff --git a/build/static.rs b/build/static.rs
new file mode 100644
index 0000000..bacd4ad
--- /dev/null
+++ b/build/static.rs
@@ -0,0 +1,136 @@
+// Copyright 2018 Kyle Mayes
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+extern crate glob;
+
+use std::path::{Path, PathBuf};
+
+use common;
+
+/// Returns the name of an LLVM or Clang library from a path to such a library.
+fn get_library_name(path: &Path) -> Option<String> {
+    path.file_stem().map(|p| {
+        let string = p.to_string_lossy();
+        if string.starts_with("lib") {
+            string[3..].to_owned()
+        } else {
+            string.to_string()
+        }
+    })
+}
+
+/// Returns the LLVM libraries required to link to `libclang` statically.
+fn get_llvm_libraries() -> Vec<String> {
+    common::run_llvm_config(&["--libs"])
+        .unwrap()
+        .split_whitespace()
+        .filter_map(|p| {
+            // Depending on the version of `llvm-config` in use, listed
+            // libraries may be in one of two forms, a full path to the library
+            // or simply prefixed with `-l`.
+            if p.starts_with("-l") {
+                Some(p[2..].into())
+            } else {
+                get_library_name(Path::new(p))
+            }
+        })
+        .collect()
+}
+
+/// Clang libraries required to link to `libclang` 3.5 and later statically.
+const CLANG_LIBRARIES: &[&str] = &[
+    "clang",
+    "clangAST",
+    "clangAnalysis",
+    "clangBasic",
+    "clangDriver",
+    "clangEdit",
+    "clangFrontend",
+    "clangIndex",
+    "clangLex",
+    "clangParse",
+    "clangRewrite",
+    "clangSema",
+    "clangSerialization",
+];
+
+/// Returns the Clang libraries required to link to `libclang` statically.
+fn get_clang_libraries<P: AsRef<Path>>(directory: P) -> Vec<String> {
+    let pattern = directory
+        .as_ref()
+        .join("libclang*.a")
+        .to_string_lossy()
+        .to_string();
+    if let Ok(libraries) = glob::glob(&pattern) {
+        libraries
+            .filter_map(|l| l.ok().and_then(|l| get_library_name(&l)))
+            .collect()
+    } else {
+        CLANG_LIBRARIES.iter().map(|l| (*l).to_string()).collect()
+    }
+}
+
+/// Returns a directory containing `libclang` static libraries.
+fn find() -> PathBuf {
+    let name = if cfg!(target_os = "windows") {
+        "libclang.lib"
+    } else {
+        "libclang.a"
+    };
+
+    let files = common::search_libclang_directories(&[name.into()], "LIBCLANG_STATIC_PATH");
+    if let Some((directory, _)) = files.into_iter().nth(0) {
+        directory
+    } else {
+        panic!("could not find any static libraries");
+    }
+}
+
+/// Find and link to `libclang` statically.
+pub fn link() {
+    let directory = find();
+
+    // Specify required Clang static libraries.
+    println!("cargo:rustc-link-search=native={}", directory.display());
+    for library in get_clang_libraries(directory) {
+        println!("cargo:rustc-link-lib=static={}", library);
+    }
+
+    // Determine the shared mode used by LLVM.
+    let mode = common::run_llvm_config(&["--shared-mode"]).map(|m| m.trim().to_owned());
+    let prefix = if mode.map_or(false, |m| m == "static") {
+        "static="
+    } else {
+        ""
+    };
+
+    // Specify required LLVM static libraries.
+    println!(
+        "cargo:rustc-link-search=native={}",
+        common::run_llvm_config(&["--libdir"]).unwrap().trim_end()
+    );
+    for library in get_llvm_libraries() {
+        println!("cargo:rustc-link-lib={}{}", prefix, library);
+    }
+
+    // Specify required system libraries.
+    // MSVC doesn't need this, as it tracks dependencies inside `.lib` files.
+    if cfg!(target_os = "freebsd") {
+        println!("cargo:rustc-flags=-l ffi -l ncursesw -l c++ -l z");
+    } else if cfg!(target_os = "linux") {
+        println!("cargo:rustc-flags=-l ffi -l ncursesw -l stdc++ -l z");
+    } else if cfg!(target_os = "macos") {
+        println!("cargo:rustc-flags=-l ffi -l ncurses -l c++ -l z");
+    }
+}
diff --git a/ci/before_install.sh b/ci/before_install.sh
new file mode 100644
index 0000000..a0de565
--- /dev/null
+++ b/ci/before_install.sh
@@ -0,0 +1,57 @@
+set -e
+pushd ~
+
+# Workaround for Travis CI macOS bug (https://github.com/travis-ci/travis-ci/issues/6307)
+if [ "${TRAVIS_OS_NAME}" == "osx" ]; then
+    rvm get head || true
+fi
+
+function llvm_version_triple() {
+    if [ "$1" == "3.5" ]; then
+        echo "3.5.2"
+    elif [ "$1" == "3.6" ]; then
+        echo "3.6.2"
+    elif [ "$1" == "3.7" ]; then
+        echo "3.7.1"
+    elif [ "$1" == "3.8" ]; then
+        echo "3.8.1"
+    elif [ "$1" == "3.9" ]; then
+        echo "3.9.0"
+    elif [ "$1" == "4.0" ]; then
+        echo "4.0.1"
+    elif [ "$1" == "5.0" ]; then
+        echo "5.0.2"
+    elif [ "$1" == "6.0" ]; then
+        echo "6.0.1"
+    elif [ "$1" == "7.0" ]; then
+        echo "7.0.0"
+    fi
+}
+
+function llvm_download() {
+    export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}`
+    export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-$1
+    export LLVM_DIRECTORY="$HOME/.llvm/${LLVM}"
+
+    if [ -d "${LLVM_DIRECTORY}" ]; then
+        echo "Using cached LLVM download for ${LLVM}..."
+    else
+        wget http://releases.llvm.org/${LLVM_VERSION_TRIPLE}/${LLVM}.tar.xz
+        mkdir -p "${LLVM_DIRECTORY}"
+        tar xf ${LLVM}.tar.xz -C "${LLVM_DIRECTORY}" --strip-components=1
+    fi
+
+    export LLVM_CONFIG_PATH="${LLVM_DIRECTORY}/bin/llvm-config"
+}
+
+if [ "${TRAVIS_OS_NAME}" == "linux" ]; then
+    llvm_download x86_64-linux-gnu-ubuntu-14.04
+    export LD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":$LD_LIBRARY_PATH
+else
+    llvm_download x86_64-apple-darwin
+    cp "${LLVM_DIRECTORY}/lib/libclang.dylib" /usr/local/lib/libclang.dylib
+    export DYLD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":$DYLD_LIBRARY_PATH
+fi
+
+popd
+set +e
diff --git a/ci/install.bat b/ci/install.bat
new file mode 100644
index 0000000..a3d54df
--- /dev/null
+++ b/ci/install.bat
@@ -0,0 +1,8 @@
+curl -sSf https://static.rust-lang.org/dist/rust-1.36.0-i686-pc-windows-msvc.exe -o rust.exe
+rust.exe /VERYSILENT /NORESTART /DIR="C:\Rust"
+set PATH=%PATH%;C:\Rust\bin
+
+curl -sSf http://releases.llvm.org/%LLVM_VERSION%/LLVM-%LLVM_VERSION%-win32.exe -o LLVM.exe
+7z x LLVM.exe -oC:\LLVM
+set PATH=%PATH%;C:\LLVM\bin
+set LIBCLANG_PATH=C:\LLVM\bin
diff --git a/ci/script.sh b/ci/script.sh
new file mode 100644
index 0000000..47ca439
--- /dev/null
+++ b/ci/script.sh
@@ -0,0 +1,13 @@
+if [ "${TRAVIS_OS_NAME}" == "osx" ]; then
+    rvm get head || true
+fi
+
+set -e
+
+RUST_BACKTRACE=1 cargo test --verbose --features $CLANG_VERSION -- --nocapture
+
+if [ "${CLANG_VERSION}" \< "clang_3_7" ]; then
+    RUST_BACKTRACE=1 cargo test --verbose --features "$CLANG_VERSION static" -- --nocapture
+fi
+
+RUST_BACKTRACE=1 cargo test --verbose --features "$CLANG_VERSION runtime" -- --nocapture
diff --git a/ci/test_script.bat b/ci/test_script.bat
new file mode 100644
index 0000000..2928409
--- /dev/null
+++ b/ci/test_script.bat
@@ -0,0 +1,2 @@
+set RUST_BACKTRACE=1
+cargo test --verbose --features %CLANG_VERSION% -- --nocapture
diff --git a/clippy.toml b/clippy.toml
new file mode 100644
index 0000000..006bfc4
--- /dev/null
+++ b/clippy.toml
@@ -0,0 +1 @@
+doc-valid-idents = ["FreeBSD"]
diff --git a/docs.py b/docs.py
new file mode 100644
index 0000000..e1d6d9c
--- /dev/null
+++ b/docs.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+
+import os
+import shutil
+import subprocess
+
+TARGET = ".docs"
+VERSION = "clang_9_0"
+
+if os.path.isdir(TARGET):
+    shutil.rmtree(TARGET)
+
+os.mkdir(TARGET)
+
+for (name, features) in [("default", VERSION), ("runtime", f"runtime,{VERSION}")]:
+    subprocess.call(["cargo", "clean"])
+    subprocess.call(["cargo", "doc", f"--features={features}", "--no-deps"])
+    print(f"Copying docs to {TARGET}/{name}...")
+    shutil.copytree(f"target/doc", f"{TARGET}/{name}")
+
+os.chdir(TARGET)
+subprocess.call(["git", "init"])
+subprocess.call(["git", "remote", "add", "origin", "git@github.com:KyleMayes/clang-sys.git"])
+subprocess.call(["git", "checkout", "--orphan", "gh-pages"])
+subprocess.call(["git", "add", "-A"])
+subprocess.call(["git", "commit", "-m", "\"Update documentation\""])
+subprocess.call(["git", "push", "origin", "gh-pages", "--force"])
+
+os.chdir("..")
+shutil.rmtree(TARGET)
diff --git a/out/common.rs b/out/common.rs
new file mode 100644
index 0000000..958ef9b
--- /dev/null
+++ b/out/common.rs
@@ -0,0 +1,221 @@
+// Copyright 2018 Kyle Mayes
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+extern crate glob;
+
+use std::env;
+use std::path::{Path, PathBuf};
+use std::process::Command;
+
+use glob::MatchOptions;
+
+/// `libclang` directory patterns for FreeBSD and Linux.
+const DIRECTORIES_LINUX: &[&str] = &[
+    "/usr/lib*",
+    "/usr/lib*/*",
+    "/usr/lib*/*/*",
+    "/usr/local/lib*",
+    "/usr/local/lib*/*",
+    "/usr/local/lib*/*/*",
+    "/usr/local/llvm*/lib*",
+];
+
+/// `libclang` directory patterns for macOS.
+const DIRECTORIES_MACOS: &[&str] = &[
+    "/usr/local/opt/llvm*/lib",
+    "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib",
+    "/Library/Developer/CommandLineTools/usr/lib",
+    "/usr/local/opt/llvm*/lib/llvm*/lib",
+];
+
+/// `libclang` directory patterns for Windows.
+const DIRECTORIES_WINDOWS: &[&str] = &[
+    "C:\\LLVM\\lib",
+    "C:\\Program Files*\\LLVM\\lib",
+    "C:\\MSYS*\\MinGW*\\lib",
+];
+
+/// Executes the supplied console command, returning the `stdout` output if the
+/// command was successfully executed.
+fn run_command(command: &str, arguments: &[&str]) -> Option<String> {
+    macro_rules! warn {
+        ($error:expr) => {
+            println!(
+                "cargo:warning=couldn't execute `{} {}` ({})",
+                command,
+                arguments.join(" "),
+                $error,
+            );
+        };
+    }
+
+    let output = match Command::new(command).args(arguments).output() {
+        Ok(output) => output,
+        Err(error) => {
+            warn!(format!("error: {}", error));
+            return None;
+        }
+    };
+
+    if !output.status.success() {
+        warn!(format!("exit code: {}", output.status));
+        return None;
+    }
+
+    Some(String::from_utf8_lossy(&output.stdout).into_owned())
+}
+
+/// Executes `llvm-config`, returning the `stdout` output if the command was
+/// successfully executed.
+pub fn run_llvm_config(arguments: &[&str]) -> Option<String> {
+    let path = env::var("LLVM_CONFIG_PATH").unwrap_or_else(|_| "llvm-config".into());
+
+    let output = run_command(&path, arguments);
+    if output.is_none() {
+        println!(
+            "cargo:warning=set the LLVM_CONFIG_PATH environment variable to \
+            the full path to a valid `llvm-config` executable (including the \
+            executable itself)"
+        );
+    }
+
+    output
+}
+
+/// Returns the paths to and the filenames of the files matching the supplied
+/// filename patterns in the supplied directory.
+fn search_directory(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, String)> {
+    // Join the directory to the filename patterns to obtain the path patterns.
+    let paths = filenames
+        .iter()
+        .filter_map(|f| directory.join(f).to_str().map(ToOwned::to_owned));
+
+    // Prevent wildcards from matching path separators.
+    let mut options = MatchOptions::new();
+    options.require_literal_separator = true;
+
+    paths
+        .flat_map(|p| {
+            if let Ok(paths) = glob::glob_with(&p, options) {
+                paths.filter_map(Result::ok).collect()
+            } else {
+                vec![]
+            }
+        })
+        .filter_map(|p| {
+            let filename = p.file_name().and_then(|f| f.to_str())?;
+
+            // The `libclang_shared` library has been renamed to `libclang-cpp`
+            // in Clang 10. This can cause instances of this library (e.g.,
+            // `libclang-cpp.so.10`) to be matched by patterns looking for
+            // instances of `libclang`.
+            if filename.contains("-cpp.") {
+                return None;
+            }
+
+            Some((directory.to_owned(), filename.into()))
+        })
+        .collect::<Vec<_>>()
+}
+
+/// Returns the paths to and the filenames of the files matching the supplied
+/// filename patterns in the supplied directory, checking any relevant sibling
+/// directories.
+fn search_directories(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, String)> {
+    let mut results = search_directory(directory, filenames);
+
+    // On Windows, `libclang.dll` is usually found in the LLVM `bin` directory
+    // while `libclang.lib` is usually found in the LLVM `lib` directory. To
+    // keep things consistent with other platforms, only LLVM `lib` directories
+    // are included in the backup search directory globs so we need to search
+    // the LLVM `bin` directory here.
+    if cfg!(target_os = "windows") && directory.ends_with("lib") {
+        let sibling = directory.parent().unwrap().join("bin");
+        results.extend(search_directory(&sibling, filenames).into_iter());
+    }
+
+    results
+}
+
+/// Returns the paths to and the filenames of the `libclang` static or dynamic
+/// libraries matching the supplied filename patterns.
+pub fn search_libclang_directories(files: &[String], variable: &str) -> Vec<(PathBuf, String)> {
+    // Use the path provided by the relevant environment variable.
+    if let Ok(path) = env::var(variable).map(|d| Path::new(&d).to_path_buf()) {
+        // Check if the path is referring to a matching file already.
+        if let Some(parent) = path.parent() {
+            let filename = path.file_name().unwrap().to_str().unwrap();
+            let libraries = search_directories(parent, files);
+            if libraries.iter().any(|(_, f)| f == filename) {
+                return vec![(parent.into(), filename.into())];
+            }
+        }
+
+        return search_directories(&path, files);
+    }
+
+    let mut found = vec![];
+
+    // Search the `bin` and `lib` directories in directory provided by
+    // `llvm-config --prefix`.
+    if let Some(output) = run_llvm_config(&["--prefix"]) {
+        let directory = Path::new(output.lines().next().unwrap()).to_path_buf();
+        found.extend(search_directories(&directory.join("bin"), files));
+        found.extend(search_directories(&directory.join("lib"), files));
+        found.extend(search_directories(&directory.join("lib64"), files));
+    }
+
+    // Search the toolchain directory in the directory provided by
+    // `xcode-select --print-path`.
+    if cfg!(target_os = "macos") {
+        if let Some(output) = run_command("xcode-select", &["--print-path"]) {
+            let directory = Path::new(output.lines().next().unwrap()).to_path_buf();
+            let directory = directory.join("Toolchains/XcodeDefault.xctoolchain/usr/lib");
+            found.extend(search_directories(&directory, files));
+        }
+    }
+
+    // Search the directories provided by the `LD_LIBRARY_PATH` environment
+    // variable.
+    if let Ok(path) = env::var("LD_LIBRARY_PATH") {
+        for directory in path.split(':').map(Path::new) {
+            found.extend(search_directories(&directory, files));
+        }
+    }
+
+    // Determine the `libclang` directory patterns.
+    let directories = if cfg!(any(target_os = "freebsd", target_os = "linux")) {
+        DIRECTORIES_LINUX
+    } else if cfg!(target_os = "macos") {
+        DIRECTORIES_MACOS
+    } else if cfg!(target_os = "windows") {
+        DIRECTORIES_WINDOWS
+    } else {
+        &[]
+    };
+
+    // Search the directories provided by the `libclang` directory patterns.
+    let mut options = MatchOptions::new();
+    options.case_sensitive = false;
+    options.require_literal_separator = true;
+    for directory in directories.iter().rev() {
+        if let Ok(directories) = glob::glob_with(directory, options) {
+            for directory in directories.filter_map(Result::ok).filter(|p| p.is_dir()) {
+                found.extend(search_directories(&directory, files));
+            }
+        }
+    }
+
+    found
+}
diff --git a/out/dynamic.rs b/out/dynamic.rs
new file mode 100644
index 0000000..2054ba0
--- /dev/null
+++ b/out/dynamic.rs
@@ -0,0 +1,244 @@
+// Copyright 2018 Kyle Mayes
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use std::env;
+use std::fs::File;
+use std::io::{self, Error, ErrorKind, Read, Seek, SeekFrom};
+use std::path::{Path, PathBuf};
+
+use super::common;
+
+/// Returns the ELF class from the ELF header in the supplied file.
+fn parse_elf_header(path: &Path) -> io::Result<u8> {
+    let mut file = File::open(path)?;
+    let mut buffer = [0; 5];
+    file.read_exact(&mut buffer)?;
+    if buffer[..4] == [127, 69, 76, 70] {
+        Ok(buffer[4])
+    } else {
+        Err(Error::new(ErrorKind::InvalidData, "invalid ELF header"))
+    }
+}
+
+/// Returns the magic number from the PE header in the supplied file.
+fn parse_pe_header(path: &Path) -> io::Result<u16> {
+    let mut file = File::open(path)?;
+
+    // Determine the header offset.
+    let mut buffer = [0; 4];
+    let start = SeekFrom::Start(0x3C);
+    file.seek(start)?;
+    file.read_exact(&mut buffer)?;
+    let offset = i32::from_le_bytes(buffer);
+
+    // Determine the validity of the header.
+    file.seek(SeekFrom::Start(offset as u64))?;
+    file.read_exact(&mut buffer)?;
+    if buffer != [80, 69, 0, 0] {
+        return Err(Error::new(ErrorKind::InvalidData, "invalid PE header"));
+    }
+
+    // Find the magic number.
+    let mut buffer = [0; 2];
+    file.seek(SeekFrom::Current(20))?;
+    file.read_exact(&mut buffer)?;
+    Ok(u16::from_le_bytes(buffer))
+}
+
+/// Validates the header for the supplied `libclang` shared library.
+fn validate_header(path: &Path) -> Result<(), String> {
+    if cfg!(any(target_os = "freebsd", target_os = "linux")) {
+        let class = parse_elf_header(path).map_err(|e| e.to_string())?;
+
+        if cfg!(target_pointer_width = "32") && class != 1 {
+            return Err("invalid ELF class (64-bit)".into());
+        }
+
+        if cfg!(target_pointer_width = "64") && class != 2 {
+            return Err("invalid ELF class (32-bit)".into());
+        }
+
+        Ok(())
+    } else if cfg!(target_os = "windows") {
+        let magic = parse_pe_header(path).map_err(|e| e.to_string())?;
+
+        if cfg!(target_pointer_width = "32") && magic != 267 {
+            return Err("invalid DLL (64-bit)".into());
+        }
+
+        if cfg!(target_pointer_width = "64") && magic != 523 {
+            return Err("invalid DLL (32-bit)".into());
+        }
+
+        Ok(())
+    } else {
+        Ok(())
+    }
+}
+
+/// Returns the components of the version in the supplied `libclang` shared
+// library filename.
+fn parse_version(filename: &str) -> Vec<u32> {
+    let version = if filename.starts_with("libclang.so.") {
+        &filename[12..]
+    } else if filename.starts_with("libclang-") {
+        &filename[9..filename.len() - 3]
+    } else {
+        return vec![];
+    };
+
+    version.split('.').map(|s| s.parse().unwrap_or(0)).collect()
+}
+
+/// Returns the paths to, the filenames, and the versions of the `libclang`
+// shared libraries.
+fn search_libclang_directories(runtime: bool) -> Result<Vec<(PathBuf, String, Vec<u32>)>, String> {
+    let mut files = vec![format!(
+        "{}clang{}",
+        env::consts::DLL_PREFIX,
+        env::consts::DLL_SUFFIX
+    )];
+
+    if cfg!(target_os = "linux") {
+        // Some Linux distributions don't create a `libclang.so` symlink, so we
+        // need to look for versioned files (e.g., `libclang-3.9.so`).
+        files.push("libclang-*.so".into());
+
+        // Some Linux distributions don't create a `libclang.so` symlink and
+        // don't have versioned files as described above, so we need to look for
+        // suffix versioned files (e.g., `libclang.so.1`). However, `ld` cannot
+        // link to these files, so this will only be included when linking at
+        // runtime.
+        if runtime {
+            files.push("libclang.so.*".into());
+            files.push("libclang-*.so.*".into());
+        }
+    }
+
+    if cfg!(any(
+        target_os = "openbsd",
+        target_os = "freebsd",
+        target_os = "netbsd"
+    )) {
+        // Some BSD distributions don't create a `libclang.so` symlink either,
+        // but use a different naming scheme for versioned files (e.g.,
+        // `libclang.so.7.0`).
+        files.push("libclang.so.*".into());
+    }
+
+    if cfg!(target_os = "windows") {
+        // The official LLVM build uses `libclang.dll` on Windows instead of
+        // `clang.dll`. However, unofficial builds such as MinGW use `clang.dll`.
+        files.push("libclang.dll".into());
+    }
+
+    // Validate the `libclang` shared libraries and collect the versions.
+    let mut valid = vec![];
+    let mut invalid = vec![];
+    for (directory, filename) in common::search_libclang_directories(&files, "LIBCLANG_PATH") {
+        let path = directory.join(&filename);
+        match validate_header(&path) {
+            Ok(()) => {
+                let version = parse_version(&filename);
+                valid.push((directory, filename, version))
+            }
+            Err(message) => invalid.push(format!("({}: {})", path.display(), message)),
+        }
+    }
+
+    if !valid.is_empty() {
+        return Ok(valid);
+    }
+
+    let message = format!(
+        "couldn't find any valid shared libraries matching: [{}], set the \
+         `LIBCLANG_PATH` environment variable to a path where one of these files \
+         can be found (invalid: [{}])",
+        files
+            .iter()
+            .map(|f| format!("'{}'", f))
+            .collect::<Vec<_>>()
+            .join(", "),
+        invalid.join(", "),
+    );
+
+    Err(message)
+}
+
+/// Returns the directory and filename of the "best" available `libclang` shared
+/// library.
+pub fn find(runtime: bool) -> Result<(PathBuf, String), String> {
+    search_libclang_directories(runtime)?
+        .iter()
+        .max_by_key(|f| &f.2)
+        .cloned()
+        .map(|(path, filename, _)| (path, filename))
+        .ok_or_else(|| "unreachable".into())
+}
+
+/// Find and link to `libclang` dynamically.
+#[cfg(not(feature = "runtime"))]
+pub fn link() {
+    use std::fs;
+
+    let (directory, filename) = find(false).unwrap();
+    println!("cargo:rustc-link-search={}", directory.display());
+
+    if cfg!(all(target_os = "windows", target_env = "msvc")) {
+        // Find the `libclang` stub static library required for the MSVC
+        // toolchain.
+        let lib = if !directory.ends_with("bin") {
+            directory
+        } else {
+            directory.parent().unwrap().join("lib")
+        };
+
+        if lib.join("libclang.lib").exists() {
+            println!("cargo:rustc-link-search={}", lib.display());
+        } else if lib.join("libclang.dll.a").exists() {
+            // MSYS and MinGW use `libclang.dll.a` instead of `libclang.lib`.
+            // It is linkable with the MSVC linker, but Rust doesn't recognize
+            // the `.a` suffix, so we need to copy it with a different name.
+            //
+            // FIXME: Maybe we can just hardlink or symlink it?
+            let out = env::var("OUT_DIR").unwrap();
+            fs::copy(
+                lib.join("libclang.dll.a"),
+                Path::new(&out).join("libclang.lib"),
+            )
+            .unwrap();
+            println!("cargo:rustc-link-search=native={}", out);
+        } else {
+            panic!(
+                "using '{}', so 'libclang.lib' or 'libclang.dll.a' must be \
+                 available in {}",
+                filename,
+                lib.display(),
+            );
+        }
+
+        println!("cargo:rustc-link-lib=dylib=libclang");
+    } else {
+        let name = filename.trim_start_matches("lib");
+
+        // Strip extensions and trailing version numbers (e.g., the `.so.7.0` in
+        // `libclang.so.7.0`).
+        let name = match name.find(".dylib").or_else(|| name.find(".so")) {
+            Some(index) => &name[0..index],
+            None => &name,
+        };
+
+        println!("cargo:rustc-link-lib=dylib={}", name);
+    }
+}
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..e4367b0
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,2187 @@
+// Copyright 2016 Kyle Mayes
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Rust bindings for `libclang`.
+//!
+//! ## Documentation
+//!
+//! There are two versions of the documentation, one for the API exposed when
+//! linking dynamically or statically and one for the API exposed when linking
+//! at runtime (see the
+//! [Dependencies](https://github.com/KyleMayes/clang-sys#dependencies) section
+//! of the README for more information on the linking options).
+//!
+//! The only difference between the APIs exposed is that when linking at runtime
+//! a few additional types and functions are exposed to manage the loaded
+//! `libclang` shared library.
+//!
+//! * Runtime - [Documentation](https://kylemayes.github.io/clang-sys/runtime/clang_sys)
+//! * Dynamic / Static - [Documentation](https://kylemayes.github.io/clang-sys/default/clang_sys)
+
+#![allow(non_camel_case_types, non_snake_case, non_upper_case_globals)]
+#![cfg_attr(feature = "cargo-clippy", allow(clippy::unreadable_literal))]
+
+extern crate glob;
+extern crate libc;
+#[cfg(feature = "runtime")]
+extern crate libloading;
+
+pub mod support;
+
+#[macro_use]
+mod link;
+
+use std::mem;
+
+use libc::*;
+
+pub type CXClientData = *mut c_void;
+pub type CXCursorVisitor = extern "C" fn(CXCursor, CXCursor, CXClientData) -> CXChildVisitResult;
+#[cfg(feature = "gte_clang_3_7")]
+pub type CXFieldVisitor = extern "C" fn(CXCursor, CXClientData) -> CXVisitorResult;
+pub type CXInclusionVisitor = extern "C" fn(CXFile, *mut CXSourceLocation, c_uint, CXClientData);
+
+//================================================
+// Macros
+//================================================
+
+/// Defines a C enum as a series of constants.
+macro_rules! cenum {
+    ($(#[$meta:meta])* enum $name:ident {
+        $($(#[$vmeta:meta])* const $variant:ident = $value:expr), +,
+    }) => (
+        pub type $name = c_int;
+
+        $($(#[$vmeta])* pub const $variant: $name = $value;)+
+    );
+    ($(#[$meta:meta])* enum $name:ident {
+        $($(#[$vmeta:meta])* const $variant:ident = $value:expr); +;
+    }) => (
+        pub type $name = c_int;
+
+        $($(#[$vmeta])* pub const $variant: $name = $value;)+
+    );
+}
+
+/// Implements a zeroing implementation of `Default` for the supplied type.
+macro_rules! default {
+    (#[$meta:meta] $ty:ty) => {
+        #[$meta]
+        impl Default for $ty {
+            fn default() -> $ty {
+                unsafe { mem::zeroed() }
+            }
+        }
+    };
+
+    ($ty:ty) => {
+        impl Default for $ty {
+            fn default() -> $ty {
+                unsafe { mem::zeroed() }
+            }
+        }
+    };
+}
+
+//================================================
+// Enums
+//================================================
+
+cenum! {
+    enum CXAvailabilityKind {
+        const CXAvailability_Available = 0,
+        const CXAvailability_Deprecated = 1,
+        const CXAvailability_NotAvailable = 2,
+        const CXAvailability_NotAccessible = 3,
+    }
+}
+
+cenum! {
+    enum CXCallingConv {
+        const CXCallingConv_Default = 0,
+        const CXCallingConv_C = 1,
+        const CXCallingConv_X86StdCall = 2,
+        const CXCallingConv_X86FastCall = 3,
+        const CXCallingConv_X86ThisCall = 4,
+        const CXCallingConv_X86Pascal = 5,
+        const CXCallingConv_AAPCS = 6,
+        const CXCallingConv_AAPCS_VFP = 7,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCallingConv_X86RegCall = 8,
+        const CXCallingConv_IntelOclBicc = 9,
+        const CXCallingConv_Win64 = 10,
+        const CXCallingConv_X86_64Win64 = 10,
+        const CXCallingConv_X86_64SysV = 11,
+        /// Only produced by `libclang` 3.6 and later.
+        const CXCallingConv_X86VectorCall = 12,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCallingConv_Swift = 13,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCallingConv_PreserveMost = 14,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCallingConv_PreserveAll = 15,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCallingConv_AArch64VectorCall = 16,
+        const CXCallingConv_Invalid = 100,
+        const CXCallingConv_Unexposed = 200,
+    }
+}
+
+cenum! {
+    enum CXChildVisitResult {
+        const CXChildVisit_Break = 0,
+        const CXChildVisit_Continue = 1,
+        const CXChildVisit_Recurse = 2,
+    }
+}
+
+cenum! {
+    enum CXCommentInlineCommandRenderKind {
+        const CXCommentInlineCommandRenderKind_Normal = 0,
+        const CXCommentInlineCommandRenderKind_Bold = 1,
+        const CXCommentInlineCommandRenderKind_Monospaced = 2,
+        const CXCommentInlineCommandRenderKind_Emphasized = 3,
+    }
+}
+
+cenum! {
+    enum CXCommentKind {
+        const CXComment_Null = 0,
+        const CXComment_Text = 1,
+        const CXComment_InlineCommand = 2,
+        const CXComment_HTMLStartTag = 3,
+        const CXComment_HTMLEndTag = 4,
+        const CXComment_Paragraph = 5,
+        const CXComment_BlockCommand = 6,
+        const CXComment_ParamCommand = 7,
+        const CXComment_TParamCommand = 8,
+        const CXComment_VerbatimBlockCommand = 9,
+        const CXComment_VerbatimBlockLine = 10,
+        const CXComment_VerbatimLine = 11,
+        const CXComment_FullComment = 12,
+    }
+}
+
+cenum! {
+    enum CXCommentParamPassDirection {
+        const CXCommentParamPassDirection_In = 0,
+        const CXCommentParamPassDirection_Out = 1,
+        const CXCommentParamPassDirection_InOut = 2,
+    }
+}
+
+cenum! {
+    enum CXCompilationDatabase_Error {
+        const CXCompilationDatabase_NoError = 0,
+        const CXCompilationDatabase_CanNotLoadDatabase = 1,
+    }
+}
+
+cenum! {
+    enum CXCompletionChunkKind {
+        const CXCompletionChunk_Optional = 0,
+        const CXCompletionChunk_TypedText = 1,
+        const CXCompletionChunk_Text = 2,
+        const CXCompletionChunk_Placeholder = 3,
+        const CXCompletionChunk_Informative = 4,
+        const CXCompletionChunk_CurrentParameter = 5,
+        const CXCompletionChunk_LeftParen = 6,
+        const CXCompletionChunk_RightParen = 7,
+        const CXCompletionChunk_LeftBracket = 8,
+        const CXCompletionChunk_RightBracket = 9,
+        const CXCompletionChunk_LeftBrace = 10,
+        const CXCompletionChunk_RightBrace = 11,
+        const CXCompletionChunk_LeftAngle = 12,
+        const CXCompletionChunk_RightAngle = 13,
+        const CXCompletionChunk_Comma = 14,
+        const CXCompletionChunk_ResultType = 15,
+        const CXCompletionChunk_Colon = 16,
+        const CXCompletionChunk_SemiColon = 17,
+        const CXCompletionChunk_Equal = 18,
+        const CXCompletionChunk_HorizontalSpace = 19,
+        const CXCompletionChunk_VerticalSpace = 20,
+    }
+}
+
+cenum! {
+    enum CXCursorKind {
+        const CXCursor_UnexposedDecl = 1,
+        const CXCursor_StructDecl = 2,
+        const CXCursor_UnionDecl = 3,
+        const CXCursor_ClassDecl = 4,
+        const CXCursor_EnumDecl = 5,
+        const CXCursor_FieldDecl = 6,
+        const CXCursor_EnumConstantDecl = 7,
+        const CXCursor_FunctionDecl = 8,
+        const CXCursor_VarDecl = 9,
+        const CXCursor_ParmDecl = 10,
+        const CXCursor_ObjCInterfaceDecl = 11,
+        const CXCursor_ObjCCategoryDecl = 12,
+        const CXCursor_ObjCProtocolDecl = 13,
+        const CXCursor_ObjCPropertyDecl = 14,
+        const CXCursor_ObjCIvarDecl = 15,
+        const CXCursor_ObjCInstanceMethodDecl = 16,
+        const CXCursor_ObjCClassMethodDecl = 17,
+        const CXCursor_ObjCImplementationDecl = 18,
+        const CXCursor_ObjCCategoryImplDecl = 19,
+        const CXCursor_TypedefDecl = 20,
+        const CXCursor_CXXMethod = 21,
+        const CXCursor_Namespace = 22,
+        const CXCursor_LinkageSpec = 23,
+        const CXCursor_Constructor = 24,
+        const CXCursor_Destructor = 25,
+        const CXCursor_ConversionFunction = 26,
+        const CXCursor_TemplateTypeParameter = 27,
+        const CXCursor_NonTypeTemplateParameter = 28,
+        const CXCursor_TemplateTemplateParameter = 29,
+        const CXCursor_FunctionTemplate = 30,
+        const CXCursor_ClassTemplate = 31,
+        const CXCursor_ClassTemplatePartialSpecialization = 32,
+        const CXCursor_NamespaceAlias = 33,
+        const CXCursor_UsingDirective = 34,
+        const CXCursor_UsingDeclaration = 35,
+        const CXCursor_TypeAliasDecl = 36,
+        const CXCursor_ObjCSynthesizeDecl = 37,
+        const CXCursor_ObjCDynamicDecl = 38,
+        const CXCursor_CXXAccessSpecifier = 39,
+        const CXCursor_ObjCSuperClassRef = 40,
+        const CXCursor_ObjCProtocolRef = 41,
+        const CXCursor_ObjCClassRef = 42,
+        const CXCursor_TypeRef = 43,
+        const CXCursor_CXXBaseSpecifier = 44,
+        const CXCursor_TemplateRef = 45,
+        const CXCursor_NamespaceRef = 46,
+        const CXCursor_MemberRef = 47,
+        const CXCursor_LabelRef = 48,
+        const CXCursor_OverloadedDeclRef = 49,
+        const CXCursor_VariableRef = 50,
+        const CXCursor_InvalidFile = 70,
+        const CXCursor_NoDeclFound = 71,
+        const CXCursor_NotImplemented = 72,
+        const CXCursor_InvalidCode = 73,
+        const CXCursor_UnexposedExpr = 100,
+        const CXCursor_DeclRefExpr = 101,
+        const CXCursor_MemberRefExpr = 102,
+        const CXCursor_CallExpr = 103,
+        const CXCursor_ObjCMessageExpr = 104,
+        const CXCursor_BlockExpr = 105,
+        const CXCursor_IntegerLiteral = 106,
+        const CXCursor_FloatingLiteral = 107,
+        const CXCursor_ImaginaryLiteral = 108,
+        const CXCursor_StringLiteral = 109,
+        const CXCursor_CharacterLiteral = 110,
+        const CXCursor_ParenExpr = 111,
+        const CXCursor_UnaryOperator = 112,
+        const CXCursor_ArraySubscriptExpr = 113,
+        const CXCursor_BinaryOperator = 114,
+        const CXCursor_CompoundAssignOperator = 115,
+        const CXCursor_ConditionalOperator = 116,
+        const CXCursor_CStyleCastExpr = 117,
+        const CXCursor_CompoundLiteralExpr = 118,
+        const CXCursor_InitListExpr = 119,
+        const CXCursor_AddrLabelExpr = 120,
+        const CXCursor_StmtExpr = 121,
+        const CXCursor_GenericSelectionExpr = 122,
+        const CXCursor_GNUNullExpr = 123,
+        const CXCursor_CXXStaticCastExpr = 124,
+        const CXCursor_CXXDynamicCastExpr = 125,
+        const CXCursor_CXXReinterpretCastExpr = 126,
+        const CXCursor_CXXConstCastExpr = 127,
+        const CXCursor_CXXFunctionalCastExpr = 128,
+        const CXCursor_CXXTypeidExpr = 129,
+        const CXCursor_CXXBoolLiteralExpr = 130,
+        const CXCursor_CXXNullPtrLiteralExpr = 131,
+        const CXCursor_CXXThisExpr = 132,
+        const CXCursor_CXXThrowExpr = 133,
+        const CXCursor_CXXNewExpr = 134,
+        const CXCursor_CXXDeleteExpr = 135,
+        const CXCursor_UnaryExpr = 136,
+        const CXCursor_ObjCStringLiteral = 137,
+        const CXCursor_ObjCEncodeExpr = 138,
+        const CXCursor_ObjCSelectorExpr = 139,
+        const CXCursor_ObjCProtocolExpr = 140,
+        const CXCursor_ObjCBridgedCastExpr = 141,
+        const CXCursor_PackExpansionExpr = 142,
+        const CXCursor_SizeOfPackExpr = 143,
+        const CXCursor_LambdaExpr = 144,
+        const CXCursor_ObjCBoolLiteralExpr = 145,
+        const CXCursor_ObjCSelfExpr = 146,
+        /// Only produced by `libclang` 3.8 and later.
+        const CXCursor_OMPArraySectionExpr = 147,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_ObjCAvailabilityCheckExpr = 148,
+        /// Only produced by `libclang` 7.0 and later.
+        const CXCursor_FixedPointLiteral = 149,
+        const CXCursor_UnexposedStmt = 200,
+        const CXCursor_LabelStmt = 201,
+        const CXCursor_CompoundStmt = 202,
+        const CXCursor_CaseStmt = 203,
+        const CXCursor_DefaultStmt = 204,
+        const CXCursor_IfStmt = 205,
+        const CXCursor_SwitchStmt = 206,
+        const CXCursor_WhileStmt = 207,
+        const CXCursor_DoStmt = 208,
+        const CXCursor_ForStmt = 209,
+        const CXCursor_GotoStmt = 210,
+        const CXCursor_IndirectGotoStmt = 211,
+        const CXCursor_ContinueStmt = 212,
+        const CXCursor_BreakStmt = 213,
+        const CXCursor_ReturnStmt = 214,
+        /// Duplicate of `CXCursor_GccAsmStmt`.
+        const CXCursor_AsmStmt = 215,
+        const CXCursor_ObjCAtTryStmt = 216,
+        const CXCursor_ObjCAtCatchStmt = 217,
+        const CXCursor_ObjCAtFinallyStmt = 218,
+        const CXCursor_ObjCAtThrowStmt = 219,
+        const CXCursor_ObjCAtSynchronizedStmt = 220,
+        const CXCursor_ObjCAutoreleasePoolStmt = 221,
+        const CXCursor_ObjCForCollectionStmt = 222,
+        const CXCursor_CXXCatchStmt = 223,
+        const CXCursor_CXXTryStmt = 224,
+        const CXCursor_CXXForRangeStmt = 225,
+        const CXCursor_SEHTryStmt = 226,
+        const CXCursor_SEHExceptStmt = 227,
+        const CXCursor_SEHFinallyStmt = 228,
+        const CXCursor_MSAsmStmt = 229,
+        const CXCursor_NullStmt = 230,
+        const CXCursor_DeclStmt = 231,
+        const CXCursor_OMPParallelDirective = 232,
+        const CXCursor_OMPSimdDirective = 233,
+        const CXCursor_OMPForDirective = 234,
+        const CXCursor_OMPSectionsDirective = 235,
+        const CXCursor_OMPSectionDirective = 236,
+        const CXCursor_OMPSingleDirective = 237,
+        const CXCursor_OMPParallelForDirective = 238,
+        const CXCursor_OMPParallelSectionsDirective = 239,
+        const CXCursor_OMPTaskDirective = 240,
+        const CXCursor_OMPMasterDirective = 241,
+        const CXCursor_OMPCriticalDirective = 242,
+        const CXCursor_OMPTaskyieldDirective = 243,
+        const CXCursor_OMPBarrierDirective = 244,
+        const CXCursor_OMPTaskwaitDirective = 245,
+        const CXCursor_OMPFlushDirective = 246,
+        const CXCursor_SEHLeaveStmt = 247,
+        /// Only produced by `libclang` 3.6 and later.
+        const CXCursor_OMPOrderedDirective = 248,
+        /// Only produced by `libclang` 3.6 and later.
+        const CXCursor_OMPAtomicDirective = 249,
+        /// Only produced by `libclang` 3.6 and later.
+        const CXCursor_OMPForSimdDirective = 250,
+        /// Only produced by `libclang` 3.6 and later.
+        const CXCursor_OMPParallelForSimdDirective = 251,
+        /// Only produced by `libclang` 3.6 and later.
+        const CXCursor_OMPTargetDirective = 252,
+        /// Only produced by `libclang` 3.6 and later.
+        const CXCursor_OMPTeamsDirective = 253,
+        /// Only produced by `libclang` 3.7 and later.
+        const CXCursor_OMPTaskgroupDirective = 254,
+        /// Only produced by `libclang` 3.7 and later.
+        const CXCursor_OMPCancellationPointDirective = 255,
+        /// Only produced by `libclang` 3.7 and later.
+        const CXCursor_OMPCancelDirective = 256,
+        /// Only produced by `libclang` 3.8 and later.
+        const CXCursor_OMPTargetDataDirective = 257,
+        /// Only produced by `libclang` 3.8 and later.
+        const CXCursor_OMPTaskLoopDirective = 258,
+        /// Only produced by `libclang` 3.8 and later.
+        const CXCursor_OMPTaskLoopSimdDirective = 259,
+        /// Only produced by `libclang` 3.8 and later.
+        const CXCursor_OMPDistributeDirective = 260,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_OMPTargetEnterDataDirective = 261,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_OMPTargetExitDataDirective = 262,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_OMPTargetParallelDirective = 263,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_OMPTargetParallelForDirective = 264,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_OMPTargetUpdateDirective = 265,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_OMPDistributeParallelForDirective = 266,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_OMPDistributeParallelForSimdDirective = 267,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_OMPDistributeSimdDirective = 268,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_OMPTargetParallelForSimdDirective = 269,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCursor_OMPTargetSimdDirective = 270,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCursor_OMPTeamsDistributeDirective = 271,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCursor_OMPTeamsDistributeSimdDirective = 272,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCursor_OMPTeamsDistributeParallelForSimdDirective = 273,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCursor_OMPTeamsDistributeParallelForDirective = 274,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCursor_OMPTargetTeamsDirective = 275,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCursor_OMPTargetTeamsDistributeDirective = 276,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCursor_OMPTargetTeamsDistributeParallelForDirective = 277,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective = 278,
+        /// Only producer by `libclang` 4.0 and later.
+        const CXCursor_OMPTargetTeamsDistributeSimdDirective = 279,
+        /// Only produced by 'libclang' 9.0 and later.
+        const CXCursor_BuiltinBitCastExpr = 280,
+        const CXCursor_TranslationUnit = 300,
+        const CXCursor_UnexposedAttr = 400,
+        const CXCursor_IBActionAttr = 401,
+        const CXCursor_IBOutletAttr = 402,
+        const CXCursor_IBOutletCollectionAttr = 403,
+        const CXCursor_CXXFinalAttr = 404,
+        const CXCursor_CXXOverrideAttr = 405,
+        const CXCursor_AnnotateAttr = 406,
+        const CXCursor_AsmLabelAttr = 407,
+        const CXCursor_PackedAttr = 408,
+        const CXCursor_PureAttr = 409,
+        const CXCursor_ConstAttr = 410,
+        const CXCursor_NoDuplicateAttr = 411,
+        const CXCursor_CUDAConstantAttr = 412,
+        const CXCursor_CUDADeviceAttr = 413,
+        const CXCursor_CUDAGlobalAttr = 414,
+        const CXCursor_CUDAHostAttr = 415,
+        /// Only produced by `libclang` 3.6 and later.
+        const CXCursor_CUDASharedAttr = 416,
+        /// Only produced by `libclang` 3.8 and later.
+        const CXCursor_VisibilityAttr = 417,
+        /// Only produced by `libclang` 3.8 and later.
+        const CXCursor_DLLExport = 418,
+        /// Only produced by `libclang` 3.8 and later.
+        const CXCursor_DLLImport = 419,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_NSReturnsRetained = 420,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_NSReturnsNotRetained = 421,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_NSReturnsAutoreleased = 422,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_NSConsumesSelf = 423,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_NSConsumed = 424,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCException = 425,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCNSObject = 426,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCIndependentClass = 427,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCPreciseLifetime = 428,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCReturnsInnerPointer = 429,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCRequiresSuper = 430,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCRootClass = 431,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCSubclassingRestricted = 432,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCExplicitProtocolImpl = 433,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCDesignatedInitializer = 434,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCRuntimeVisible = 435,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_ObjCBoxable = 436,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXCursor_FlagEnum = 437,
+        /// Only produced by `libclang` 9.0 and later.
+        const CXCursor_ConvergentAttr  = 438,
+        /// Only produced by `libclang` 9.0 and later.
+        const CXCursor_WarnUnusedAttr = 439,
+        /// Only produced by `libclang` 9.0 and later.
+        const CXCursor_WarnUnusedResultAttr = 440,
+        /// Only produced by `libclang` 9.0 and later.
+        const CXCursor_AlignedAttr = 441,
+        const CXCursor_PreprocessingDirective = 500,
+        const CXCursor_MacroDefinition = 501,
+        /// Duplicate of `CXCursor_MacroInstantiation`.
+        const CXCursor_MacroExpansion = 502,
+        const CXCursor_InclusionDirective = 503,
+        const CXCursor_ModuleImportDecl = 600,
+        /// Only produced by `libclang` 3.8 and later.
+        const CXCursor_TypeAliasTemplateDecl = 601,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXCursor_StaticAssert = 602,
+        /// Only produced by `libclang` 4.0 and later.
+        const CXCursor_FriendDecl = 603,
+        /// Only produced by `libclang` 3.7 and later.
+        const CXCursor_OverloadCandidate = 700,
+    }
+}
+
+cenum! {
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    enum CXCursor_ExceptionSpecificationKind {
+        const CXCursor_ExceptionSpecificationKind_None = 0,
+        const CXCursor_ExceptionSpecificationKind_DynamicNone = 1,
+        const CXCursor_ExceptionSpecificationKind_Dynamic = 2,
+        const CXCursor_ExceptionSpecificationKind_MSAny = 3,
+        const CXCursor_ExceptionSpecificationKind_BasicNoexcept = 4,
+        const CXCursor_ExceptionSpecificationKind_ComputedNoexcept = 5,
+        const CXCursor_ExceptionSpecificationKind_Unevaluated = 6,
+        const CXCursor_ExceptionSpecificationKind_Uninstantiated = 7,
+        const CXCursor_ExceptionSpecificationKind_Unparsed = 8,
+        /// Only available on `libclang` 9.0 and later.
+        #[cfg(feature = "gte_clang_9_0")]
+        const CXCursor_ExceptionSpecificationKind_NoThrow = 9,
+    }
+}
+
+cenum! {
+    enum CXDiagnosticSeverity {
+        const CXDiagnostic_Ignored = 0,
+        const CXDiagnostic_Note = 1,
+        const CXDiagnostic_Warning = 2,
+        const CXDiagnostic_Error = 3,
+        const CXDiagnostic_Fatal = 4,
+    }
+}
+
+cenum! {
+    enum CXErrorCode {
+        const CXError_Success = 0,
+        const CXError_Failure = 1,
+        const CXError_Crashed = 2,
+        const CXError_InvalidArguments = 3,
+        const CXError_ASTReadError = 4,
+    }
+}
+
+cenum! {
+    enum CXEvalResultKind {
+        const CXEval_UnExposed = 0,
+        const CXEval_Int = 1 ,
+        const CXEval_Float = 2,
+        const CXEval_ObjCStrLiteral = 3,
+        const CXEval_StrLiteral = 4,
+        const CXEval_CFStr = 5,
+        const CXEval_Other = 6,
+    }
+}
+
+cenum! {
+    enum CXIdxAttrKind {
+        const CXIdxAttr_Unexposed = 0,
+        const CXIdxAttr_IBAction = 1,
+        const CXIdxAttr_IBOutlet = 2,
+        const CXIdxAttr_IBOutletCollection = 3,
+    }
+}
+
+cenum! {
+    enum CXIdxEntityCXXTemplateKind {
+        const CXIdxEntity_NonTemplate = 0,
+        const CXIdxEntity_Template = 1,
+        const CXIdxEntity_TemplatePartialSpecialization = 2,
+        const CXIdxEntity_TemplateSpecialization = 3,
+    }
+}
+
+cenum! {
+    enum CXIdxEntityKind {
+        const CXIdxEntity_Unexposed = 0,
+        const CXIdxEntity_Typedef = 1,
+        const CXIdxEntity_Function = 2,
+        const CXIdxEntity_Variable = 3,
+        const CXIdxEntity_Field = 4,
+        const CXIdxEntity_EnumConstant = 5,
+        const CXIdxEntity_ObjCClass = 6,
+        const CXIdxEntity_ObjCProtocol = 7,
+        const CXIdxEntity_ObjCCategory = 8,
+        const CXIdxEntity_ObjCInstanceMethod = 9,
+        const CXIdxEntity_ObjCClassMethod = 10,
+        const CXIdxEntity_ObjCProperty = 11,
+        const CXIdxEntity_ObjCIvar = 12,
+        const CXIdxEntity_Enum = 13,
+        const CXIdxEntity_Struct = 14,
+        const CXIdxEntity_Union = 15,
+        const CXIdxEntity_CXXClass = 16,
+        const CXIdxEntity_CXXNamespace = 17,
+        const CXIdxEntity_CXXNamespaceAlias = 18,
+        const CXIdxEntity_CXXStaticVariable = 19,
+        const CXIdxEntity_CXXStaticMethod = 20,
+        const CXIdxEntity_CXXInstanceMethod = 21,
+        const CXIdxEntity_CXXConstructor = 22,
+        const CXIdxEntity_CXXDestructor = 23,
+        const CXIdxEntity_CXXConversionFunction = 24,
+        const CXIdxEntity_CXXTypeAlias = 25,
+        const CXIdxEntity_CXXInterface = 26,
+    }
+}
+
+cenum! {
+    enum CXIdxEntityLanguage {
+        const CXIdxEntityLang_None = 0,
+        const CXIdxEntityLang_C = 1,
+        const CXIdxEntityLang_ObjC = 2,
+        const CXIdxEntityLang_CXX = 3,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXIdxEntityLang_Swift = 4,
+    }
+}
+
+cenum! {
+    enum CXIdxEntityRefKind {
+        const CXIdxEntityRef_Direct = 1,
+        const CXIdxEntityRef_Implicit = 2,
+    }
+}
+
+cenum! {
+    enum CXIdxObjCContainerKind {
+        const CXIdxObjCContainer_ForwardRef = 0,
+        const CXIdxObjCContainer_Interface = 1,
+        const CXIdxObjCContainer_Implementation = 2,
+    }
+}
+
+cenum! {
+    enum CXLanguageKind {
+        const CXLanguage_Invalid = 0,
+        const CXLanguage_C = 1,
+        const CXLanguage_ObjC = 2,
+        const CXLanguage_CPlusPlus = 3,
+    }
+}
+
+cenum! {
+    enum CXLinkageKind {
+        const CXLinkage_Invalid = 0,
+        const CXLinkage_NoLinkage = 1,
+        const CXLinkage_Internal = 2,
+        const CXLinkage_UniqueExternal = 3,
+        const CXLinkage_External = 4,
+    }
+}
+
+cenum! {
+    enum CXLoadDiag_Error {
+        const CXLoadDiag_None = 0,
+        const CXLoadDiag_Unknown = 1,
+        const CXLoadDiag_CannotLoad = 2,
+        const CXLoadDiag_InvalidFile = 3,
+    }
+}
+
+cenum! {
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    enum CXPrintingPolicyProperty {
+        const CXPrintingPolicy_Indentation = 0,
+        const CXPrintingPolicy_SuppressSpecifiers = 1,
+        const CXPrintingPolicy_SuppressTagKeyword = 2,
+        const CXPrintingPolicy_IncludeTagDefinition = 3,
+        const CXPrintingPolicy_SuppressScope = 4,
+        const CXPrintingPolicy_SuppressUnwrittenScope = 5,
+        const CXPrintingPolicy_SuppressInitializers = 6,
+        const CXPrintingPolicy_ConstantArraySizeAsWritten = 7,
+        const CXPrintingPolicy_AnonymousTagLocations = 8,
+        const CXPrintingPolicy_SuppressStrongLifetime = 9,
+        const CXPrintingPolicy_SuppressLifetimeQualifiers = 10,
+        const CXPrintingPolicy_SuppressTemplateArgsInCXXConstructors = 11,
+        const CXPrintingPolicy_Bool = 12,
+        const CXPrintingPolicy_Restrict = 13,
+        const CXPrintingPolicy_Alignof = 14,
+        const CXPrintingPolicy_UnderscoreAlignof = 15,
+        const CXPrintingPolicy_UseVoidForZeroParams = 16,
+        const CXPrintingPolicy_TerseOutput = 17,
+        const CXPrintingPolicy_PolishForDeclaration = 18,
+        const CXPrintingPolicy_Half = 19,
+        const CXPrintingPolicy_MSWChar = 20,
+        const CXPrintingPolicy_IncludeNewlines = 21,
+        const CXPrintingPolicy_MSVCFormatting = 22,
+        const CXPrintingPolicy_ConstantsAsWritten = 23,
+        const CXPrintingPolicy_SuppressImplicitBase = 24,
+        const CXPrintingPolicy_FullyQualifiedName = 25,
+    }
+}
+
+cenum! {
+    enum CXRefQualifierKind {
+        const CXRefQualifier_None = 0,
+        const CXRefQualifier_LValue = 1,
+        const CXRefQualifier_RValue = 2,
+    }
+}
+
+cenum! {
+    enum CXResult {
+        const CXResult_Success = 0,
+        const CXResult_Invalid = 1,
+        const CXResult_VisitBreak = 2,
+    }
+}
+
+cenum! {
+    enum CXSaveError {
+        const CXSaveError_None = 0,
+        const CXSaveError_Unknown = 1,
+        const CXSaveError_TranslationErrors = 2,
+        const CXSaveError_InvalidTU = 3,
+    }
+}
+
+cenum! {
+    /// Only available on `libclang` 6.0 and later.
+    #[cfg(feature = "gte_clang_6_0")]
+    enum CXTLSKind {
+        const CXTLS_None = 0,
+        const CXTLS_Dynamic = 1,
+        const CXTLS_Static = 2,
+    }
+}
+
+cenum! {
+    enum CXTUResourceUsageKind {
+        const CXTUResourceUsage_AST = 1,
+        const CXTUResourceUsage_Identifiers = 2,
+        const CXTUResourceUsage_Selectors = 3,
+        const CXTUResourceUsage_GlobalCompletionResults = 4,
+        const CXTUResourceUsage_SourceManagerContentCache = 5,
+        const CXTUResourceUsage_AST_SideTables = 6,
+        const CXTUResourceUsage_SourceManager_Membuffer_Malloc = 7,
+        const CXTUResourceUsage_SourceManager_Membuffer_MMap = 8,
+        const CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc = 9,
+        const CXTUResourceUsage_ExternalASTSource_Membuffer_MMap = 10,
+        const CXTUResourceUsage_Preprocessor = 11,
+        const CXTUResourceUsage_PreprocessingRecord = 12,
+        const CXTUResourceUsage_SourceManager_DataStructures = 13,
+        const CXTUResourceUsage_Preprocessor_HeaderSearch = 14,
+    }
+}
+
+cenum! {
+    /// Only available on `libclang` 3.6 and later.
+    #[cfg(feature = "gte_clang_3_6")]
+    enum CXTemplateArgumentKind {
+        const CXTemplateArgumentKind_Null = 0,
+        const CXTemplateArgumentKind_Type = 1,
+        const CXTemplateArgumentKind_Declaration = 2,
+        const CXTemplateArgumentKind_NullPtr = 3,
+        const CXTemplateArgumentKind_Integral = 4,
+        const CXTemplateArgumentKind_Template = 5,
+        const CXTemplateArgumentKind_TemplateExpansion = 6,
+        const CXTemplateArgumentKind_Expression = 7,
+        const CXTemplateArgumentKind_Pack = 8,
+        const CXTemplateArgumentKind_Invalid = 9,
+    }
+}
+
+cenum! {
+    enum CXTokenKind {
+        const CXToken_Punctuation = 0,
+        const CXToken_Keyword = 1,
+        const CXToken_Identifier = 2,
+        const CXToken_Literal = 3,
+        const CXToken_Comment = 4,
+    }
+}
+
+cenum! {
+    enum CXTypeKind {
+        const CXType_Invalid = 0,
+        const CXType_Unexposed = 1,
+        const CXType_Void = 2,
+        const CXType_Bool = 3,
+        const CXType_Char_U = 4,
+        const CXType_UChar = 5,
+        const CXType_Char16 = 6,
+        const CXType_Char32 = 7,
+        const CXType_UShort = 8,
+        const CXType_UInt = 9,
+        const CXType_ULong = 10,
+        const CXType_ULongLong = 11,
+        const CXType_UInt128 = 12,
+        const CXType_Char_S = 13,
+        const CXType_SChar = 14,
+        const CXType_WChar = 15,
+        const CXType_Short = 16,
+        const CXType_Int = 17,
+        const CXType_Long = 18,
+        const CXType_LongLong = 19,
+        const CXType_Int128 = 20,
+        const CXType_Float = 21,
+        const CXType_Double = 22,
+        const CXType_LongDouble = 23,
+        const CXType_NullPtr = 24,
+        const CXType_Overload = 25,
+        const CXType_Dependent = 26,
+        const CXType_ObjCId = 27,
+        const CXType_ObjCClass = 28,
+        const CXType_ObjCSel = 29,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXType_Float128 = 30,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_Half = 31,
+        /// Only produced by `libclang` 6.0 and later.
+        const CXType_Float16 = 32,
+        /// Only produced by `libclang` 7.0 and later.
+        const CXType_ShortAccum = 33,
+        /// Only produced by `libclang` 7.0 and later.
+        const CXType_Accum = 34,
+        /// Only produced by `libclang` 7.0 and later.
+        const CXType_LongAccum = 35,
+        /// Only produced by `libclang` 7.0 and later.
+        const CXType_UShortAccum = 36,
+        /// Only produced by `libclang` 7.0 and later.
+        const CXType_UAccum = 37,
+        /// Only produced by `libclang` 7.0 and later.
+        const CXType_ULongAccum = 38,
+        const CXType_Complex = 100,
+        const CXType_Pointer = 101,
+        const CXType_BlockPointer = 102,
+        const CXType_LValueReference = 103,
+        const CXType_RValueReference = 104,
+        const CXType_Record = 105,
+        const CXType_Enum = 106,
+        const CXType_Typedef = 107,
+        const CXType_ObjCInterface = 108,
+        const CXType_ObjCObjectPointer = 109,
+        const CXType_FunctionNoProto = 110,
+        const CXType_FunctionProto = 111,
+        const CXType_ConstantArray = 112,
+        const CXType_Vector = 113,
+        const CXType_IncompleteArray = 114,
+        const CXType_VariableArray = 115,
+        const CXType_DependentSizedArray = 116,
+        const CXType_MemberPointer = 117,
+        /// Only produced by `libclang` 3.8 and later.
+        const CXType_Auto = 118,
+        /// Only produced by `libclang` 3.9 and later.
+        const CXType_Elaborated = 119,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_Pipe = 120,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage1dRO = 121,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage1dArrayRO = 122,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage1dBufferRO = 123,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dRO = 124,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayRO = 125,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dDepthRO = 126,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayDepthRO = 127,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dMSAARO = 128,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayMSAARO = 129,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dMSAADepthRO = 130,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayMSAADepthRO = 131,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage3dRO = 132,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage1dWO = 133,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage1dArrayWO = 134,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage1dBufferWO = 135,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dWO = 136,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayWO = 137,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dDepthWO = 138,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayDepthWO = 139,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dMSAAWO = 140,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayMSAAWO = 141,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dMSAADepthWO = 142,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayMSAADepthWO = 143,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage3dWO = 144,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage1dRW = 145,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage1dArrayRW = 146,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage1dBufferRW = 147,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dRW = 148,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayRW = 149,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dDepthRW = 150,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayDepthRW = 151,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dMSAARW = 152,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayMSAARW = 153,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dMSAADepthRW = 154,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage2dArrayMSAADepthRW = 155,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLImage3dRW = 156,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLSampler = 157,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLEvent = 158,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLQueue = 159,
+        /// Only produced by `libclang` 5.0 and later.
+        const CXType_OCLReserveID = 160,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_ObjCObject = 161,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_ObjCTypeParam = 162,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_Attributed = 163,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCMcePayload = 164,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCImePayload = 165,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCRefPayload = 166,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCSicPayload = 167,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCMceResult = 168,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCImeResult = 169,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCRefResult = 170,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCSicResult = 171,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCImeResultSingleRefStreamout = 172,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCImeResultDualRefStreamout = 173,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCImeSingleRefStreamin = 174,
+        /// Only produced by `libclang` 8.0 and later.
+        const CXType_OCLIntelSubgroupAVCImeDualRefStreamin = 175,
+        /// Only produced by `libclang` 9.0 and later.
+        const CXType_ExtVector = 176,
+    }
+}
+
+cenum! {
+    enum CXTypeLayoutError {
+        const CXTypeLayoutError_Invalid = -1,
+        const CXTypeLayoutError_Incomplete = -2,
+        const CXTypeLayoutError_Dependent = -3,
+        const CXTypeLayoutError_NotConstantSize = -4,
+        const CXTypeLayoutError_InvalidFieldName = -5,
+        /// Only produced by `libclang` 9.0 and later.
+        const CXTypeLayoutError_Undeduced = -6,
+    }
+}
+
+cenum! {
+    /// Only available on `libclang` 3.8 and later.
+    #[cfg(feature = "gte_clang_3_8")]
+    enum CXVisibilityKind {
+        const CXVisibility_Invalid = 0,
+        const CXVisibility_Hidden = 1,
+        const CXVisibility_Protected = 2,
+        const CXVisibility_Default = 3,
+    }
+}
+
+cenum! {
+    /// Only available on `libclang` 8.0 and later.
+    #[cfg(feature = "gte_clang_8_0")]
+    enum CXTypeNullabilityKind {
+        const CXTypeNullability_NonNull = 0,
+        const CXTypeNullability_Nullable = 1,
+        const CXTypeNullability_Unspecified = 2,
+        const CXTypeNullability_Invalid = 3,
+    }
+}
+
+cenum! {
+    enum CXVisitorResult {
+        const CXVisit_Break = 0,
+        const CXVisit_Continue = 1,
+    }
+}
+
+cenum! {
+    enum CX_CXXAccessSpecifier {
+        const CX_CXXInvalidAccessSpecifier = 0,
+        const CX_CXXPublic = 1,
+        const CX_CXXProtected = 2,
+        const CX_CXXPrivate = 3,
+    }
+}
+
+cenum! {
+    /// Only available on `libclang` 3.6 and later.
+    #[cfg(feature = "gte_clang_3_6")]
+    enum CX_StorageClass {
+        const CX_SC_Invalid = 0,
+        const CX_SC_None = 1,
+        const CX_SC_Extern = 2,
+        const CX_SC_Static = 3,
+        const CX_SC_PrivateExtern = 4,
+        const CX_SC_OpenCLWorkGroupLocal = 5,
+        const CX_SC_Auto = 6,
+        const CX_SC_Register = 7,
+    }
+}
+
+//================================================
+// Flags
+//================================================
+
+cenum! {
+    enum CXCodeComplete_Flags {
+        const CXCodeComplete_IncludeMacros = 1;
+        const CXCodeComplete_IncludeCodePatterns = 2;
+        const CXCodeComplete_IncludeBriefComments = 4;
+        const CXCodeComplete_SkipPreamble = 8;
+        const CXCodeComplete_IncludeCompletionsWithFixIts = 16;
+    }
+}
+
+cenum! {
+    enum CXCompletionContext {
+        const CXCompletionContext_Unexposed = 0;
+        const CXCompletionContext_AnyType = 1;
+        const CXCompletionContext_AnyValue = 2;
+        const CXCompletionContext_ObjCObjectValue = 4;
+        const CXCompletionContext_ObjCSelectorValue = 8;
+        const CXCompletionContext_CXXClassTypeValue = 16;
+        const CXCompletionContext_DotMemberAccess = 32;
+        const CXCompletionContext_ArrowMemberAccess = 64;
+        const CXCompletionContext_ObjCPropertyAccess = 128;
+        const CXCompletionContext_EnumTag = 256;
+        const CXCompletionContext_UnionTag = 512;
+        const CXCompletionContext_StructTag = 1024;
+        const CXCompletionContext_ClassTag = 2048;
+        const CXCompletionContext_Namespace = 4096;
+        const CXCompletionContext_NestedNameSpecifier = 8192;
+        const CXCompletionContext_ObjCInterface = 16384;
+        const CXCompletionContext_ObjCProtocol = 32768;
+        const CXCompletionContext_ObjCCategory = 65536;
+        const CXCompletionContext_ObjCInstanceMessage = 131072;
+        const CXCompletionContext_ObjCClassMessage = 262144;
+        const CXCompletionContext_ObjCSelectorName = 524288;
+        const CXCompletionContext_MacroName = 1048576;
+        const CXCompletionContext_NaturalLanguage = 2097152;
+        const CXCompletionContext_IncludedFile = 4194304;
+        const CXCompletionContext_Unknown = 8388607;
+    }
+}
+
+cenum! {
+    enum CXDiagnosticDisplayOptions {
+        const CXDiagnostic_DisplaySourceLocation = 1;
+        const CXDiagnostic_DisplayColumn = 2;
+        const CXDiagnostic_DisplaySourceRanges = 4;
+        const CXDiagnostic_DisplayOption = 8;
+        const CXDiagnostic_DisplayCategoryId = 16;
+        const CXDiagnostic_DisplayCategoryName = 32;
+    }
+}
+
+cenum! {
+    enum CXGlobalOptFlags {
+        const CXGlobalOpt_None = 0;
+        const CXGlobalOpt_ThreadBackgroundPriorityForIndexing = 1;
+        const CXGlobalOpt_ThreadBackgroundPriorityForEditing = 2;
+        const CXGlobalOpt_ThreadBackgroundPriorityForAll = 3;
+    }
+}
+
+cenum! {
+    enum CXIdxDeclInfoFlags {
+        const CXIdxDeclFlag_Skipped = 1;
+    }
+}
+
+cenum! {
+    enum CXIndexOptFlags {
+        const CXIndexOptNone = 0;
+        const CXIndexOptSuppressRedundantRefs = 1;
+        const CXIndexOptIndexFunctionLocalSymbols = 2;
+        const CXIndexOptIndexImplicitTemplateInstantiations = 4;
+        const CXIndexOptSuppressWarnings = 8;
+        const CXIndexOptSkipParsedBodiesInSession = 16;
+    }
+}
+
+cenum! {
+    enum CXNameRefFlags {
+        const CXNameRange_WantQualifier = 1;
+        const CXNameRange_WantTemplateArgs = 2;
+        const CXNameRange_WantSinglePiece = 4;
+    }
+}
+
+cenum! {
+    enum CXObjCDeclQualifierKind {
+        const CXObjCDeclQualifier_None = 0;
+        const CXObjCDeclQualifier_In = 1;
+        const CXObjCDeclQualifier_Inout = 2;
+        const CXObjCDeclQualifier_Out = 4;
+        const CXObjCDeclQualifier_Bycopy = 8;
+        const CXObjCDeclQualifier_Byref = 16;
+        const CXObjCDeclQualifier_Oneway = 32;
+    }
+}
+
+cenum! {
+    enum CXObjCPropertyAttrKind {
+        const CXObjCPropertyAttr_noattr = 0;
+        const CXObjCPropertyAttr_readonly = 1;
+        const CXObjCPropertyAttr_getter = 2;
+        const CXObjCPropertyAttr_assign = 4;
+        const CXObjCPropertyAttr_readwrite = 8;
+        const CXObjCPropertyAttr_retain = 16;
+        const CXObjCPropertyAttr_copy = 32;
+        const CXObjCPropertyAttr_nonatomic = 64;
+        const CXObjCPropertyAttr_setter = 128;
+        const CXObjCPropertyAttr_atomic = 256;
+        const CXObjCPropertyAttr_weak = 512;
+        const CXObjCPropertyAttr_strong = 1024;
+        const CXObjCPropertyAttr_unsafe_unretained = 2048;
+        /// Only available on `libclang` 3.9 and later.
+        #[cfg(feature = "gte_clang_3_9")]
+        const CXObjCPropertyAttr_class = 4096;
+    }
+}
+
+cenum! {
+    enum CXReparse_Flags {
+        const CXReparse_None = 0;
+    }
+}
+
+cenum! {
+    enum CXSaveTranslationUnit_Flags {
+        const CXSaveTranslationUnit_None = 0;
+    }
+}
+
+cenum! {
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    enum CXSymbolRole {
+        const CXSymbolRole_None = 0;
+        const CXSymbolRole_Declaration = 1;
+        const CXSymbolRole_Definition = 2;
+        const CXSymbolRole_Reference = 4;
+        const CXSymbolRole_Read = 8;
+        const CXSymbolRole_Write = 16;
+        const CXSymbolRole_Call = 32;
+        const CXSymbolRole_Dynamic = 64;
+        const CXSymbolRole_AddressOf = 128;
+        const CXSymbolRole_Implicit = 256;
+    }
+}
+
+cenum! {
+    enum CXTranslationUnit_Flags {
+        const CXTranslationUnit_None = 0;
+        const CXTranslationUnit_DetailedPreprocessingRecord = 1;
+        const CXTranslationUnit_Incomplete = 2;
+        const CXTranslationUnit_PrecompiledPreamble = 4;
+        const CXTranslationUnit_CacheCompletionResults = 8;
+        const CXTranslationUnit_ForSerialization = 16;
+        const CXTranslationUnit_CXXChainedPCH = 32;
+        const CXTranslationUnit_SkipFunctionBodies = 64;
+        const CXTranslationUnit_IncludeBriefCommentsInCodeCompletion = 128;
+        /// Only available on `libclang` 3.8 and later.
+        #[cfg(feature = "gte_clang_3_8")]
+        const CXTranslationUnit_CreatePreambleOnFirstParse = 256;
+        /// Only available on `libclang` 3.9 and later.
+        #[cfg(feature = "gte_clang_3_9")]
+        const CXTranslationUnit_KeepGoing = 512;
+        /// Only available on `libclang` 5.0 and later.
+        #[cfg(feature = "gte_clang_5_0")]
+        const CXTranslationUnit_SingleFileParse = 1024;
+        /// Only available on `libclang` 7.0 and later.
+        #[cfg(feature = "gte_clang_7_0")]
+        const CXTranslationUnit_LimitSkipFunctionBodiesToPreamble = 2048;
+        /// Only available on `libclang` 8.0 and later.
+        #[cfg(feature = "gte_clang_8_0")]
+        const CXTranslationUnit_IncludeAttributedTypes = 4096;
+        /// Only available on `libclang` 8.0 and later.
+        #[cfg(feature = "gte_clang_8_0")]
+        const CXTranslationUnit_VisitImplicitAttributes = 8192;
+        /// Only available on `libclang` 9.0 and later.
+        #[cfg(feature = "gte_clang_9_0")]
+        const CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles = 16384;
+    }
+}
+
+//================================================
+// Structs
+//================================================
+
+// Opaque ________________________________________
+
+macro_rules! opaque {
+    ($name:ident) => {
+        pub type $name = *mut c_void;
+    };
+}
+
+opaque!(CXCompilationDatabase);
+opaque!(CXCompileCommand);
+opaque!(CXCompileCommands);
+opaque!(CXCompletionString);
+opaque!(CXCursorSet);
+opaque!(CXDiagnostic);
+opaque!(CXDiagnosticSet);
+#[cfg(feature = "gte_clang_3_9")]
+opaque!(CXEvalResult);
+opaque!(CXFile);
+opaque!(CXIdxClientASTFile);
+opaque!(CXIdxClientContainer);
+opaque!(CXIdxClientEntity);
+opaque!(CXIdxClientFile);
+opaque!(CXIndex);
+opaque!(CXIndexAction);
+opaque!(CXModule);
+#[cfg(feature = "gte_clang_7_0")]
+opaque!(CXPrintingPolicy);
+opaque!(CXRemapping);
+#[cfg(feature = "gte_clang_5_0")]
+opaque!(CXTargetInfo);
+opaque!(CXTranslationUnit);
+
+// Transparent ___________________________________
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXCodeCompleteResults {
+    pub Results: *mut CXCompletionResult,
+    pub NumResults: c_uint,
+}
+
+default!(CXCodeCompleteResults);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXComment {
+    pub ASTNode: *const c_void,
+    pub TranslationUnit: CXTranslationUnit,
+}
+
+default!(CXComment);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXCompletionResult {
+    pub CursorKind: CXCursorKind,
+    pub CompletionString: CXCompletionString,
+}
+
+default!(CXCompletionResult);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXCursor {
+    pub kind: CXCursorKind,
+    pub xdata: c_int,
+    pub data: [*const c_void; 3],
+}
+
+default!(CXCursor);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXCursorAndRangeVisitor {
+    pub context: *mut c_void,
+    pub visit: Option<extern "C" fn(*mut c_void, CXCursor, CXSourceRange) -> CXVisitorResult>,
+}
+
+default!(CXCursorAndRangeVisitor);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXFileUniqueID {
+    pub data: [c_ulonglong; 3],
+}
+
+default!(CXFileUniqueID);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxAttrInfo {
+    pub kind: CXIdxAttrKind,
+    pub cursor: CXCursor,
+    pub loc: CXIdxLoc,
+}
+
+default!(CXIdxAttrInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxBaseClassInfo {
+    pub base: *const CXIdxEntityInfo,
+    pub cursor: CXCursor,
+    pub loc: CXIdxLoc,
+}
+
+default!(CXIdxBaseClassInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxCXXClassDeclInfo {
+    pub declInfo: *const CXIdxDeclInfo,
+    pub bases: *const *const CXIdxBaseClassInfo,
+    pub numBases: c_uint,
+}
+
+default!(CXIdxCXXClassDeclInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxContainerInfo {
+    pub cursor: CXCursor,
+}
+
+default!(CXIdxContainerInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxDeclInfo {
+    pub entityInfo: *const CXIdxEntityInfo,
+    pub cursor: CXCursor,
+    pub loc: CXIdxLoc,
+    pub semanticContainer: *const CXIdxContainerInfo,
+    pub lexicalContainer: *const CXIdxContainerInfo,
+    pub isRedeclaration: c_int,
+    pub isDefinition: c_int,
+    pub isContainer: c_int,
+    pub declAsContainer: *const CXIdxContainerInfo,
+    pub isImplicit: c_int,
+    pub attributes: *const *const CXIdxAttrInfo,
+    pub numAttributes: c_uint,
+    pub flags: c_uint,
+}
+
+default!(CXIdxDeclInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxEntityInfo {
+    pub kind: CXIdxEntityKind,
+    pub templateKind: CXIdxEntityCXXTemplateKind,
+    pub lang: CXIdxEntityLanguage,
+    pub name: *const c_char,
+    pub USR: *const c_char,
+    pub cursor: CXCursor,
+    pub attributes: *const *const CXIdxAttrInfo,
+    pub numAttributes: c_uint,
+}
+
+default!(CXIdxEntityInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxEntityRefInfo {
+    pub kind: CXIdxEntityRefKind,
+    pub cursor: CXCursor,
+    pub loc: CXIdxLoc,
+    pub referencedEntity: *const CXIdxEntityInfo,
+    pub parentEntity: *const CXIdxEntityInfo,
+    pub container: *const CXIdxContainerInfo,
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    pub role: CXSymbolRole,
+}
+
+default!(CXIdxEntityRefInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxIBOutletCollectionAttrInfo {
+    pub attrInfo: *const CXIdxAttrInfo,
+    pub objcClass: *const CXIdxEntityInfo,
+    pub classCursor: CXCursor,
+    pub classLoc: CXIdxLoc,
+}
+
+default!(CXIdxIBOutletCollectionAttrInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxImportedASTFileInfo {
+    pub file: CXFile,
+    pub module: CXModule,
+    pub loc: CXIdxLoc,
+    pub isImplicit: c_int,
+}
+
+default!(CXIdxImportedASTFileInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxIncludedFileInfo {
+    pub hashLoc: CXIdxLoc,
+    pub filename: *const c_char,
+    pub file: CXFile,
+    pub isImport: c_int,
+    pub isAngled: c_int,
+    pub isModuleImport: c_int,
+}
+
+default!(CXIdxIncludedFileInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxLoc {
+    pub ptr_data: [*mut c_void; 2],
+    pub int_data: c_uint,
+}
+
+default!(CXIdxLoc);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxObjCCategoryDeclInfo {
+    pub containerInfo: *const CXIdxObjCContainerDeclInfo,
+    pub objcClass: *const CXIdxEntityInfo,
+    pub classCursor: CXCursor,
+    pub classLoc: CXIdxLoc,
+    pub protocols: *const CXIdxObjCProtocolRefListInfo,
+}
+
+default!(CXIdxObjCCategoryDeclInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxObjCContainerDeclInfo {
+    pub declInfo: *const CXIdxDeclInfo,
+    pub kind: CXIdxObjCContainerKind,
+}
+
+default!(CXIdxObjCContainerDeclInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxObjCInterfaceDeclInfo {
+    pub containerInfo: *const CXIdxObjCContainerDeclInfo,
+    pub superInfo: *const CXIdxBaseClassInfo,
+    pub protocols: *const CXIdxObjCProtocolRefListInfo,
+}
+
+default!(CXIdxObjCInterfaceDeclInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxObjCPropertyDeclInfo {
+    pub declInfo: *const CXIdxDeclInfo,
+    pub getter: *const CXIdxEntityInfo,
+    pub setter: *const CXIdxEntityInfo,
+}
+
+default!(CXIdxObjCPropertyDeclInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxObjCProtocolRefInfo {
+    pub protocol: *const CXIdxEntityInfo,
+    pub cursor: CXCursor,
+    pub loc: CXIdxLoc,
+}
+
+default!(CXIdxObjCProtocolRefInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXIdxObjCProtocolRefListInfo {
+    pub protocols: *const *const CXIdxObjCProtocolRefInfo,
+    pub numProtocols: c_uint,
+}
+
+default!(CXIdxObjCProtocolRefListInfo);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXPlatformAvailability {
+    pub Platform: CXString,
+    pub Introduced: CXVersion,
+    pub Deprecated: CXVersion,
+    pub Obsoleted: CXVersion,
+    pub Unavailable: c_int,
+    pub Message: CXString,
+}
+
+default!(CXPlatformAvailability);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXSourceLocation {
+    pub ptr_data: [*const c_void; 2],
+    pub int_data: c_uint,
+}
+
+default!(CXSourceLocation);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXSourceRange {
+    pub ptr_data: [*const c_void; 2],
+    pub begin_int_data: c_uint,
+    pub end_int_data: c_uint,
+}
+
+default!(CXSourceRange);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXSourceRangeList {
+    pub count: c_uint,
+    pub ranges: *mut CXSourceRange,
+}
+
+default!(CXSourceRangeList);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXString {
+    pub data: *const c_void,
+    pub private_flags: c_uint,
+}
+
+default!(CXString);
+
+#[cfg(feature = "gte_clang_3_8")]
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXStringSet {
+    pub Strings: *mut CXString,
+    pub Count: c_uint,
+}
+
+#[cfg(feature = "gte_clang_3_8")]
+default!(CXStringSet);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXTUResourceUsage {
+    pub data: *mut c_void,
+    pub numEntries: c_uint,
+    pub entries: *mut CXTUResourceUsageEntry,
+}
+
+default!(CXTUResourceUsage);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXTUResourceUsageEntry {
+    pub kind: CXTUResourceUsageKind,
+    pub amount: c_ulong,
+}
+
+default!(CXTUResourceUsageEntry);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXToken {
+    pub int_data: [c_uint; 4],
+    pub ptr_data: *mut c_void,
+}
+
+default!(CXToken);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXType {
+    pub kind: CXTypeKind,
+    pub data: [*mut c_void; 2],
+}
+
+default!(CXType);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXUnsavedFile {
+    pub Filename: *const c_char,
+    pub Contents: *const c_char,
+    pub Length: c_ulong,
+}
+
+default!(CXUnsavedFile);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+pub struct CXVersion {
+    pub Major: c_int,
+    pub Minor: c_int,
+    pub Subminor: c_int,
+}
+
+default!(CXVersion);
+
+#[derive(Copy, Clone, Debug)]
+#[repr(C)]
+#[rustfmt::skip]
+pub struct IndexerCallbacks {
+    pub abortQuery: Option<extern "C" fn(CXClientData, *mut c_void) -> c_int>,
+    pub diagnostic: Option<extern "C" fn(CXClientData, CXDiagnosticSet, *mut c_void)>,
+    pub enteredMainFile: Option<extern "C" fn(CXClientData, CXFile, *mut c_void) -> CXIdxClientFile>,
+    pub ppIncludedFile: Option<extern "C" fn(CXClientData, *const CXIdxIncludedFileInfo) -> CXIdxClientFile>,
+    pub importedASTFile: Option<extern "C" fn(CXClientData, *const CXIdxImportedASTFileInfo) -> CXIdxClientASTFile>,
+    pub startedTranslationUnit: Option<extern "C" fn(CXClientData, *mut c_void) -> CXIdxClientContainer>,
+    pub indexDeclaration: Option<extern "C" fn(CXClientData, *const CXIdxDeclInfo)>,
+    pub indexEntityReference: Option<extern "C" fn(CXClientData, *const CXIdxEntityRefInfo)>,
+}
+
+default!(IndexerCallbacks);
+
+//================================================
+// Functions
+//================================================
+
+link! {
+    pub fn clang_CXCursorSet_contains(set: CXCursorSet, cursor: CXCursor) -> c_uint;
+    pub fn clang_CXCursorSet_insert(set: CXCursorSet, cursor: CXCursor) -> c_uint;
+    pub fn clang_CXIndex_getGlobalOptions(index: CXIndex) -> CXGlobalOptFlags;
+    pub fn clang_CXIndex_setGlobalOptions(index: CXIndex, flags: CXGlobalOptFlags);
+    /// Only available on `libclang` 6.0 and later.
+    #[cfg(feature = "gte_clang_6_0")]
+    pub fn clang_CXIndex_setInvocationEmissionPathOption(index: CXIndex, path: *const c_char);
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_CXXConstructor_isConvertingConstructor(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_CXXConstructor_isCopyConstructor(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_CXXConstructor_isDefaultConstructor(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_CXXConstructor_isMoveConstructor(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 3.8 and later.
+    #[cfg(feature = "gte_clang_3_8")]
+    pub fn clang_CXXField_isMutable(cursor: CXCursor) -> c_uint;
+    pub fn clang_CXXMethod_isConst(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_CXXMethod_isDefaulted(cursor: CXCursor) -> c_uint;
+    pub fn clang_CXXMethod_isPureVirtual(cursor: CXCursor) -> c_uint;
+    pub fn clang_CXXMethod_isStatic(cursor: CXCursor) -> c_uint;
+    pub fn clang_CXXMethod_isVirtual(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 6.0 and later.
+    #[cfg(feature = "gte_clang_6_0")]
+    pub fn clang_CXXRecord_isAbstract(cursor: CXCursor) -> c_uint;
+    pub fn clang_CompilationDatabase_dispose(database: CXCompilationDatabase);
+    pub fn clang_CompilationDatabase_fromDirectory(directory: *const c_char, error: *mut CXCompilationDatabase_Error) -> CXCompilationDatabase;
+    pub fn clang_CompilationDatabase_getAllCompileCommands(database: CXCompilationDatabase) -> CXCompileCommands;
+    pub fn clang_CompilationDatabase_getCompileCommands(database: CXCompilationDatabase, filename: *const c_char) -> CXCompileCommands;
+    pub fn clang_CompileCommand_getArg(command: CXCompileCommand, index: c_uint) -> CXString;
+    pub fn clang_CompileCommand_getDirectory(command: CXCompileCommand) -> CXString;
+    /// Only available on `libclang` 3.8 and later.
+    #[cfg(feature = "gte_clang_3_8")]
+    pub fn clang_CompileCommand_getFilename(command: CXCompileCommand) -> CXString;
+    /// Only available on `libclang` 3.8 and later.
+    #[cfg(feature = "gte_clang_3_8")]
+    pub fn clang_CompileCommand_getMappedSourceContent(command: CXCompileCommand, index: c_uint) -> CXString;
+    /// Only available on `libclang` 3.8 and later.
+    #[cfg(feature = "gte_clang_3_8")]
+    pub fn clang_CompileCommand_getMappedSourcePath(command: CXCompileCommand, index: c_uint) -> CXString;
+    pub fn clang_CompileCommand_getNumArgs(command: CXCompileCommand) -> c_uint;
+    pub fn clang_CompileCommand_getNumMappedSources(command: CXCompileCommand) -> c_uint;
+    pub fn clang_CompileCommands_dispose(command: CXCompileCommands);
+    pub fn clang_CompileCommands_getCommand(command: CXCompileCommands, index: c_uint) -> CXCompileCommand;
+    pub fn clang_CompileCommands_getSize(command: CXCompileCommands) -> c_uint;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_Cursor_Evaluate(cursor: CXCursor) -> CXEvalResult;
+    pub fn clang_Cursor_getArgument(cursor: CXCursor, index: c_uint) -> CXCursor;
+    pub fn clang_Cursor_getBriefCommentText(cursor: CXCursor) -> CXString;
+    /// Only available on `libclang` 3.8 and later.
+    #[cfg(feature = "gte_clang_3_8")]
+    pub fn clang_Cursor_getCXXManglings(cursor: CXCursor) -> *mut CXStringSet;
+    pub fn clang_Cursor_getCommentRange(cursor: CXCursor) -> CXSourceRange;
+    /// Only available on `libclang` 3.6 and later.
+    #[cfg(feature = "gte_clang_3_6")]
+    pub fn clang_Cursor_getMangling(cursor: CXCursor) -> CXString;
+    pub fn clang_Cursor_getModule(cursor: CXCursor) -> CXModule;
+    pub fn clang_Cursor_getNumArguments(cursor: CXCursor) -> c_int;
+    /// Only available on `libclang` 3.6 and later.
+    #[cfg(feature = "gte_clang_3_6")]
+    pub fn clang_Cursor_getNumTemplateArguments(cursor: CXCursor) -> c_int;
+    pub fn clang_Cursor_getObjCDeclQualifiers(cursor: CXCursor) -> CXObjCDeclQualifierKind;
+    /// Only available on `libclang` 6.0 and later.
+    #[cfg(feature = "gte_clang_6_0")]
+    pub fn clang_Cursor_getObjCManglings(cursor: CXCursor) -> *mut CXStringSet;
+    pub fn clang_Cursor_getObjCPropertyAttributes(cursor: CXCursor, reserved: c_uint) -> CXObjCPropertyAttrKind;
+    /// Only available on `libclang` 8.0 and later.
+    #[cfg(feature = "gte_clang_8_0")]
+    pub fn clang_Cursor_getObjCPropertyGetterName(cursor: CXCursor) -> CXString;
+    /// Only available on `libclang` 8.0 and later.
+    #[cfg(feature = "gte_clang_8_0")]
+    pub fn clang_Cursor_getObjCPropertySetterName(cursor: CXCursor) -> CXString;
+    pub fn clang_Cursor_getObjCSelectorIndex(cursor: CXCursor) -> c_int;
+    /// Only available on `libclang` 3.7 and later.
+    #[cfg(feature = "gte_clang_3_7")]
+    pub fn clang_Cursor_getOffsetOfField(cursor: CXCursor) -> c_longlong;
+    /// Only available on `libclang` 9.0 and later.
+    #[cfg(feature = "gte_clang_9_0")]
+    pub fn clang_Cursor_isAnonymousRecordDecl(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 9.0 and later.
+    #[cfg(feature = "gte_clang_9_0")]
+    pub fn clang_Cursor_isInlineNamespace(cursor: CXCursor) -> c_uint;
+    pub fn clang_Cursor_getRawCommentText(cursor: CXCursor) -> CXString;
+    pub fn clang_Cursor_getReceiverType(cursor: CXCursor) -> CXType;
+    pub fn clang_Cursor_getSpellingNameRange(cursor: CXCursor, index: c_uint, reserved: c_uint) -> CXSourceRange;
+    /// Only available on `libclang` 3.6 and later.
+    #[cfg(feature = "gte_clang_3_6")]
+    pub fn clang_Cursor_getStorageClass(cursor: CXCursor) -> CX_StorageClass;
+    /// Only available on `libclang` 3.6 and later.
+    #[cfg(feature = "gte_clang_3_6")]
+    pub fn clang_Cursor_getTemplateArgumentKind(cursor: CXCursor, index: c_uint) -> CXTemplateArgumentKind;
+    /// Only available on `libclang` 3.6 and later.
+    #[cfg(feature = "gte_clang_3_6")]
+    pub fn clang_Cursor_getTemplateArgumentType(cursor: CXCursor, index: c_uint) -> CXType;
+    /// Only available on `libclang` 3.6 and later.
+    #[cfg(feature = "gte_clang_3_6")]
+    pub fn clang_Cursor_getTemplateArgumentUnsignedValue(cursor: CXCursor, index: c_uint) -> c_ulonglong;
+    /// Only available on `libclang` 3.6 and later.
+    #[cfg(feature = "gte_clang_3_6")]
+    pub fn clang_Cursor_getTemplateArgumentValue(cursor: CXCursor, index: c_uint) -> c_longlong;
+    pub fn clang_Cursor_getTranslationUnit(cursor: CXCursor) -> CXTranslationUnit;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_Cursor_hasAttrs(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 3.7 and later.
+    #[cfg(feature = "gte_clang_3_7")]
+    pub fn clang_Cursor_isAnonymous(cursor: CXCursor) -> c_uint;
+    pub fn clang_Cursor_isBitField(cursor: CXCursor) -> c_uint;
+    pub fn clang_Cursor_isDynamicCall(cursor: CXCursor) -> c_int;
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_Cursor_isExternalSymbol(cursor: CXCursor, language: *mut CXString, from: *mut CXString, generated: *mut c_uint) -> c_uint;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_Cursor_isFunctionInlined(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_Cursor_isMacroBuiltin(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_Cursor_isMacroFunctionLike(cursor: CXCursor) -> c_uint;
+    pub fn clang_Cursor_isNull(cursor: CXCursor) -> c_int;
+    pub fn clang_Cursor_isObjCOptional(cursor: CXCursor) -> c_uint;
+    pub fn clang_Cursor_isVariadic(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_EnumDecl_isScoped(cursor: CXCursor) -> c_uint;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_EvalResult_dispose(result: CXEvalResult);
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_EvalResult_getAsDouble(result: CXEvalResult) -> libc::c_double;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_EvalResult_getAsInt(result: CXEvalResult) -> c_int;
+    /// Only available on `libclang` 4.0 and later.
+    #[cfg(feature = "gte_clang_4_0")]
+    pub fn clang_EvalResult_getAsLongLong(result: CXEvalResult) -> c_longlong;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_EvalResult_getAsStr(result: CXEvalResult) -> *const c_char;
+    /// Only available on `libclang` 4.0 and later.
+    #[cfg(feature = "gte_clang_4_0")]
+    pub fn clang_EvalResult_getAsUnsigned(result: CXEvalResult) -> c_ulonglong;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_EvalResult_getKind(result: CXEvalResult) -> CXEvalResultKind;
+    /// Only available on `libclang` 4.0 and later.
+    #[cfg(feature = "gte_clang_4_0")]
+    pub fn clang_EvalResult_isUnsignedInt(result: CXEvalResult) -> c_uint;
+    /// Only available on `libclang` 3.6 and later.
+    #[cfg(feature = "gte_clang_3_6")]
+    pub fn clang_File_isEqual(left: CXFile, right: CXFile) -> c_int;
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    pub fn clang_File_tryGetRealPathName(file: CXFile) -> CXString;
+    pub fn clang_IndexAction_create(index: CXIndex) -> CXIndexAction;
+    pub fn clang_IndexAction_dispose(index: CXIndexAction);
+    pub fn clang_Location_isFromMainFile(location: CXSourceLocation) -> c_int;
+    pub fn clang_Location_isInSystemHeader(location: CXSourceLocation) -> c_int;
+    pub fn clang_Module_getASTFile(module: CXModule) -> CXFile;
+    pub fn clang_Module_getFullName(module: CXModule) -> CXString;
+    pub fn clang_Module_getName(module: CXModule) -> CXString;
+    pub fn clang_Module_getNumTopLevelHeaders(tu: CXTranslationUnit, module: CXModule) -> c_uint;
+    pub fn clang_Module_getParent(module: CXModule) -> CXModule;
+    pub fn clang_Module_getTopLevelHeader(tu: CXTranslationUnit, module: CXModule, index: c_uint) -> CXFile;
+    pub fn clang_Module_isSystem(module: CXModule) -> c_int;
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    pub fn clang_PrintingPolicy_dispose(policy: CXPrintingPolicy);
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    pub fn clang_PrintingPolicy_getProperty(policy: CXPrintingPolicy, property: CXPrintingPolicyProperty) -> c_uint;
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    pub fn clang_PrintingPolicy_setProperty(policy: CXPrintingPolicy, property: CXPrintingPolicyProperty, value: c_uint);
+    pub fn clang_Range_isNull(range: CXSourceRange) -> c_int;
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_TargetInfo_dispose(info: CXTargetInfo);
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_TargetInfo_getPointerWidth(info: CXTargetInfo) -> c_int;
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_TargetInfo_getTriple(info: CXTargetInfo) -> CXString;
+    pub fn clang_Type_getAlignOf(type_: CXType) -> c_longlong;
+    pub fn clang_Type_getCXXRefQualifier(type_: CXType) -> CXRefQualifierKind;
+    pub fn clang_Type_getClassType(type_: CXType) -> CXType;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_Type_getNamedType(type_: CXType) -> CXType;
+    pub fn clang_Type_getNumTemplateArguments(type_: CXType) -> c_int;
+    /// Only available on `libclang` 8.0 and later.
+    #[cfg(feature = "gte_clang_8_0")]
+    pub fn clang_Type_getObjCObjectBaseType(type_: CXType) -> CXType;
+    /// Only available on `libclang` 8.0 and later.
+    #[cfg(feature = "gte_clang_8_0")]
+    pub fn clang_Type_getNumObjCProtocolRefs(type_: CXType) -> c_uint;
+    /// Only available on `libclang` 8.0 and later.
+    #[cfg(feature = "gte_clang_8_0")]
+    pub fn clang_Type_getObjCProtocolDecl(type_: CXType, index: c_uint) -> CXCursor;
+    /// Only available on `libclang` 8.0 and later.
+    #[cfg(feature = "gte_clang_8_0")]
+    pub fn clang_Type_getNumObjCTypeArgs(type_: CXType) -> c_uint;
+    /// Only available on `libclang` 8.0 and later.
+    #[cfg(feature = "gte_clang_8_0")]
+    pub fn clang_Type_getObjCTypeArg(type_: CXType, index: c_uint) -> CXType;
+    /// Only available on `libclang` 3.9 and later.
+    #[cfg(feature = "gte_clang_3_9")]
+    pub fn clang_Type_getObjCEncoding(type_: CXType) -> CXString;
+    pub fn clang_Type_getOffsetOf(type_: CXType, field: *const c_char) -> c_longlong;
+    /// Only available on `libclang` 8.0 and later.
+    #[cfg(feature = "gte_clang_8_0")]
+    pub fn clang_Type_getModifiedType(type_: CXType) -> CXType;
+    pub fn clang_Type_getSizeOf(type_: CXType) -> c_longlong;
+    pub fn clang_Type_getTemplateArgumentAsType(type_: CXType, index: c_uint) -> CXType;
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_Type_isTransparentTagTypedef(type_: CXType) -> c_uint;
+    /// Only available on `libclang` 8.0 and later.
+    #[cfg(feature = "gte_clang_8_0")]
+    pub fn clang_Type_getNullability(type_: CXType) -> CXTypeNullabilityKind;
+    /// Only available on `libclang` 3.7 and later.
+    #[cfg(feature = "gte_clang_3_7")]
+    pub fn clang_Type_visitFields(type_: CXType, visitor: CXFieldVisitor, data: CXClientData) -> CXVisitorResult;
+    pub fn clang_annotateTokens(tu: CXTranslationUnit, tokens: *mut CXToken, n_tokens: c_uint, cursors: *mut CXCursor);
+    pub fn clang_codeCompleteAt(tu: CXTranslationUnit, file: *const c_char, line: c_uint, column: c_uint, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXCodeComplete_Flags) -> *mut CXCodeCompleteResults;
+    pub fn clang_codeCompleteGetContainerKind(results: *mut CXCodeCompleteResults, incomplete: *mut c_uint) -> CXCursorKind;
+    pub fn clang_codeCompleteGetContainerUSR(results: *mut CXCodeCompleteResults) -> CXString;
+    pub fn clang_codeCompleteGetContexts(results: *mut CXCodeCompleteResults) -> c_ulonglong;
+    pub fn clang_codeCompleteGetDiagnostic(results: *mut CXCodeCompleteResults, index: c_uint) -> CXDiagnostic;
+    pub fn clang_codeCompleteGetNumDiagnostics(results: *mut CXCodeCompleteResults) -> c_uint;
+    pub fn clang_codeCompleteGetObjCSelector(results: *mut CXCodeCompleteResults) -> CXString;
+    pub fn clang_constructUSR_ObjCCategory(class: *const c_char, category: *const c_char) -> CXString;
+    pub fn clang_constructUSR_ObjCClass(class: *const c_char) -> CXString;
+    pub fn clang_constructUSR_ObjCIvar(name: *const c_char, usr: CXString) -> CXString;
+    pub fn clang_constructUSR_ObjCMethod(name: *const c_char, instance: c_uint, usr: CXString) -> CXString;
+    pub fn clang_constructUSR_ObjCProperty(property: *const c_char, usr: CXString) -> CXString;
+    pub fn clang_constructUSR_ObjCProtocol(protocol: *const c_char) -> CXString;
+    pub fn clang_createCXCursorSet() -> CXCursorSet;
+    pub fn clang_createIndex(exclude: c_int, display: c_int) -> CXIndex;
+    pub fn clang_createTranslationUnit(index: CXIndex, file: *const c_char) -> CXTranslationUnit;
+    pub fn clang_createTranslationUnit2(index: CXIndex, file: *const c_char, tu: *mut CXTranslationUnit) -> CXErrorCode;
+    pub fn clang_createTranslationUnitFromSourceFile(index: CXIndex, file: *const c_char, n_arguments: c_int, arguments: *const *const c_char, n_unsaved: c_uint, unsaved: *mut CXUnsavedFile) -> CXTranslationUnit;
+    pub fn clang_defaultCodeCompleteOptions() -> CXCodeComplete_Flags;
+    pub fn clang_defaultDiagnosticDisplayOptions() -> CXDiagnosticDisplayOptions;
+    pub fn clang_defaultEditingTranslationUnitOptions() -> CXTranslationUnit_Flags;
+    pub fn clang_defaultReparseOptions(tu: CXTranslationUnit) -> CXReparse_Flags;
+    pub fn clang_defaultSaveOptions(tu: CXTranslationUnit) -> CXSaveTranslationUnit_Flags;
+    pub fn clang_disposeCXCursorSet(set: CXCursorSet);
+    pub fn clang_disposeCXPlatformAvailability(availability: *mut CXPlatformAvailability);
+    pub fn clang_disposeCXTUResourceUsage(usage: CXTUResourceUsage);
+    pub fn clang_disposeCodeCompleteResults(results: *mut CXCodeCompleteResults);
+    pub fn clang_disposeDiagnostic(diagnostic: CXDiagnostic);
+    pub fn clang_disposeDiagnosticSet(diagnostic: CXDiagnosticSet);
+    pub fn clang_disposeIndex(index: CXIndex);
+    pub fn clang_disposeOverriddenCursors(cursors: *mut CXCursor);
+    pub fn clang_disposeSourceRangeList(list: *mut CXSourceRangeList);
+    pub fn clang_disposeString(string: CXString);
+    /// Only available on `libclang` 3.8 and later.
+    #[cfg(feature = "gte_clang_3_8")]
+    pub fn clang_disposeStringSet(set: *mut CXStringSet);
+    pub fn clang_disposeTokens(tu: CXTranslationUnit, tokens: *mut CXToken, n_tokens: c_uint);
+    pub fn clang_disposeTranslationUnit(tu: CXTranslationUnit);
+    pub fn clang_enableStackTraces();
+    pub fn clang_equalCursors(left: CXCursor, right: CXCursor) -> c_uint;
+    pub fn clang_equalLocations(left: CXSourceLocation, right: CXSourceLocation) -> c_uint;
+    pub fn clang_equalRanges(left: CXSourceRange, right: CXSourceRange) -> c_uint;
+    pub fn clang_equalTypes(left: CXType, right: CXType) -> c_uint;
+    pub fn clang_executeOnThread(function: extern fn(*mut c_void), data: *mut c_void, stack: c_uint);
+    pub fn clang_findIncludesInFile(tu: CXTranslationUnit, file: CXFile, cursor: CXCursorAndRangeVisitor) -> CXResult;
+    pub fn clang_findReferencesInFile(cursor: CXCursor, file: CXFile, visitor: CXCursorAndRangeVisitor) -> CXResult;
+    pub fn clang_formatDiagnostic(diagnostic: CXDiagnostic, flags: CXDiagnosticDisplayOptions) -> CXString;
+    /// Only available on `libclang` 3.7 and later.
+    #[cfg(feature = "gte_clang_3_7")]
+    pub fn clang_free(buffer: *mut c_void);
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_getAddressSpace(type_: CXType) -> c_uint;
+    /// Only available on `libclang` 4.0 and later.
+    #[cfg(feature = "gte_clang_4_0")]
+    pub fn clang_getAllSkippedRanges(tu: CXTranslationUnit) -> *mut CXSourceRangeList;
+    pub fn clang_getArgType(type_: CXType, index: c_uint) -> CXType;
+    pub fn clang_getArrayElementType(type_: CXType) -> CXType;
+    pub fn clang_getArraySize(type_: CXType) -> c_longlong;
+    pub fn clang_getCString(string: CXString) -> *const c_char;
+    pub fn clang_getCXTUResourceUsage(tu: CXTranslationUnit) -> CXTUResourceUsage;
+    pub fn clang_getCXXAccessSpecifier(cursor: CXCursor) -> CX_CXXAccessSpecifier;
+    pub fn clang_getCanonicalCursor(cursor: CXCursor) -> CXCursor;
+    pub fn clang_getCanonicalType(type_: CXType) -> CXType;
+    pub fn clang_getChildDiagnostics(diagnostic: CXDiagnostic) -> CXDiagnosticSet;
+    pub fn clang_getClangVersion() -> CXString;
+    pub fn clang_getCompletionAnnotation(string: CXCompletionString, index: c_uint) -> CXString;
+    pub fn clang_getCompletionAvailability(string: CXCompletionString) -> CXAvailabilityKind;
+    pub fn clang_getCompletionBriefComment(string: CXCompletionString) -> CXString;
+    pub fn clang_getCompletionChunkCompletionString(string: CXCompletionString, index: c_uint) -> CXCompletionString;
+    pub fn clang_getCompletionChunkKind(string: CXCompletionString, index: c_uint) -> CXCompletionChunkKind;
+    pub fn clang_getCompletionChunkText(string: CXCompletionString, index: c_uint) -> CXString;
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    pub fn clang_getCompletionFixIt(results: *mut CXCodeCompleteResults, completion_index: c_uint, fixit_index: c_uint, range: *mut CXSourceRange) -> CXString;
+    pub fn clang_getCompletionNumAnnotations(string: CXCompletionString) -> c_uint;
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    pub fn clang_getCompletionNumFixIts(results: *mut CXCodeCompleteResults, completion_index: c_uint) -> c_uint;
+    pub fn clang_getCompletionParent(string: CXCompletionString, kind: *mut CXCursorKind) -> CXString;
+    pub fn clang_getCompletionPriority(string: CXCompletionString) -> c_uint;
+    pub fn clang_getCursor(tu: CXTranslationUnit, location: CXSourceLocation) -> CXCursor;
+    pub fn clang_getCursorAvailability(cursor: CXCursor) -> CXAvailabilityKind;
+    pub fn clang_getCursorCompletionString(cursor: CXCursor) -> CXCompletionString;
+    pub fn clang_getCursorDefinition(cursor: CXCursor) -> CXCursor;
+    pub fn clang_getCursorDisplayName(cursor: CXCursor) -> CXString;
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_getCursorExceptionSpecificationType(cursor: CXCursor) -> CXCursor_ExceptionSpecificationKind;
+    pub fn clang_getCursorExtent(cursor: CXCursor) -> CXSourceRange;
+    pub fn clang_getCursorKind(cursor: CXCursor) -> CXCursorKind;
+    pub fn clang_getCursorKindSpelling(kind: CXCursorKind) -> CXString;
+    pub fn clang_getCursorLanguage(cursor: CXCursor) -> CXLanguageKind;
+    pub fn clang_getCursorLexicalParent(cursor: CXCursor) -> CXCursor;
+    pub fn clang_getCursorLinkage(cursor: CXCursor) -> CXLinkageKind;
+    pub fn clang_getCursorLocation(cursor: CXCursor) -> CXSourceLocation;
+    pub fn clang_getCursorPlatformAvailability(cursor: CXCursor, deprecated: *mut c_int, deprecated_message: *mut CXString, unavailable: *mut c_int, unavailable_message: *mut CXString, availability: *mut CXPlatformAvailability, n_availability: c_int) -> c_int;
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    pub fn clang_getCursorPrettyPrinted(cursor: CXCursor, policy: CXPrintingPolicy) -> CXString;
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    pub fn clang_getCursorPrintingPolicy(cursor: CXCursor) -> CXPrintingPolicy;
+    pub fn clang_getCursorReferenceNameRange(cursor: CXCursor, flags: CXNameRefFlags, index: c_uint) -> CXSourceRange;
+    pub fn clang_getCursorReferenced(cursor: CXCursor) -> CXCursor;
+    pub fn clang_getCursorResultType(cursor: CXCursor) -> CXType;
+    pub fn clang_getCursorSemanticParent(cursor: CXCursor) -> CXCursor;
+    pub fn clang_getCursorSpelling(cursor: CXCursor) -> CXString;
+    /// Only available on `libclang` 6.0 and later.
+    #[cfg(feature = "gte_clang_6_0")]
+    pub fn clang_getCursorTLSKind(cursor: CXCursor) -> CXTLSKind;
+    pub fn clang_getCursorType(cursor: CXCursor) -> CXType;
+    pub fn clang_getCursorUSR(cursor: CXCursor) -> CXString;
+    /// Only available on `libclang` 3.8 and later.
+    #[cfg(feature = "gte_clang_3_8")]
+    pub fn clang_getCursorVisibility(cursor: CXCursor) -> CXVisibilityKind;
+    pub fn clang_getDeclObjCTypeEncoding(cursor: CXCursor) -> CXString;
+    pub fn clang_getDefinitionSpellingAndExtent(cursor: CXCursor, start: *mut *const c_char, end: *mut *const c_char, start_line: *mut c_uint, start_column: *mut c_uint, end_line: *mut c_uint, end_column: *mut c_uint);
+    pub fn clang_getDiagnostic(tu: CXTranslationUnit, index: c_uint) -> CXDiagnostic;
+    pub fn clang_getDiagnosticCategory(diagnostic: CXDiagnostic) -> c_uint;
+    pub fn clang_getDiagnosticCategoryName(category: c_uint) -> CXString;
+    pub fn clang_getDiagnosticCategoryText(diagnostic: CXDiagnostic) -> CXString;
+    pub fn clang_getDiagnosticFixIt(diagnostic: CXDiagnostic, index: c_uint, range: *mut CXSourceRange) -> CXString;
+    pub fn clang_getDiagnosticInSet(diagnostic: CXDiagnosticSet, index: c_uint) -> CXDiagnostic;
+    pub fn clang_getDiagnosticLocation(diagnostic: CXDiagnostic) -> CXSourceLocation;
+    pub fn clang_getDiagnosticNumFixIts(diagnostic: CXDiagnostic) -> c_uint;
+    pub fn clang_getDiagnosticNumRanges(diagnostic: CXDiagnostic) -> c_uint;
+    pub fn clang_getDiagnosticOption(diagnostic: CXDiagnostic, option: *mut CXString) -> CXString;
+    pub fn clang_getDiagnosticRange(diagnostic: CXDiagnostic, index: c_uint) -> CXSourceRange;
+    pub fn clang_getDiagnosticSetFromTU(tu: CXTranslationUnit) -> CXDiagnosticSet;
+    pub fn clang_getDiagnosticSeverity(diagnostic: CXDiagnostic) -> CXDiagnosticSeverity;
+    pub fn clang_getDiagnosticSpelling(diagnostic: CXDiagnostic) -> CXString;
+    pub fn clang_getElementType(type_: CXType) -> CXType;
+    pub fn clang_getEnumConstantDeclUnsignedValue(cursor: CXCursor) -> c_ulonglong;
+    pub fn clang_getEnumConstantDeclValue(cursor: CXCursor) -> c_longlong;
+    pub fn clang_getEnumDeclIntegerType(cursor: CXCursor) -> CXType;
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_getExceptionSpecificationType(type_: CXType) -> CXCursor_ExceptionSpecificationKind;
+    pub fn clang_getExpansionLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint);
+    pub fn clang_getFieldDeclBitWidth(cursor: CXCursor) -> c_int;
+    pub fn clang_getFile(tu: CXTranslationUnit, file: *const c_char) -> CXFile;
+    /// Only available on `libclang` 6.0 and later.
+    #[cfg(feature = "gte_clang_6_0")]
+    pub fn clang_getFileContents(tu: CXTranslationUnit, file: CXFile, size: *mut size_t) -> *const c_char;
+    pub fn clang_getFileLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint);
+    pub fn clang_getFileName(file: CXFile) -> CXString;
+    pub fn clang_getFileTime(file: CXFile) -> time_t;
+    pub fn clang_getFileUniqueID(file: CXFile, id: *mut CXFileUniqueID) -> c_int;
+    pub fn clang_getFunctionTypeCallingConv(type_: CXType) -> CXCallingConv;
+    pub fn clang_getIBOutletCollectionType(cursor: CXCursor) -> CXType;
+    pub fn clang_getIncludedFile(cursor: CXCursor) -> CXFile;
+    pub fn clang_getInclusions(tu: CXTranslationUnit, visitor: CXInclusionVisitor, data: CXClientData);
+    pub fn clang_getInstantiationLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint);
+    pub fn clang_getLocation(tu: CXTranslationUnit, file: CXFile, line: c_uint, column: c_uint) -> CXSourceLocation;
+    pub fn clang_getLocationForOffset(tu: CXTranslationUnit, file: CXFile, offset: c_uint) -> CXSourceLocation;
+    pub fn clang_getModuleForFile(tu: CXTranslationUnit, file: CXFile) -> CXModule;
+    pub fn clang_getNullCursor() -> CXCursor;
+    pub fn clang_getNullLocation() -> CXSourceLocation;
+    pub fn clang_getNullRange() -> CXSourceRange;
+    pub fn clang_getNumArgTypes(type_: CXType) -> c_int;
+    pub fn clang_getNumCompletionChunks(string: CXCompletionString) -> c_uint;
+    pub fn clang_getNumDiagnostics(tu: CXTranslationUnit) -> c_uint;
+    pub fn clang_getNumDiagnosticsInSet(diagnostic: CXDiagnosticSet) -> c_uint;
+    pub fn clang_getNumElements(type_: CXType) -> c_longlong;
+    pub fn clang_getNumOverloadedDecls(cursor: CXCursor) -> c_uint;
+    pub fn clang_getOverloadedDecl(cursor: CXCursor, index: c_uint) -> CXCursor;
+    pub fn clang_getOverriddenCursors(cursor: CXCursor, cursors: *mut *mut CXCursor, n_cursors: *mut c_uint);
+    pub fn clang_getPointeeType(type_: CXType) -> CXType;
+    pub fn clang_getPresumedLocation(location: CXSourceLocation, file: *mut CXString, line: *mut c_uint, column: *mut c_uint);
+    pub fn clang_getRange(start: CXSourceLocation, end: CXSourceLocation) -> CXSourceRange;
+    pub fn clang_getRangeEnd(range: CXSourceRange) -> CXSourceLocation;
+    pub fn clang_getRangeStart(range: CXSourceRange) -> CXSourceLocation;
+    pub fn clang_getRemappings(file: *const c_char) -> CXRemapping;
+    pub fn clang_getRemappingsFromFileList(files: *mut *const c_char, n_files: c_uint) -> CXRemapping;
+    pub fn clang_getResultType(type_: CXType) -> CXType;
+    pub fn clang_getSkippedRanges(tu: CXTranslationUnit, file: CXFile) -> *mut CXSourceRangeList;
+    pub fn clang_getSpecializedCursorTemplate(cursor: CXCursor) -> CXCursor;
+    pub fn clang_getSpellingLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint);
+    pub fn clang_getTUResourceUsageName(kind: CXTUResourceUsageKind) -> *const c_char;
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_getTranslationUnitTargetInfo(tu: CXTranslationUnit) -> CXTargetInfo;
+    pub fn clang_getTemplateCursorKind(cursor: CXCursor) -> CXCursorKind;
+    pub fn clang_getTokenExtent(tu: CXTranslationUnit, token: CXToken) -> CXSourceRange;
+    pub fn clang_getTokenKind(token: CXToken) -> CXTokenKind;
+    pub fn clang_getTokenLocation(tu: CXTranslationUnit, token: CXToken) -> CXSourceLocation;
+    pub fn clang_getTokenSpelling(tu: CXTranslationUnit, token: CXToken) -> CXString;
+    pub fn clang_getTranslationUnitCursor(tu: CXTranslationUnit) -> CXCursor;
+    pub fn clang_getTranslationUnitSpelling(tu: CXTranslationUnit) -> CXString;
+    pub fn clang_getTypeDeclaration(type_: CXType) -> CXCursor;
+    pub fn clang_getTypeKindSpelling(type_: CXTypeKind) -> CXString;
+    pub fn clang_getTypeSpelling(type_: CXType) -> CXString;
+    pub fn clang_getTypedefDeclUnderlyingType(cursor: CXCursor) -> CXType;
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_getTypedefName(type_: CXType) -> CXString;
+    pub fn clang_hashCursor(cursor: CXCursor) -> c_uint;
+    pub fn clang_indexLoc_getCXSourceLocation(location: CXIdxLoc) -> CXSourceLocation;
+    pub fn clang_indexLoc_getFileLocation(location: CXIdxLoc, index_file: *mut CXIdxClientFile, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint);
+    pub fn clang_indexSourceFile(index: CXIndexAction, data: CXClientData, callbacks: *mut IndexerCallbacks, n_callbacks: c_uint, index_flags: CXIndexOptFlags, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, tu: *mut CXTranslationUnit, tu_flags: CXTranslationUnit_Flags) -> CXErrorCode;
+    /// Only available on `libclang` 3.8 and later.
+    #[cfg(feature = "gte_clang_3_8")]
+    pub fn clang_indexSourceFileFullArgv(index: CXIndexAction, data: CXClientData, callbacks: *mut IndexerCallbacks, n_callbacks: c_uint, index_flags: CXIndexOptFlags, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, tu: *mut CXTranslationUnit, tu_flags: CXTranslationUnit_Flags) -> CXErrorCode;
+    pub fn clang_indexTranslationUnit(index: CXIndexAction, data: CXClientData, callbacks: *mut IndexerCallbacks, n_callbacks: c_uint, flags: CXIndexOptFlags, tu: CXTranslationUnit) -> c_int;
+    pub fn clang_index_getCXXClassDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxCXXClassDeclInfo;
+    pub fn clang_index_getClientContainer(info: *const CXIdxContainerInfo) -> CXIdxClientContainer;
+    pub fn clang_index_getClientEntity(info: *const CXIdxEntityInfo) -> CXIdxClientEntity;
+    pub fn clang_index_getIBOutletCollectionAttrInfo(info: *const CXIdxAttrInfo) -> *const CXIdxIBOutletCollectionAttrInfo;
+    pub fn clang_index_getObjCCategoryDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCCategoryDeclInfo;
+    pub fn clang_index_getObjCContainerDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCContainerDeclInfo;
+    pub fn clang_index_getObjCInterfaceDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCInterfaceDeclInfo;
+    pub fn clang_index_getObjCPropertyDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCPropertyDeclInfo;
+    pub fn clang_index_getObjCProtocolRefListInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCProtocolRefListInfo;
+    pub fn clang_index_isEntityObjCContainerKind(info: CXIdxEntityKind) -> c_int;
+    pub fn clang_index_setClientContainer(info: *const CXIdxContainerInfo, container: CXIdxClientContainer);
+    pub fn clang_index_setClientEntity(info: *const CXIdxEntityInfo, entity: CXIdxClientEntity);
+    pub fn clang_isAttribute(kind: CXCursorKind) -> c_uint;
+    pub fn clang_isConstQualifiedType(type_: CXType) -> c_uint;
+    pub fn clang_isCursorDefinition(cursor: CXCursor) -> c_uint;
+    pub fn clang_isDeclaration(kind: CXCursorKind) -> c_uint;
+    pub fn clang_isExpression(kind: CXCursorKind) -> c_uint;
+    pub fn clang_isFileMultipleIncludeGuarded(tu: CXTranslationUnit, file: CXFile) -> c_uint;
+    pub fn clang_isFunctionTypeVariadic(type_: CXType) -> c_uint;
+    pub fn clang_isInvalid(kind: CXCursorKind) -> c_uint;
+    /// Only available on `libclang` 7.0 and later.
+    #[cfg(feature = "gte_clang_7_0")]
+    pub fn clang_isInvalidDeclaration(cursor: CXCursor) -> c_uint;
+    pub fn clang_isPODType(type_: CXType) -> c_uint;
+    pub fn clang_isPreprocessing(kind: CXCursorKind) -> c_uint;
+    pub fn clang_isReference(kind: CXCursorKind) -> c_uint;
+    pub fn clang_isRestrictQualifiedType(type_: CXType) -> c_uint;
+    pub fn clang_isStatement(kind: CXCursorKind) -> c_uint;
+    pub fn clang_isTranslationUnit(kind: CXCursorKind) -> c_uint;
+    pub fn clang_isUnexposed(kind: CXCursorKind) -> c_uint;
+    pub fn clang_isVirtualBase(cursor: CXCursor) -> c_uint;
+    pub fn clang_isVolatileQualifiedType(type_: CXType) -> c_uint;
+    pub fn clang_loadDiagnostics(file: *const c_char, error: *mut CXLoadDiag_Error, message: *mut CXString) -> CXDiagnosticSet;
+    pub fn clang_parseTranslationUnit(index: CXIndex, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXTranslationUnit_Flags) -> CXTranslationUnit;
+    pub fn clang_parseTranslationUnit2(index: CXIndex, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXTranslationUnit_Flags, tu: *mut CXTranslationUnit) -> CXErrorCode;
+    /// Only available on `libclang` 3.8 and later.
+    #[cfg(feature = "gte_clang_3_8")]
+    pub fn clang_parseTranslationUnit2FullArgv(index: CXIndex, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXTranslationUnit_Flags, tu: *mut CXTranslationUnit) -> CXErrorCode;
+    pub fn clang_remap_dispose(remapping: CXRemapping);
+    pub fn clang_remap_getFilenames(remapping: CXRemapping, index: c_uint, original: *mut CXString, transformed: *mut CXString);
+    pub fn clang_remap_getNumFiles(remapping: CXRemapping) -> c_uint;
+    pub fn clang_reparseTranslationUnit(tu: CXTranslationUnit, n_unsaved: c_uint, unsaved: *mut CXUnsavedFile, flags: CXReparse_Flags) -> CXErrorCode;
+    pub fn clang_saveTranslationUnit(tu: CXTranslationUnit, file: *const c_char, options: CXSaveTranslationUnit_Flags) -> CXSaveError;
+    pub fn clang_sortCodeCompletionResults(results: *mut CXCompletionResult, n_results: c_uint);
+    /// Only available on `libclang` 5.0 and later.
+    #[cfg(feature = "gte_clang_5_0")]
+    pub fn clang_suspendTranslationUnit(tu: CXTranslationUnit) -> c_uint;
+    pub fn clang_toggleCrashRecovery(recovery: c_uint);
+    pub fn clang_tokenize(tu: CXTranslationUnit, range: CXSourceRange, tokens: *mut *mut CXToken, n_tokens: *mut c_uint);
+    pub fn clang_visitChildren(cursor: CXCursor, visitor: CXCursorVisitor, data: CXClientData) -> c_uint;
+
+    // Documentation
+    pub fn clang_BlockCommandComment_getArgText(comment: CXComment, index: c_uint) -> CXString;
+    pub fn clang_BlockCommandComment_getCommandName(comment: CXComment) -> CXString;
+    pub fn clang_BlockCommandComment_getNumArgs(comment: CXComment) -> c_uint;
+    pub fn clang_BlockCommandComment_getParagraph(comment: CXComment) -> CXComment;
+    pub fn clang_Comment_getChild(comment: CXComment, index: c_uint) -> CXComment;
+    pub fn clang_Comment_getKind(comment: CXComment) -> CXCommentKind;
+    pub fn clang_Comment_getNumChildren(comment: CXComment) -> c_uint;
+    pub fn clang_Comment_isWhitespace(comment: CXComment) -> c_uint;
+    pub fn clang_Cursor_getParsedComment(C: CXCursor) -> CXComment;
+    pub fn clang_FullComment_getAsHTML(comment: CXComment) -> CXString;
+    pub fn clang_FullComment_getAsXML(comment: CXComment) -> CXString;
+    pub fn clang_HTMLStartTagComment_isSelfClosing(comment: CXComment) -> c_uint;
+    pub fn clang_HTMLStartTag_getAttrName(comment: CXComment, index: c_uint) -> CXString;
+    pub fn clang_HTMLStartTag_getAttrValue(comment: CXComment, index: c_uint) -> CXString;
+    pub fn clang_HTMLStartTag_getNumAttrs(comment: CXComment) -> c_uint;
+    pub fn clang_HTMLTagComment_getAsString(comment: CXComment) -> CXString;
+    pub fn clang_HTMLTagComment_getTagName(comment: CXComment) -> CXString;
+    pub fn clang_InlineCommandComment_getArgText(comment: CXComment, index: c_uint) -> CXString;
+    pub fn clang_InlineCommandComment_getCommandName(comment: CXComment) -> CXString;
+    pub fn clang_InlineCommandComment_getNumArgs(comment: CXComment) -> c_uint;
+    pub fn clang_InlineCommandComment_getRenderKind(comment: CXComment) -> CXCommentInlineCommandRenderKind;
+    pub fn clang_InlineContentComment_hasTrailingNewline(comment: CXComment) -> c_uint;
+    pub fn clang_ParamCommandComment_getDirection(comment: CXComment) -> CXCommentParamPassDirection;
+    pub fn clang_ParamCommandComment_getParamIndex(comment: CXComment) -> c_uint;
+    pub fn clang_ParamCommandComment_getParamName(comment: CXComment) -> CXString;
+    pub fn clang_ParamCommandComment_isDirectionExplicit(comment: CXComment) -> c_uint;
+    pub fn clang_ParamCommandComment_isParamIndexValid(comment: CXComment) -> c_uint;
+    pub fn clang_TParamCommandComment_getDepth(comment: CXComment) -> c_uint;
+    pub fn clang_TParamCommandComment_getIndex(comment: CXComment, depth: c_uint) -> c_uint;
+    pub fn clang_TParamCommandComment_getParamName(comment: CXComment) -> CXString;
+    pub fn clang_TParamCommandComment_isParamPositionValid(comment: CXComment) -> c_uint;
+    pub fn clang_TextComment_getText(comment: CXComment) -> CXString;
+    pub fn clang_VerbatimBlockLineComment_getText(comment: CXComment) -> CXString;
+    pub fn clang_VerbatimLineComment_getText(comment: CXComment) -> CXString;
+}
diff --git a/src/link.rs b/src/link.rs
new file mode 100644
index 0000000..11a73ab
--- /dev/null
+++ b/src/link.rs
@@ -0,0 +1,278 @@
+// Copyright 2016 Kyle Mayes
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//================================================
+// Macros
+//================================================
+
+#[cfg(feature = "runtime")]
+macro_rules! link {
+    (
+        @LOAD:
+        $(#[doc=$doc:expr])*
+        #[cfg($cfg:meta)]
+        fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*
+    ) => (
+        $(#[doc=$doc])*
+        #[cfg($cfg)]
+        pub fn $name(library: &mut super::SharedLibrary) {
+            let symbol = unsafe { library.library.get(stringify!($name).as_bytes()) }.ok();
+            library.functions.$name = match symbol {
+                Some(s) => *s,
+                None => None,
+            };
+        }
+
+        #[cfg(not($cfg))]
+        pub fn $name(_: &mut super::SharedLibrary) {}
+    );
+
+    (
+        @LOAD:
+        fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*
+    ) => (
+        link!(@LOAD: #[cfg(feature = "runtime")] fn $name($($pname: $pty), *) $(-> $ret)*);
+    );
+
+    (
+        $(
+            $(#[doc=$doc:expr] #[cfg($cfg:meta)])*
+            pub fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*;
+        )+
+    ) => (
+        use std::cell::{RefCell};
+        use std::sync::{Arc};
+        use std::path::{Path, PathBuf};
+
+        /// The (minimum) version of a `libclang` shared library.
+        #[allow(missing_docs)]
+        #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
+        pub enum Version {
+            V3_5 = 35,
+            V3_6 = 36,
+            V3_7 = 37,
+            V3_8 = 38,
+            V3_9 = 39,
+            V4_0 = 40,
+            V5_0 = 50,
+            V6_0 = 60,
+            V7_0 = 70,
+            V8_0 = 80,
+            V9_0 = 90,
+        }
+
+        /// The set of functions loaded dynamically.
+        #[derive(Debug, Default)]
+        pub struct Functions {
+            $(
+                $(#[doc=$doc] #[cfg($cfg)])*
+                pub $name: Option<unsafe extern fn($($pname: $pty), *) $(-> $ret)*>,
+            )+
+        }
+
+        /// A dynamically loaded instance of the `libclang` library.
+        #[derive(Debug)]
+        pub struct SharedLibrary {
+            library: libloading::Library,
+            path: PathBuf,
+            pub functions: Functions,
+        }
+
+        impl SharedLibrary {
+            fn new(library: libloading::Library, path: PathBuf) -> Self {
+                Self { library, path, functions: Functions::default() }
+            }
+
+            /// Returns the path to this `libclang` shared library.
+            pub fn path(&self) -> &Path {
+                &self.path
+            }
+
+            /// Returns the (minimum) version of this `libclang` shared library.
+            ///
+            /// If this returns `None`, it indicates that the version is too old
+            /// to be supported by this crate (i.e., `3.4` or earlier). If the
+            /// version of this shared library is more recent than that fully
+            /// supported by this crate, the most recent fully supported version
+            /// will be returned.
+            pub fn version(&self) -> Option<Version> {
+                macro_rules! check {
+                    ($fn:expr, $version:ident) => {
+                        if self.library.get::<unsafe extern fn()>($fn).is_ok() {
+                            return Some(Version::$version);
+                        }
+                    };
+                }
+
+                unsafe {
+                    check!(b"clang_Cursor_isAnonymousRecordDecl", V9_0);
+                    check!(b"clang_Cursor_getObjCPropertyGetterName", V8_0);
+                    check!(b"clang_File_tryGetRealPathName", V7_0);
+                    check!(b"clang_CXIndex_setInvocationEmissionPathOption", V6_0);
+                    check!(b"clang_Cursor_isExternalSymbol", V5_0);
+                    check!(b"clang_EvalResult_getAsLongLong", V4_0);
+                    check!(b"clang_CXXConstructor_isConvertingConstructor", V3_9);
+                    check!(b"clang_CXXField_isMutable", V3_8);
+                    check!(b"clang_Cursor_getOffsetOfField", V3_7);
+                    check!(b"clang_Cursor_getStorageClass", V3_6);
+                    check!(b"clang_Type_getNumTemplateArguments", V3_5);
+                }
+
+                None
+            }
+        }
+
+        thread_local!(static LIBRARY: RefCell<Option<Arc<SharedLibrary>>> = RefCell::new(None));
+
+        /// Returns whether a `libclang` shared library is loaded on this thread.
+        pub fn is_loaded() -> bool {
+            LIBRARY.with(|l| l.borrow().is_some())
+        }
+
+        fn with_library<T, F>(f: F) -> Option<T> where F: FnOnce(&SharedLibrary) -> T {
+            LIBRARY.with(|l| {
+                match l.borrow().as_ref() {
+                    Some(library) => Some(f(&library)),
+                    _ => None,
+                }
+            })
+        }
+
+        $(
+            #[cfg_attr(feature="cargo-clippy", allow(too_many_arguments))]
+            $(#[doc=$doc] #[cfg($cfg)])*
+            pub unsafe fn $name($($pname: $pty), *) $(-> $ret)* {
+                let f = with_library(|l| {
+                    match l.functions.$name {
+                        Some(f) => f,
+                        _ => panic!(concat!("function not loaded: ", stringify!($name))),
+                    }
+                }).expect("a `libclang` shared library is not loaded on this thread");
+                f($($pname), *)
+            }
+
+            $(#[doc=$doc] #[cfg($cfg)])*
+            pub mod $name {
+                pub fn is_loaded() -> bool {
+                    super::with_library(|l| l.functions.$name.is_some()).unwrap_or(false)
+                }
+            }
+        )+
+
+        mod load {
+            $(link!(@LOAD: $(#[cfg($cfg)])* fn $name($($pname: $pty), *) $(-> $ret)*);)+
+        }
+
+        /// Loads a `libclang` shared library and returns the library instance.
+        ///
+        /// This function does not attempt to load any functions from the shared library. The caller
+        /// is responsible for loading the functions they require.
+        ///
+        /// # Failures
+        ///
+        /// * a `libclang` shared library could not be found
+        /// * the `libclang` shared library could not be opened
+        pub fn load_manually() -> Result<SharedLibrary, String> {
+            mod build {
+                pub mod common { include!("../out/common.rs"); }
+                pub mod dynamic { include!("../out/dynamic.rs"); }
+            }
+
+            let (directory, filename) = try!(build::dynamic::find(true));
+            let path = directory.join(filename);
+
+            let library = libloading::Library::new(&path).map_err(|e| {
+                format!(
+                    "the `libclang` shared library at {} could not be opened: {}",
+                    path.display(),
+                    e,
+                )
+            });
+
+            let mut library = SharedLibrary::new(try!(library), path);
+            $(load::$name(&mut library);)+
+            Ok(library)
+        }
+
+        /// Loads a `libclang` shared library for use in the current thread.
+        ///
+        /// This functions attempts to load all the functions in the shared library. Whether a
+        /// function has been loaded can be tested by calling the `is_loaded` function on the
+        /// module with the same name as the function (e.g., `clang_createIndex::is_loaded()` for
+        /// the `clang_createIndex` function).
+        ///
+        /// # Failures
+        ///
+        /// * a `libclang` shared library could not be found
+        /// * the `libclang` shared library could not be opened
+        #[allow(dead_code)]
+        pub fn load() -> Result<(), String> {
+            let library = Arc::new(try!(load_manually()));
+            LIBRARY.with(|l| *l.borrow_mut() = Some(library));
+            Ok(())
+        }
+
+        /// Unloads the `libclang` shared library in use in the current thread.
+        ///
+        /// # Failures
+        ///
+        /// * a `libclang` shared library is not in use in the current thread
+        pub fn unload() -> Result<(), String> {
+            let library = set_library(None);
+            if library.is_some() {
+                Ok(())
+            } else {
+                Err("a `libclang` shared library is not in use in the current thread".into())
+            }
+        }
+
+        /// Returns the library instance stored in TLS.
+        ///
+        /// This functions allows for sharing library instances between threads.
+        pub fn get_library() -> Option<Arc<SharedLibrary>> {
+            LIBRARY.with(|l| l.borrow_mut().clone())
+        }
+
+        /// Sets the library instance stored in TLS and returns the previous library.
+        ///
+        /// This functions allows for sharing library instances between threads.
+        pub fn set_library(library: Option<Arc<SharedLibrary>>) -> Option<Arc<SharedLibrary>> {
+            LIBRARY.with(|l| mem::replace(&mut *l.borrow_mut(), library))
+        }
+    )
+}
+
+#[cfg(not(feature = "runtime"))]
+macro_rules! link {
+    (
+        $(
+            $(#[doc=$doc:expr] #[cfg($cfg:meta)])*
+            pub fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*;
+        )+
+    ) => (
+        extern {
+            $(
+                $(#[doc=$doc] #[cfg($cfg)])*
+                pub fn $name($($pname: $pty), *) $(-> $ret)*;
+            )+
+        }
+
+        $(
+            $(#[doc=$doc] #[cfg($cfg)])*
+            pub mod $name {
+                pub fn is_loaded() -> bool { true }
+            }
+        )+
+    )
+}
diff --git a/src/support.rs b/src/support.rs
new file mode 100644
index 0000000..acf6522
--- /dev/null
+++ b/src/support.rs
@@ -0,0 +1,210 @@
+// Copyright 2016 Kyle Mayes
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Provides helper functionality.
+
+use std::path::{Path, PathBuf};
+use std::process::Command;
+use std::{env, io};
+
+use glob;
+
+use libc::c_int;
+
+use super::CXVersion;
+
+//================================================
+// Macros
+//================================================
+
+macro_rules! try_opt {
+    ($option:expr) => {{
+        match $option {
+            Some(some) => some,
+            None => return None,
+        }
+    }};
+}
+
+//================================================
+// Structs
+//================================================
+
+/// A `clang` executable.
+#[derive(Clone, Debug)]
+pub struct Clang {
+    /// The path to this `clang` executable.
+    pub path: PathBuf,
+    /// The version of this `clang` executable if it could be parsed.
+    pub version: Option<CXVersion>,
+    /// The directories searched by this `clang` executable for C headers if
+    /// they could be parsed.
+    pub c_search_paths: Option<Vec<PathBuf>>,
+    /// The directories searched by this `clang` executable for C++ headers if
+    /// they could be parsed.
+    pub cpp_search_paths: Option<Vec<PathBuf>>,
+}
+
+impl Clang {
+    fn new(path: impl AsRef<Path>, args: &[String]) -> Self {
+        Self {
+            path: path.as_ref().into(),
+            version: parse_version(path.as_ref()),
+            c_search_paths: parse_search_paths(path.as_ref(), "c", args),
+            cpp_search_paths: parse_search_paths(path.as_ref(), "c++", args),
+        }
+    }
+
+    /// Returns a `clang` executable if one can be found.
+    ///
+    /// If the `CLANG_PATH` environment variable is set, that is the instance of
+    /// `clang` used. Otherwise, a series of directories are searched. First, if
+    /// a path is supplied, that is the first directory searched. Then, the
+    /// directory returned by `llvm-config --bindir` is searched. On macOS
+    /// systems, `xcodebuild -find clang` will next be queried. Last, the
+    /// directories in the system's `PATH` are searched.
+    pub fn find(path: Option<&Path>, args: &[String]) -> Option<Clang> {
+        if let Ok(path) = env::var("CLANG_PATH") {
+            return Some(Clang::new(path, args));
+        }
+
+        let mut paths = vec![];
+        if let Some(path) = path {
+            paths.push(path.into());
+        }
+        if let Ok(path) = run_llvm_config(&["--bindir"]) {
+            paths.push(path.into());
+        }
+        if cfg!(target_os = "macos") {
+            if let Ok((path, _)) = run("xcodebuild", &["-find", "clang"]) {
+                paths.push(path.into());
+            }
+        }
+        paths.extend(env::split_paths(&env::var("PATH").unwrap()));
+
+        let default = format!("clang{}", env::consts::EXE_SUFFIX);
+        let versioned = format!("clang-[0-9]*{}", env::consts::EXE_SUFFIX);
+        let patterns = &[&default[..], &versioned[..]];
+        for path in paths {
+            if let Some(path) = find(&path, patterns) {
+                return Some(Clang::new(path, args));
+            }
+        }
+
+        None
+    }
+}
+
+//================================================
+// Functions
+//================================================
+
+/// Returns the first match to the supplied glob patterns in the supplied
+/// directory if there are any matches.
+fn find(directory: &Path, patterns: &[&str]) -> Option<PathBuf> {
+    for pattern in patterns {
+        let pattern = directory.join(pattern).to_string_lossy().into_owned();
+        if let Some(path) = try_opt!(glob::glob(&pattern).ok())
+            .filter_map(|p| p.ok())
+            .next()
+        {
+            if path.is_file() && is_executable(&path).unwrap_or(false) {
+                return Some(path);
+            }
+        }
+    }
+
+    None
+}
+
+#[cfg(unix)]
+fn is_executable(path: &Path) -> io::Result<bool> {
+    use std::ffi::CString;
+    use std::os::unix::ffi::OsStrExt;
+
+    let path = CString::new(path.as_os_str().as_bytes())?;
+    unsafe { Ok(libc::access(path.as_ptr(), libc::X_OK) == 0) }
+}
+
+#[cfg(not(unix))]
+fn is_executable(_: &Path) -> io::Result<bool> {
+    Ok(true)
+}
+
+/// Attempts to run an executable, returning the `stdout` and `stderr` output if
+/// successful.
+fn run(executable: &str, arguments: &[&str]) -> Result<(String, String), String> {
+    Command::new(executable)
+        .args(arguments)
+        .output()
+        .map(|o| {
+            let stdout = String::from_utf8_lossy(&o.stdout).into_owned();
+            let stderr = String::from_utf8_lossy(&o.stderr).into_owned();
+            (stdout, stderr)
+        })
+        .map_err(|e| format!("could not run executable `{}`: {}", executable, e))
+}
+
+/// Runs `clang`, returning the `stdout` and `stderr` output.
+fn run_clang(path: &Path, arguments: &[&str]) -> (String, String) {
+    run(&path.to_string_lossy().into_owned(), arguments).unwrap()
+}
+
+/// Runs `llvm-config`, returning the `stdout` output if successful.
+fn run_llvm_config(arguments: &[&str]) -> Result<String, String> {
+    let config = env::var("LLVM_CONFIG_PATH").unwrap_or_else(|_| "llvm-config".to_string());
+    run(&config, arguments).map(|(o, _)| o)
+}
+
+/// Parses a version number if possible, ignoring trailing non-digit characters.
+fn parse_version_number(number: &str) -> Option<c_int> {
+    number
+        .chars()
+        .take_while(|c| c.is_digit(10))
+        .collect::<String>()
+        .parse()
+        .ok()
+}
+
+/// Parses the version from the output of a `clang` executable if possible.
+fn parse_version(path: &Path) -> Option<CXVersion> {
+    let output = run_clang(path, &["--version"]).0;
+    let start = try_opt!(output.find("version ")) + 8;
+    let mut numbers = try_opt!(output[start..].split_whitespace().nth(0)).split('.');
+    let major = try_opt!(numbers.next().and_then(parse_version_number));
+    let minor = try_opt!(numbers.next().and_then(parse_version_number));
+    let subminor = numbers.next().and_then(parse_version_number).unwrap_or(0);
+    Some(CXVersion {
+        Major: major,
+        Minor: minor,
+        Subminor: subminor,
+    })
+}
+
+/// Parses the search paths from the output of a `clang` executable if possible.
+fn parse_search_paths(path: &Path, language: &str, args: &[String]) -> Option<Vec<PathBuf>> {
+    let mut clang_args = vec!["-E", "-x", language, "-", "-v"];
+    clang_args.extend(args.iter().map(|s| &**s));
+    let output = run_clang(path, &clang_args).1;
+    let start = try_opt!(output.find("#include <...> search starts here:")) + 34;
+    let end = try_opt!(output.find("End of search list."));
+    let paths = output[start..end].replace("(framework directory)", "");
+    Some(
+        paths
+            .lines()
+            .filter(|l| !l.is_empty())
+            .map(|l| Path::new(l.trim()).into())
+            .collect(),
+    )
+}
diff --git a/tests/header.h b/tests/header.h
new file mode 100644
index 0000000..3767c8e
--- /dev/null
+++ b/tests/header.h
@@ -0,0 +1,6 @@
+#ifndef HEADER_H_
+#define HEADER_H_
+
+int add(int a, int b);
+
+#endif
diff --git a/tests/lib.rs b/tests/lib.rs
new file mode 100644
index 0000000..100a6c6
--- /dev/null
+++ b/tests/lib.rs
@@ -0,0 +1,48 @@
+extern crate clang_sys;
+extern crate libc;
+
+use std::ptr;
+
+use clang_sys::*;
+
+use libc::c_char;
+
+fn parse() {
+    unsafe {
+        let index = clang_createIndex(0, 0);
+        assert!(!index.is_null());
+
+        let tu = clang_parseTranslationUnit(
+            index,
+            "tests/header.h\0".as_ptr() as *const c_char,
+            ptr::null_mut(),
+            0,
+            ptr::null_mut(),
+            0,
+            0,
+        );
+        assert!(!tu.is_null());
+    }
+}
+
+#[cfg(feature = "runtime")]
+#[test]
+fn test() {
+    load().unwrap();
+    let library = get_library().unwrap();
+    println!("{:?} ({:?})", library.version(), library.path());
+    parse();
+    unload().unwrap();
+}
+
+#[cfg(not(feature = "runtime"))]
+#[test]
+fn test() {
+    parse();
+}
+
+#[test]
+fn test_support() {
+    let clang = support::Clang::find(None, &[]).unwrap();
+    println!("{:?}", clang);
+}
