NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #851 most downloaded on crates.io
A crate for demangling C++ symbols
Last release 11 months ago
05 Nov 2025
Release timing varies
gaps range from 1 weeks to 13 months
Most releases are documented
notes for 23 of 30 stable releases
4 versions withdrawn
withdrawn after publishing
10 years old
34 releases · first in 2016
Fold expressions are supported. (#303)[https://github.com/gimli-rs/cpp_demangle/pull/303]
Released 2025/11/5
We are now less conservative when accepting the legacy <data-member-prefix> production for increased compatibility with libiberty.
When printing conversion and cast operators we now treat the type we are converting/casting to as a self-contained child and prevent outer template parameters/etc from leaking into it.
When looking for a <template-template-param> production after a conversion operator, we now correctly handle the case where peeking for the next character fails because we reached the end of the symbol.
When parsing <unqualified-name productions, accept <operator-names> both with and without an "on" prefix. LLVM requires the prefix, while libiberty accepts but does not require it.
Empty braced-enclosed initializer lists are now accepted.
A new Symbol::demangle function has been introduced to replace the Display impl. See below for the motivation.
Released 2025/9/23
Symbol::demangle function has been introduced to replace the Display
impl. See below for the motivation.Symbol::demangle has been renamed to
Symbol::demangle_with_options. See below for the motivation.Display for Symbol has been removed. This implementation
violated the contract of the Display trait by potentially returning an Err
without a failure of a write to the provided stream. This contract is enforced
by assertion since Rust 1.80.0.
The new Symbol::demangle function is the intended replacement for uses of
the Display impl.
(#233)[https://github.com/gimli-rs/cpp_demangle/issues/233]One column per quarter.
ABI tags are now accepted after all variants of qualified names. (#272)[https://github.com/gimli-rs/cpp_demangle/issues/272]
Released 2025/9/23
ABI tags are now accepted after all variants of qualified names. (#272)[https://github.com/gimli-rs/cpp_demangle/issues/272]
Unqualified nested names without prefixes are accepted to match libiberty and LLVM.
Fixed-point types from the N1169 draft of ISO/IEC DTR 18037 (_Accum, _Fract) are supported. (#298)[https://github.com/gimli-rs/cpp_demangle/pull/298]
The proposed (and widely implemented) explicitly named object parameters are supported. (#299)[https://github.com/gimli-rs/cpp_demangle/pull/299]
C++23 extended floating-point types (_FloatN, Float_Nx, and std::bfloat16_t) and integer types (_BitInt) are supported. (#295)[https://github.com/giml
Released 2024/8/28
Inheriting constructions now correctly add themselves to the substitution table, fixing issues with demangling symbols that use them and then use a la
Released 2023/8/18
Handling of recursion depth errors has been improved. Exceeding cpp_demangle's recursion limits will now return immediately, which significantly impro
Released 2023/6/26
A case of runaway recursion caused by parsing ambiguous input in an incorrect order has been fixed. (#280)[https://github.com/gimli-rs/cpp_demangle/pu
Released 2023/4/13
The deprecated nightly and cppfilt features are gone.
Released 2022/10/20
The non-deprecated versions of noexcept are supported. #273
Released 2022/10/20
The non-deprecated versions of noexcept are supported. #273
Most of the subobject production that clang uses is supported. #273
Rust 2018 is now used. #251
cppfilt now uses clap 4.0. #271
no_std works. #251
Inheriting constructors no longer produce substitutable values. #272
The LLVM mangling for vector types with a dimension expression is now supported. The libiberty mangling which appears to be unused by gcc has been rem
Released 2021/12/02
DemangleOptions now has a hide_expression_literal_types method that can make it easier to match user-provided template instance names. #230
Released 2021/11/21
DemangleOptions now has a hide_expression_literal_types method that
can make it easier to match user-provided template instance names. #230The builtin char8_t type is now recognized #224
Released 2021/7/8
char8_t type is now recognized #224glob is no longer a build time dependency #220ParseOptions is introduced, with new API variants Symbol::new_with_options and Symbol::with_tail_and_options. The existing APIs use the default parsin
Released 2020/11/27
ParseOptions is introduced, with new API variants Symbol::new_with_options
and Symbol::with_tail_and_options. The existing APIs use the default parsing
options.ParseOptions and DemangleOptions.Java Resource symbols are now supported #200
Released 2020/10/09
The DemangleOptions API has changed to be more future-proof and the DemangleNodeType enum now has an __NonExhaustive variant to discourage pattern mat
Released 2020/06/11
_ => () arm.Return types can now be elided from demangled symbols via DemangleOptions::no_return_typ. #202
Released 2020/06/09
Return types can now be elided from demangled symbols via DemangleOptions::no_return_typ. #202
A vtable marker is now emitted for semantic consumers.
The spaceship operator <=>. #198
Released 2020/05/13
Block invocation symbols. #197
The spaceship operator <=>. #198
A C API to cpp_demangle is now available. #191
Released 2020/04/24
A C API to cpp_demangle is now available. #191
Additional AST markers are emitted for semantic consumers. #189
Certain symbols can have cyclic back references, or at least very deep stacks of back references. Many of those symbols are valid! But as a practical
Released 2019/11/15
Fix parsing of outdated sr forms that prevented parsing other symbols. See
Released 2019/07/30
Fix parsing of outdated sr forms that prevented parsing other symbols. See
#173 for details.
Ensures a space is printed before a & or && reference qualifier. #176
Fixed placement of parentheses in symbols with function pointer arguments that
have const qualifiers. #175
*Actually* fixed builds using no-default-features = true to not accidentally enable no_std mode, which requires nightly rust, and break builds on non-
Released 2018/08/09
no-default-features = true to not accidentally
enable no_std mode, which requires nightly rust, and break builds on
non-nightly channels. Enabling the no_std mode now requires disabling the
std feature and enabling the alloc feature.Fixed builds using no-default-features = true to not accidentally enable no_std mode, which requires nightly rust, and break builds on non-nightly cha
Released 2018/08/09
no-default-features = true to not accidentally enable
no_std mode, which requires nightly rust, and break builds on non-nightly
channels. Enabling the no_std mode now requires disabling the std feature
and enabling the alloc feature.Added support for no_std! This currently requires nightly Rust's alloc feature to get access to BTreeMap. Enable no_std support by building without th
Released 2018/08/08
no_std! This currently requires nightly Rust's alloc
feature to get access to BTreeMap. Enable no_std support by building
without the on-by-default std feature. #148Fixed a few issues with parentheticals.
Released 2018/05/14
Bug fixes, more libiberty tests passing, and we can now parse and demangle all but one symbol from Firefox's libxul:
Released 2018/05/11
Bug fixes, more libiberty tests passing, and we can now parse and demangle all
but one symbol from Firefox's libxul:
Total number of libxul symbols: 274346
Number of libxul symbols parsed: 274345 (100.00%)
Number of libxul symbols demangled: 274345 (100.00%)
Number of libxul symbols demangled same as libiberty: 227259 (82.84%)
<function-param> production.Making lots of progress on symbols found in the wild! Here are our stats for symbols from Firefox's libxul:
Released 2017/11/27
Making lots of progress on symbols found in the wild! Here are our stats for
symbols from Firefox's libxul:
Total number of libxul symbols: 274346
Number of libxul symbols parsed: 274319 (99.99%)
Number of libxul symbols demangled: 274319 (99.99%)
Number of libxul symbols demangled same as libiberty: 199928 (72.88%)
Additionally, the libiberty test threshold bumped up from 70 to 83 during this
release.
<special-name> production:
construction vtables, typeinfo functions, TLS initialization functions, TLS
wrapper functions.<local-source-name> production. My
understanding is that this is from an older version of the ABI standard. It
isn't in the current version, but all the other demanglers support it, so we
will too.cpp_demangle is now part of the gimli-rs GitHub organization. The
canonical repository is now https://github.com/gimli-rs/cpp_demanglelibiberty formats them. For example,
foo<true>() rather than foo<1>().libiberty.new operator is now correctly formatted as operator new rather than
operatornew. Same for the delete operator.Added support for ::= productions
Released 2017/11/08
<unqualified-name> ::= <closure-type-name> productionsNothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →