Update clang-sys to 1.8.1

Test: m
Change-Id: Ibc7a63de4d0d24f61fd045845a7ca93e491d77e6
diff --git a/crates/clang-sys/.android-checksum.json b/crates/clang-sys/.android-checksum.json
new file mode 100644
index 0000000..8680591
--- /dev/null
+++ b/crates/clang-sys/.android-checksum.json
@@ -0,0 +1 @@
+{"package":null,"files":{"build.rs":"ba2d4635dda64e35e8f1c9853d420ac6745d568777efc00b5be5077df2855a2f","src/support.rs":"b7f04d3b8fde7828f24bf4492f0050c14bef1256438b38216e07fb9090d3d311","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","Android.bp":"4a37f23e5a3bcc7d24a4a5a26ea4c0bf28662d342510eb3809850459033d2469","out/common.rs":"6c8a561ac7d9b585c8d73fbe62d18c05bc0d8657f6367d97161e891db44d9d70","build/macros.rs":"164c5d99befb840e60b4580709e8603d8e6daf7aa205906a6addeacbca1ceaaa","cargo_embargo.json":"369c4bf0abc3367f14bb9b167e349ab0b911497c2a02b4e1c2a27150f7811209","clippy.toml":"653f7a5160598173cf214209159c862dc2984437cb17dc35524dc948e1855a2d","tests/build.rs":"98de73996c255035be111ade2b5176b0e5569f8969f59ce0c417ffb297a9cb81","tests/lib.rs":"941b104a3ef009307b43318850d36ed2cb86f6e0db20ab1700ae941a11e90a97","Cargo.toml":"dcd6596094be5c921657f1570e3809fc4408a7f3f201109e63106a955d52373b","src/link.rs":"cc08dae19e7b63a2bc7162f3c93c6690741333e466b7a88e1cee60f0facaf72a","TEST_MAPPING":"78ab0a5864649f95a8a3316e993ca562c9890ade3a72822a1a90282c06a1da16","out/dynamic.rs":"bd7ecca72b095ef57193b5b1382cc4d2094879f5e3526c5ad289122191ed03dd","build/static.rs":"fe42463af1069acb5f3b4ef5c6e6dbbbd8bbc4fd381619fc957b0f664f2de6ac","out/macros.rs":"164c5d99befb840e60b4580709e8603d8e6daf7aa205906a6addeacbca1ceaaa",".cargo-checksum.json":"24ae29c3b1856b7dce1de80bf3af2141d3c016ecae06fc3846c96e5327c645bb","CHANGELOG.md":"190149c2c882dae2926e9cb336f48f93de3a7e4601c97a8079799b50ebb4a877","src/lib.rs":"b9fe1ff5cd85a876251183d8e6b191c1214ba129e607fedad27d29bea71345ba","METADATA":"62ec7848da678aca11a13e9822097039ac945ff8cfb56b28e0e65df30c9e1e30","README.md":"de20090adfb8a70ce818d9c6cff7f23a4f71f451e87c377eac39a76a78b31ec2","LICENSE":"2f4da1447e6b4f297a48ccf0fb9c9a35ee94529f7dc180c9fc0b89c6acd715a8","LICENSE.txt":"2f4da1447e6b4f297a48ccf0fb9c9a35ee94529f7dc180c9fc0b89c6acd715a8","build/dynamic.rs":"bd7ecca72b095ef57193b5b1382cc4d2094879f5e3526c5ad289122191ed03dd","build/common.rs":"6c8a561ac7d9b585c8d73fbe62d18c05bc0d8657f6367d97161e891db44d9d70","tests/header.h":"89d66e5a42d84035b38fdb26085c916537a52a1be291eac1fdae7a94257cf476"}}
\ No newline at end of file
diff --git a/crates/clang-sys/.cargo-checksum.json b/crates/clang-sys/.cargo-checksum.json
index c5e0a49..d205966 100644
--- a/crates/clang-sys/.cargo-checksum.json
+++ b/crates/clang-sys/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"7a177945b551a62c30b9183f8edaac38216fbeb3fb7f8760e5f2a69916140086","Cargo.toml":"9d896747d0d657eeb8913dc254439b06f77025399c654026db5d58bf655837f6","LICENSE.txt":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","README.md":"d75bc7b6e957818c2c9c78107eade13c48bd1e9f6a5eca3b04644b21938b0157","build.rs":"f344874bf25f8ec6f852c55edaf262789fc6b883489afb47fa3d7da83f95ad1c","build/common.rs":"0b23893c737a9b60d8d400b5101bf3bcc632e0833d948590c42d189a1f69aeb0","build/dynamic.rs":"79014d1f9c7a197affb018d60218458e8878ccc80e61fc2e5d61b2f291ebbb4b","build/macros.rs":"eac7bffaac5f70728764065145eb1541b0a133c900356a0bcf55f0d89966c84e","build/static.rs":"b3000f872b139b3f3230f49e98a183d05ac18be661192bb5cada896eca853aca","clippy.toml":"acef14b9acffa18d1069ae08a4e8fe824a614f91b0bc71a6b1c68e4d885397e6","src/lib.rs":"3c0fc0c0e3cabc3b81732b5ac784b36f69dfb72abcecc3bf4e5a08c72d9c8ad0","src/link.rs":"13b236714d68483fbcec9df2ee1ae63db21e87176881c2d53a9157a2b38240eb","src/support.rs":"5398f8c35cceae64ca941b9a26ed28f29d34a1301958399d636e599dcfd0d64f","tests/build.rs":"66ed85f6e1baf9fac5c50e486fa43413e40c3f16ce9f503c9bba53e300682a9a","tests/header.h":"b1cf564b21d76db78529d1934e1481a5f0452fdedc6e32954608293c310498b6","tests/lib.rs":"a39e48b2ab3347692f461609e296456850cff870514fa3df8232341318015568"},"package":"67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"9db56336c2fd1dddbacc861f42b697f218a9dccb663aaa1ad042cfe940a0c232","Cargo.toml":"db6730e270afa1f936b6f14264be0b0aaa506b88d91ab4805cf270595f3b568b","LICENSE.txt":"3ddf9be5c28fe27dad143a5dc76eea25222ad1dd68934a047064e56ed2fa40c5","README.md":"ca106237bdacd8aee43af3bc2ad94771b1c1fe029a7d6f622989c00d5a74f4eb","build.rs":"321ac62c88932a3831be9c96f526a21f65ea22df01639946bd0033d1bcf8900e","build/common.rs":"c827ffc2761c4b96952334e35ff443198adfc86fbe2822c309dfe5ea1bcc8cc0","build/dynamic.rs":"c28adab4ea893d12f47d8b229c38a134a6553c654a1d243f37f7f03ed82e5723","build/macros.rs":"41eef7020d4c28ce70c71036009be4be5844572b26e32b840f671b924174475e","build/static.rs":"51316c6274c15f939fff637499163a7312c97d95cea6959825f1ca52af35a726","clippy.toml":"fcf54943ba571514b244cc098ce08671b4117167733e8107e799d533a12a2195","src/lib.rs":"dc1707cf08d65b2bf8e0b9f836f5c2e74af399ea10476a36238056ad1dcc926b","src/link.rs":"d12eda4e3f76f00168615b4cba67b0b1fff8e6dbb06df80302561baa9472eec3","src/support.rs":"4f5f2e76f9352b6b02a1519857de773b6ab064c7bdfab15bf63d4f712f0c7b61","tests/build.rs":"b9bc3b4af58ab815e9ef56538b58448f19ede42591078ef02c6ff9f946456315","tests/header.h":"1b15a686d1c06561960045a26c25a34d840f26c8246f2f5e630f993b69c7492c","tests/lib.rs":"7ddd85162a682328b4eea499526a14f4a841c10ac673a5871f02050b428231d4"},"package":"0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"}
\ No newline at end of file
diff --git a/crates/clang-sys/Android.bp b/crates/clang-sys/Android.bp
index 9356629..1994bfe 100644
--- a/crates/clang-sys/Android.bp
+++ b/crates/clang-sys/Android.bp
@@ -28,10 +28,10 @@
     name: "libclang_sys",
     crate_name: "clang_sys",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.7.0",
+    cargo_pkg_version: "1.8.1",
     crate_root: "src/lib.rs",
     srcs: [":copy_clang-sys_build_out"],
-    edition: "2015",
+    edition: "2021",
     features: [
         "clang_10_0",
         "clang_3_5",
diff --git a/crates/clang-sys/CHANGELOG.md b/crates/clang-sys/CHANGELOG.md
index d08b4bc..dc6c75e 100644
--- a/crates/clang-sys/CHANGELOG.md
+++ b/crates/clang-sys/CHANGELOG.md
@@ -1,527 +1,552 @@
-## [1.7.0] - 2023-12-31
-
-### Added
-- Added support for `clang` 17.0.x
-
-## [1.6.1] - 2023-03-29
-
-### Fixed
-- Improved error message when calling a `libclang` function that is not supported by the loaded `libclang` instance (https://github.com/rust-lang/rust-bindgen/issues/2446)
-
-## [1.6.0] - 2023-02-18
-
-### Changed
-- MinGW directories are not searched for `libclang` instances on Windows when
-compiling for an MSVC target
-- Bumped minimum supported Rust version (MSRV) to 1.51.0
-- Changed Windows search directory preferences (`libclang` instances from
-Visual Studio installs are now the lowest priority rather than the second
-highest)
-
-## ~~[1.5.1] - 2023-02-05~~ (YANKED)
-
-### Changed
-- MinGW directories are not searched for `libclang` instances on Windows when
-compiling for an MSVC target
-
-## ~~[1.5.0] - 2023-02-05~~ (YANKED)
-
-### Changed
-- Bumped minimum supported Rust version (MSRV) to 1.51.0
-- Changed Windows search directory preferences (`libclang` instances from
-Visual Studio installs are now the lowest priority rather than the second
-highest)
-
-### Added
-- Added additional support for `clang` 16.0.x
-
-## [1.4.0] - 2022-09-22
-
-### Changed
-- The value of an `EntityKind` enum variant
-(`EntityKind::CXCursor_TranslationUnit`) has been updated for Clang 15.0 and
-later to match the
-[breaking change made in `libclang`](https://github.com/llvm/llvm-project/commit/bb83f8e70bd1d56152f02307adacd718cd67e312#diff-674613a0e47f4e66cc19061e28e3296d39be2d124dceefb68237b30b8e241e7c)
-
-### Added
-- Added support for `clang` 16.0.x
-- Added support for `clang` 15.0.x
-- Added support for `clang` 14.0.x
-
-## [1.3.3] - 2022-05-28
-
-### Fixed
-- Fixed `Clang::find` to check that `CLANG_PATH` is an executable file before
-selecting it
-
-## [1.3.2] - 2022-05-18
-
-### Added
-- Added support for illumos and derivatives
-
-## [1.3.1] - 2022-02-03
-
-### Added
-- Added missing `clang_getToken` function
-
-## [1.3.0] - 2021-10-31
-
-### Added
-- Added support for `clang` 13.0.x
-- Added support for `clang` 12.0.x
-- Added support for the Haiku operating system
-
-## [1.2.2] - 2021-09-02
-
-### Fixed
-- Fixed handling of paths that contain characters that have special meaning in
-glob patterns (e.g., `[` or `]`)
-
-## [1.2.1] - 2021-08-24
-
-### Changed
-- Updated build script to check the install location used by the
-[Scoop](https://scoop.sh/) command-line installer on Windows
-
-### Fixed
-- Updated build script to support environments where the `PATH` environment
-variable is not set
-
-## [1.2.0] - 2021-04-08
-
-### Changed
-- Changed `Clang::find` to prefer target-prefixed binaries when a `-target`
-argument is provided (e.g., if the arguments `-target` and
-`x86_64-unknown-linux-gnu` are provided, a target-prefixed Clang executable
-such as `x86_64-unknown-linux-gnu-clang` will be preferred over a non-target
-prefixed Clang executable)
-
-### Fixed
-- Fixed build script to split paths in environment variables (e.g.,
-`LD_LIBRARY_PATH`) using the appropriate separator for the platform (previously
-`:` was used as the separator but some platforms such as Windows use `;`)
-
-## [1.1.1] - 2021-02-19
-
-### Changed
-- Bumped `libloading` version to `0.7`
-
-## [1.1.0] - 2021-02-09
-
-### Changed
-- Added Visual Studio LLVM component directory to search paths on Windows
-([#121](https://github.com/KyleMayes/clang-sys/issues/121))
-
-### Added
-- Added support for `clang` 11.0.x
-
-## [1.0.3] - 2020-11-19
-
-### Fixed
-- Fixed `Clang::find` panicking when `llvm-config` or `xcode-build` don't output anything to `stdout`
-
-## [1.0.2] - 2020-11-17
-
-### Fixed
-- Fixed `Clang::find` to properly search directories returned by the
-`llvm-config --bindir` and `xcodebuild -find clang` commands
-- Improved version selection algorithm in the case where there are multiple
-instances of `libclang` with the highest version found; previously the lowest
-priority instance would be selected instead of the highest priority instance
-(e.g., the versions found by searching the fallback directories were preferred
-over the versions found by searching the `llvm-config --prefix` directory)
-
-## [1.0.1] - 2020-10-01
-
-### Changed
-- Improved panic error message when calling an unloaded function
-
-## [1.0.0] - 2020-07-14
-
-### Changed
-- Bumped `libloading` version to `0.6.0`
-- Updated build script to not print warnings about failures to execute
-`llvm-config` and `xcode-select` unless an instance of `libclang` is not found
-
-### Added
-- Added support for `clang` 10.0.x
-
-### Removed
-- Removed `gte_clang_*` Cargo features (these were an implementation detail)
-
-## [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
+## [1.8.1] - 2024-05-28

+

+### Added

+- Added support for `clang` 18.0.x

+

+### Fixed

+- Improve DLL search on Windows to take target architecture into account (e.g., ARM64 vs x86-64)

+- Improved detection of `libclang` installed with Visual Studio on Windows

+

+## [1.8.0] - 2024-05-26

+

+### Changed

+- Bumped minimum supported Rust version (MSRV) to 1.60.0

+- Added error logging when `CLANG_PATH` set but it isn't a full path to an executable

+- Removed reference to `libclang` 3.5 in error message for attempting to call an unsupported function

+

+### Added

+- Added `libcpp` Cargo feature which enables linking to `libc++` instead of `libstdc++` when linking to `libclang` statically on Linux or Haiku

+

+### Fixed

+- Fixed handling of paths that contain characters that have special meaning in

+glob patterns (e.g., `[` or `]`)

+- Fixed `Clang::find` to support both the `-target` and `--target` arguments

+when using target-prefixed `clang` binaries

+

+## [1.7.0] - 2023-12-31

+

+### Added

+- Added support for `clang` 17.0.x

+

+## [1.6.1] - 2023-03-29

+

+### Fixed

+- Improved error message when calling a `libclang` function that is not supported by the loaded `libclang` instance (https://github.com/rust-lang/rust-bindgen/issues/2446)

+

+## [1.6.0] - 2023-02-18

+

+### Changed

+- MinGW directories are not searched for `libclang` instances on Windows when

+compiling for an MSVC target

+- Bumped minimum supported Rust version (MSRV) to 1.51.0

+- Changed Windows search directory preferences (`libclang` instances from

+Visual Studio installs are now the lowest priority rather than the second

+highest)

+

+## ~~[1.5.1] - 2023-02-05~~ (YANKED)

+

+### Changed

+- MinGW directories are not searched for `libclang` instances on Windows when

+compiling for an MSVC target

+

+## ~~[1.5.0] - 2023-02-05~~ (YANKED)

+

+### Changed

+- Bumped minimum supported Rust version (MSRV) to 1.51.0

+- Changed Windows search directory preferences (`libclang` instances from

+Visual Studio installs are now the lowest priority rather than the second

+highest)

+

+### Added

+- Added additional support for `clang` 16.0.x

+

+## [1.4.0] - 2022-09-22

+

+### Changed

+- The value of an `EntityKind` enum variant

+(`EntityKind::CXCursor_TranslationUnit`) has been updated for Clang 15.0 and

+later to match the

+[breaking change made in `libclang`](https://github.com/llvm/llvm-project/commit/bb83f8e70bd1d56152f02307adacd718cd67e312#diff-674613a0e47f4e66cc19061e28e3296d39be2d124dceefb68237b30b8e241e7c)

+

+### Added

+- Added support for `clang` 16.0.x

+- Added support for `clang` 15.0.x

+- Added support for `clang` 14.0.x

+

+## [1.3.3] - 2022-05-28

+

+### Fixed

+- Fixed `Clang::find` to check that `CLANG_PATH` is an executable file before

+selecting it

+

+## [1.3.2] - 2022-05-18

+

+### Added

+- Added support for illumos and derivatives

+

+## [1.3.1] - 2022-02-03

+

+### Added

+- Added missing `clang_getToken` function

+

+## [1.3.0] - 2021-10-31

+

+### Added

+- Added support for `clang` 13.0.x

+- Added support for `clang` 12.0.x

+- Added support for the Haiku operating system

+

+## [1.2.2] - 2021-09-02

+

+### Fixed

+- Fixed handling of paths that contain characters that have special meaning in

+glob patterns (e.g., `[` or `]`)

+

+## [1.2.1] - 2021-08-24

+

+### Changed

+- Updated build script to check the install location used by the

+[Scoop](https://scoop.sh/) command-line installer on Windows

+

+### Fixed

+- Updated build script to support environments where the `PATH` environment

+variable is not set

+

+## [1.2.0] - 2021-04-08

+

+### Changed

+- Changed `Clang::find` to prefer target-prefixed binaries when a `-target`

+argument is provided (e.g., if the arguments `-target` and

+`x86_64-unknown-linux-gnu` are provided, a target-prefixed Clang executable

+such as `x86_64-unknown-linux-gnu-clang` will be preferred over a non-target

+prefixed Clang executable)

+

+### Fixed

+- Fixed build script to split paths in environment variables (e.g.,

+`LD_LIBRARY_PATH`) using the appropriate separator for the platform (previously

+`:` was used as the separator but some platforms such as Windows use `;`)

+

+## [1.1.1] - 2021-02-19

+

+### Changed

+- Bumped `libloading` version to `0.7`

+

+## [1.1.0] - 2021-02-09

+

+### Changed

+- Added Visual Studio LLVM component directory to search paths on Windows

+([#121](https://github.com/KyleMayes/clang-sys/issues/121))

+

+### Added

+- Added support for `clang` 11.0.x

+

+## [1.0.3] - 2020-11-19

+

+### Fixed

+- Fixed `Clang::find` panicking when `llvm-config` or `xcode-build` don't output anything to `stdout`

+

+## [1.0.2] - 2020-11-17

+

+### Fixed

+- Fixed `Clang::find` to properly search directories returned by the

+`llvm-config --bindir` and `xcodebuild -find clang` commands

+- Improved version selection algorithm in the case where there are multiple

+instances of `libclang` with the highest version found; previously the lowest

+priority instance would be selected instead of the highest priority instance

+(e.g., the versions found by searching the fallback directories were preferred

+over the versions found by searching the `llvm-config --prefix` directory)

+

+## [1.0.1] - 2020-10-01

+

+### Changed

+- Improved panic error message when calling an unloaded function

+

+## [1.0.0] - 2020-07-14

+

+### Changed

+- Bumped `libloading` version to `0.6.0`

+- Updated build script to not print warnings about failures to execute

+`llvm-config` and `xcode-select` unless an instance of `libclang` is not found

+

+### Added

+- Added support for `clang` 10.0.x

+

+### Removed

+- Removed `gte_clang_*` Cargo features (these were an implementation detail)

+

+## [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/crates/clang-sys/Cargo.toml b/crates/clang-sys/Cargo.toml
index 49e15ce..ae9a804 100644
--- a/crates/clang-sys/Cargo.toml
+++ b/crates/clang-sys/Cargo.toml
@@ -10,8 +10,9 @@
 # See Cargo.toml.orig for the original contents.
 
 [package]
+edition = "2021"
 name = "clang-sys"
-version = "1.7.0"
+version = "1.8.1"
 authors = ["Kyle Mayes <kyle@mayeses.com>"]
 build = "build.rs"
 links = "clang"
@@ -23,7 +24,7 @@
 
 [package.metadata.docs.rs]
 features = [
-    "clang_17_0",
+    "clang_18_0",
     "runtime",
 ]
 
@@ -41,11 +42,11 @@
 [dev-dependencies.glob]
 version = "0.3"
 
-[dev-dependencies.serial_test]
+[dev-dependencies.lazy_static]
 version = "1"
 
 [dev-dependencies.tempfile]
-version = "3"
+version = ">=3.0.0, <3.7.0"
 
 [build-dependencies.glob]
 version = "0.3"
@@ -59,6 +60,7 @@
 clang_15_0 = ["clang_14_0"]
 clang_16_0 = ["clang_15_0"]
 clang_17_0 = ["clang_16_0"]
+clang_18_0 = ["clang_17_0"]
 clang_3_5 = []
 clang_3_6 = ["clang_3_5"]
 clang_3_7 = ["clang_3_6"]
@@ -70,5 +72,6 @@
 clang_7_0 = ["clang_6_0"]
 clang_8_0 = ["clang_7_0"]
 clang_9_0 = ["clang_8_0"]
+libcpp = []
 runtime = ["libloading"]
 static = []
diff --git a/crates/clang-sys/LICENSE.txt b/crates/clang-sys/LICENSE.txt
index d645695..75b5248 100644
--- a/crates/clang-sys/LICENSE.txt
+++ b/crates/clang-sys/LICENSE.txt
@@ -1,202 +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.
+

+                                 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/crates/clang-sys/METADATA b/crates/clang-sys/METADATA
index 8353d21..ab03ae1 100644
--- a/crates/clang-sys/METADATA
+++ b/crates/clang-sys/METADATA
@@ -1,17 +1,17 @@
 name: "clang-sys"
 description: "Rust bindings for libclang."
 third_party {
-  version: "1.7.0"
+  version: "1.8.1"
   license_type: NOTICE
   last_upgrade_date {
     year: 2024
-    month: 5
-    day: 10
+    month: 12
+    day: 19
   }
   homepage: "https://crates.io/crates/clang-sys"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/clang-sys/clang-sys-1.7.0.crate"
-    version: "1.7.0"
+    value: "https://static.crates.io/crates/clang-sys/clang-sys-1.8.1.crate"
+    version: "1.8.1"
   }
 }
diff --git a/crates/clang-sys/README.md b/crates/clang-sys/README.md
index 40252db..be86f94 100644
--- a/crates/clang-sys/README.md
+++ b/crates/clang-sys/README.md
@@ -1,89 +1,116 @@
-# clang-sys
-
-[![Crate](https://img.shields.io/crates/v/clang-sys.svg)](https://crates.io/crates/clang-sys)
-[![Documentation](https://docs.rs/clang-sys/badge.svg)](https://docs.rs/clang-sys)
-[![CI](https://img.shields.io/github/actions/workflow/status/KyleMayes/clang-sys/ci.yml?branch=master)](https://github.com/KyleMayes/clang-sys/actions?query=workflow%3ACI)
-![MSRV](https://img.shields.io/badge/MSRV-1.51.0-blue)
-
-Rust bindings for `libclang`.
-
-If you are interested in a somewhat idiomatic Rust wrapper for these bindings, see [`clang-rs`](https://github.com/KyleMayes/clang-rs).
-
-Released under the Apache License 2.0.
-
-## [Documentation](https://docs.rs/clang-sys)
-
-Note that the documentation on https://docs.rs for this crate assumes usage of the `runtime` Cargo feature as well as the Cargo feature for the latest supported version of `libclang` (e.g., `clang_16_0`), neither of which are enabled by default.
-
-Due to the usage of the `runtime` Cargo feature, this documentation will contain some additional types and functions to manage a dynamically loaded `libclang` instance at runtime.
-
-Due to the usage of the Cargo feature for the latest supported version of `libclang`, this documentation will contain constants and functions that are not available in the oldest supported version of `libclang` (3.5). All of these types and functions have a documentation comment which specifies the minimum `libclang` version required to use the item.
-
-## Supported Versions
-
-To target a version of `libclang`, enable a Cargo features such as one of the following:
-
-* `clang_3_5` - requires `libclang` 3.5 or later
-* `clang_3_6` - requires `libclang` 3.6 or later
-* etc...
-* `clang_15_0` - requires `libclang` 15.0 or later
-* `clang_16_0` - requires `libclang` 16.0 or later
-
-If you do not enable one of these features, the API provided by `libclang` 3.5 will be available by default.
-
-**Note:** If you are using Clang 15.0 or later, you should enable the `clang_15_0` feature or a more recent version feature. Clang 15.0 introduced [a breaking change to the `EntityKind` enum](https://github.com/llvm/llvm-project/commit/bb83f8e70bd1d56152f02307adacd718cd67e312#diff-674613a0e47f4e66cc19061e28e3296d39be2d124dceefb68237b30b8e241e7c) which resulted in a mismatch between the values returned by `libclang` and the values for `EntityKind` defined by this crate in previous versions.
-
-## 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.
+# clang-sys

+

+[![Crate](https://img.shields.io/crates/v/clang-sys.svg)](https://crates.io/crates/clang-sys)

+[![Documentation](https://docs.rs/clang-sys/badge.svg)](https://docs.rs/clang-sys)

+[![CI](https://img.shields.io/github/actions/workflow/status/KyleMayes/clang-sys/ci.yml?branch=master)](https://github.com/KyleMayes/clang-sys/actions?query=workflow%3ACI)

+![MSRV](https://img.shields.io/badge/MSRV-1.60.0-blue)

+

+Rust bindings for `libclang`.

+

+If you are interested in a somewhat idiomatic Rust wrapper for these bindings, see [`clang-rs`](https://github.com/KyleMayes/clang-rs).

+

+Released under the Apache License 2.0.

+

+## [Documentation](https://docs.rs/clang-sys)

+

+Note that the documentation on https://docs.rs for this crate assumes usage of the `runtime` Cargo feature as well as the Cargo feature for the latest supported version of `libclang` (e.g., `clang_16_0`), neither of which are enabled by default.

+

+Due to the usage of the `runtime` Cargo feature, this documentation will contain some additional types and functions to manage a dynamically loaded `libclang` instance at runtime.

+

+Due to the usage of the Cargo feature for the latest supported version of `libclang`, this documentation will contain constants and functions that are not available in the oldest supported version of `libclang` (3.5). All of these types and functions have a documentation comment which specifies the minimum `libclang` version required to use the item.

+

+## Supported Versions

+

+To target a version of `libclang`, enable a Cargo features such as one of the following:

+

+* `clang_3_5` - requires `libclang` 3.5 or later

+* `clang_3_6` - requires `libclang` 3.6 or later

+* etc...

+* `clang_17_0` - requires `libclang` 17.0 or later

+* `clang_18_0` - requires `libclang` 18.0 or later

+

+If you do not enable one of these features, the API provided by `libclang` 3.5 will be available by default.

+

+**Note:** If you are using Clang 15.0 or later, you should enable the `clang_15_0` feature or a more recent version feature. Clang 15.0 introduced [a breaking change to the `EntityKind` enum](https://github.com/llvm/llvm-project/commit/bb83f8e70bd1d56152f02307adacd718cd67e312#diff-674613a0e47f4e66cc19061e28e3296d39be2d124dceefb68237b30b8e241e7c) which resulted in a mismatch between the values returned by `libclang` and the values for `EntityKind` defined by this crate in previous versions.

+

+## 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.

+

+**Note:** The `libcpp` Cargo feature can be used to enable linking to `libc++` instead of `libstd++` when linking to `libclang` statically on Linux or Haiku.

+

+#### Static Library Availability

+

+Linking to `libclang` statically on *nix systems requires that the `libclang.a` static library be available.  

+This library is usually *not* included in most distributions of LLVM and Clang (e.g., `libclang-dev` on Debian-based systems).  

+If you need to link to `libclang` statically then most likely the only consistent way to get your hands on `libclang.a` is to build it yourself.

+

+Here's an example of building the required static libraries and using them with `clang-sys`:

+

+```text

+git clone git@github.com:llvm/llvm-project.git

+cd llvm-project

+

+cmake -S llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS=clang -DLIBCLANG_BUILD_STATIC=ON

+ninja -C build

+

+cd ..

+git clone git@github.com:KyleMayes/clang-sys.git

+cd clang-sys

+

+LLVM_CONFIG_PATH=../llvm-project/build/bin/llvm-config cargo test --features static

+```

+

+Linking to `libclang` statically requires linking a large number of big static libraries.  

+Using [`rust-lld` as a linker](https://blog.rust-lang.org/2024/05/17/enabling-rust-lld-on-linux.html) can greatly reduce linking times.

+

+### 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/crates/clang-sys/build.rs b/crates/clang-sys/build.rs
index 6b15126..4155b97 100644
--- a/crates/clang-sys/build.rs
+++ b/crates/clang-sys/build.rs
@@ -1,79 +1,77 @@
-// SPDX-License-Identifier: Apache-2.0
-
-//! Finds `libclang` static or shared 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 shared 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;
-
-#[macro_use]
-#[path = "build/macros.rs"]
-pub mod macros;
-
-#[path = "build/common.rs"]
-pub mod common;
-#[path = "build/dynamic.rs"]
-pub mod dynamic;
-#[path = "build/static.rs"]
-pub mod r#static;
-
-/// Copies a file.
-#[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();
-}
-
-/// Copies the code used to find and link to `libclang` shared libraries into
-/// the build output directory so that it may be used when linking 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/macros.rs", &Path::new(&out).join("macros.rs"));
-    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 dynamically or statically.
-#[cfg(not(feature = "runtime"))]
-fn main() {
-    if cfg!(feature = "static") {
-        r#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());
-    }
-}
+// SPDX-License-Identifier: Apache-2.0

+

+//! Finds `libclang` static or shared 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 shared 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)]

+

+use std::path::Path;

+

+#[macro_use]

+#[path = "build/macros.rs"]

+pub mod macros;

+

+#[path = "build/common.rs"]

+pub mod common;

+#[path = "build/dynamic.rs"]

+pub mod dynamic;

+#[path = "build/static.rs"]

+pub mod r#static;

+

+/// Copies a file.

+#[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();

+}

+

+/// Copies the code used to find and link to `libclang` shared libraries into

+/// the build output directory so that it may be used when linking 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/macros.rs", &Path::new(&out).join("macros.rs"));

+    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 dynamically or statically.

+#[cfg(not(feature = "runtime"))]

+fn main() {

+    if cfg!(feature = "static") {

+        r#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/crates/clang-sys/build/common.rs b/crates/clang-sys/build/common.rs
index 3005a8a..4d144cb 100644
--- a/crates/clang-sys/build/common.rs
+++ b/crates/clang-sys/build/common.rs
@@ -1,355 +1,355 @@
-// SPDX-License-Identifier: Apache-2.0
-
-extern crate glob;
-
-use std::cell::RefCell;
-use std::collections::HashMap;
-use std::env;
-use std::path::{Path, PathBuf};
-use std::process::Command;
-
-use glob::{MatchOptions, Pattern};
-
-//================================================
-// Commands
-//================================================
-
-thread_local! {
-    /// The errors encountered by the build script while executing commands.
-    static COMMAND_ERRORS: RefCell<HashMap<String, Vec<String>>> = RefCell::default();
-}
-
-/// Adds an error encountered by the build script while executing a command.
-fn add_command_error(name: &str, path: &str, arguments: &[&str], message: String) {
-    COMMAND_ERRORS.with(|e| {
-        e.borrow_mut()
-            .entry(name.into())
-            .or_insert_with(Vec::new)
-            .push(format!(
-                "couldn't execute `{} {}` (path={}) ({})",
-                name,
-                arguments.join(" "),
-                path,
-                message,
-            ))
-    });
-}
-
-/// A struct that prints the errors encountered by the build script while
-/// executing commands when dropped (unless explictly discarded).
-///
-/// This is handy because we only want to print these errors when the build
-/// script fails to link to an instance of `libclang`. For example, if
-/// `llvm-config` couldn't be executed but an instance of `libclang` was found
-/// anyway we don't want to pollute the build output with irrelevant errors.
-#[derive(Default)]
-pub struct CommandErrorPrinter {
-    discard: bool,
-}
-
-impl CommandErrorPrinter {
-    pub fn discard(mut self) {
-        self.discard = true;
-    }
-}
-
-impl Drop for CommandErrorPrinter {
-    fn drop(&mut self) {
-        if self.discard {
-            return;
-        }
-
-        let errors = COMMAND_ERRORS.with(|e| e.borrow().clone());
-
-        if let Some(errors) = errors.get("llvm-config") {
-            println!(
-                "cargo:warning=could not execute `llvm-config` one or more \
-                times, if the LLVM_CONFIG_PATH environment variable is set to \
-                a full path to valid `llvm-config` executable it will be used \
-                to try to find an instance of `libclang` on your system: {}",
-                errors
-                    .iter()
-                    .map(|e| format!("\"{}\"", e))
-                    .collect::<Vec<_>>()
-                    .join("\n  "),
-            )
-        }
-
-        if let Some(errors) = errors.get("xcode-select") {
-            println!(
-                "cargo:warning=could not execute `xcode-select` one or more \
-                times, if a valid instance of this executable is on your PATH \
-                it will be used to try to find an instance of `libclang` on \
-                your system: {}",
-                errors
-                    .iter()
-                    .map(|e| format!("\"{}\"", e))
-                    .collect::<Vec<_>>()
-                    .join("\n  "),
-            )
-        }
-    }
-}
-
-#[cfg(test)]
-pub static RUN_COMMAND_MOCK: std::sync::Mutex<
-    Option<Box<dyn Fn(&str, &str, &[&str]) -> Option<String> + Send + Sync + 'static>>,
-> = std::sync::Mutex::new(None);
-
-/// Executes a command and returns the `stdout` output if the command was
-/// successfully executed (errors are added to `COMMAND_ERRORS`).
-fn run_command(name: &str, path: &str, arguments: &[&str]) -> Option<String> {
-    #[cfg(test)]
-    if let Some(command) = &*RUN_COMMAND_MOCK.lock().unwrap() {
-        return command(name, path, arguments);
-    }
-
-    let output = match Command::new(path).args(arguments).output() {
-        Ok(output) => output,
-        Err(error) => {
-            let message = format!("error: {}", error);
-            add_command_error(name, path, arguments, message);
-            return None;
-        }
-    };
-
-    if output.status.success() {
-        Some(String::from_utf8_lossy(&output.stdout).into_owned())
-    } else {
-        let message = format!("exit code: {}", output.status);
-        add_command_error(name, path, arguments, message);
-        None
-    }
-}
-
-/// Executes the `llvm-config` command and returns the `stdout` output if the
-/// command was successfully executed (errors are added to `COMMAND_ERRORS`).
-pub fn run_llvm_config(arguments: &[&str]) -> Option<String> {
-    let path = env::var("LLVM_CONFIG_PATH").unwrap_or_else(|_| "llvm-config".into());
-    run_command("llvm-config", &path, arguments)
-}
-
-/// Executes the `xcode-select` command and returns the `stdout` output if the
-/// command was successfully executed (errors are added to `COMMAND_ERRORS`).
-pub fn run_xcode_select(arguments: &[&str]) -> Option<String> {
-    run_command("xcode-select", "xcode-select", arguments)
-}
-
-//================================================
-// Search Directories
-//================================================
-// These search directories are listed in order of
-// preference, so if multiple `libclang` instances
-// are found when searching matching directories,
-// the `libclang` instances from earlier
-// directories will be preferred (though version
-// takes precedence over location).
-//================================================
-
-/// `libclang` directory patterns for Haiku.
-const DIRECTORIES_HAIKU: &[&str] = &[
-    "/boot/home/config/non-packaged/develop/lib",
-    "/boot/home/config/non-packaged/lib",
-    "/boot/system/non-packaged/develop/lib",
-    "/boot/system/non-packaged/lib",
-    "/boot/system/develop/lib",
-    "/boot/system/lib",
-];
-
-/// `libclang` directory patterns for Linux (and FreeBSD).
-const DIRECTORIES_LINUX: &[&str] = &[
-    "/usr/local/llvm*/lib*",
-    "/usr/local/lib*/*/*",
-    "/usr/local/lib*/*",
-    "/usr/local/lib*",
-    "/usr/lib*/*/*",
-    "/usr/lib*/*",
-    "/usr/lib*",
-];
-
-/// `libclang` directory patterns for macOS.
-const DIRECTORIES_MACOS: &[&str] = &[
-    "/usr/local/opt/llvm*/lib/llvm*/lib",
-    "/Library/Developer/CommandLineTools/usr/lib",
-    "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib",
-    "/usr/local/opt/llvm*/lib",
-];
-
-/// `libclang` directory patterns for Windows.
-///
-/// The boolean indicates whether the directory pattern should be used when
-/// compiling for an MSVC target environment.
-const DIRECTORIES_WINDOWS: &[(&str, bool)] = &[
-    // LLVM + Clang can be installed using Scoop (https://scoop.sh).
-    // Other Windows package managers install LLVM + Clang to other listed
-    // system-wide directories.
-    ("C:\\Users\\*\\scoop\\apps\\llvm\\current\\lib", true),
-    ("C:\\MSYS*\\MinGW*\\lib", false),
-    ("C:\\Program Files*\\LLVM\\lib", true),
-    ("C:\\LLVM\\lib", true),
-    // LLVM + Clang can be installed as a component of Visual Studio.
-    // https://github.com/KyleMayes/clang-sys/issues/121
-    ("C:\\Program Files*\\Microsoft Visual Studio\\*\\BuildTools\\VC\\Tools\\Llvm\\**\\lib", true),
-];
-
-/// `libclang` directory patterns for illumos
-const DIRECTORIES_ILLUMOS: &[&str] = &[
-    "/opt/ooce/llvm-*/lib",
-    "/opt/ooce/clang-*/lib",
-];
-
-//================================================
-// Searching
-//================================================
-
-/// Finds the files in a directory that match one or more filename glob patterns
-/// and returns the paths to and filenames of those files.
-fn search_directory(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, String)> {
-    // Escape the specified directory in case it contains characters that have
-    // special meaning in glob patterns (e.g., `[` or `]`).
-    let directory = Pattern::escape(directory.to_str().unwrap());
-    let directory = Path::new(&directory);
-
-    // Join the escaped directory to the filename glob patterns to obtain
-    // complete glob patterns for the files being searched for.
-    let paths = filenames
-        .iter()
-        .map(|f| directory.join(f).to_str().unwrap().to_owned());
-
-    // Prevent wildcards from matching path separators to ensure that the search
-    // is limited to the specified directory.
-    let mut options = MatchOptions::new();
-    options.require_literal_separator = true;
-
-    paths
-        .map(|p| glob::glob_with(&p, options))
-        .filter_map(Result::ok)
-        .flatten()
-        .filter_map(|p| {
-            let path = p.ok()?;
-            let filename = path.file_name()?.to_str().unwrap();
-
-            // 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<_>>()
-}
-
-/// Finds the files in a directory (and any relevant sibling directories) that
-/// match one or more filename glob patterns and returns the paths to and
-/// filenames of those files.
-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 target_os!("windows") && directory.ends_with("lib") {
-        let sibling = directory.parent().unwrap().join("bin");
-        results.extend(search_directory(&sibling, filenames).into_iter());
-    }
-
-    results
-}
-
-/// Finds the `libclang` static or dynamic libraries matching one or more
-/// filename glob patterns and returns the paths to and filenames of those files.
-pub fn search_libclang_directories(filenames: &[String], variable: &str) -> Vec<(PathBuf, String)> {
-    // Search only the path indicated by the relevant environment variable
-    // (e.g., `LIBCLANG_PATH`) if it is set.
-    if let Ok(path) = env::var(variable).map(|d| Path::new(&d).to_path_buf()) {
-        // Check if the path is a matching file.
-        if let Some(parent) = path.parent() {
-            let filename = path.file_name().unwrap().to_str().unwrap();
-            let libraries = search_directories(parent, filenames);
-            if libraries.iter().any(|(_, f)| f == filename) {
-                return vec![(parent.into(), filename.into())];
-            }
-        }
-
-        // Check if the path is directory containing a matching file.
-        return search_directories(&path, filenames);
-    }
-
-    let mut found = vec![];
-
-    // Search the `bin` and `lib` directories in the directory returned 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"), filenames));
-        found.extend(search_directories(&directory.join("lib"), filenames));
-        found.extend(search_directories(&directory.join("lib64"), filenames));
-    }
-
-    // Search the toolchain directory in the directory returned by
-    // `xcode-select --print-path`.
-    if target_os!("macos") {
-        if let Some(output) = run_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, filenames));
-        }
-    }
-
-    // Search the directories in the `LD_LIBRARY_PATH` environment variable.
-    if let Ok(path) = env::var("LD_LIBRARY_PATH") {
-        for directory in env::split_paths(&path) {
-            found.extend(search_directories(&directory, filenames));
-        }
-    }
-
-    // Determine the `libclang` directory patterns.
-    let directories: Vec<&str> = if target_os!("haiku") {
-        DIRECTORIES_HAIKU.into()
-    } else if target_os!("linux") || target_os!("freebsd") {
-        DIRECTORIES_LINUX.into()
-    } else if target_os!("macos") {
-        DIRECTORIES_MACOS.into()
-    } else if target_os!("windows") {
-        let msvc = target_env!("msvc");
-        DIRECTORIES_WINDOWS
-            .iter()
-            .filter(|d| d.1 || !msvc)
-            .map(|d| d.0)
-            .collect()
-    } else if target_os!("illumos") {
-        DIRECTORIES_ILLUMOS.into()
-    } else {
-        vec![]
-    };
-
-    // We use temporary directories when testing the build script so we'll
-    // remove the prefixes that make the directories absolute.
-    let directories = if test!() {
-        directories
-            .iter()
-            .map(|d| d.strip_prefix('/').or_else(|| d.strip_prefix("C:\\")).unwrap_or(d))
-            .collect::<Vec<_>>()
-    } else {
-        directories
-    };
-
-    // 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() {
-        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, filenames));
-            }
-        }
-    }
-
-    found
-}
+// SPDX-License-Identifier: Apache-2.0

+

+use std::cell::RefCell;

+use std::collections::HashMap;

+use std::env;

+use std::path::{Path, PathBuf};

+use std::process::Command;

+

+use glob::{MatchOptions, Pattern};

+

+//================================================

+// Commands

+//================================================

+

+thread_local! {

+    /// The errors encountered by the build script while executing commands.

+    static COMMAND_ERRORS: RefCell<HashMap<String, Vec<String>>> = RefCell::default();

+}

+

+/// Adds an error encountered by the build script while executing a command.

+fn add_command_error(name: &str, path: &str, arguments: &[&str], message: String) {

+    COMMAND_ERRORS.with(|e| {

+        e.borrow_mut()

+            .entry(name.into())

+            .or_default()

+            .push(format!(

+                "couldn't execute `{} {}` (path={}) ({})",

+                name,

+                arguments.join(" "),

+                path,

+                message,

+            ))

+    });

+}

+

+/// A struct that prints the errors encountered by the build script while

+/// executing commands when dropped (unless explictly discarded).

+///

+/// This is handy because we only want to print these errors when the build

+/// script fails to link to an instance of `libclang`. For example, if

+/// `llvm-config` couldn't be executed but an instance of `libclang` was found

+/// anyway we don't want to pollute the build output with irrelevant errors.

+#[derive(Default)]

+pub struct CommandErrorPrinter {

+    discard: bool,

+}

+

+impl CommandErrorPrinter {

+    pub fn discard(mut self) {

+        self.discard = true;

+    }

+}

+

+impl Drop for CommandErrorPrinter {

+    fn drop(&mut self) {

+        if self.discard {

+            return;

+        }

+

+        let errors = COMMAND_ERRORS.with(|e| e.borrow().clone());

+

+        if let Some(errors) = errors.get("llvm-config") {

+            println!(

+                "cargo:warning=could not execute `llvm-config` one or more \

+                times, if the LLVM_CONFIG_PATH environment variable is set to \

+                a full path to valid `llvm-config` executable it will be used \

+                to try to find an instance of `libclang` on your system: {}",

+                errors

+                    .iter()

+                    .map(|e| format!("\"{}\"", e))

+                    .collect::<Vec<_>>()

+                    .join("\n  "),

+            )

+        }

+

+        if let Some(errors) = errors.get("xcode-select") {

+            println!(

+                "cargo:warning=could not execute `xcode-select` one or more \

+                times, if a valid instance of this executable is on your PATH \

+                it will be used to try to find an instance of `libclang` on \

+                your system: {}",

+                errors

+                    .iter()

+                    .map(|e| format!("\"{}\"", e))

+                    .collect::<Vec<_>>()

+                    .join("\n  "),

+            )

+        }

+    }

+}

+

+#[cfg(test)]

+lazy_static::lazy_static! {

+    pub static ref RUN_COMMAND_MOCK: std::sync::Mutex<

+        Option<Box<dyn Fn(&str, &str, &[&str]) -> Option<String> + Send + Sync + 'static>>,

+    > = std::sync::Mutex::new(None);

+}

+

+/// Executes a command and returns the `stdout` output if the command was

+/// successfully executed (errors are added to `COMMAND_ERRORS`).

+fn run_command(name: &str, path: &str, arguments: &[&str]) -> Option<String> {

+    #[cfg(test)]

+    if let Some(command) = &*RUN_COMMAND_MOCK.lock().unwrap() {

+        return command(name, path, arguments);

+    }

+

+    let output = match Command::new(path).args(arguments).output() {

+        Ok(output) => output,

+        Err(error) => {

+            let message = format!("error: {}", error);

+            add_command_error(name, path, arguments, message);

+            return None;

+        }

+    };

+

+    if output.status.success() {

+        Some(String::from_utf8_lossy(&output.stdout).into_owned())

+    } else {

+        let message = format!("exit code: {}", output.status);

+        add_command_error(name, path, arguments, message);

+        None

+    }

+}

+

+/// Executes the `llvm-config` command and returns the `stdout` output if the

+/// command was successfully executed (errors are added to `COMMAND_ERRORS`).

+pub fn run_llvm_config(arguments: &[&str]) -> Option<String> {

+    let path = env::var("LLVM_CONFIG_PATH").unwrap_or_else(|_| "llvm-config".into());

+    run_command("llvm-config", &path, arguments)

+}

+

+/// Executes the `xcode-select` command and returns the `stdout` output if the

+/// command was successfully executed (errors are added to `COMMAND_ERRORS`).

+pub fn run_xcode_select(arguments: &[&str]) -> Option<String> {

+    run_command("xcode-select", "xcode-select", arguments)

+}

+

+//================================================

+// Search Directories

+//================================================

+// These search directories are listed in order of

+// preference, so if multiple `libclang` instances

+// are found when searching matching directories,

+// the `libclang` instances from earlier

+// directories will be preferred (though version

+// takes precedence over location).

+//================================================

+

+/// `libclang` directory patterns for Haiku.

+const DIRECTORIES_HAIKU: &[&str] = &[

+    "/boot/home/config/non-packaged/develop/lib",

+    "/boot/home/config/non-packaged/lib",

+    "/boot/system/non-packaged/develop/lib",

+    "/boot/system/non-packaged/lib",

+    "/boot/system/develop/lib",

+    "/boot/system/lib",

+];

+

+/// `libclang` directory patterns for Linux (and FreeBSD).

+const DIRECTORIES_LINUX: &[&str] = &[

+    "/usr/local/llvm*/lib*",

+    "/usr/local/lib*/*/*",

+    "/usr/local/lib*/*",

+    "/usr/local/lib*",

+    "/usr/lib*/*/*",

+    "/usr/lib*/*",

+    "/usr/lib*",

+];

+

+/// `libclang` directory patterns for macOS.

+const DIRECTORIES_MACOS: &[&str] = &[

+    "/usr/local/opt/llvm*/lib/llvm*/lib",

+    "/Library/Developer/CommandLineTools/usr/lib",

+    "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib",

+    "/usr/local/opt/llvm*/lib",

+];

+

+/// `libclang` directory patterns for Windows.

+///

+/// The boolean indicates whether the directory pattern should be used when

+/// compiling for an MSVC target environment.

+const DIRECTORIES_WINDOWS: &[(&str, bool)] = &[

+    // LLVM + Clang can be installed using Scoop (https://scoop.sh).

+    // Other Windows package managers install LLVM + Clang to other listed

+    // system-wide directories.

+    ("C:\\Users\\*\\scoop\\apps\\llvm\\current\\lib", true),

+    ("C:\\MSYS*\\MinGW*\\lib", false),

+    ("C:\\Program Files*\\LLVM\\lib", true),

+    ("C:\\LLVM\\lib", true),

+    // LLVM + Clang can be installed as a component of Visual Studio.

+    // https://github.com/KyleMayes/clang-sys/issues/121

+    ("C:\\Program Files*\\Microsoft Visual Studio\\*\\VC\\Tools\\Llvm\\**\\lib", true),

+];

+

+/// `libclang` directory patterns for illumos

+const DIRECTORIES_ILLUMOS: &[&str] = &[

+    "/opt/ooce/llvm-*/lib",

+    "/opt/ooce/clang-*/lib",

+];

+

+//================================================

+// Searching

+//================================================

+

+/// Finds the files in a directory that match one or more filename glob patterns

+/// and returns the paths to and filenames of those files.

+fn search_directory(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, String)> {

+    // Escape the specified directory in case it contains characters that have

+    // special meaning in glob patterns (e.g., `[` or `]`).

+    let directory = Pattern::escape(directory.to_str().unwrap());

+    let directory = Path::new(&directory);

+

+    // Join the escaped directory to the filename glob patterns to obtain

+    // complete glob patterns for the files being searched for.

+    let paths = filenames

+        .iter()

+        .map(|f| directory.join(f).to_str().unwrap().to_owned());

+

+    // Prevent wildcards from matching path separators to ensure that the search

+    // is limited to the specified directory.

+    let mut options = MatchOptions::new();

+    options.require_literal_separator = true;

+

+    paths

+        .map(|p| glob::glob_with(&p, options))

+        .filter_map(Result::ok)

+        .flatten()

+        .filter_map(|p| {

+            let path = p.ok()?;

+            let filename = path.file_name()?.to_str().unwrap();

+

+            // 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((path.parent().unwrap().to_owned(), filename.into()))

+        })

+        .collect::<Vec<_>>()

+}

+

+/// Finds the files in a directory (and any relevant sibling directories) that

+/// match one or more filename glob patterns and returns the paths to and

+/// filenames of those files.

+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 target_os!("windows") && directory.ends_with("lib") {

+        let sibling = directory.parent().unwrap().join("bin");

+        results.extend(search_directory(&sibling, filenames));

+    }

+

+    results

+}

+

+/// Finds the `libclang` static or dynamic libraries matching one or more

+/// filename glob patterns and returns the paths to and filenames of those files.

+pub fn search_libclang_directories(filenames: &[String], variable: &str) -> Vec<(PathBuf, String)> {

+    // Search only the path indicated by the relevant environment variable

+    // (e.g., `LIBCLANG_PATH`) if it is set.

+    if let Ok(path) = env::var(variable).map(|d| Path::new(&d).to_path_buf()) {

+        // Check if the path is a matching file.

+        if let Some(parent) = path.parent() {

+            let filename = path.file_name().unwrap().to_str().unwrap();

+            let libraries = search_directories(parent, filenames);

+            if libraries.iter().any(|(_, f)| f == filename) {

+                return vec![(parent.into(), filename.into())];

+            }

+        }

+

+        // Check if the path is directory containing a matching file.

+        return search_directories(&path, filenames);

+    }

+

+    let mut found = vec![];

+

+    // Search the `bin` and `lib` directories in the directory returned 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"), filenames));

+        found.extend(search_directories(&directory.join("lib"), filenames));

+        found.extend(search_directories(&directory.join("lib64"), filenames));

+    }

+

+    // Search the toolchain directory in the directory returned by

+    // `xcode-select --print-path`.

+    if target_os!("macos") {

+        if let Some(output) = run_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, filenames));

+        }

+    }

+

+    // Search the directories in the `LD_LIBRARY_PATH` environment variable.

+    if let Ok(path) = env::var("LD_LIBRARY_PATH") {

+        for directory in env::split_paths(&path) {

+            found.extend(search_directories(&directory, filenames));

+        }

+    }

+

+    // Determine the `libclang` directory patterns.

+    let directories: Vec<&str> = if target_os!("haiku") {

+        DIRECTORIES_HAIKU.into()

+    } else if target_os!("linux") || target_os!("freebsd") {

+        DIRECTORIES_LINUX.into()

+    } else if target_os!("macos") {

+        DIRECTORIES_MACOS.into()

+    } else if target_os!("windows") {

+        let msvc = target_env!("msvc");

+        DIRECTORIES_WINDOWS

+            .iter()

+            .filter(|d| d.1 || !msvc)

+            .map(|d| d.0)

+            .collect()

+    } else if target_os!("illumos") {

+        DIRECTORIES_ILLUMOS.into()

+    } else {

+        vec![]

+    };

+

+    // We use temporary directories when testing the build script so we'll

+    // remove the prefixes that make the directories absolute.

+    let directories = if test!() {

+        directories

+            .iter()

+            .map(|d| d.strip_prefix('/').or_else(|| d.strip_prefix("C:\\")).unwrap_or(d))

+            .collect::<Vec<_>>()

+    } else {

+        directories

+    };

+

+    // 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() {

+        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, filenames));

+            }

+        }

+    }

+

+    found

+}

diff --git a/crates/clang-sys/build/dynamic.rs b/crates/clang-sys/build/dynamic.rs
index 25e1c18..f3d5a62 100644
--- a/crates/clang-sys/build/dynamic.rs
+++ b/crates/clang-sys/build/dynamic.rs
@@ -1,257 +1,276 @@
-// SPDX-License-Identifier: Apache-2.0
-
-use std::env;
-use std::fs::File;
-use std::io::{self, Error, ErrorKind, Read, Seek, SeekFrom};
-use std::path::{Path, PathBuf};
-
-use super::common;
-
-//================================================
-// Validation
-//================================================
-
-/// Extracts the ELF class from the ELF header in a shared library.
-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"))
-    }
-}
-
-/// Extracts the magic number from the PE header in a shared library.
-fn parse_pe_header(path: &Path) -> io::Result<u16> {
-    let mut file = File::open(path)?;
-
-    // Extract 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);
-
-    // Check 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"));
-    }
-
-    // Extract the magic number.
-    let mut buffer = [0; 2];
-    file.seek(SeekFrom::Current(20))?;
-    file.read_exact(&mut buffer)?;
-    Ok(u16::from_le_bytes(buffer))
-}
-
-/// Checks that a `libclang` shared library matches the target platform.
-fn validate_library(path: &Path) -> Result<(), String> {
-    if target_os!("linux") || target_os!("freebsd") {
-        let class = parse_elf_header(path).map_err(|e| e.to_string())?;
-
-        if target_pointer_width!("32") && class != 1 {
-            return Err("invalid ELF class (64-bit)".into());
-        }
-
-        if target_pointer_width!("64") && class != 2 {
-            return Err("invalid ELF class (32-bit)".into());
-        }
-
-        Ok(())
-    } else if target_os!("windows") {
-        let magic = parse_pe_header(path).map_err(|e| e.to_string())?;
-
-        if target_pointer_width!("32") && magic != 267 {
-            return Err("invalid DLL (64-bit)".into());
-        }
-
-        if target_pointer_width!("64") && magic != 523 {
-            return Err("invalid DLL (32-bit)".into());
-        }
-
-        Ok(())
-    } else {
-        Ok(())
-    }
-}
-
-//================================================
-// Searching
-//================================================
-
-/// Extracts the version components in a `libclang` shared library filename.
-fn parse_version(filename: &str) -> Vec<u32> {
-    let version = if let Some(version) = filename.strip_prefix("libclang.so.") {
-        version
-    } else if filename.starts_with("libclang-") {
-        &filename[9..filename.len() - 3]
-    } else {
-        return vec![];
-    };
-
-    version.split('.').map(|s| s.parse().unwrap_or(0)).collect()
-}
-
-/// Finds `libclang` shared libraries and returns the paths to, filenames of,
-/// and versions of those 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 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 target_os!("freebsd") || target_os!("haiku") || target_os!("netbsd") || target_os!("openbsd") {
-        // 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 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());
-    }
-
-    // Find and validate `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_library(&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)
-}
-
-/// Finds the "best" `libclang` shared library and returns the directory and
-/// filename of that library.
-pub fn find(runtime: bool) -> Result<(PathBuf, String), String> {
-    search_libclang_directories(runtime)?
-        .iter()
-        // We want to find the `libclang` shared library with the highest
-        // version number, hence `max_by_key` below.
-        //
-        // However, in the case where there are multiple such `libclang` shared
-        // libraries, we want to use the order in which they appeared in the
-        // list returned by `search_libclang_directories` as a tiebreaker since
-        // that function returns `libclang` shared libraries in descending order
-        // of preference by how they were found.
-        //
-        // `max_by_key`, perhaps surprisingly, returns the *last* item with the
-        // maximum key rather than the first which results in the opposite of
-        // the tiebreaking behavior we want. This is easily fixed by reversing
-        // the list first.
-        .rev()
-        .max_by_key(|f| &f.2)
-        .cloned()
-        .map(|(path, filename, _)| (path, filename))
-        .ok_or_else(|| "unreachable".into())
-}
-
-//================================================
-// Linking
-//================================================
-
-/// Finds and links to a `libclang` shared library.
-#[cfg(not(feature = "runtime"))]
-pub fn link() {
-    let cep = common::CommandErrorPrinter::default();
-
-    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);
-    }
-
-    cep.discard();
-}
+// SPDX-License-Identifier: Apache-2.0

+

+use std::env;

+use std::fs::File;

+use std::io::{self, Error, ErrorKind, Read, Seek, SeekFrom};

+use std::path::{Path, PathBuf};

+

+use super::common;

+

+//================================================

+// Validation

+//================================================

+

+/// Extracts the ELF class from the ELF header in a shared library.

+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"))

+    }

+}

+

+/// Extracts the magic number and machine type from the PE header in a shared library.

+fn parse_pe_header(path: &Path) -> io::Result<(u16, u16)> {

+    let mut file = File::open(path)?;

+

+    // Extract 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);

+

+    // Check 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"));

+    }

+

+    // Extract the magic number.

+    let mut buffer = [0; 2];

+    file.seek(SeekFrom::Current(20))?;

+    file.read_exact(&mut buffer)?;

+    let magic_number = u16::from_le_bytes(buffer);

+

+    // Extract the machine type.

+    let mut buffer = [0; 2];

+    file.seek(SeekFrom::Current(-22))?;

+    file.read_exact(&mut buffer)?;

+    let machine_type = u16::from_le_bytes(buffer);

+

+    return Ok((magic_number, machine_type));

+}

+

+/// Checks that a `libclang` shared library matches the target platform.

+fn validate_library(path: &Path) -> Result<(), String> {

+    if target_os!("linux") || target_os!("freebsd") {

+        let class = parse_elf_header(path).map_err(|e| e.to_string())?;

+

+        if target_pointer_width!("32") && class != 1 {

+            return Err("invalid ELF class (64-bit)".into());

+        }

+

+        if target_pointer_width!("64") && class != 2 {

+            return Err("invalid ELF class (32-bit)".into());

+        }

+

+        Ok(())

+    } else if target_os!("windows") {

+        let (magic, machine_type) = parse_pe_header(path).map_err(|e| e.to_string())?;

+

+        if target_pointer_width!("32") && magic != 267 {

+            return Err("invalid DLL (64-bit)".into());

+        }

+

+        if target_pointer_width!("64") && magic != 523 {

+            return Err("invalid DLL (32-bit)".into());

+        }

+

+        let arch_mismatch = match machine_type {

+            0x014C if !target_arch!("x86") => Some("x86"),

+            0x8664 if !target_arch!("x86_64") => Some("x86-64"),

+            0xAA64 if !target_arch!("aarch64") => Some("ARM64"),

+            _ => None,

+        };

+

+        if let Some(arch) = arch_mismatch {

+            Err(format!("invalid DLL ({arch})"))

+        } else {

+            Ok(())

+        }

+    } else {

+        Ok(())

+    }

+}

+

+//================================================

+// Searching

+//================================================

+

+/// Extracts the version components in a `libclang` shared library filename.

+fn parse_version(filename: &str) -> Vec<u32> {

+    let version = if let Some(version) = filename.strip_prefix("libclang.so.") {

+        version

+    } else if filename.starts_with("libclang-") {

+        &filename[9..filename.len() - 3]

+    } else {

+        return vec![];

+    };

+

+    version.split('.').map(|s| s.parse().unwrap_or(0)).collect()

+}

+

+/// Finds `libclang` shared libraries and returns the paths to, filenames of,

+/// and versions of those 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 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 target_os!("freebsd") || target_os!("haiku") || target_os!("netbsd") || target_os!("openbsd") {

+        // 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 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());

+    }

+

+    // Find and validate `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_library(&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)

+}

+

+/// Finds the "best" `libclang` shared library and returns the directory and

+/// filename of that library.

+pub fn find(runtime: bool) -> Result<(PathBuf, String), String> {

+    search_libclang_directories(runtime)?

+        .iter()

+        // We want to find the `libclang` shared library with the highest

+        // version number, hence `max_by_key` below.

+        //

+        // However, in the case where there are multiple such `libclang` shared

+        // libraries, we want to use the order in which they appeared in the

+        // list returned by `search_libclang_directories` as a tiebreaker since

+        // that function returns `libclang` shared libraries in descending order

+        // of preference by how they were found.

+        //

+        // `max_by_key`, perhaps surprisingly, returns the *last* item with the

+        // maximum key rather than the first which results in the opposite of

+        // the tiebreaking behavior we want. This is easily fixed by reversing

+        // the list first.

+        .rev()

+        .max_by_key(|f| &f.2)

+        .cloned()

+        .map(|(path, filename, _)| (path, filename))

+        .ok_or_else(|| "unreachable".into())

+}

+

+//================================================

+// Linking

+//================================================

+

+/// Finds and links to a `libclang` shared library.

+#[cfg(not(feature = "runtime"))]

+pub fn link() {

+    let cep = common::CommandErrorPrinter::default();

+

+    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);

+    }

+

+    cep.discard();

+}

diff --git a/crates/clang-sys/build/macros.rs b/crates/clang-sys/build/macros.rs
index 811c7c3..a766a6e 100644
--- a/crates/clang-sys/build/macros.rs
+++ b/crates/clang-sys/build/macros.rs
@@ -1,38 +1,49 @@
-// SPDX-License-Identifier: Apache-2.0
-
-macro_rules! test {
-    () => (cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok());
-}
-
-macro_rules! target_os {
-    ($os:expr) => {
-        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {
-            let var = ::std::env::var("_CLANG_SYS_TEST_OS");
-            var.map_or(false, |v| v == $os)
-        } else {
-            cfg!(target_os = $os)
-        }
-    };
-}
-
-macro_rules! target_pointer_width {
-    ($pointer_width:expr) => {
-        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {
-            let var = ::std::env::var("_CLANG_SYS_TEST_POINTER_WIDTH");
-            var.map_or(false, |v| v == $pointer_width)
-        } else {
-            cfg!(target_pointer_width = $pointer_width)
-        }
-    };
-}
-
-macro_rules! target_env {
-    ($env:expr) => {
-        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {
-            let var = ::std::env::var("_CLANG_SYS_TEST_ENV");
-            var.map_or(false, |v| v == $env)
-        } else {
-            cfg!(target_env = $env)
-        }
-    };
-}
+// SPDX-License-Identifier: Apache-2.0

+

+macro_rules! test {

+    () => (cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok());

+}

+

+macro_rules! target_os {

+    ($os:expr) => {

+        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {

+            let var = ::std::env::var("_CLANG_SYS_TEST_OS");

+            var.map_or(false, |v| v == $os)

+        } else {

+            cfg!(target_os = $os)

+        }

+    };

+}

+

+macro_rules! target_arch {

+    ($arch:expr) => {

+        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {

+            let var = ::std::env::var("_CLANG_SYS_TEST_ARCH");

+            var.map_or(false, |v| v == $arch)

+        } else {

+            cfg!(target_arch = $arch)

+        }

+    };

+}

+

+macro_rules! target_pointer_width {

+    ($pointer_width:expr) => {

+        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {

+            let var = ::std::env::var("_CLANG_SYS_TEST_POINTER_WIDTH");

+            var.map_or(false, |v| v == $pointer_width)

+        } else {

+            cfg!(target_pointer_width = $pointer_width)

+        }

+    };

+}

+

+macro_rules! target_env {

+    ($env:expr) => {

+        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {

+            let var = ::std::env::var("_CLANG_SYS_TEST_ENV");

+            var.map_or(false, |v| v == $env)

+        } else {

+            cfg!(target_env = $env)

+        }

+    };

+}

diff --git a/crates/clang-sys/build/static.rs b/crates/clang-sys/build/static.rs
index 1123189..c1b70eb 100644
--- a/crates/clang-sys/build/static.rs
+++ b/crates/clang-sys/build/static.rs
@@ -1,140 +1,146 @@
-// SPDX-License-Identifier: Apache-2.0
-
-extern crate glob;
-
-use std::path::{Path, PathBuf};
-
-use glob::Pattern;
-
-use super::common;
-
-//================================================
-// Searching
-//================================================
-
-/// Clang static libraries required to link to `libclang` 3.5 and later.
-const CLANG_LIBRARIES: &[&str] = &[
-    "clang",
-    "clangAST",
-    "clangAnalysis",
-    "clangBasic",
-    "clangDriver",
-    "clangEdit",
-    "clangFrontend",
-    "clangIndex",
-    "clangLex",
-    "clangParse",
-    "clangRewrite",
-    "clangSema",
-    "clangSerialization",
-];
-
-/// Gets the name of an LLVM or Clang static library from a path.
-fn get_library_name(path: &Path) -> Option<String> {
-    path.file_stem().map(|p| {
-        let string = p.to_string_lossy();
-        if let Some(name) = string.strip_prefix("lib") {
-            name.to_owned()
-        } else {
-            string.to_string()
-        }
-    })
-}
-
-/// Gets the LLVM static libraries required to link to `libclang`.
-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 let Some(path) = p.strip_prefix("-l") {
-                Some(path.into())
-            } else {
-                get_library_name(Path::new(p))
-            }
-        })
-        .collect()
-}
-
-/// Gets the Clang static libraries required to link to `libclang`.
-fn get_clang_libraries<P: AsRef<Path>>(directory: P) -> Vec<String> {
-    // Escape the directory in case it contains characters that have special
-    // meaning in glob patterns (e.g., `[` or `]`).
-    let directory = Pattern::escape(directory.as_ref().to_str().unwrap());
-    let directory = Path::new(&directory);
-
-    let pattern = directory.join("libclang*.a").to_str().unwrap().to_owned();
-    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()
-    }
-}
-
-/// Finds a directory containing LLVM and Clang static libraries and returns the
-/// path to that directory.
-fn find() -> PathBuf {
-    let name = if 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().next() {
-        directory
-    } else {
-        panic!("could not find any static libraries");
-    }
-}
-
-//================================================
-// Linking
-//================================================
-
-/// Finds and links to `libclang` static libraries.
-pub fn link() {
-    let cep = common::CommandErrorPrinter::default();
-
-    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!(any(target_os = "haiku", 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");
-    }
-
-    cep.discard();
-}
+// SPDX-License-Identifier: Apache-2.0

+

+use std::path::{Path, PathBuf};

+

+use glob::Pattern;

+

+use super::common;

+

+//================================================

+// Searching

+//================================================

+

+/// Clang static libraries required to link to `libclang` 3.5 and later.

+const CLANG_LIBRARIES: &[&str] = &[

+    "clang",

+    "clangAST",

+    "clangAnalysis",

+    "clangBasic",

+    "clangDriver",

+    "clangEdit",

+    "clangFrontend",

+    "clangIndex",

+    "clangLex",

+    "clangParse",

+    "clangRewrite",

+    "clangSema",

+    "clangSerialization",

+];

+

+/// Gets the name of an LLVM or Clang static library from a path.

+fn get_library_name(path: &Path) -> Option<String> {

+    path.file_stem().map(|p| {

+        let string = p.to_string_lossy();

+        if let Some(name) = string.strip_prefix("lib") {

+            name.to_owned()

+        } else {

+            string.to_string()

+        }

+    })

+}

+

+/// Gets the LLVM static libraries required to link to `libclang`.

+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 let Some(path) = p.strip_prefix("-l") {

+                Some(path.into())

+            } else {

+                get_library_name(Path::new(p))

+            }

+        })

+        .collect()

+}

+

+/// Gets the Clang static libraries required to link to `libclang`.

+fn get_clang_libraries<P: AsRef<Path>>(directory: P) -> Vec<String> {

+    // Escape the directory in case it contains characters that have special

+    // meaning in glob patterns (e.g., `[` or `]`).

+    let directory = Pattern::escape(directory.as_ref().to_str().unwrap());

+    let directory = Path::new(&directory);

+

+    let pattern = directory.join("libclang*.a").to_str().unwrap().to_owned();

+    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()

+    }

+}

+

+/// Finds a directory containing LLVM and Clang static libraries and returns the

+/// path to that directory.

+fn find() -> PathBuf {

+    let name = if 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().next() {

+        directory

+    } else {

+        panic!(

+            "could not find the required `{name}` static library, see the \

+            README for more information on how to link to `libclang` statically: \

+            https://github.com/KyleMayes/clang-sys?tab=readme-ov-file#static"

+        );

+    }

+}

+

+//================================================

+// Linking

+//================================================

+

+/// Finds and links to `libclang` static libraries.

+pub fn link() {

+    let cep = common::CommandErrorPrinter::default();

+

+    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!(any(target_os = "haiku", target_os = "linux")) {

+        if cfg!(feature = "libcpp") {

+            println!("cargo:rustc-flags=-l c++");

+        } else {

+            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");

+    }

+

+    cep.discard();

+}

diff --git a/crates/clang-sys/clippy.toml b/crates/clang-sys/clippy.toml
index 006bfc4..6f41284 100644
--- a/crates/clang-sys/clippy.toml
+++ b/crates/clang-sys/clippy.toml
@@ -1 +1 @@
-doc-valid-idents = ["FreeBSD"]
+doc-valid-idents = ["FreeBSD"]

diff --git a/crates/clang-sys/out/common.rs b/crates/clang-sys/out/common.rs
index 3005a8a..4d144cb 100644
--- a/crates/clang-sys/out/common.rs
+++ b/crates/clang-sys/out/common.rs
@@ -1,355 +1,355 @@
-// SPDX-License-Identifier: Apache-2.0
-
-extern crate glob;
-
-use std::cell::RefCell;
-use std::collections::HashMap;
-use std::env;
-use std::path::{Path, PathBuf};
-use std::process::Command;
-
-use glob::{MatchOptions, Pattern};
-
-//================================================
-// Commands
-//================================================
-
-thread_local! {
-    /// The errors encountered by the build script while executing commands.
-    static COMMAND_ERRORS: RefCell<HashMap<String, Vec<String>>> = RefCell::default();
-}
-
-/// Adds an error encountered by the build script while executing a command.
-fn add_command_error(name: &str, path: &str, arguments: &[&str], message: String) {
-    COMMAND_ERRORS.with(|e| {
-        e.borrow_mut()
-            .entry(name.into())
-            .or_insert_with(Vec::new)
-            .push(format!(
-                "couldn't execute `{} {}` (path={}) ({})",
-                name,
-                arguments.join(" "),
-                path,
-                message,
-            ))
-    });
-}
-
-/// A struct that prints the errors encountered by the build script while
-/// executing commands when dropped (unless explictly discarded).
-///
-/// This is handy because we only want to print these errors when the build
-/// script fails to link to an instance of `libclang`. For example, if
-/// `llvm-config` couldn't be executed but an instance of `libclang` was found
-/// anyway we don't want to pollute the build output with irrelevant errors.
-#[derive(Default)]
-pub struct CommandErrorPrinter {
-    discard: bool,
-}
-
-impl CommandErrorPrinter {
-    pub fn discard(mut self) {
-        self.discard = true;
-    }
-}
-
-impl Drop for CommandErrorPrinter {
-    fn drop(&mut self) {
-        if self.discard {
-            return;
-        }
-
-        let errors = COMMAND_ERRORS.with(|e| e.borrow().clone());
-
-        if let Some(errors) = errors.get("llvm-config") {
-            println!(
-                "cargo:warning=could not execute `llvm-config` one or more \
-                times, if the LLVM_CONFIG_PATH environment variable is set to \
-                a full path to valid `llvm-config` executable it will be used \
-                to try to find an instance of `libclang` on your system: {}",
-                errors
-                    .iter()
-                    .map(|e| format!("\"{}\"", e))
-                    .collect::<Vec<_>>()
-                    .join("\n  "),
-            )
-        }
-
-        if let Some(errors) = errors.get("xcode-select") {
-            println!(
-                "cargo:warning=could not execute `xcode-select` one or more \
-                times, if a valid instance of this executable is on your PATH \
-                it will be used to try to find an instance of `libclang` on \
-                your system: {}",
-                errors
-                    .iter()
-                    .map(|e| format!("\"{}\"", e))
-                    .collect::<Vec<_>>()
-                    .join("\n  "),
-            )
-        }
-    }
-}
-
-#[cfg(test)]
-pub static RUN_COMMAND_MOCK: std::sync::Mutex<
-    Option<Box<dyn Fn(&str, &str, &[&str]) -> Option<String> + Send + Sync + 'static>>,
-> = std::sync::Mutex::new(None);
-
-/// Executes a command and returns the `stdout` output if the command was
-/// successfully executed (errors are added to `COMMAND_ERRORS`).
-fn run_command(name: &str, path: &str, arguments: &[&str]) -> Option<String> {
-    #[cfg(test)]
-    if let Some(command) = &*RUN_COMMAND_MOCK.lock().unwrap() {
-        return command(name, path, arguments);
-    }
-
-    let output = match Command::new(path).args(arguments).output() {
-        Ok(output) => output,
-        Err(error) => {
-            let message = format!("error: {}", error);
-            add_command_error(name, path, arguments, message);
-            return None;
-        }
-    };
-
-    if output.status.success() {
-        Some(String::from_utf8_lossy(&output.stdout).into_owned())
-    } else {
-        let message = format!("exit code: {}", output.status);
-        add_command_error(name, path, arguments, message);
-        None
-    }
-}
-
-/// Executes the `llvm-config` command and returns the `stdout` output if the
-/// command was successfully executed (errors are added to `COMMAND_ERRORS`).
-pub fn run_llvm_config(arguments: &[&str]) -> Option<String> {
-    let path = env::var("LLVM_CONFIG_PATH").unwrap_or_else(|_| "llvm-config".into());
-    run_command("llvm-config", &path, arguments)
-}
-
-/// Executes the `xcode-select` command and returns the `stdout` output if the
-/// command was successfully executed (errors are added to `COMMAND_ERRORS`).
-pub fn run_xcode_select(arguments: &[&str]) -> Option<String> {
-    run_command("xcode-select", "xcode-select", arguments)
-}
-
-//================================================
-// Search Directories
-//================================================
-// These search directories are listed in order of
-// preference, so if multiple `libclang` instances
-// are found when searching matching directories,
-// the `libclang` instances from earlier
-// directories will be preferred (though version
-// takes precedence over location).
-//================================================
-
-/// `libclang` directory patterns for Haiku.
-const DIRECTORIES_HAIKU: &[&str] = &[
-    "/boot/home/config/non-packaged/develop/lib",
-    "/boot/home/config/non-packaged/lib",
-    "/boot/system/non-packaged/develop/lib",
-    "/boot/system/non-packaged/lib",
-    "/boot/system/develop/lib",
-    "/boot/system/lib",
-];
-
-/// `libclang` directory patterns for Linux (and FreeBSD).
-const DIRECTORIES_LINUX: &[&str] = &[
-    "/usr/local/llvm*/lib*",
-    "/usr/local/lib*/*/*",
-    "/usr/local/lib*/*",
-    "/usr/local/lib*",
-    "/usr/lib*/*/*",
-    "/usr/lib*/*",
-    "/usr/lib*",
-];
-
-/// `libclang` directory patterns for macOS.
-const DIRECTORIES_MACOS: &[&str] = &[
-    "/usr/local/opt/llvm*/lib/llvm*/lib",
-    "/Library/Developer/CommandLineTools/usr/lib",
-    "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib",
-    "/usr/local/opt/llvm*/lib",
-];
-
-/// `libclang` directory patterns for Windows.
-///
-/// The boolean indicates whether the directory pattern should be used when
-/// compiling for an MSVC target environment.
-const DIRECTORIES_WINDOWS: &[(&str, bool)] = &[
-    // LLVM + Clang can be installed using Scoop (https://scoop.sh).
-    // Other Windows package managers install LLVM + Clang to other listed
-    // system-wide directories.
-    ("C:\\Users\\*\\scoop\\apps\\llvm\\current\\lib", true),
-    ("C:\\MSYS*\\MinGW*\\lib", false),
-    ("C:\\Program Files*\\LLVM\\lib", true),
-    ("C:\\LLVM\\lib", true),
-    // LLVM + Clang can be installed as a component of Visual Studio.
-    // https://github.com/KyleMayes/clang-sys/issues/121
-    ("C:\\Program Files*\\Microsoft Visual Studio\\*\\BuildTools\\VC\\Tools\\Llvm\\**\\lib", true),
-];
-
-/// `libclang` directory patterns for illumos
-const DIRECTORIES_ILLUMOS: &[&str] = &[
-    "/opt/ooce/llvm-*/lib",
-    "/opt/ooce/clang-*/lib",
-];
-
-//================================================
-// Searching
-//================================================
-
-/// Finds the files in a directory that match one or more filename glob patterns
-/// and returns the paths to and filenames of those files.
-fn search_directory(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, String)> {
-    // Escape the specified directory in case it contains characters that have
-    // special meaning in glob patterns (e.g., `[` or `]`).
-    let directory = Pattern::escape(directory.to_str().unwrap());
-    let directory = Path::new(&directory);
-
-    // Join the escaped directory to the filename glob patterns to obtain
-    // complete glob patterns for the files being searched for.
-    let paths = filenames
-        .iter()
-        .map(|f| directory.join(f).to_str().unwrap().to_owned());
-
-    // Prevent wildcards from matching path separators to ensure that the search
-    // is limited to the specified directory.
-    let mut options = MatchOptions::new();
-    options.require_literal_separator = true;
-
-    paths
-        .map(|p| glob::glob_with(&p, options))
-        .filter_map(Result::ok)
-        .flatten()
-        .filter_map(|p| {
-            let path = p.ok()?;
-            let filename = path.file_name()?.to_str().unwrap();
-
-            // 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<_>>()
-}
-
-/// Finds the files in a directory (and any relevant sibling directories) that
-/// match one or more filename glob patterns and returns the paths to and
-/// filenames of those files.
-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 target_os!("windows") && directory.ends_with("lib") {
-        let sibling = directory.parent().unwrap().join("bin");
-        results.extend(search_directory(&sibling, filenames).into_iter());
-    }
-
-    results
-}
-
-/// Finds the `libclang` static or dynamic libraries matching one or more
-/// filename glob patterns and returns the paths to and filenames of those files.
-pub fn search_libclang_directories(filenames: &[String], variable: &str) -> Vec<(PathBuf, String)> {
-    // Search only the path indicated by the relevant environment variable
-    // (e.g., `LIBCLANG_PATH`) if it is set.
-    if let Ok(path) = env::var(variable).map(|d| Path::new(&d).to_path_buf()) {
-        // Check if the path is a matching file.
-        if let Some(parent) = path.parent() {
-            let filename = path.file_name().unwrap().to_str().unwrap();
-            let libraries = search_directories(parent, filenames);
-            if libraries.iter().any(|(_, f)| f == filename) {
-                return vec![(parent.into(), filename.into())];
-            }
-        }
-
-        // Check if the path is directory containing a matching file.
-        return search_directories(&path, filenames);
-    }
-
-    let mut found = vec![];
-
-    // Search the `bin` and `lib` directories in the directory returned 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"), filenames));
-        found.extend(search_directories(&directory.join("lib"), filenames));
-        found.extend(search_directories(&directory.join("lib64"), filenames));
-    }
-
-    // Search the toolchain directory in the directory returned by
-    // `xcode-select --print-path`.
-    if target_os!("macos") {
-        if let Some(output) = run_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, filenames));
-        }
-    }
-
-    // Search the directories in the `LD_LIBRARY_PATH` environment variable.
-    if let Ok(path) = env::var("LD_LIBRARY_PATH") {
-        for directory in env::split_paths(&path) {
-            found.extend(search_directories(&directory, filenames));
-        }
-    }
-
-    // Determine the `libclang` directory patterns.
-    let directories: Vec<&str> = if target_os!("haiku") {
-        DIRECTORIES_HAIKU.into()
-    } else if target_os!("linux") || target_os!("freebsd") {
-        DIRECTORIES_LINUX.into()
-    } else if target_os!("macos") {
-        DIRECTORIES_MACOS.into()
-    } else if target_os!("windows") {
-        let msvc = target_env!("msvc");
-        DIRECTORIES_WINDOWS
-            .iter()
-            .filter(|d| d.1 || !msvc)
-            .map(|d| d.0)
-            .collect()
-    } else if target_os!("illumos") {
-        DIRECTORIES_ILLUMOS.into()
-    } else {
-        vec![]
-    };
-
-    // We use temporary directories when testing the build script so we'll
-    // remove the prefixes that make the directories absolute.
-    let directories = if test!() {
-        directories
-            .iter()
-            .map(|d| d.strip_prefix('/').or_else(|| d.strip_prefix("C:\\")).unwrap_or(d))
-            .collect::<Vec<_>>()
-    } else {
-        directories
-    };
-
-    // 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() {
-        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, filenames));
-            }
-        }
-    }
-
-    found
-}
+// SPDX-License-Identifier: Apache-2.0

+

+use std::cell::RefCell;

+use std::collections::HashMap;

+use std::env;

+use std::path::{Path, PathBuf};

+use std::process::Command;

+

+use glob::{MatchOptions, Pattern};

+

+//================================================

+// Commands

+//================================================

+

+thread_local! {

+    /// The errors encountered by the build script while executing commands.

+    static COMMAND_ERRORS: RefCell<HashMap<String, Vec<String>>> = RefCell::default();

+}

+

+/// Adds an error encountered by the build script while executing a command.

+fn add_command_error(name: &str, path: &str, arguments: &[&str], message: String) {

+    COMMAND_ERRORS.with(|e| {

+        e.borrow_mut()

+            .entry(name.into())

+            .or_default()

+            .push(format!(

+                "couldn't execute `{} {}` (path={}) ({})",

+                name,

+                arguments.join(" "),

+                path,

+                message,

+            ))

+    });

+}

+

+/// A struct that prints the errors encountered by the build script while

+/// executing commands when dropped (unless explictly discarded).

+///

+/// This is handy because we only want to print these errors when the build

+/// script fails to link to an instance of `libclang`. For example, if

+/// `llvm-config` couldn't be executed but an instance of `libclang` was found

+/// anyway we don't want to pollute the build output with irrelevant errors.

+#[derive(Default)]

+pub struct CommandErrorPrinter {

+    discard: bool,

+}

+

+impl CommandErrorPrinter {

+    pub fn discard(mut self) {

+        self.discard = true;

+    }

+}

+

+impl Drop for CommandErrorPrinter {

+    fn drop(&mut self) {

+        if self.discard {

+            return;

+        }

+

+        let errors = COMMAND_ERRORS.with(|e| e.borrow().clone());

+

+        if let Some(errors) = errors.get("llvm-config") {

+            println!(

+                "cargo:warning=could not execute `llvm-config` one or more \

+                times, if the LLVM_CONFIG_PATH environment variable is set to \

+                a full path to valid `llvm-config` executable it will be used \

+                to try to find an instance of `libclang` on your system: {}",

+                errors

+                    .iter()

+                    .map(|e| format!("\"{}\"", e))

+                    .collect::<Vec<_>>()

+                    .join("\n  "),

+            )

+        }

+

+        if let Some(errors) = errors.get("xcode-select") {

+            println!(

+                "cargo:warning=could not execute `xcode-select` one or more \

+                times, if a valid instance of this executable is on your PATH \

+                it will be used to try to find an instance of `libclang` on \

+                your system: {}",

+                errors

+                    .iter()

+                    .map(|e| format!("\"{}\"", e))

+                    .collect::<Vec<_>>()

+                    .join("\n  "),

+            )

+        }

+    }

+}

+

+#[cfg(test)]

+lazy_static::lazy_static! {

+    pub static ref RUN_COMMAND_MOCK: std::sync::Mutex<

+        Option<Box<dyn Fn(&str, &str, &[&str]) -> Option<String> + Send + Sync + 'static>>,

+    > = std::sync::Mutex::new(None);

+}

+

+/// Executes a command and returns the `stdout` output if the command was

+/// successfully executed (errors are added to `COMMAND_ERRORS`).

+fn run_command(name: &str, path: &str, arguments: &[&str]) -> Option<String> {

+    #[cfg(test)]

+    if let Some(command) = &*RUN_COMMAND_MOCK.lock().unwrap() {

+        return command(name, path, arguments);

+    }

+

+    let output = match Command::new(path).args(arguments).output() {

+        Ok(output) => output,

+        Err(error) => {

+            let message = format!("error: {}", error);

+            add_command_error(name, path, arguments, message);

+            return None;

+        }

+    };

+

+    if output.status.success() {

+        Some(String::from_utf8_lossy(&output.stdout).into_owned())

+    } else {

+        let message = format!("exit code: {}", output.status);

+        add_command_error(name, path, arguments, message);

+        None

+    }

+}

+

+/// Executes the `llvm-config` command and returns the `stdout` output if the

+/// command was successfully executed (errors are added to `COMMAND_ERRORS`).

+pub fn run_llvm_config(arguments: &[&str]) -> Option<String> {

+    let path = env::var("LLVM_CONFIG_PATH").unwrap_or_else(|_| "llvm-config".into());

+    run_command("llvm-config", &path, arguments)

+}

+

+/// Executes the `xcode-select` command and returns the `stdout` output if the

+/// command was successfully executed (errors are added to `COMMAND_ERRORS`).

+pub fn run_xcode_select(arguments: &[&str]) -> Option<String> {

+    run_command("xcode-select", "xcode-select", arguments)

+}

+

+//================================================

+// Search Directories

+//================================================

+// These search directories are listed in order of

+// preference, so if multiple `libclang` instances

+// are found when searching matching directories,

+// the `libclang` instances from earlier

+// directories will be preferred (though version

+// takes precedence over location).

+//================================================

+

+/// `libclang` directory patterns for Haiku.

+const DIRECTORIES_HAIKU: &[&str] = &[

+    "/boot/home/config/non-packaged/develop/lib",

+    "/boot/home/config/non-packaged/lib",

+    "/boot/system/non-packaged/develop/lib",

+    "/boot/system/non-packaged/lib",

+    "/boot/system/develop/lib",

+    "/boot/system/lib",

+];

+

+/// `libclang` directory patterns for Linux (and FreeBSD).

+const DIRECTORIES_LINUX: &[&str] = &[

+    "/usr/local/llvm*/lib*",

+    "/usr/local/lib*/*/*",

+    "/usr/local/lib*/*",

+    "/usr/local/lib*",

+    "/usr/lib*/*/*",

+    "/usr/lib*/*",

+    "/usr/lib*",

+];

+

+/// `libclang` directory patterns for macOS.

+const DIRECTORIES_MACOS: &[&str] = &[

+    "/usr/local/opt/llvm*/lib/llvm*/lib",

+    "/Library/Developer/CommandLineTools/usr/lib",

+    "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib",

+    "/usr/local/opt/llvm*/lib",

+];

+

+/// `libclang` directory patterns for Windows.

+///

+/// The boolean indicates whether the directory pattern should be used when

+/// compiling for an MSVC target environment.

+const DIRECTORIES_WINDOWS: &[(&str, bool)] = &[

+    // LLVM + Clang can be installed using Scoop (https://scoop.sh).

+    // Other Windows package managers install LLVM + Clang to other listed

+    // system-wide directories.

+    ("C:\\Users\\*\\scoop\\apps\\llvm\\current\\lib", true),

+    ("C:\\MSYS*\\MinGW*\\lib", false),

+    ("C:\\Program Files*\\LLVM\\lib", true),

+    ("C:\\LLVM\\lib", true),

+    // LLVM + Clang can be installed as a component of Visual Studio.

+    // https://github.com/KyleMayes/clang-sys/issues/121

+    ("C:\\Program Files*\\Microsoft Visual Studio\\*\\VC\\Tools\\Llvm\\**\\lib", true),

+];

+

+/// `libclang` directory patterns for illumos

+const DIRECTORIES_ILLUMOS: &[&str] = &[

+    "/opt/ooce/llvm-*/lib",

+    "/opt/ooce/clang-*/lib",

+];

+

+//================================================

+// Searching

+//================================================

+

+/// Finds the files in a directory that match one or more filename glob patterns

+/// and returns the paths to and filenames of those files.

+fn search_directory(directory: &Path, filenames: &[String]) -> Vec<(PathBuf, String)> {

+    // Escape the specified directory in case it contains characters that have

+    // special meaning in glob patterns (e.g., `[` or `]`).

+    let directory = Pattern::escape(directory.to_str().unwrap());

+    let directory = Path::new(&directory);

+

+    // Join the escaped directory to the filename glob patterns to obtain

+    // complete glob patterns for the files being searched for.

+    let paths = filenames

+        .iter()

+        .map(|f| directory.join(f).to_str().unwrap().to_owned());

+

+    // Prevent wildcards from matching path separators to ensure that the search

+    // is limited to the specified directory.

+    let mut options = MatchOptions::new();

+    options.require_literal_separator = true;

+

+    paths

+        .map(|p| glob::glob_with(&p, options))

+        .filter_map(Result::ok)

+        .flatten()

+        .filter_map(|p| {

+            let path = p.ok()?;

+            let filename = path.file_name()?.to_str().unwrap();

+

+            // 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((path.parent().unwrap().to_owned(), filename.into()))

+        })

+        .collect::<Vec<_>>()

+}

+

+/// Finds the files in a directory (and any relevant sibling directories) that

+/// match one or more filename glob patterns and returns the paths to and

+/// filenames of those files.

+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 target_os!("windows") && directory.ends_with("lib") {

+        let sibling = directory.parent().unwrap().join("bin");

+        results.extend(search_directory(&sibling, filenames));

+    }

+

+    results

+}

+

+/// Finds the `libclang` static or dynamic libraries matching one or more

+/// filename glob patterns and returns the paths to and filenames of those files.

+pub fn search_libclang_directories(filenames: &[String], variable: &str) -> Vec<(PathBuf, String)> {

+    // Search only the path indicated by the relevant environment variable

+    // (e.g., `LIBCLANG_PATH`) if it is set.

+    if let Ok(path) = env::var(variable).map(|d| Path::new(&d).to_path_buf()) {

+        // Check if the path is a matching file.

+        if let Some(parent) = path.parent() {

+            let filename = path.file_name().unwrap().to_str().unwrap();

+            let libraries = search_directories(parent, filenames);

+            if libraries.iter().any(|(_, f)| f == filename) {

+                return vec![(parent.into(), filename.into())];

+            }

+        }

+

+        // Check if the path is directory containing a matching file.

+        return search_directories(&path, filenames);

+    }

+

+    let mut found = vec![];

+

+    // Search the `bin` and `lib` directories in the directory returned 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"), filenames));

+        found.extend(search_directories(&directory.join("lib"), filenames));

+        found.extend(search_directories(&directory.join("lib64"), filenames));

+    }

+

+    // Search the toolchain directory in the directory returned by

+    // `xcode-select --print-path`.

+    if target_os!("macos") {

+        if let Some(output) = run_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, filenames));

+        }

+    }

+

+    // Search the directories in the `LD_LIBRARY_PATH` environment variable.

+    if let Ok(path) = env::var("LD_LIBRARY_PATH") {

+        for directory in env::split_paths(&path) {

+            found.extend(search_directories(&directory, filenames));

+        }

+    }

+

+    // Determine the `libclang` directory patterns.

+    let directories: Vec<&str> = if target_os!("haiku") {

+        DIRECTORIES_HAIKU.into()

+    } else if target_os!("linux") || target_os!("freebsd") {

+        DIRECTORIES_LINUX.into()

+    } else if target_os!("macos") {

+        DIRECTORIES_MACOS.into()

+    } else if target_os!("windows") {

+        let msvc = target_env!("msvc");

+        DIRECTORIES_WINDOWS

+            .iter()

+            .filter(|d| d.1 || !msvc)

+            .map(|d| d.0)

+            .collect()

+    } else if target_os!("illumos") {

+        DIRECTORIES_ILLUMOS.into()

+    } else {

+        vec![]

+    };

+

+    // We use temporary directories when testing the build script so we'll

+    // remove the prefixes that make the directories absolute.

+    let directories = if test!() {

+        directories

+            .iter()

+            .map(|d| d.strip_prefix('/').or_else(|| d.strip_prefix("C:\\")).unwrap_or(d))

+            .collect::<Vec<_>>()

+    } else {

+        directories

+    };

+

+    // 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() {

+        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, filenames));

+            }

+        }

+    }

+

+    found

+}

diff --git a/crates/clang-sys/out/dynamic.rs b/crates/clang-sys/out/dynamic.rs
index 25e1c18..f3d5a62 100644
--- a/crates/clang-sys/out/dynamic.rs
+++ b/crates/clang-sys/out/dynamic.rs
@@ -1,257 +1,276 @@
-// SPDX-License-Identifier: Apache-2.0
-
-use std::env;
-use std::fs::File;
-use std::io::{self, Error, ErrorKind, Read, Seek, SeekFrom};
-use std::path::{Path, PathBuf};
-
-use super::common;
-
-//================================================
-// Validation
-//================================================
-
-/// Extracts the ELF class from the ELF header in a shared library.
-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"))
-    }
-}
-
-/// Extracts the magic number from the PE header in a shared library.
-fn parse_pe_header(path: &Path) -> io::Result<u16> {
-    let mut file = File::open(path)?;
-
-    // Extract 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);
-
-    // Check 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"));
-    }
-
-    // Extract the magic number.
-    let mut buffer = [0; 2];
-    file.seek(SeekFrom::Current(20))?;
-    file.read_exact(&mut buffer)?;
-    Ok(u16::from_le_bytes(buffer))
-}
-
-/// Checks that a `libclang` shared library matches the target platform.
-fn validate_library(path: &Path) -> Result<(), String> {
-    if target_os!("linux") || target_os!("freebsd") {
-        let class = parse_elf_header(path).map_err(|e| e.to_string())?;
-
-        if target_pointer_width!("32") && class != 1 {
-            return Err("invalid ELF class (64-bit)".into());
-        }
-
-        if target_pointer_width!("64") && class != 2 {
-            return Err("invalid ELF class (32-bit)".into());
-        }
-
-        Ok(())
-    } else if target_os!("windows") {
-        let magic = parse_pe_header(path).map_err(|e| e.to_string())?;
-
-        if target_pointer_width!("32") && magic != 267 {
-            return Err("invalid DLL (64-bit)".into());
-        }
-
-        if target_pointer_width!("64") && magic != 523 {
-            return Err("invalid DLL (32-bit)".into());
-        }
-
-        Ok(())
-    } else {
-        Ok(())
-    }
-}
-
-//================================================
-// Searching
-//================================================
-
-/// Extracts the version components in a `libclang` shared library filename.
-fn parse_version(filename: &str) -> Vec<u32> {
-    let version = if let Some(version) = filename.strip_prefix("libclang.so.") {
-        version
-    } else if filename.starts_with("libclang-") {
-        &filename[9..filename.len() - 3]
-    } else {
-        return vec![];
-    };
-
-    version.split('.').map(|s| s.parse().unwrap_or(0)).collect()
-}
-
-/// Finds `libclang` shared libraries and returns the paths to, filenames of,
-/// and versions of those 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 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 target_os!("freebsd") || target_os!("haiku") || target_os!("netbsd") || target_os!("openbsd") {
-        // 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 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());
-    }
-
-    // Find and validate `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_library(&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)
-}
-
-/// Finds the "best" `libclang` shared library and returns the directory and
-/// filename of that library.
-pub fn find(runtime: bool) -> Result<(PathBuf, String), String> {
-    search_libclang_directories(runtime)?
-        .iter()
-        // We want to find the `libclang` shared library with the highest
-        // version number, hence `max_by_key` below.
-        //
-        // However, in the case where there are multiple such `libclang` shared
-        // libraries, we want to use the order in which they appeared in the
-        // list returned by `search_libclang_directories` as a tiebreaker since
-        // that function returns `libclang` shared libraries in descending order
-        // of preference by how they were found.
-        //
-        // `max_by_key`, perhaps surprisingly, returns the *last* item with the
-        // maximum key rather than the first which results in the opposite of
-        // the tiebreaking behavior we want. This is easily fixed by reversing
-        // the list first.
-        .rev()
-        .max_by_key(|f| &f.2)
-        .cloned()
-        .map(|(path, filename, _)| (path, filename))
-        .ok_or_else(|| "unreachable".into())
-}
-
-//================================================
-// Linking
-//================================================
-
-/// Finds and links to a `libclang` shared library.
-#[cfg(not(feature = "runtime"))]
-pub fn link() {
-    let cep = common::CommandErrorPrinter::default();
-
-    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);
-    }
-
-    cep.discard();
-}
+// SPDX-License-Identifier: Apache-2.0

