diff options
author | Dino Radakovic <dinor@google.com> | 2024-02-09 18:46:09 -0800 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-02-09 18:46:50 -0800 |
commit | 4358cb2f8cb304e64d9a2d2845f472297724e19f (patch) | |
tree | 524ff2f5c3c6b5325f7e013b28aee1c879276e4a /absl/debugging/internal/demangle_test.cc | |
parent | df2c771ec596b385448117f237ee70be35efe4ce (diff) | |
download | abseil-4358cb2f8cb304e64d9a2d2845f472297724e19f.tar.gz abseil-4358cb2f8cb304e64d9a2d2845f472297724e19f.tar.bz2 abseil-4358cb2f8cb304e64d9a2d2845f472297724e19f.zip |
`demangle`: Parse `requires` clauses on template params, before function return type
For example, this covers the following:
```
template <typename T>
requires std::integral<T>
int foo();
```
Refactor parsing of `Q <requires-clause expr>` into a single function that performs backtracking to avoid reimplementing `ParseTemplateArgs` in terms of nested if-else blocks.
PiperOrigin-RevId: 605785418
Change-Id: I118998a75e050dcf46af125b613b690312fd3cbe
Diffstat (limited to 'absl/debugging/internal/demangle_test.cc')
-rw-r--r-- | absl/debugging/internal/demangle_test.cc | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/absl/debugging/internal/demangle_test.cc b/absl/debugging/internal/demangle_test.cc index 4b9d7711..86e66886 100644 --- a/absl/debugging/internal/demangle_test.cc +++ b/absl/debugging/internal/demangle_test.cc @@ -75,6 +75,42 @@ TEST(Demangle, FunctionTemplateWithFunctionRequiresClause) { EXPECT_STREQ(tmp, "foo<>()"); } +TEST(Demangle, FunctionWithTemplateParamRequiresClause) { + char tmp[100]; + + // template <typename T> + // requires std::integral<T> + // int foo(); + // + // foo<int>(); + ASSERT_TRUE(Demangle("_Z3fooIiQsr3stdE8integralIT_EEiv", tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "foo<>()"); +} + +TEST(Demangle, FunctionWithTemplateParamAndFunctionRequiresClauses) { + char tmp[100]; + + // template <typename T> + // requires std::integral<T> + // int foo() requires std::integral<T>; + // + // foo<int>(); + ASSERT_TRUE(Demangle("_Z3fooIiQsr3stdE8integralIT_EEivQsr3stdE8integralIS0_E", + tmp, sizeof(tmp))); + EXPECT_STREQ(tmp, "foo<>()"); +} + +TEST(Demangle, FunctionTemplateBacktracksOnMalformedRequiresClause) { + char tmp[100]; + + // template <typename T> + // int foo(T); + // + // foo<int>(5); + // Except there's an extra `Q` where the mangled requires clause would be. + ASSERT_FALSE(Demangle("_Z3fooIiQEiT_", tmp, sizeof(tmp))); +} + TEST(Demangle, FunctionTemplateWithAutoParam) { char tmp[100]; |