diff options
-rw-r--r-- | absl/debugging/internal/demangle.cc | 7 | ||||
-rw-r--r-- | absl/debugging/internal/demangle_test.cc | 15 |
2 files changed, 22 insertions, 0 deletions
diff --git a/absl/debugging/internal/demangle.cc b/absl/debugging/internal/demangle.cc index 79246e9b..787edcee 100644 --- a/absl/debugging/internal/demangle.cc +++ b/absl/debugging/internal/demangle.cc @@ -1998,6 +1998,7 @@ static bool ParseBracedExpression(State *state) { // ::= st <type> // ::= at <type> // ::= az <expression> +// ::= nx <expression> // ::= <template-param> // ::= <function-param> // ::= sZ <template-param> @@ -2136,6 +2137,12 @@ static bool ParseExpression(State *state) { } state->parse_state = copy; + // noexcept(expression) appearing as an expression in a dependent signature + if (ParseTwoCharToken(state, "nx") && ParseExpression(state)) { + return true; + } + state->parse_state = copy; + // sizeof...(pack) // // <expression> ::= sZ <template-param> diff --git a/absl/debugging/internal/demangle_test.cc b/absl/debugging/internal/demangle_test.cc index a91935f4..5dc2d03b 100644 --- a/absl/debugging/internal/demangle_test.cc +++ b/absl/debugging/internal/demangle_test.cc @@ -1128,6 +1128,21 @@ TEST(Demangle, AlignofExpression) { EXPECT_STREQ("f<>()", tmp); } +TEST(Demangle, NoexceptExpression) { + char tmp[80]; + + // Source: + // + // template <class T> void f(T (&a)[noexcept(T{})]) {} + // template void f<int>(int (&)[noexcept(int{})]); + // + // Full LLVM demangling of the instantiation of f: + // + // void f<int>(int (&) [noexcept (int{})]) + EXPECT_TRUE(Demangle("_Z1fIiEvRAnxtlT_E_S0_", tmp, sizeof(tmp))); + EXPECT_STREQ("f<>()", tmp); +} + TEST(Demangle, ThreadLocalWrappers) { char tmp[80]; |