+

+use std::env;

+use std::fs::File;

+use std::io::{self, Error, ErrorKind, Read, Seek, SeekFrom};

+use std::path::{Path, PathBuf};

+

+use super::common;

+

+//================================================

+// Validation

+//================================================

+

+/// Extracts the ELF class from the ELF header in a shared library.

+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"))

+    }

+}

+

+/// Extracts the magic number and machine type from the PE header in a shared library.

+fn parse_pe_header(path: &Path) -> io::Result<(u16, u16)> {

+    let mut file = File::open(path)?;

+

+    // Extract 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);

+

+    // Check 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"));

+    }

+

+    // Extract the magic number.

+    let mut buffer = [0; 2];

+    file.seek(SeekFrom::Current(20))?;

+    file.read_exact(&mut buffer)?;

+    let magic_number = u16::from_le_bytes(buffer);

+

+    // Extract the machine type.

+    let mut buffer = [0; 2];

+    file.seek(SeekFrom::Current(-22))?;

+    file.read_exact(&mut buffer)?;

+    let machine_type = u16::from_le_bytes(buffer);

+

+    return Ok((magic_number, machine_type));

+}

+

+/// Checks that a `libclang` shared library matches the target platform.

+fn validate_library(path: &Path) -> Result<(), String> {

+    if target_os!("linux") || target_os!("freebsd") {

+        let class = parse_elf_header(path).map_err(|e| e.to_string())?;

+

+        if target_pointer_width!("32") && class != 1 {

+            return Err("invalid ELF class (64-bit)".into());

+        }

+

+        if target_pointer_width!("64") && class != 2 {

+            return Err("invalid ELF class (32-bit)".into());

+        }

+

+        Ok(())

+    } else if target_os!("windows") {

+        let (magic, machine_type) = parse_pe_header(path).map_err(|e| e.to_string())?;

+

+        if target_pointer_width!("32") && magic != 267 {

+            return Err("invalid DLL (64-bit)".into());

+        }

+

+        if target_pointer_width!("64") && magic != 523 {

+            return Err("invalid DLL (32-bit)".into());

+        }

+

+        let arch_mismatch = match machine_type {

+            0x014C if !target_arch!("x86") => Some("x86"),

+            0x8664 if !target_arch!("x86_64") => Some("x86-64"),

+            0xAA64 if !target_arch!("aarch64") => Some("ARM64"),

+            _ => None,

+        };

+

+        if let Some(arch) = arch_mismatch {

+            Err(format!("invalid DLL ({arch})"))

+        } else {

+            Ok(())

+        }

+    } else {

+        Ok(())

+    }

+}

+

+//================================================

+// Searching

+//================================================

+

+/// Extracts the version components in a `libclang` shared library filename.

+fn parse_version(filename: &str) -> Vec<u32> {

+    let version = if let Some(version) = filename.strip_prefix("libclang.so.") {

+        version

+    } else if filename.starts_with("libclang-") {

+        &filename[9..filename.len() - 3]

+    } else {

+        return vec![];

+    };

+

+    version.split('.').map(|s| s.parse().unwrap_or(0)).collect()

+}

+

+/// Finds `libclang` shared libraries and returns the paths to, filenames of,

+/// and versions of those 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 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 target_os!("freebsd") || target_os!("haiku") || target_os!("netbsd") || target_os!("openbsd") {

+        // 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 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());

+    }

+

+    // Find and validate `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_library(&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)

+}

+

+/// Finds the "best" `libclang` shared library and returns the directory and

+/// filename of that library.

+pub fn find(runtime: bool) -> Result<(PathBuf, String), String> {

+    search_libclang_directories(runtime)?

+        .iter()

+        // We want to find the `libclang` shared library with the highest

+        // version number, hence `max_by_key` below.

+        //

+        // However, in the case where there are multiple such `libclang` shared

+        // libraries, we want to use the order in which they appeared in the

+        // list returned by `search_libclang_directories` as a tiebreaker since

+        // that function returns `libclang` shared libraries in descending order

+        // of preference by how they were found.

+        //

+        // `max_by_key`, perhaps surprisingly, returns the *last* item with the

+        // maximum key rather than the first which results in the opposite of

+        // the tiebreaking behavior we want. This is easily fixed by reversing

+        // the list first.

+        .rev()

+        .max_by_key(|f| &f.2)

+        .cloned()

+        .map(|(path, filename, _)| (path, filename))

+        .ok_or_else(|| "unreachable".into())

+}

+

+//================================================

+// Linking

+//================================================

+

+/// Finds and links to a `libclang` shared library.

+#[cfg(not(feature = "runtime"))]

+pub fn link() {

+    let cep = common::CommandErrorPrinter::default();

+

+    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);

+    }

+

+    cep.discard();

+}

diff --git a/crates/clang-sys/out/macros.rs b/crates/clang-sys/out/macros.rs
index 811c7c3..a766a6e 100644
--- a/crates/clang-sys/out/macros.rs
+++ b/crates/clang-sys/out/macros.rs
@@ -1,38 +1,49 @@
-// SPDX-License-Identifier: Apache-2.0
-
-macro_rules! test {
-    () => (cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok());
-}
-
-macro_rules! target_os {
-    ($os:expr) => {
-        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {
-            let var = ::std::env::var("_CLANG_SYS_TEST_OS");
-            var.map_or(false, |v| v == $os)
-        } else {
-            cfg!(target_os = $os)
-        }
-    };
-}
-
-macro_rules! target_pointer_width {
-    ($pointer_width:expr) => {
-        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {
-            let var = ::std::env::var("_CLANG_SYS_TEST_POINTER_WIDTH");
-            var.map_or(false, |v| v == $pointer_width)
-        } else {
-            cfg!(target_pointer_width = $pointer_width)
-        }
-    };
-}
-
-macro_rules! target_env {
-    ($env:expr) => {
-        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {
-            let var = ::std::env::var("_CLANG_SYS_TEST_ENV");
-            var.map_or(false, |v| v == $env)
-        } else {
-            cfg!(target_env = $env)
-        }
-    };
-}
+// SPDX-License-Identifier: Apache-2.0

+

+macro_rules! test {

+    () => (cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok());

+}

+

+macro_rules! target_os {

+    ($os:expr) => {

+        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {

+            let var = ::std::env::var("_CLANG_SYS_TEST_OS");

+            var.map_or(false, |v| v == $os)

+        } else {

+            cfg!(target_os = $os)

+        }

+    };

+}

+

+macro_rules! target_arch {

+    ($arch:expr) => {

+        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {

+            let var = ::std::env::var("_CLANG_SYS_TEST_ARCH");

+            var.map_or(false, |v| v == $arch)

+        } else {

+            cfg!(target_arch = $arch)

+        }

+    };

+}

+

+macro_rules! target_pointer_width {

+    ($pointer_width:expr) => {

+        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {

+            let var = ::std::env::var("_CLANG_SYS_TEST_POINTER_WIDTH");

+            var.map_or(false, |v| v == $pointer_width)

+        } else {

+            cfg!(target_pointer_width = $pointer_width)

+        }

+    };

+}

+

+macro_rules! target_env {

+    ($env:expr) => {

+        if cfg!(test) && ::std::env::var("_CLANG_SYS_TEST").is_ok() {

+            let var = ::std::env::var("_CLANG_SYS_TEST_ENV");

+            var.map_or(false, |v| v == $env)

+        } else {

+            cfg!(target_env = $env)

+        }

+    };

+}

diff --git a/crates/clang-sys/src/lib.rs b/crates/clang-sys/src/lib.rs
index 31e2e96..5f5383b 100644
--- a/crates/clang-sys/src/lib.rs
+++ b/crates/clang-sys/src/lib.rs
@@ -1,2434 +1,2433 @@
-// SPDX-License-Identifier: Apache-2.0
-
-//! Rust bindings for `libclang`.
-//!
-//! ## [Documentation](https://docs.rs/clang-sys)
-//!
-//! Note that the documentation on https://docs.rs for this crate assumes usage
-//! of the `runtime` Cargo feature as well as the Cargo feature for the latest
-//! supported version of `libclang` (e.g., `clang_11_0`), neither of which are
-//! enabled by default.
-//!
-//! Due to the usage of the `runtime` Cargo feature, this documentation will
-//! contain some additional types and functions to manage a dynamically loaded
-//! `libclang` instance at runtime.
-//!
-//! Due to the usage of the Cargo feature for the latest supported version of
-//! `libclang`, this documentation will contain constants and functions that are
-//! not available in the oldest supported version of `libclang` (3.5). All of
-//! these types and functions have a documentation comment which specifies the
-//! minimum `libclang` version required to use the item.
-
-#![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 = "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 {
-    (#[repr($ty:ty)] $(#[$meta:meta])* enum $name:ident {
-        $($(#[$vmeta:meta])* const $variant:ident = $value:expr), +,
-    }) => (
-        pub type $name = $ty;
-
-        $($(#[$vmeta])* pub const $variant: $name = $value;)+
-    );
-    (#[repr($ty:ty)] $(#[$meta:meta])* enum $name:ident {
-        $($(#[$vmeta:meta])* const $variant:ident = $value:expr); +;
-    }) => (
-        pub type $name = $ty;
-
-        $($(#[$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;)+
-    );
-    ($(#[$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! {
-    /// Only available on `libclang` 17.0 and later.
-    #[cfg(feature = "clang_17_0")]
-    enum CXBinaryOperatorKind {
-        const CXBinaryOperator_Invalid = 0,
-        const CXBinaryOperator_PtrMemD = 1,
-        const CXBinaryOperator_PtrMemI = 2,
-        const CXBinaryOperator_Mul = 3,
-        const CXBinaryOperator_Div = 4,
-        const CXBinaryOperator_Rem = 5,
-        const CXBinaryOperator_Add = 6,
-        const CXBinaryOperator_Sub = 7,
-        const CXBinaryOperator_Shl = 8,
-        const CXBinaryOperator_Shr = 9,
-        const CXBinaryOperator_Cmp = 10,
-        const CXBinaryOperator_LT = 11,
-        const CXBinaryOperator_GT = 12,
-        const CXBinaryOperator_LE = 13,
-        const CXBinaryOperator_GE = 14,
-        const CXBinaryOperator_EQ = 15,
-        const CXBinaryOperator_NE = 16,
-        const CXBinaryOperator_And = 17,
-        const CXBinaryOperator_Xor = 18,
-        const CXBinaryOperator_Or = 19,
-        const CXBinaryOperator_LAnd = 20,
-        const CXBinaryOperator_LOr = 21,
-        const CXBinaryOperator_Assign = 22,
-        const CXBinaryOperator_MulAssign = 23,
-        const CXBinaryOperator_DivAssign = 24,
-        const CXBinaryOperator_RemAssign = 25,
-        const CXBinaryOperator_AddAssign = 26,
-        const CXBinaryOperator_SubAssign = 27,
-        const CXBinaryOperator_ShlAssign = 28,
-        const CXBinaryOperator_ShrAssign = 29,
-        const CXBinaryOperator_AndAssign = 30,
-        const CXBinaryOperator_XorAssign = 31,
-        const CXBinaryOperator_OrAssign = 32,
-        const CXBinaryOperator_Comma = 33,
-    }
-}
-
-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,
-        /// Only produced by `libclang` 13.0 and later.
-        const CXCallingConv_SwiftAsync = 17,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCallingConv_AArch64SVEPCS = 18,
-    }
-}
-
-cenum! {
-    enum CXChildVisitResult {
-        const CXChildVisit_Break = 0,
-        const CXChildVisit_Continue = 1,
-        const CXChildVisit_Recurse = 2,
-    }
-}
-
-cenum! {
-    #[repr(c_uchar)]
-    /// Only available on `libclang` 17.0 and later.
-    #[cfg(feature = "clang_17_0")]
-    enum CXChoice {
-        const CXChoice_Default = 0,
-        const CXChoice_Enabled = 1,
-        const CXChoice_Disabled = 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,
-        /// Only produced by `libclang` 12.0 and later.
-        const CXCursor_OMPArrayShapingExpr = 150,
-        /// Only produced by `libclang` 12.0 and later.
-        const CXCursor_OMPIteratorExpr = 151,
-        /// Only produced by `libclang` 12.0 and later.
-        const CXCursor_CXXAddrspaceCastExpr = 152,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_ConceptSpecializationExpr = 153,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_RequiresExpr = 154,
-        /// Only produced by `libclang` 16.0 and later.
-        const CXCursor_CXXParenListInitExpr = 155,
-        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,
-        /// Only produced by `libclang` 10.0 and later.
-        const CXCursor_OMPMasterTaskLoopDirective = 281,
-        /// Only produced by `libclang` 10.0 and later.
-        const CXCursor_OMPParallelMasterTaskLoopDirective = 282,
-        /// Only produced by `libclang` 10.0 and later.
-        const CXCursor_OMPMasterTaskLoopSimdDirective = 283,
-        /// Only produced by `libclang` 10.0 and later.
-        const CXCursor_OMPParallelMasterTaskLoopSimdDirective = 284,
-        /// Only produced by `libclang` 10.0 and later.
-        const CXCursor_OMPParallelMasterDirective = 285,
-        /// Only produced by `libclang` 11.0 and later.
-        const CXCursor_OMPDepobjDirective = 286,
-        /// Only produced by `libclang` 11.0 and later.
-        const CXCursor_OMPScanDirective = 287,
-        /// Only produced by `libclang` 13.0 and later.
-        const CXCursor_OMPTileDirective = 288,
-        /// Only produced by `libclang` 13.0 and later.
-        const CXCursor_OMPCanonicalLoop = 289,
-        /// Only produced by `libclang` 13.0 and later.
-        const CXCursor_OMPInteropDirective = 290,
-        /// Only produced by `libclang` 13.0 and later.
-        const CXCursor_OMPDispatchDirective = 291,
-        /// Only produced by `libclang` 13.0 and later.
-        const CXCursor_OMPMaskedDirective = 292,
-        /// Only produced by `libclang` 13.0 and later.
-        const CXCursor_OMPUnrollDirective = 293,
-        /// Only produced by `libclang` 14.0 and later.
-        const CXCursor_OMPMetaDirective = 294,
-        /// Only produced by `libclang` 14.0 and later.
-        const CXCursor_OMPGenericLoopDirective = 295,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_OMPTeamsGenericLoopDirective = 296,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_OMPTargetTeamsGenericLoopDirective = 297,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_OMPParallelGenericLoopDirective = 298,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_OMPTargetParallelGenericLoopDirective = 299,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_OMPParallelMaskedDirective = 300,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_OMPMaskedTaskLoopDirective = 301,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_OMPMaskedTaskLoopSimdDirective = 302,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_OMPParallelMaskedTaskLoopDirective = 303,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXCursor_OMPParallelMaskedTaskLoopSimdDirective = 304,
-        /// Only produced by `libclang` 16.0 and later.
-        const CXCursor_OMPErrorDirective = 305,
-        #[cfg(not(feature="clang_15_0"))]
-        const CXCursor_TranslationUnit = 300,
-        #[cfg(feature="clang_15_0")]
-        const CXCursor_TranslationUnit = 350,
-        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` 15.0 and later.
-        const CXCursor_ConceptDecl = 604,
-        /// Only produced by `libclang` 3.7 and later.
-        const CXCursor_OverloadCandidate = 700,
-    }
-}
-
-cenum! {
-    /// Only available on `libclang` 5.0 and later.
-    #[cfg(feature = "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 = "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,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXIdxEntity_CXXConcept = 27,
-    }
-}
-
-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 = "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 = "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 = "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,
-        /// Only produced by `libclang` 11.0 and later.
-        const CXType_BFloat16 = 39,
-        /// Only produced by `libclang` 14.0 and later.
-        const CXType_Ibm128 = 40,
-        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,
-        /// Only produced by `libclang` 11.0 and later.
-        const CXType_Atomic = 177,
-        /// Only produced by `libclang` 15.0 and later.
-        const CXType_BTFTagAttributed = 178,        
-    }
-}
-
-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 = "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 = "clang_8_0")]
-    enum CXTypeNullabilityKind {
-        const CXTypeNullability_NonNull = 0,
-        const CXTypeNullability_Nullable = 1,
-        const CXTypeNullability_Unspecified = 2,
-        const CXTypeNullability_Invalid = 3,
-        /// Only produced by `libclang` 12.0 and later.
-        const CXTypeNullability_NullableResult = 4,
-    }
-}
-
-cenum! {
-    /// Only available on `libclang` 17.0 and later.
-    #[cfg(feature = "clang_17_0")]
-    enum CXUnaryOperatorKind {
-        const CXUnaryOperator_Invalid = 0,
-        const CXUnaryOperator_PostInc = 1,
-        const CXUnaryOperator_PostDec = 2,
-        const CXUnaryOperator_PreInc = 3,
-        const CXUnaryOperator_PreDec = 4,
-        const CXUnaryOperator_AddrOf = 5,
-        const CXUnaryOperator_Deref = 6,
-        const CXUnaryOperator_Plus = 7,
-        const CXUnaryOperator_Minus = 8,
-        const CXUnaryOperator_Not = 9,
-        const CXUnaryOperator_LNot = 10,
-        const CXUnaryOperator_Real = 11,
-        const CXUnaryOperator_Imag = 12,
-        const CXUnaryOperator_Extension = 13,
-        const CXUnaryOperator_Coawait = 14,
-    }
-}
-
-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 = "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;
-    }
-}
-
-/// Only available on `libclang` 17.0 and later.
-#[cfg(feature = "clang_17_0")]
-#[cfg(not(target_os = "windows"))]
-pub type CXIndexOptions_Flags = c_ushort;
-
-/// Only available on `libclang` 17.0 and later.
-#[cfg(feature = "clang_17_0")]
-#[cfg(target_os = "windows")]
-pub type CXIndexOptions_Flags = c_uint;
-
-/// Only available on `libclang` 17.0 and later.
-#[cfg(feature = "clang_17_0")]
-pub const CXIndexOptions_ExcludeDeclarationsFromPCH: CXIndexOptions_Flags = 1;
-
-/// Only available on `libclang` 17.0 and later.
-#[cfg(feature = "clang_17_0")]
-pub const CXIndexOptions_DisplayDiagnostics: CXIndexOptions_Flags = 2;
-
-/// Only available on `libclang` 17.0 and later.
-#[cfg(feature = "clang_17_0")]
-pub const CXIndexOptions_StorePreamblesInMemory: CXIndexOptions_Flags = 4;
-
-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 = "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 = "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 = "clang_3_8")]
-        const CXTranslationUnit_CreatePreambleOnFirstParse = 256;
-        /// Only available on `libclang` 3.9 and later.
-        #[cfg(feature = "clang_3_9")]
-        const CXTranslationUnit_KeepGoing = 512;
-        /// Only available on `libclang` 5.0 and later.
-        #[cfg(feature = "clang_5_0")]
-        const CXTranslationUnit_SingleFileParse = 1024;
-        /// Only available on `libclang` 7.0 and later.
-        #[cfg(feature = "clang_7_0")]
-        const CXTranslationUnit_LimitSkipFunctionBodiesToPreamble = 2048;
-        /// Only available on `libclang` 8.0 and later.
-        #[cfg(feature = "clang_8_0")]
-        const CXTranslationUnit_IncludeAttributedTypes = 4096;
-        /// Only available on `libclang` 8.0 and later.
-        #[cfg(feature = "clang_8_0")]
-        const CXTranslationUnit_VisitImplicitAttributes = 8192;
-        /// Only available on `libclang` 9.0 and later.
-        #[cfg(feature = "clang_9_0")]
-        const CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles = 16384;
-        /// Only available on `libclang` 10.0 and later.
-        #[cfg(feature = "clang_10_0")]
-        const CXTranslationUnit_RetainExcludedConditionalBlocks = 32768;
-    }
-}
-
-//================================================
-// 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 = "clang_3_9")]
-opaque!(CXEvalResult);
-opaque!(CXFile);
-opaque!(CXIdxClientASTFile);
-opaque!(CXIdxClientContainer);
-opaque!(CXIdxClientEntity);
-opaque!(CXIdxClientFile);
-opaque!(CXIndex);
-opaque!(CXIndexAction);
-opaque!(CXModule);
-#[cfg(feature = "clang_7_0")]
-opaque!(CXPrintingPolicy);
-opaque!(CXRemapping);
-#[cfg(feature = "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 = "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);
-
-#[cfg(feature = "clang_17_0")]
-#[derive(Copy, Clone, Debug)]
-#[repr(C)]
-pub struct CXIndexOptions {
-    pub Size: c_uint,
-    pub ThreadBackgroundPriorityForIndexing: CXChoice,
-    pub ThreadBackgroundPriorityForEditing: CXChoice,
-    pub flags: CXIndexOptions_Flags,
-    pub PreambleStoragePath: *const c_char,
-    pub InvocationEmissionPath: *const c_char,
-}
-
-#[cfg(feature = "clang_17_0")]
-default!(CXIndexOptions);
-
-#[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 = "clang_3_8")]
-#[derive(Copy, Clone, Debug)]
-#[repr(C)]
-pub struct CXStringSet {
-    pub Strings: *mut CXString,
-    pub Count: c_uint,
-}
-
-#[cfg(feature = "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 = "clang_6_0")]
-    pub fn clang_CXIndex_setInvocationEmissionPathOption(index: CXIndex, path: *const c_char);
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_CXXConstructor_isConvertingConstructor(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_CXXConstructor_isCopyConstructor(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_CXXConstructor_isDefaultConstructor(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_CXXConstructor_isMoveConstructor(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 3.8 and later.
-    #[cfg(feature = "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` 16.0 and later.
-    #[cfg(feature = "clang_16_0")]
-    pub fn clang_CXXMethod_isCopyAssignmentOperator(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_CXXMethod_isDefaulted(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 16.0 and later.
-    #[cfg(feature = "clang_16_0")]
-    pub fn clang_CXXMethod_isDeleted(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 16.0 and later.
-    #[cfg(feature = "clang_16_0")]
-    pub fn clang_CXXMethod_isMoveAssignmentOperator(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` 17.0 and later.
-    #[cfg(feature = "clang_17_0")]
-    pub fn clang_CXXMethod_isExplicit(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 6.0 and later.
-    #[cfg(feature = "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 = "clang_3_8")]
-    pub fn clang_CompileCommand_getFilename(command: CXCompileCommand) -> CXString;
-    /// Only available on `libclang` 3.8 and later.
-    #[cfg(feature = "clang_3_8")]
-    pub fn clang_CompileCommand_getMappedSourceContent(command: CXCompileCommand, index: c_uint) -> CXString;
-    /// Only available on `libclang` 3.8 and later.
-    #[cfg(feature = "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 = "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 = "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 = "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 = "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 = "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 = "clang_8_0")]
-    pub fn clang_Cursor_getObjCPropertyGetterName(cursor: CXCursor) -> CXString;
-    /// Only available on `libclang` 8.0 and later.
-    #[cfg(feature = "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 = "clang_3_7")]
-    pub fn clang_Cursor_getOffsetOfField(cursor: CXCursor) -> c_longlong;
-    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 = "clang_3_6")]
-    pub fn clang_Cursor_getStorageClass(cursor: CXCursor) -> CX_StorageClass;
-    /// Only available on `libclang` 3.6 and later.
-    #[cfg(feature = "clang_3_6")]
-    pub fn clang_Cursor_getTemplateArgumentKind(cursor: CXCursor, index: c_uint) -> CXTemplateArgumentKind;
-    /// Only available on `libclang` 3.6 and later.
-    #[cfg(feature = "clang_3_6")]
-    pub fn clang_Cursor_getTemplateArgumentType(cursor: CXCursor, index: c_uint) -> CXType;
-    /// Only available on `libclang` 3.6 and later.
-    #[cfg(feature = "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 = "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` 12.0 and later.
-    #[cfg(feature = "clang_12_0")]
-    pub fn clang_Cursor_getVarDeclInitializer(cursor: CXCursor) -> CXCursor;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_Cursor_hasAttrs(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 12.0 and later.
-    #[cfg(feature = "clang_12_0")]
-    pub fn clang_Cursor_hasVarDeclGlobalStorage(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 12.0 and later.
-    #[cfg(feature = "clang_12_0")]
-    pub fn clang_Cursor_hasVarDeclExternalStorage(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 3.7 and later.
-    #[cfg(feature = "clang_3_7")]
-    pub fn clang_Cursor_isAnonymous(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 9.0 and later.
-    #[cfg(feature = "clang_9_0")]
-    pub fn clang_Cursor_isAnonymousRecordDecl(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 = "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 = "clang_3_9")]
-    pub fn clang_Cursor_isFunctionInlined(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 9.0 and later.
-    #[cfg(feature = "clang_9_0")]
-    pub fn clang_Cursor_isInlineNamespace(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_Cursor_isMacroBuiltin(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "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 = "clang_5_0")]
-    pub fn clang_EnumDecl_isScoped(cursor: CXCursor) -> c_uint;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_EvalResult_dispose(result: CXEvalResult);
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_EvalResult_getAsDouble(result: CXEvalResult) -> libc::c_double;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_EvalResult_getAsInt(result: CXEvalResult) -> c_int;
-    /// Only available on `libclang` 4.0 and later.
-    #[cfg(feature = "clang_4_0")]
-    pub fn clang_EvalResult_getAsLongLong(result: CXEvalResult) -> c_longlong;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_EvalResult_getAsStr(result: CXEvalResult) -> *const c_char;
-    /// Only available on `libclang` 4.0 and later.
-    #[cfg(feature = "clang_4_0")]
-    pub fn clang_EvalResult_getAsUnsigned(result: CXEvalResult) -> c_ulonglong;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_EvalResult_getKind(result: CXEvalResult) -> CXEvalResultKind;
-    /// Only available on `libclang` 4.0 and later.
-    #[cfg(feature = "clang_4_0")]
-    pub fn clang_EvalResult_isUnsignedInt(result: CXEvalResult) -> c_uint;
-    /// Only available on `libclang` 3.6 and later.
-    #[cfg(feature = "clang_3_6")]
-    pub fn clang_File_isEqual(left: CXFile, right: CXFile) -> c_int;
-    /// Only available on `libclang` 7.0 and later.
-    #[cfg(feature = "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 = "clang_7_0")]
-    pub fn clang_PrintingPolicy_dispose(policy: CXPrintingPolicy);
-    /// Only available on `libclang` 7.0 and later.
-    #[cfg(feature = "clang_7_0")]
-    pub fn clang_PrintingPolicy_getProperty(policy: CXPrintingPolicy, property: CXPrintingPolicyProperty) -> c_uint;
-    /// Only available on `libclang` 7.0 and later.
-    #[cfg(feature = "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 = "clang_5_0")]
-    pub fn clang_TargetInfo_dispose(info: CXTargetInfo);
-    /// Only available on `libclang` 5.0 and later.
-    #[cfg(feature = "clang_5_0")]
-    pub fn clang_TargetInfo_getPointerWidth(info: CXTargetInfo) -> c_int;
-    /// Only available on `libclang` 5.0 and later.
-    #[cfg(feature = "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` 8.0 and later.
-    #[cfg(feature = "clang_8_0")]
-    pub fn clang_Type_getModifiedType(type_: CXType) -> CXType;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_Type_getNamedType(type_: CXType) -> CXType;
-    /// Only available on `libclang` 8.0 and later.
-    #[cfg(feature = "clang_8_0")]
-    pub fn clang_Type_getNullability(type_: CXType) -> CXTypeNullabilityKind;
-    /// Only available on `libclang` 8.0 and later.
-    #[cfg(feature = "clang_8_0")]
-    pub fn clang_Type_getNumObjCProtocolRefs(type_: CXType) -> c_uint;
-    /// Only available on `libclang` 8.0 and later.
-    #[cfg(feature = "clang_8_0")]
-    pub fn clang_Type_getNumObjCTypeArgs(type_: CXType) -> c_uint;
-    pub fn clang_Type_getNumTemplateArguments(type_: CXType) -> c_int;
-    /// Only available on `libclang` 3.9 and later.
-    #[cfg(feature = "clang_3_9")]
-    pub fn clang_Type_getObjCEncoding(type_: CXType) -> CXString;
-    /// Only available on `libclang` 8.0 and later.
-    #[cfg(feature = "clang_8_0")]
-    pub fn clang_Type_getObjCObjectBaseType(type_: CXType) -> CXType;
-    /// Only available on `libclang` 8.0 and later.
-    #[cfg(feature = "clang_8_0")]
-    pub fn clang_Type_getObjCProtocolDecl(type_: CXType, index: c_uint) -> CXCursor;
-    /// Only available on `libclang` 8.0 and later.
-    #[cfg(feature = "clang_8_0")]
-    pub fn clang_Type_getObjCTypeArg(type_: CXType, index: c_uint) -> CXType;
-    pub fn clang_Type_getOffsetOf(type_: CXType, field: *const c_char) -> c_longlong;
-    pub fn clang_Type_getSizeOf(type_: CXType) -> c_longlong;
-    pub fn clang_Type_getTemplateArgumentAsType(type_: CXType, index: c_uint) -> CXType;
-    /// Only available on `libclang` 11.0 and later.
-    #[cfg(feature = "clang_11_0")]
-    pub fn clang_Type_getValueType(type_: CXType) -> CXType;
-    /// Only available on `libclang` 5.0 and later.
-    #[cfg(feature = "clang_5_0")]
-    pub fn clang_Type_isTransparentTagTypedef(type_: CXType) -> c_uint;
-    /// Only available on `libclang` 3.7 and later.
-    #[cfg(feature = "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;
-    /// Only available on `libclang` 17.0 and later.
-    #[cfg(feature = "clang_17_0")]
-    pub fn clang_createIndexWithOptions(options: CXIndexOptions) -> 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 = "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 = "clang_3_7")]
-    pub fn clang_free(buffer: *mut c_void);
-    /// Only available on `libclang` 5.0 and later.
-    #[cfg(feature = "clang_5_0")]
-    pub fn clang_getAddressSpace(type_: CXType) -> c_uint;
-    /// Only available on `libclang` 4.0 and later.
-    #[cfg(feature = "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;
-    /// Only available on `libclang` 17.0 and later.
-    #[cfg(feature = "clang_17_0")]
-    pub fn clang_getBinaryOperatorKindSpelling(kind: CXBinaryOperatorKind) -> CXString;
-    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 = "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 = "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;
-    /// Only available on `libclang` 17.0 and later.
-    #[cfg(feature = "clang_17_0")]
-    pub fn clang_getCursorBinaryOperatorKind(cursor: CXCursor) -> CXBinaryOperatorKind;
-    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 = "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 = "clang_7_0")]
-    pub fn clang_getCursorPrettyPrinted(cursor: CXCursor, policy: CXPrintingPolicy) -> CXString;
-    /// Only available on `libclang` 7.0 and later.
-    #[cfg(feature = "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 = "clang_6_0")]
-    pub fn clang_getCursorTLSKind(cursor: CXCursor) -> CXTLSKind;
-    pub fn clang_getCursorType(cursor: CXCursor) -> CXType;
-    /// Only available on `libclang` 17.0 and later.
-    #[cfg(feature = "clang_17_0")]
-    pub fn clang_getCursorUnaryOperatorKind(cursor: CXCursor) -> CXUnaryOperatorKind;
-    pub fn clang_getCursorUSR(cursor: CXCursor) -> CXString;
-    /// Only available on `libclang` 3.8 and later.
-    #[cfg(feature = "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 = "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 = "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;
-    /// Only available on `libclang` 16.0 and later.
-    #[cfg(feature = "clang_16_0")]
-    pub fn clang_getNonReferenceType(type_: CXType) -> CXType;
-    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;
-    pub fn clang_getTemplateCursorKind(cursor: CXCursor) -> CXCursorKind;
-    pub fn clang_getToken(tu: CXTranslationUnit, location: CXSourceLocation) -> *mut CXToken;
-    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;
-    /// Only available on `libclang` 5.0 and later.
-    #[cfg(feature = "clang_5_0")]
-    pub fn clang_getTranslationUnitTargetInfo(tu: CXTranslationUnit) -> CXTargetInfo;
-    /// Only available on `libclang` 17.0 and later.
-    #[cfg(feature = "clang_17_0")]
-    pub fn clang_getUnaryOperatorKindSpelling(kind: CXUnaryOperatorKind) -> CXString;
-    /// Only available on `libclang` 16.0 and later.
-    #[cfg(feature = "clang_16_0")]
-    pub fn clang_getUnqualifiedType(type_: CXType) -> CXType;
-    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 = "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 = "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 = "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 = "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 = "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_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_HTMLStartTagComment_isSelfClosing(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_TextComment_getText(comment: CXComment) -> CXString;
-    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_VerbatimBlockLineComment_getText(comment: CXComment) -> CXString;
-    pub fn clang_VerbatimLineComment_getText(comment: CXComment) -> CXString;
-}
+// SPDX-License-Identifier: Apache-2.0

+

+//! Rust bindings for `libclang`.

+//!

+//! ## [Documentation](https://docs.rs/clang-sys)

+//!

+//! Note that the documentation on https://docs.rs for this crate assumes usage

+//! of the `runtime` Cargo feature as well as the Cargo feature for the latest

+//! supported version of `libclang` (e.g., `clang_11_0`), neither of which are

+//! enabled by default.

+//!

+//! Due to the usage of the `runtime` Cargo feature, this documentation will

+//! contain some additional types and functions to manage a dynamically loaded

+//! `libclang` instance at runtime.

+//!

+//! Due to the usage of the Cargo feature for the latest supported version of

+//! `libclang`, this documentation will contain constants and functions that are

+//! not available in the oldest supported version of `libclang` (3.5). All of

+//! these types and functions have a documentation comment which specifies the

+//! minimum `libclang` version required to use the item.

+

+#![allow(non_camel_case_types, non_snake_case, non_upper_case_globals)]

+#![cfg_attr(feature = "cargo-clippy", allow(clippy::unreadable_literal))]

+

+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 = "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 {

+    (#[repr($ty:ty)] $(#[$meta:meta])* enum $name:ident {

+        $($(#[$vmeta:meta])* const $variant:ident = $value:expr), +,

+    }) => (

+        pub type $name = $ty;

+

+        $($(#[$vmeta])* pub const $variant: $name = $value;)+

+    );

+    (#[repr($ty:ty)] $(#[$meta:meta])* enum $name:ident {

+        $($(#[$vmeta:meta])* const $variant:ident = $value:expr); +;

+    }) => (

+        pub type $name = $ty;

+

+        $($(#[$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;)+

+    );

+    ($(#[$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! {

+    /// Only available on `libclang` 17.0 and later.

+    #[cfg(feature = "clang_17_0")]

+    enum CXBinaryOperatorKind {

+        const CXBinaryOperator_Invalid = 0,

+        const CXBinaryOperator_PtrMemD = 1,

+        const CXBinaryOperator_PtrMemI = 2,

+        const CXBinaryOperator_Mul = 3,

+        const CXBinaryOperator_Div = 4,

+        const CXBinaryOperator_Rem = 5,

+        const CXBinaryOperator_Add = 6,

+        const CXBinaryOperator_Sub = 7,

+        const CXBinaryOperator_Shl = 8,

+        const CXBinaryOperator_Shr = 9,

+        const CXBinaryOperator_Cmp = 10,

+        const CXBinaryOperator_LT = 11,

+        const CXBinaryOperator_GT = 12,

+        const CXBinaryOperator_LE = 13,

+        const CXBinaryOperator_GE = 14,

+        const CXBinaryOperator_EQ = 15,

+        const CXBinaryOperator_NE = 16,

+        const CXBinaryOperator_And = 17,

+        const CXBinaryOperator_Xor = 18,

+        const CXBinaryOperator_Or = 19,

+        const CXBinaryOperator_LAnd = 20,

+        const CXBinaryOperator_LOr = 21,

+        const CXBinaryOperator_Assign = 22,

+        const CXBinaryOperator_MulAssign = 23,

+        const CXBinaryOperator_DivAssign = 24,

+        const CXBinaryOperator_RemAssign = 25,

+        const CXBinaryOperator_AddAssign = 26,

+        const CXBinaryOperator_SubAssign = 27,

+        const CXBinaryOperator_ShlAssign = 28,

+        const CXBinaryOperator_ShrAssign = 29,

+        const CXBinaryOperator_AndAssign = 30,

+        const CXBinaryOperator_XorAssign = 31,

+        const CXBinaryOperator_OrAssign = 32,

+        const CXBinaryOperator_Comma = 33,

+    }

+}

+

+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,

+        /// Only produced by `libclang` 13.0 and later.

+        const CXCallingConv_SwiftAsync = 17,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCallingConv_AArch64SVEPCS = 18,

+        /// Only produced by `libclang` 18.0 and later.

+        const CXCallingConv_M68kRTD = 19,

+    }

+}

+

+cenum! {

+    enum CXChildVisitResult {

+        const CXChildVisit_Break = 0,

+        const CXChildVisit_Continue = 1,

+        const CXChildVisit_Recurse = 2,

+    }

+}

+

+cenum! {

+    #[repr(c_uchar)]

+    /// Only available on `libclang` 17.0 and later.

+    #[cfg(feature = "clang_17_0")]

+    enum CXChoice {

+        const CXChoice_Default = 0,

+        const CXChoice_Enabled = 1,

+        const CXChoice_Disabled = 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,

+        /// Only produced by `libclang` 12.0 and later.

+        const CXCursor_OMPArrayShapingExpr = 150,

+        /// Only produced by `libclang` 12.0 and later.

+        const CXCursor_OMPIteratorExpr = 151,

+        /// Only produced by `libclang` 12.0 and later.

+        const CXCursor_CXXAddrspaceCastExpr = 152,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_ConceptSpecializationExpr = 153,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_RequiresExpr = 154,

+        /// Only produced by `libclang` 16.0 and later.

+        const CXCursor_CXXParenListInitExpr = 155,

+        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,

+        /// Only produced by `libclang` 10.0 and later.

+        const CXCursor_OMPMasterTaskLoopDirective = 281,

+        /// Only produced by `libclang` 10.0 and later.

+        const CXCursor_OMPParallelMasterTaskLoopDirective = 282,

+        /// Only produced by `libclang` 10.0 and later.

+        const CXCursor_OMPMasterTaskLoopSimdDirective = 283,

+        /// Only produced by `libclang` 10.0 and later.

+        const CXCursor_OMPParallelMasterTaskLoopSimdDirective = 284,

+        /// Only produced by `libclang` 10.0 and later.

+        const CXCursor_OMPParallelMasterDirective = 285,

+        /// Only produced by `libclang` 11.0 and later.

+        const CXCursor_OMPDepobjDirective = 286,

+        /// Only produced by `libclang` 11.0 and later.

+        const CXCursor_OMPScanDirective = 287,

+        /// Only produced by `libclang` 13.0 and later.

+        const CXCursor_OMPTileDirective = 288,

+        /// Only produced by `libclang` 13.0 and later.

+        const CXCursor_OMPCanonicalLoop = 289,

+        /// Only produced by `libclang` 13.0 and later.

+        const CXCursor_OMPInteropDirective = 290,

+        /// Only produced by `libclang` 13.0 and later.

+        const CXCursor_OMPDispatchDirective = 291,

+        /// Only produced by `libclang` 13.0 and later.

+        const CXCursor_OMPMaskedDirective = 292,

+        /// Only produced by `libclang` 13.0 and later.

+        const CXCursor_OMPUnrollDirective = 293,

+        /// Only produced by `libclang` 14.0 and later.

+        const CXCursor_OMPMetaDirective = 294,

+        /// Only produced by `libclang` 14.0 and later.

+        const CXCursor_OMPGenericLoopDirective = 295,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_OMPTeamsGenericLoopDirective = 296,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_OMPTargetTeamsGenericLoopDirective = 297,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_OMPParallelGenericLoopDirective = 298,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_OMPTargetParallelGenericLoopDirective = 299,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_OMPParallelMaskedDirective = 300,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_OMPMaskedTaskLoopDirective = 301,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_OMPMaskedTaskLoopSimdDirective = 302,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_OMPParallelMaskedTaskLoopDirective = 303,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXCursor_OMPParallelMaskedTaskLoopSimdDirective = 304,

+        /// Only produced by `libclang` 16.0 and later.

+        const CXCursor_OMPErrorDirective = 305,

+        /// Only produced by `libclang` 18.0 and later.

+        const CXCursor_OMPScopeDirective = 306,

+        #[cfg(not(feature="clang_15_0"))]

+        const CXCursor_TranslationUnit = 300,

+        #[cfg(feature="clang_15_0")]

+        const CXCursor_TranslationUnit = 350,

+        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` 15.0 and later.

+        const CXCursor_ConceptDecl = 604,

+        /// Only produced by `libclang` 3.7 and later.

+        const CXCursor_OverloadCandidate = 700,

+    }

+}

+

+cenum! {

+    /// Only available on `libclang` 5.0 and later.

+    #[cfg(feature = "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 = "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,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXIdxEntity_CXXConcept = 27,

+    }

+}

+

+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 = "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 = "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 = "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,

+        /// Only produced by `libclang` 11.0 and later.

+        const CXType_BFloat16 = 39,

+        /// Only produced by `libclang` 14.0 and later.

+        const CXType_Ibm128 = 40,

+        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,

+        /// Only produced by `libclang` 11.0 and later.

+        const CXType_Atomic = 177,

+        /// Only produced by `libclang` 15.0 and later.

+        const CXType_BTFTagAttributed = 178,        

+    }

+}

+

+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 = "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 = "clang_8_0")]

+    enum CXTypeNullabilityKind {

+        const CXTypeNullability_NonNull = 0,

+        const CXTypeNullability_Nullable = 1,

+        const CXTypeNullability_Unspecified = 2,

+        const CXTypeNullability_Invalid = 3,

+        /// Only produced by `libclang` 12.0 and later.

+        const CXTypeNullability_NullableResult = 4,

+    }

+}

+

+cenum! {

+    /// Only available on `libclang` 17.0 and later.

+    #[cfg(feature = "clang_17_0")]

+    enum CXUnaryOperatorKind {

+        const CXUnaryOperator_Invalid = 0,

+        const CXUnaryOperator_PostInc = 1,

+        const CXUnaryOperator_PostDec = 2,

+        const CXUnaryOperator_PreInc = 3,

+        const CXUnaryOperator_PreDec = 4,

+        const CXUnaryOperator_AddrOf = 5,

+        const CXUnaryOperator_Deref = 6,

+        const CXUnaryOperator_Plus = 7,

+        const CXUnaryOperator_Minus = 8,

+        const CXUnaryOperator_Not = 9,

+        const CXUnaryOperator_LNot = 10,

+        const CXUnaryOperator_Real = 11,

+        const CXUnaryOperator_Imag = 12,

+        const CXUnaryOperator_Extension = 13,

+        const CXUnaryOperator_Coawait = 14,

+    }

+}

+

+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 = "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;

+    }

+}

+

+/// Only available on `libclang` 17.0 and later.

+#[cfg(feature = "clang_17_0")]

+#[cfg(not(target_os = "windows"))]

+pub type CXIndexOptions_Flags = c_ushort;

+

+/// Only available on `libclang` 17.0 and later.

+#[cfg(feature = "clang_17_0")]

+#[cfg(target_os = "windows")]

+pub type CXIndexOptions_Flags = c_uint;

+

+/// Only available on `libclang` 17.0 and later.

+#[cfg(feature = "clang_17_0")]

+pub const CXIndexOptions_ExcludeDeclarationsFromPCH: CXIndexOptions_Flags = 1;

+

+/// Only available on `libclang` 17.0 and later.

+#[cfg(feature = "clang_17_0")]

+pub const CXIndexOptions_DisplayDiagnostics: CXIndexOptions_Flags = 2;

+

+/// Only available on `libclang` 17.0 and later.

+#[cfg(feature = "clang_17_0")]

+pub const CXIndexOptions_StorePreamblesInMemory: CXIndexOptions_Flags = 4;

+

+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 = "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 = "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 = "clang_3_8")]

+        const CXTranslationUnit_CreatePreambleOnFirstParse = 256;

+        /// Only available on `libclang` 3.9 and later.

+        #[cfg(feature = "clang_3_9")]

+        const CXTranslationUnit_KeepGoing = 512;

+        /// Only available on `libclang` 5.0 and later.

+        #[cfg(feature = "clang_5_0")]

+        const CXTranslationUnit_SingleFileParse = 1024;

+        /// Only available on `libclang` 7.0 and later.

+        #[cfg(feature = "clang_7_0")]

+        const CXTranslationUnit_LimitSkipFunctionBodiesToPreamble = 2048;

+        /// Only available on `libclang` 8.0 and later.

+        #[cfg(feature = "clang_8_0")]

+        const CXTranslationUnit_IncludeAttributedTypes = 4096;

+        /// Only available on `libclang` 8.0 and later.

+        #[cfg(feature = "clang_8_0")]

+        const CXTranslationUnit_VisitImplicitAttributes = 8192;

+        /// Only available on `libclang` 9.0 and later.

+        #[cfg(feature = "clang_9_0")]

+        const CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles = 16384;

+        /// Only available on `libclang` 10.0 and later.

+        #[cfg(feature = "clang_10_0")]

+        const CXTranslationUnit_RetainExcludedConditionalBlocks = 32768;

+    }

+}

+

+//================================================

+// 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 = "clang_3_9")]

+opaque!(CXEvalResult);

+opaque!(CXFile);

+opaque!(CXIdxClientASTFile);

+opaque!(CXIdxClientContainer);

+opaque!(CXIdxClientEntity);

+opaque!(CXIdxClientFile);

+opaque!(CXIndex);

+opaque!(CXIndexAction);

+opaque!(CXModule);

+#[cfg(feature = "clang_7_0")]

+opaque!(CXPrintingPolicy);

+opaque!(CXRemapping);

+#[cfg(feature = "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 = "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);

+

+#[cfg(feature = "clang_17_0")]

+#[derive(Copy, Clone, Debug)]

+#[repr(C)]

+pub struct CXIndexOptions {

+    pub Size: c_uint,

+    pub ThreadBackgroundPriorityForIndexing: CXChoice,

+    pub ThreadBackgroundPriorityForEditing: CXChoice,

+    pub flags: CXIndexOptions_Flags,

+    pub PreambleStoragePath: *const c_char,

+    pub InvocationEmissionPath: *const c_char,

+}

+

+#[cfg(feature = "clang_17_0")]

+default!(CXIndexOptions);

+

+#[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 = "clang_3_8")]

+#[derive(Copy, Clone, Debug)]

+#[repr(C)]

+pub struct CXStringSet {

+    pub Strings: *mut CXString,

+    pub Count: c_uint,

+}

+

+#[cfg(feature = "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 = "clang_6_0")]

+    pub fn clang_CXIndex_setInvocationEmissionPathOption(index: CXIndex, path: *const c_char);

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_CXXConstructor_isConvertingConstructor(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_CXXConstructor_isCopyConstructor(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_CXXConstructor_isDefaultConstructor(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_CXXConstructor_isMoveConstructor(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 3.8 and later.

+    #[cfg(feature = "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` 16.0 and later.

+    #[cfg(feature = "clang_16_0")]

+    pub fn clang_CXXMethod_isCopyAssignmentOperator(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_CXXMethod_isDefaulted(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 16.0 and later.

+    #[cfg(feature = "clang_16_0")]

+    pub fn clang_CXXMethod_isDeleted(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 16.0 and later.

+    #[cfg(feature = "clang_16_0")]

+    pub fn clang_CXXMethod_isMoveAssignmentOperator(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` 17.0 and later.

+    #[cfg(feature = "clang_17_0")]

+    pub fn clang_CXXMethod_isExplicit(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 6.0 and later.

+    #[cfg(feature = "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 = "clang_3_8")]

+    pub fn clang_CompileCommand_getFilename(command: CXCompileCommand) -> CXString;

+    /// Only available on `libclang` 3.8 and later.

+    #[cfg(feature = "clang_3_8")]

+    pub fn clang_CompileCommand_getMappedSourceContent(command: CXCompileCommand, index: c_uint) -> CXString;

+    /// Only available on `libclang` 3.8 and later.

+    #[cfg(feature = "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 = "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 = "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 = "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 = "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 = "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 = "clang_8_0")]

+    pub fn clang_Cursor_getObjCPropertyGetterName(cursor: CXCursor) -> CXString;

+    /// Only available on `libclang` 8.0 and later.

+    #[cfg(feature = "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 = "clang_3_7")]

+    pub fn clang_Cursor_getOffsetOfField(cursor: CXCursor) -> c_longlong;

+    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 = "clang_3_6")]

+    pub fn clang_Cursor_getStorageClass(cursor: CXCursor) -> CX_StorageClass;

+    /// Only available on `libclang` 3.6 and later.

+    #[cfg(feature = "clang_3_6")]

+    pub fn clang_Cursor_getTemplateArgumentKind(cursor: CXCursor, index: c_uint) -> CXTemplateArgumentKind;

+    /// Only available on `libclang` 3.6 and later.

+    #[cfg(feature = "clang_3_6")]

+    pub fn clang_Cursor_getTemplateArgumentType(cursor: CXCursor, index: c_uint) -> CXType;

+    /// Only available on `libclang` 3.6 and later.

+    #[cfg(feature = "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 = "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` 12.0 and later.

+    #[cfg(feature = "clang_12_0")]

+    pub fn clang_Cursor_getVarDeclInitializer(cursor: CXCursor) -> CXCursor;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_Cursor_hasAttrs(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 12.0 and later.

+    #[cfg(feature = "clang_12_0")]

+    pub fn clang_Cursor_hasVarDeclGlobalStorage(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 12.0 and later.

+    #[cfg(feature = "clang_12_0")]

+    pub fn clang_Cursor_hasVarDeclExternalStorage(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 3.7 and later.

+    #[cfg(feature = "clang_3_7")]

+    pub fn clang_Cursor_isAnonymous(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 9.0 and later.

+    #[cfg(feature = "clang_9_0")]

+    pub fn clang_Cursor_isAnonymousRecordDecl(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 = "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 = "clang_3_9")]

+    pub fn clang_Cursor_isFunctionInlined(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 9.0 and later.

+    #[cfg(feature = "clang_9_0")]

+    pub fn clang_Cursor_isInlineNamespace(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_Cursor_isMacroBuiltin(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "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 = "clang_5_0")]

+    pub fn clang_EnumDecl_isScoped(cursor: CXCursor) -> c_uint;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_EvalResult_dispose(result: CXEvalResult);

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_EvalResult_getAsDouble(result: CXEvalResult) -> libc::c_double;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_EvalResult_getAsInt(result: CXEvalResult) -> c_int;

+    /// Only available on `libclang` 4.0 and later.

+    #[cfg(feature = "clang_4_0")]

+    pub fn clang_EvalResult_getAsLongLong(result: CXEvalResult) -> c_longlong;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_EvalResult_getAsStr(result: CXEvalResult) -> *const c_char;

+    /// Only available on `libclang` 4.0 and later.

+    #[cfg(feature = "clang_4_0")]

+    pub fn clang_EvalResult_getAsUnsigned(result: CXEvalResult) -> c_ulonglong;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_EvalResult_getKind(result: CXEvalResult) -> CXEvalResultKind;

+    /// Only available on `libclang` 4.0 and later.

+    #[cfg(feature = "clang_4_0")]

+    pub fn clang_EvalResult_isUnsignedInt(result: CXEvalResult) -> c_uint;

+    /// Only available on `libclang` 3.6 and later.

+    #[cfg(feature = "clang_3_6")]

+    pub fn clang_File_isEqual(left: CXFile, right: CXFile) -> c_int;

+    /// Only available on `libclang` 7.0 and later.

+    #[cfg(feature = "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 = "clang_7_0")]

+    pub fn clang_PrintingPolicy_dispose(policy: CXPrintingPolicy);

+    /// Only available on `libclang` 7.0 and later.

+    #[cfg(feature = "clang_7_0")]

+    pub fn clang_PrintingPolicy_getProperty(policy: CXPrintingPolicy, property: CXPrintingPolicyProperty) -> c_uint;

+    /// Only available on `libclang` 7.0 and later.

+    #[cfg(feature = "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 = "clang_5_0")]

+    pub fn clang_TargetInfo_dispose(info: CXTargetInfo);

+    /// Only available on `libclang` 5.0 and later.

+    #[cfg(feature = "clang_5_0")]

+    pub fn clang_TargetInfo_getPointerWidth(info: CXTargetInfo) -> c_int;

+    /// Only available on `libclang` 5.0 and later.

+    #[cfg(feature = "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` 8.0 and later.

+    #[cfg(feature = "clang_8_0")]

+    pub fn clang_Type_getModifiedType(type_: CXType) -> CXType;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_Type_getNamedType(type_: CXType) -> CXType;

+    /// Only available on `libclang` 8.0 and later.

+    #[cfg(feature = "clang_8_0")]

+    pub fn clang_Type_getNullability(type_: CXType) -> CXTypeNullabilityKind;

+    /// Only available on `libclang` 8.0 and later.

+    #[cfg(feature = "clang_8_0")]

+    pub fn clang_Type_getNumObjCProtocolRefs(type_: CXType) -> c_uint;

+    /// Only available on `libclang` 8.0 and later.

+    #[cfg(feature = "clang_8_0")]

+    pub fn clang_Type_getNumObjCTypeArgs(type_: CXType) -> c_uint;

+    pub fn clang_Type_getNumTemplateArguments(type_: CXType) -> c_int;

+    /// Only available on `libclang` 3.9 and later.

+    #[cfg(feature = "clang_3_9")]

+    pub fn clang_Type_getObjCEncoding(type_: CXType) -> CXString;

+    /// Only available on `libclang` 8.0 and later.

+    #[cfg(feature = "clang_8_0")]

+    pub fn clang_Type_getObjCObjectBaseType(type_: CXType) -> CXType;

+    /// Only available on `libclang` 8.0 and later.

+    #[cfg(feature = "clang_8_0")]

+    pub fn clang_Type_getObjCProtocolDecl(type_: CXType, index: c_uint) -> CXCursor;

+    /// Only available on `libclang` 8.0 and later.

+    #[cfg(feature = "clang_8_0")]

+    pub fn clang_Type_getObjCTypeArg(type_: CXType, index: c_uint) -> CXType;

+    pub fn clang_Type_getOffsetOf(type_: CXType, field: *const c_char) -> c_longlong;

+    pub fn clang_Type_getSizeOf(type_: CXType) -> c_longlong;

+    pub fn clang_Type_getTemplateArgumentAsType(type_: CXType, index: c_uint) -> CXType;

+    /// Only available on `libclang` 11.0 and later.

+    #[cfg(feature = "clang_11_0")]

+    pub fn clang_Type_getValueType(type_: CXType) -> CXType;

+    /// Only available on `libclang` 5.0 and later.

+    #[cfg(feature = "clang_5_0")]

+    pub fn clang_Type_isTransparentTagTypedef(type_: CXType) -> c_uint;

+    /// Only available on `libclang` 3.7 and later.

+    #[cfg(feature = "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;

+    /// Only available on `libclang` 17.0 and later.

+    #[cfg(feature = "clang_17_0")]

+    pub fn clang_createIndexWithOptions(options: CXIndexOptions) -> 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 = "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 = "clang_3_7")]

+    pub fn clang_free(buffer: *mut c_void);

+    /// Only available on `libclang` 5.0 and later.

+    #[cfg(feature = "clang_5_0")]

+    pub fn clang_getAddressSpace(type_: CXType) -> c_uint;

+    /// Only available on `libclang` 4.0 and later.

+    #[cfg(feature = "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;

+    /// Only available on `libclang` 17.0 and later.

+    #[cfg(feature = "clang_17_0")]

+    pub fn clang_getBinaryOperatorKindSpelling(kind: CXBinaryOperatorKind) -> CXString;

+    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 = "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 = "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;

+    /// Only available on `libclang` 17.0 and later.

+    #[cfg(feature = "clang_17_0")]

+    pub fn clang_getCursorBinaryOperatorKind(cursor: CXCursor) -> CXBinaryOperatorKind;

+    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 = "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 = "clang_7_0")]

+    pub fn clang_getCursorPrettyPrinted(cursor: CXCursor, policy: CXPrintingPolicy) -> CXString;

+    /// Only available on `libclang` 7.0 and later.

+    #[cfg(feature = "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 = "clang_6_0")]

+    pub fn clang_getCursorTLSKind(cursor: CXCursor) -> CXTLSKind;

+    pub fn clang_getCursorType(cursor: CXCursor) -> CXType;

+    /// Only available on `libclang` 17.0 and later.

+    #[cfg(feature = "clang_17_0")]

+    pub fn clang_getCursorUnaryOperatorKind(cursor: CXCursor) -> CXUnaryOperatorKind;

+    pub fn clang_getCursorUSR(cursor: CXCursor) -> CXString;

+    /// Only available on `libclang` 3.8 and later.

+    #[cfg(feature = "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 = "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 = "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;

+    /// Only available on `libclang` 16.0 and later.

+    #[cfg(feature = "clang_16_0")]

+    pub fn clang_getNonReferenceType(type_: CXType) -> CXType;

+    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;

+    pub fn clang_getTemplateCursorKind(cursor: CXCursor) -> CXCursorKind;

+    pub fn clang_getToken(tu: CXTranslationUnit, location: CXSourceLocation) -> *mut CXToken;

+    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;

+    /// Only available on `libclang` 5.0 and later.

+    #[cfg(feature = "clang_5_0")]

+    pub fn clang_getTranslationUnitTargetInfo(tu: CXTranslationUnit) -> CXTargetInfo;

+    /// Only available on `libclang` 17.0 and later.

+    #[cfg(feature = "clang_17_0")]

+    pub fn clang_getUnaryOperatorKindSpelling(kind: CXUnaryOperatorKind) -> CXString;

+    /// Only available on `libclang` 16.0 and later.

+    #[cfg(feature = "clang_16_0")]

+    pub fn clang_getUnqualifiedType(type_: CXType) -> CXType;

+    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 = "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 = "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 = "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 = "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 = "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_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_HTMLStartTagComment_isSelfClosing(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_TextComment_getText(comment: CXComment) -> CXString;

+    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_VerbatimBlockLineComment_getText(comment: CXComment) -> CXString;

+    pub fn clang_VerbatimLineComment_getText(comment: CXComment) -> CXString;

+}

diff --git a/crates/clang-sys/src/link.rs b/crates/clang-sys/src/link.rs
index 79b3d49..1adb095 100644
--- a/crates/clang-sys/src/link.rs
+++ b/crates/clang-sys/src/link.rs
@@ -1,323 +1,322 @@
-// SPDX-License-Identifier: Apache-2.0
-
-//================================================
-// 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::fmt;
-        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,
-            V11_0 = 110,
-            V12_0 = 120,
-            V16_0 = 160,
-            V17_0 = 170,
-        }
-
-        impl fmt::Display for Version {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                use Version::*;
-                match self {
-                    V3_5 => write!(f, "3.5.x"),
-                    V3_6 => write!(f, "3.6.x"),
-                    V3_7 => write!(f, "3.7.x"),
-                    V3_8 => write!(f, "3.8.x"),
-                    V3_9 => write!(f, "3.9.x"),
-                    V4_0 => write!(f, "4.0.x"),
-                    V5_0 => write!(f, "5.0.x"),
-                    V6_0 => write!(f, "6.0.x"),
-                    V7_0 => write!(f, "7.0.x"),
-                    V8_0 => write!(f, "8.0.x"),
-                    V9_0 => write!(f, "9.0.x - 10.0.x"),
-                    V11_0 => write!(f, "11.0.x"),
-                    V12_0 => write!(f, "12.0.x - 15.0.x"),
-                    V16_0 => write!(f, "16.0.x"),
-                    V17_0 => write!(f, "17.0.x or later"),
-                }
-            }
-        }
-
-        /// 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_CXXMethod_isExplicit", V17_0);
-                    check!(b"clang_CXXMethod_isCopyAssignmentOperator", V16_0);
-                    check!(b"clang_Cursor_getVarDeclInitializer", V12_0);
-                    check!(b"clang_Type_getValueType", V11_0);
-                    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(clippy::missing_safety_doc))]
-            #[cfg_attr(feature="cargo-clippy", allow(clippy::too_many_arguments))]
-            $(#[doc=$doc] #[cfg($cfg)])*
-            pub unsafe fn $name($($pname: $pty), *) $(-> $ret)* {
-                let f = with_library(|library| {
-                    if let Some(function) = library.functions.$name {
-                        function
-                    } else {
-                        panic!(
-                            r#"
-A `libclang` function was called that is not supported by the loaded `libclang` instance.
-
-    called function = `{0}`
-    loaded `libclang` instance = {1}
-
-This crate only supports `libclang` 3.5 and later.
-The minimum `libclang` requirement for this particular function can be found here:
-https://docs.rs/clang-sys/latest/clang_sys/{0}/index.html
-
-Instructions for installing `libclang` can be found here:
-https://rust-lang.github.io/rust-bindgen/requirements.html
-"#, 
-                            stringify!($name),
-                            library
-                                .version()
-                                .map(|v| format!("{}", v))
-                                .unwrap_or_else(|| "unsupported version".into()),
-                        );
-                    }
-                }).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> {
-            #[allow(dead_code)]
-            mod build {
-                include!(concat!(env!("OUT_DIR"), "/macros.rs"));
-                pub mod common { include!(concat!(env!("OUT_DIR"), "/common.rs")); }
-                pub mod dynamic { include!(concat!(env!("OUT_DIR"), "/dynamic.rs")); }
-            }
-
-            let (directory, filename) = build::dynamic::find(true)?;
-            let path = directory.join(filename);
-
-            unsafe {
-                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(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(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 }
-            }
-        )+
-    )
-}
+// SPDX-License-Identifier: Apache-2.0

+

+//================================================

+// 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::fmt;

+        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,

+            V11_0 = 110,

+            V12_0 = 120,

+            V16_0 = 160,

+            V17_0 = 170,

+        }

+

+        impl fmt::Display for Version {

+            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {

+                use Version::*;

+                match self {

+                    V3_5 => write!(f, "3.5.x"),

+                    V3_6 => write!(f, "3.6.x"),

+                    V3_7 => write!(f, "3.7.x"),

+                    V3_8 => write!(f, "3.8.x"),

+                    V3_9 => write!(f, "3.9.x"),

+                    V4_0 => write!(f, "4.0.x"),

+                    V5_0 => write!(f, "5.0.x"),

+                    V6_0 => write!(f, "6.0.x"),

+                    V7_0 => write!(f, "7.0.x"),

+                    V8_0 => write!(f, "8.0.x"),

+                    V9_0 => write!(f, "9.0.x - 10.0.x"),

+                    V11_0 => write!(f, "11.0.x"),

+                    V12_0 => write!(f, "12.0.x - 15.0.x"),

+                    V16_0 => write!(f, "16.0.x"),

+                    V17_0 => write!(f, "17.0.x or later"),

+                }

+            }

+        }

+

+        /// 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_CXXMethod_isExplicit", V17_0);

+                    check!(b"clang_CXXMethod_isCopyAssignmentOperator", V16_0);

+                    check!(b"clang_Cursor_getVarDeclInitializer", V12_0);

+                    check!(b"clang_Type_getValueType", V11_0);

+                    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(clippy::missing_safety_doc))]

+            #[cfg_attr(feature="cargo-clippy", allow(clippy::too_many_arguments))]

+            $(#[doc=$doc] #[cfg($cfg)])*

+            pub unsafe fn $name($($pname: $pty), *) $(-> $ret)* {

+                let f = with_library(|library| {

+                    if let Some(function) = library.functions.$name {

+                        function

+                    } else {

+                        panic!(

+                            r#"

+A `libclang` function was called that is not supported by the loaded `libclang` instance.

+

+    called function = `{0}`

+    loaded `libclang` instance = {1}

+

+The minimum `libclang` requirement for this particular function can be found here:

+https://docs.rs/clang-sys/latest/clang_sys/{0}/index.html

+

+Instructions for installing `libclang` can be found here:

+https://rust-lang.github.io/rust-bindgen/requirements.html

+"#, 

+                            stringify!($name),

+                            library

+                                .version()

+                                .map(|v| format!("{}", v))

+                                .unwrap_or_else(|| "unsupported version".into()),

+                        );

+                    }

+                }).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> {

+            #[allow(dead_code)]

+            mod build {

+                include!(concat!(env!("OUT_DIR"), "/macros.rs"));

+                pub mod common { include!(concat!(env!("OUT_DIR"), "/common.rs")); }

+                pub mod dynamic { include!(concat!(env!("OUT_DIR"), "/dynamic.rs")); }

+            }

+

+            let (directory, filename) = build::dynamic::find(true)?;

+            let path = directory.join(filename);

+

+            unsafe {

+                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(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(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/crates/clang-sys/src/support.rs b/crates/clang-sys/src/support.rs
index 20005ba..bd20da6 100644
--- a/crates/clang-sys/src/support.rs
+++ b/crates/clang-sys/src/support.rs
@@ -1,236 +1,238 @@
-// SPDX-License-Identifier: Apache-2.0
-
-//! Provides helper functionality.
-
-use std::path::{Path, PathBuf};
-use std::process::Command;
-use std::{env, io};
-
-use glob::{self, Pattern};
-
-use libc::c_int;
-
-use super::CXVersion;
-
-//================================================
-// 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.
-    ///
-    /// ## Cross-compilation
-    ///
-    /// If target arguments are provided (e.g., `-target` followed by a target
-    /// like `x86_64-unknown-linux-gnu`) then this method will prefer a
-    /// target-prefixed instance of `clang` (e.g.,
-    /// `x86_64-unknown-linux-gnu-clang` for the above example).
-    pub fn find(path: Option<&Path>, args: &[String]) -> Option<Clang> {
-        if let Ok(path) = env::var("CLANG_PATH") {
-            let p = Path::new(&path);
-            if p.is_file() && is_executable(p).unwrap_or(false) {
-                return Some(Clang::new(p, args));
-            }
-        }
-
-        // Determine the cross-compilation target, if any.
-
-        let mut target = None;
-        for i in 0..args.len() {
-            if args[i] == "-target" && i + 1 < args.len() {
-                target = Some(&args[i + 1]);
-            }
-        }
-
-        // Collect the paths to search for a `clang` executable in.
-
-        let mut paths = vec![];
-
-        if let Some(path) = path {
-            paths.push(path.into());
-        }
-
-        if let Ok(path) = run_llvm_config(&["--bindir"]) {
-            if let Some(line) = path.lines().next() {
-                paths.push(line.into());
-            }
-        }
-
-        if cfg!(target_os = "macos") {
-            if let Ok((path, _)) = run("xcodebuild", &["-find", "clang"]) {
-                if let Some(line) = path.lines().next() {
-                    paths.push(line.into());
-                }
-            }
-        }
-
-        if let Ok(path) = env::var("PATH") {
-            paths.extend(env::split_paths(&path));
-        }
-
-        // First, look for a target-prefixed `clang` executable.
-
-        if let Some(target) = target {
-            let default = format!("{}-clang{}", target, env::consts::EXE_SUFFIX);
-            let versioned = format!("{}-clang-[0-9]*{}", target, 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));
-                }
-            }
-        }
-
-        // Otherwise, look for any other `clang` executable.
-
-        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> {
-    // Escape the directory in case it contains characters that have special
-    // meaning in glob patterns (e.g., `[` or `]`).
-    let directory = if let Some(directory) = directory.to_str() {
-        Path::new(&Pattern::escape(directory)).to_owned()
-    } else {
-        return None;
-    };
-
-    for pattern in patterns {
-        let pattern = directory.join(pattern).to_string_lossy().into_owned();
-        if let Some(path) = 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(), 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_ascii_digit())
-        .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 = output.find("version ")? + 8;
-    let mut numbers = output[start..].split_whitespace().next()?.split('.');
-    let major = numbers.next().and_then(parse_version_number)?;
-    let minor = 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 = output.find("#include <...> search starts here:")? + 34;
-    let end = 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(),
-    )
-}
+// SPDX-License-Identifier: Apache-2.0

+

+//! Provides helper functionality.

+

+use std::path::{Path, PathBuf};

+use std::process::Command;

+use std::{env, io};

+

+use glob::{self, Pattern};

+

+use libc::c_int;

+

+use super::CXVersion;

+

+//================================================

+// 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.

+    ///

+    /// ## Cross-compilation

+    ///

+    /// If target arguments are provided (e.g., `--target` followed by a target

+    /// like `x86_64-unknown-linux-gnu`) then this method will prefer a

+    /// target-prefixed instance of `clang` (e.g.,

+    /// `x86_64-unknown-linux-gnu-clang` for the above example).

+    pub fn find(path: Option<&Path>, args: &[String]) -> Option<Clang> {

+        if let Ok(path) = env::var("CLANG_PATH") {

+            let p = Path::new(&path);

+            if p.is_file() && is_executable(p).unwrap_or(false) {

+                return Some(Clang::new(p, args));

+            } else {

+                eprintln!("`CLANG_PATH` env var set but is not a full path to an executable");

+            }

+        }

+

+        // Determine the cross-compilation target, if any.

+

+        let mut target = None;

+        for i in 0..args.len() {

+            if (args[i] == "-target" || args[i] == "-target") && i + 1 < args.len() {

+                target = Some(&args[i + 1]);

+            }

+        }

+

+        // Collect the paths to search for a `clang` executable in.

+

+        let mut paths = vec![];

+

+        if let Some(path) = path {

+            paths.push(path.into());

+        }

+

+        if let Ok(path) = run_llvm_config(&["--bindir"]) {

+            if let Some(line) = path.lines().next() {

+                paths.push(line.into());

+            }

+        }

+

+        if cfg!(target_os = "macos") {

+            if let Ok((path, _)) = run("xcodebuild", &["-find", "clang"]) {

+                if let Some(line) = path.lines().next() {

+                    paths.push(line.into());

+                }

+            }

+        }

+

+        if let Ok(path) = env::var("PATH") {

+            paths.extend(env::split_paths(&path));

+        }

+

+        // First, look for a target-prefixed `clang` executable.

+

+        if let Some(target) = target {

+            let default = format!("{}-clang{}", target, env::consts::EXE_SUFFIX);

+            let versioned = format!("{}-clang-[0-9]*{}", target, 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));

+                }

+            }

+        }

+

+        // Otherwise, look for any other `clang` executable.

+

+        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> {

+    // Escape the directory in case it contains characters that have special

+    // meaning in glob patterns (e.g., `[` or `]`).

+    let directory = if let Some(directory) = directory.to_str() {

+        Path::new(&Pattern::escape(directory)).to_owned()

+    } else {

+        return None;

+    };

+

+    for pattern in patterns {

+        let pattern = directory.join(pattern).to_string_lossy().into_owned();

+        if let Some(path) = 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(), 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_ascii_digit())

+        .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 = output.find("version ")? + 8;

+    let mut numbers = output[start..].split_whitespace().next()?.split('.');

+    let major = numbers.next().and_then(parse_version_number)?;

+    let minor = 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 = output.find("#include <...> search starts here:")? + 34;

+    let end = 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/crates/clang-sys/tests/build.rs b/crates/clang-sys/tests/build.rs
index 669c561..1ac4e61 100644
--- a/crates/clang-sys/tests/build.rs
+++ b/crates/clang-sys/tests/build.rs
@@ -1,281 +1,356 @@
-#![allow(dead_code)]
-
-extern crate glob;
-extern crate serial_test;
-extern crate tempfile;
-
-use std::collections::HashMap;
-use std::env;
-use std::fs;
-use std::path::PathBuf;
-use std::sync::Arc;
-use std::sync::Mutex;
-
-use serial_test::serial;
-use tempfile::TempDir;
-
-#[macro_use]
-#[path = "../build/macros.rs"]
-mod macros;
-
-#[path = "../build/common.rs"]
-mod common;
-#[path = "../build/dynamic.rs"]
-mod dynamic;
-#[path = "../build/static.rs"]
-mod r#static;
-
-#[derive(Debug, Default)]
-struct RunCommandMock {
-    invocations: Vec<(String, String, Vec<String>)>,
-    responses: HashMap<Vec<String>, String>,
-}
-
-#[derive(Debug)]
-struct Env {
-    os: String,
-    pointer_width: String,
-    env: Option<String>,
-    vars: HashMap<String, (Option<String>, Option<String>)>,
-    cwd: PathBuf,
-    tmp: TempDir,
-    files: Vec<String>,
-    commands: Arc<Mutex<RunCommandMock>>,
-}
-
-impl Env {
-    fn new(os: &str, pointer_width: &str) -> Self {
-        Env {
-            os: os.into(),
-            pointer_width: pointer_width.into(),
-            env: None,
-            vars: HashMap::new(),
-            cwd: env::current_dir().unwrap(),
-            tmp: tempfile::Builder::new().prefix("clang_sys_test").tempdir().unwrap(),
-            files: vec![],
-            commands: Default::default(),
-        }
-        .var("CLANG_PATH", None)
-        .var("LD_LIBRARY_PATH", None)
-        .var("LIBCLANG_PATH", None)
-        .var("LIBCLANG_STATIC_PATH", None)
-        .var("LLVM_CONFIG_PATH", None)
-        .var("PATH", None)
-    }
-
-    fn env(mut self, env: &str) -> Self {
-        self.env = Some(env.into());
-        self
-    }
-
-    fn var(mut self, name: &str, value: Option<&str>) -> Self {
-        let previous = env::var(name).ok();
-        self.vars.insert(name.into(), (value.map(|v| v.into()), previous));
-        self
-    }
-
-    fn dir(mut self, path: &str) -> Self {
-        self.files.push(path.into());
-        let path = self.tmp.path().join(path);
-        fs::create_dir_all(path).unwrap();
-        self
-    }
-
-    fn file(mut self, path: &str, contents: &[u8]) -> Self {
-        self.files.push(path.into());
-        let path = self.tmp.path().join(path);
-        fs::create_dir_all(path.parent().unwrap()).unwrap();
-        fs::write(self.tmp.path().join(path), contents).unwrap();
-        self
-    }
-
-    fn dll(self, path: &str, pointer_width: &str) -> Self {
-        // PE header.
-        let mut contents = [0; 64];
-        contents[0x3C..0x3C + 4].copy_from_slice(&i32::to_le_bytes(10));
-        contents[10..14].copy_from_slice(&[b'P', b'E', 0, 0]);
-        let magic = if pointer_width == "64" { 523 } else { 267 };
-        contents[34..36].copy_from_slice(&u16::to_le_bytes(magic));
-
-        self.file(path, &contents)
-    }
-
-    fn so(self, path: &str, pointer_width: &str) -> Self {
-        // ELF header.
-        let class = if pointer_width == "64" { 2 } else { 1 };
-        let contents = [127, 69, 76, 70, class];
-
-        self.file(path, &contents)
-    }
-
-    fn command(self, command: &str, args: &[&str], response: &str) -> Self {
-        let command = command.to_string();
-        let args = args.iter().map(|a| a.to_string()).collect::<Vec<_>>();
-
-        let mut key = vec![command];
-        key.extend(args);
-        self.commands.lock().unwrap().responses.insert(key, response.into());
-
-        self
-    }
-
-    fn enable(self) -> Self {
-        env::set_var("_CLANG_SYS_TEST", "yep");
-        env::set_var("_CLANG_SYS_TEST_OS", &self.os);
-        env::set_var("_CLANG_SYS_TEST_POINTER_WIDTH", &self.pointer_width);
-        if let Some(env) = &self.env {
-            env::set_var("_CLANG_SYS_TEST_ENV", env);
-        }
-
-        for (name, (value, _)) in &self.vars {
-            if let Some(value) = value {
-                env::set_var(name, value);
-            } else {
-                env::remove_var(name);
-            }
-        }
-
-        env::set_current_dir(&self.tmp).unwrap();
-
-        let commands = self.commands.clone();
-        let mock = &mut *common::RUN_COMMAND_MOCK.lock().unwrap();
-        *mock = Some(Box::new(move |command, path, args| {
-            let command = command.to_string();
-            let path = path.to_string();
-            let args = args.iter().map(|a| a.to_string()).collect::<Vec<_>>();
-
-            let mut commands = commands.lock().unwrap();
-            commands.invocations.push((command.clone(), path, args.clone()));
-
-            let mut key = vec![command];
-            key.extend(args);
-            commands.responses.get(&key).cloned()
-        }));
-
-        self
-    }
-}
-
-impl Drop for Env {
-    fn drop(&mut self) {
-        env::remove_var("_CLANG_SYS_TEST");
-        env::remove_var("_CLANG_SYS_TEST_OS");
-        env::remove_var("_CLANG_SYS_TEST_POINTER_WIDTH");
-        env::remove_var("_CLANG_SYS_TEST_ENV");
-
-        for (name, (_, previous)) in &self.vars {
-            if let Some(previous) = previous {
-                env::set_var(name, previous);
-            } else {
-                env::remove_var(name);
-            }
-        }
-
-        if let Err(error) = env::set_current_dir(&self.cwd) {
-            println!("Failed to reset working directory: {:?}", error);
-        }
-    }
-}
-
-//================================================
-// Dynamic
-//================================================
-
-// Linux -----------------------------------------
-
-#[test]
-#[serial]
-fn test_linux_directory_preference() {
-    let _env = Env::new("linux", "64")
-        .so("usr/lib/libclang.so.1", "64")
-        .so("usr/local/lib/libclang.so.1", "64")
-        .enable();
-
-    assert_eq!(
-        dynamic::find(true),
-        Ok(("usr/local/lib".into(), "libclang.so.1".into())),
-    );
-}
-
-#[test]
-#[serial]
-fn test_linux_version_preference() {
-    let _env = Env::new("linux", "64")
-        .so("usr/lib/libclang-3.so", "64")
-        .so("usr/lib/libclang-3.5.so", "64")
-        .so("usr/lib/libclang-3.5.0.so", "64")
-        .enable();
-
-    assert_eq!(
-        dynamic::find(true),
-        Ok(("usr/lib".into(), "libclang-3.5.0.so".into())),
-    );
-}
-
-#[test]
-#[serial]
-fn test_linux_directory_and_version_preference() {
-    let _env = Env::new("linux", "64")
-        .so("usr/local/llvm/lib/libclang-3.so", "64")
-        .so("usr/local/lib/libclang-3.5.so", "64")
-        .so("usr/lib/libclang-3.5.0.so", "64")
-        .enable();
-
-    assert_eq!(
-        dynamic::find(true),
-        Ok(("usr/lib".into(), "libclang-3.5.0.so".into())),
-    );
-}
-
-// Windows ---------------------------------------
-
-#[cfg(target_os = "windows")]
-#[test]
-#[serial]
-fn test_windows_bin_sibling() {
-    let _env = Env::new("windows", "64")
-        .dir("Program Files\\LLVM\\lib")
-        .dll("Program Files\\LLVM\\bin\\libclang.dll", "64")
-        .enable();
-
-    assert_eq!(
-        dynamic::find(true),
-        Ok(("Program Files\\LLVM\\bin".into(), "libclang.dll".into())),
-    );
-}
-
-#[cfg(target_os = "windows")]
-#[test]
-#[serial]
-fn test_windows_mingw_gnu() {
-    let _env = Env::new("windows", "64")
-        .env("gnu")
-        .dir("MSYS\\MinGW\\lib")
-        .dll("MSYS\\MinGW\\bin\\clang.dll", "64")
-        .dir("Program Files\\LLVM\\lib")
-        .dll("Program Files\\LLVM\\bin\\libclang.dll", "64")
-        .enable();
-
-    assert_eq!(
-        dynamic::find(true),
-        Ok(("MSYS\\MinGW\\bin".into(), "clang.dll".into())),
-    );
-}
-
-#[cfg(target_os = "windows")]
-#[test]
-#[serial]
-fn test_windows_mingw_msvc() {
-    let _env = Env::new("windows", "64")
-        .env("msvc")
-        .dir("MSYS\\MinGW\\lib")
-        .dll("MSYS\\MinGW\\bin\\clang.dll", "64")
-        .dir("Program Files\\LLVM\\lib")
-        .dll("Program Files\\LLVM\\bin\\libclang.dll", "64")
-        .enable();
-
-    assert_eq!(
-        dynamic::find(true),
-        Ok(("Program Files\\LLVM\\bin".into(), "libclang.dll".into())),
-    );
-}
+#![allow(dead_code)]

+

+use core::fmt;

+use std::collections::HashMap;

+use std::env;

+use std::fs;

+use std::path::PathBuf;

+use std::sync::Arc;

+use std::sync::Mutex;

+

+use tempfile::TempDir;

+

+#[macro_use]

+#[path = "../build/macros.rs"]

+mod macros;

+

+#[path = "../build/common.rs"]

+mod common;

+#[path = "../build/dynamic.rs"]

+mod dynamic;

+#[path = "../build/static.rs"]

+mod r#static;

+

+#[derive(Debug, Default)]

+struct RunCommandMock {

+    invocations: Vec<(String, String, Vec<String>)>,

+    responses: HashMap<Vec<String>, String>,

+}

+

+

+#[derive(Copy, Clone, Debug)]

+enum Arch {

+    ARM64,

+    X86,

+    X86_64,

+}

+

+impl Arch {

+    fn pe_machine_type(self) -> u16 {

+        match self {

+            Arch::ARM64 => 0xAA64,

+            Arch::X86 => 0x014C,

+            Arch::X86_64 => 0x8664,

+        }

+    }

+}

+

+impl fmt::Display for Arch {

+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {

+        match self {

+            Arch::ARM64 => write!(f, "aarch64"),

+            Arch::X86 => write!(f, "x86"),

+            Arch::X86_64 => write!(f, "x86_64"),

+        }

+    }

+}

+

+#[derive(Debug)]

+struct Env {

+    os: String,

+    arch: Arch,

+    pointer_width: String,

+    env: Option<String>,

+    vars: HashMap<String, (Option<String>, Option<String>)>,

+    cwd: PathBuf,

+    tmp: TempDir,

+    files: Vec<String>,

+    commands: Arc<Mutex<RunCommandMock>>,

+}

+

+impl Env {

+    fn new(os: &str, arch: Arch, pointer_width: &str) -> Self {

+        Env {

+            os: os.into(),

+            arch,

+            pointer_width: pointer_width.into(),

+            env: None,

+            vars: HashMap::new(),

+            cwd: env::current_dir().unwrap(),

+            tmp: tempfile::Builder::new().prefix("clang_sys_test").tempdir().unwrap(),

+            files: vec![],

+            commands: Default::default(),

+        }

+        .var("CLANG_PATH", None)

+        .var("LD_LIBRARY_PATH", None)

+        .var("LIBCLANG_PATH", None)

+        .var("LIBCLANG_STATIC_PATH", None)

+        .var("LLVM_CONFIG_PATH", None)

+        .var("PATH", None)

+    }

+

+    fn env(mut self, env: &str) -> Self {

+        self.env = Some(env.into());

+        self

+    }

+

+    fn var(mut self, name: &str, value: Option<&str>) -> Self {

+        let previous = env::var(name).ok();

+        self.vars.insert(name.into(), (value.map(|v| v.into()), previous));

+        self

+    }

+

+    fn dir(mut self, path: &str) -> Self {

+        self.files.push(path.into());

+        let path = self.tmp.path().join(path);

+        fs::create_dir_all(path).unwrap();

+        self

+    }

+

+    fn file(mut self, path: &str, contents: &[u8]) -> Self {

+        self.files.push(path.into());

+        let path = self.tmp.path().join(path);

+        fs::create_dir_all(path.parent().unwrap()).unwrap();

+        fs::write(self.tmp.path().join(path), contents).unwrap();

+        self

+    }

+

+    fn dll(self, path: &str, arch: Arch, pointer_width: &str) -> Self {

+        // PE header.

+        let mut contents = [0; 64];

+        contents[0x3C..0x3C + 4].copy_from_slice(&i32::to_le_bytes(10));

+        contents[10..14].copy_from_slice(&[b'P', b'E', 0, 0]);

+        contents[14..16].copy_from_slice(&u16::to_le_bytes(arch.pe_machine_type()));

+        let magic = if pointer_width == "64" { 523 } else { 267 };

+        contents[34..36].copy_from_slice(&u16::to_le_bytes(magic));

+

+        self.file(path, &contents)

+    }

+

+    fn so(self, path: &str, pointer_width: &str) -> Self {

+        // ELF header.

+        let class = if pointer_width == "64" { 2 } else { 1 };

+        let contents = [127, 69, 76, 70, class];

+

+        self.file(path, &contents)

+    }

+

+    fn command(self, command: &str, args: &[&str], response: &str) -> Self {

+        let command = command.to_string();

+        let args = args.iter().map(|a| a.to_string()).collect::<Vec<_>>();

+

+        let mut key = vec![command];

+        key.extend(args);

+        self.commands.lock().unwrap().responses.insert(key, response.into());

+

+        self

+    }

+

+    fn enable(self) -> Self {

+        env::set_var("_CLANG_SYS_TEST", "yep");

+        env::set_var("_CLANG_SYS_TEST_OS", &self.os);

+        env::set_var("_CLANG_SYS_TEST_ARCH", &format!("{}", self.arch));

+        env::set_var("_CLANG_SYS_TEST_POINTER_WIDTH", &self.pointer_width);

+        if let Some(env) = &self.env {

+            env::set_var("_CLANG_SYS_TEST_ENV", env);

+        }

+

+        for (name, (value, _)) in &self.vars {

+            if let Some(value) = value {

+                env::set_var(name, value);

+            } else {

+                env::remove_var(name);

+            }

+        }

+

+        env::set_current_dir(&self.tmp).unwrap();

+

+        let commands = self.commands.clone();

+        let mock = &mut *common::RUN_COMMAND_MOCK.lock().unwrap();

+        *mock = Some(Box::new(move |command, path, args| {

+            let command = command.to_string();

+            let path = path.to_string();

+            let args = args.iter().map(|a| a.to_string()).collect::<Vec<_>>();

+

+            let mut commands = commands.lock().unwrap();

+            commands.invocations.push((command.clone(), path, args.clone()));

+

+            let mut key = vec![command];

+            key.extend(args);

+            commands.responses.get(&key).cloned()

+        }));

+

+        self

+    }

+}

+

+impl Drop for Env {

+    fn drop(&mut self) {

+        env::remove_var("_CLANG_SYS_TEST");

+        env::remove_var("_CLANG_SYS_TEST_OS");

+        env::remove_var("_CLANG_SYS_TEST_ARCH");

+        env::remove_var("_CLANG_SYS_TEST_POINTER_WIDTH");

+        env::remove_var("_CLANG_SYS_TEST_ENV");

+

+        for (name, (_, previous)) in &self.vars {

+            if let Some(previous) = previous {

+                env::set_var(name, previous);

+            } else {

+                env::remove_var(name);

+            }

+        }

+

+        if let Err(error) = env::set_current_dir(&self.cwd) {

+            println!("Failed to reset working directory: {:?}", error);

+        }

+    }

+}

+

+#[test]

+fn test_all() {

+    // Run tests serially since they alter the environment.

+    

+    test_linux_directory_preference();

+    test_linux_version_preference();

+    test_linux_directory_and_version_preference();

+

+    #[cfg(target_os = "windows")]

+    {

+        test_windows_bin_sibling();

+        test_windows_mingw_gnu();

+        test_windows_mingw_msvc();

+        test_windows_arm64_on_x86_64();

+        test_windows_x86_64_on_arm64();

+    }

+}

+

+macro_rules! assert_error {

+    ($result:expr, $contents:expr $(,)?) => {

+        if let Err(error) = $result {

+            if !error.contains($contents) {

+                panic!("expected error to contain {:?}, received: {error:?}", $contents);

+            }

+        } else {

+            panic!("expected error, received: {:?}", $result);

+        }

+    };

+}

+

+//================================================

+// Dynamic

+//================================================

+

+// Linux -----------------------------------------

+

+fn test_linux_directory_preference() {

+    let _env = Env::new("linux", Arch::X86_64, "64")

+        .so("usr/lib/libclang.so.1", "64")

+        .so("usr/local/lib/libclang.so.1", "64")

+        .enable();

+

+    assert_eq!(

+        dynamic::find(true),

+        Ok(("usr/local/lib".into(), "libclang.so.1".into())),

+    );

+}

+

+fn test_linux_version_preference() {

+    let _env = Env::new("linux", Arch::X86_64, "64")

+        .so("usr/lib/libclang-3.so", "64")

+        .so("usr/lib/libclang-3.5.so", "64")

+        .so("usr/lib/libclang-3.5.0.so", "64")

+        .enable();

+

+    assert_eq!(

+        dynamic::find(true),

+        Ok(("usr/lib".into(), "libclang-3.5.0.so".into())),

+    );

+}

+

+fn test_linux_directory_and_version_preference() {

+    let _env = Env::new("linux", Arch::X86_64, "64")

+        .so("usr/local/llvm/lib/libclang-3.so", "64")

+        .so("usr/local/lib/libclang-3.5.so", "64")

+        .so("usr/lib/libclang-3.5.0.so", "64")

+        .enable();

+

+    assert_eq!(

+        dynamic::find(true),

+        Ok(("usr/lib".into(), "libclang-3.5.0.so".into())),

+    );

+}

+

+// Windows ---------------------------------------

+

+#[cfg(target_os = "windows")]

+fn test_windows_bin_sibling() {

+    let _env = Env::new("windows", Arch::X86_64, "64")

+        .dir("Program Files\\LLVM\\lib")

+        .dll("Program Files\\LLVM\\bin\\libclang.dll", Arch::X86_64, "64")

+        .enable();

+

+    assert_eq!(

+        dynamic::find(true),

+        Ok(("Program Files\\LLVM\\bin".into(), "libclang.dll".into())),

+    );

+}

+

+#[cfg(target_os = "windows")]

+fn test_windows_mingw_gnu() {

+    let _env = Env::new("windows", Arch::X86_64, "64")

+        .env("gnu")

+        .dir("MSYS\\MinGW\\lib")

+        .dll("MSYS\\MinGW\\bin\\clang.dll", Arch::X86_64, "64")

+        .dir("Program Files\\LLVM\\lib")

+        .dll("Program Files\\LLVM\\bin\\libclang.dll", Arch::X86_64, "64")

+        .enable();

+

+    assert_eq!(

+        dynamic::find(true),

+        Ok(("MSYS\\MinGW\\bin".into(), "clang.dll".into())),

+    );

+}

+

+#[cfg(target_os = "windows")]

+fn test_windows_mingw_msvc() {

+    let _env = Env::new("windows", Arch::X86_64, "64")

+        .env("msvc")

+        .dir("MSYS\\MinGW\\lib")

+        .dll("MSYS\\MinGW\\bin\\clang.dll", Arch::X86_64, "64")

+        .dir("Program Files\\LLVM\\lib")

+        .dll("Program Files\\LLVM\\bin\\libclang.dll", Arch::X86_64, "64")

+        .enable();

+

+    assert_eq!(

+        dynamic::find(true),

+        Ok(("Program Files\\LLVM\\bin".into(), "libclang.dll".into())),

+    );

+}

+

+#[cfg(target_os = "windows")]

+fn test_windows_arm64_on_x86_64() {

+    let _env = Env::new("windows", Arch::X86_64, "64")

+        .env("msvc")

+        .dir("Program Files\\LLVM\\lib")

+        .dll("Program Files\\LLVM\\bin\\libclang.dll", Arch::ARM64, "64")

+        .enable();

+

+    assert_error!(

+        dynamic::find(true), 

+        "invalid: [(Program Files\\LLVM\\bin\\libclang.dll: invalid DLL (ARM64)",

+    );

+}

+

+#[cfg(target_os = "windows")]

+fn test_windows_x86_64_on_arm64() {

+    let _env = Env::new("windows", Arch::ARM64, "64")

+        .env("msvc")

+        .dir("Program Files\\LLVM\\lib")

+        .dll("Program Files\\LLVM\\bin\\libclang.dll", Arch::X86_64, "64")

+        .enable();

+

+    assert_error!(

+        dynamic::find(true), 

+        "invalid: [(Program Files\\LLVM\\bin\\libclang.dll: invalid DLL (x86-64)",

+    );

+}

diff --git a/crates/clang-sys/tests/header.h b/crates/clang-sys/tests/header.h
index 3767c8e..5c392d3 100644
--- a/crates/clang-sys/tests/header.h
+++ b/crates/clang-sys/tests/header.h
@@ -1,6 +1,6 @@
-#ifndef HEADER_H_
-#define HEADER_H_
-
-int add(int a, int b);
-
-#endif
+#ifndef HEADER_H_

+#define HEADER_H_

+

+int add(int a, int b);

+

+#endif

diff --git a/crates/clang-sys/tests/lib.rs b/crates/clang-sys/tests/lib.rs
index b50055a..1f152f7 100644
--- a/crates/clang-sys/tests/lib.rs
+++ b/crates/clang-sys/tests/lib.rs
@@ -1,55 +1,52 @@
-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);
-}
-
-#[test]
-fn test_support_target() {
-    let args = &["-target".into(), "x86_64-unknown-linux-gnu".into()];
-    let clang = support::Clang::find(None, args).unwrap();
-    println!("{:?}", clang);
-}
+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);

+}

+

+#[test]

+fn test_support_target() {

+    let args = &["--target".into(), "x86_64-unknown-linux-gnu".into()];

+    let clang = support::Clang::find(None, args).unwrap();

+    println!("{:?}", clang);

+}

diff --git a/pseudo_crate/Cargo.lock b/pseudo_crate/Cargo.lock
index db8ce15..1ffce13 100644
--- a/pseudo_crate/Cargo.lock
+++ b/pseudo_crate/Cargo.lock
@@ -1148,9 +1148,9 @@
 
 [[package]]
 name = "clang-sys"
-version = "1.7.0"
+version = "1.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1"
+checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
 dependencies = [
  "glob",
  "libc",
diff --git a/pseudo_crate/Cargo.toml b/pseudo_crate/Cargo.toml
index 4782645..a85eb4a 100644
--- a/pseudo_crate/Cargo.toml
+++ b/pseudo_crate/Cargo.toml
@@ -54,7 +54,7 @@
 ciborium = "=0.2.2"
 ciborium-io = "=0.2.2"
 ciborium-ll = "=0.2.2"
-clang-sys = "=1.7.0"
+clang-sys = "=1.8.1"
 clap = "4.5.0"
 clap_builder = "=4.5.0"
 clap_complete = "=4.5.3"