122a1aa5aSLuís Ferreira //===------------------ DLangDemangleTest.cpp -----------------------------===//
222a1aa5aSLuís Ferreira //
322a1aa5aSLuís Ferreira // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
422a1aa5aSLuís Ferreira // See https://llvm.org/LICENSE.txt for license information.
522a1aa5aSLuís Ferreira // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
622a1aa5aSLuís Ferreira //
722a1aa5aSLuís Ferreira //===----------------------------------------------------------------------===//
822a1aa5aSLuís Ferreira
922a1aa5aSLuís Ferreira #include "llvm/Demangle/Demangle.h"
1022a1aa5aSLuís Ferreira #include "gmock/gmock.h"
1122a1aa5aSLuís Ferreira #include "gtest/gtest.h"
1222a1aa5aSLuís Ferreira
1322a1aa5aSLuís Ferreira #include <cstdlib>
14*f5371eb3SNick Desaulniers #include <string_view>
1522a1aa5aSLuís Ferreira #include <utility>
1622a1aa5aSLuís Ferreira
1722a1aa5aSLuís Ferreira struct DLangDemangleTestFixture
18*f5371eb3SNick Desaulniers : public testing::TestWithParam<std::pair<std::string_view, const char *>> {
1922a1aa5aSLuís Ferreira char *Demangled;
2022a1aa5aSLuís Ferreira
SetUpDLangDemangleTestFixture2122a1aa5aSLuís Ferreira void SetUp() override { Demangled = llvm::dlangDemangle(GetParam().first); }
2222a1aa5aSLuís Ferreira
TearDownDLangDemangleTestFixture2322a1aa5aSLuís Ferreira void TearDown() override { std::free(Demangled); }
2422a1aa5aSLuís Ferreira };
2522a1aa5aSLuís Ferreira
TEST_P(DLangDemangleTestFixture,DLangDemangleTest)2622a1aa5aSLuís Ferreira TEST_P(DLangDemangleTestFixture, DLangDemangleTest) {
2722a1aa5aSLuís Ferreira EXPECT_STREQ(Demangled, GetParam().second);
2822a1aa5aSLuís Ferreira }
2922a1aa5aSLuís Ferreira
306e08abdcSDavid Blaikie INSTANTIATE_TEST_SUITE_P(
316e08abdcSDavid Blaikie DLangDemangleTest, DLangDemangleTestFixture,
326e08abdcSDavid Blaikie testing::Values(
33*f5371eb3SNick Desaulniers std::make_pair("_Dmain", "D main"), std::make_pair("_Z", nullptr),
34*f5371eb3SNick Desaulniers std::make_pair("_DDD", nullptr), std::make_pair("_D88", nullptr),
356e08abdcSDavid Blaikie std::make_pair("_D8demangleZ", "demangle"),
366e08abdcSDavid Blaikie std::make_pair("_D8demangle4testZ", "demangle.test"),
37b779f02aSLuís Ferreira std::make_pair("_D8demangle4test5test2Z", "demangle.test.test2"),
38b779f02aSLuís Ferreira std::make_pair("_D8demangle4test0Z", "demangle.test"),
398a7ddf9eSLuís Ferreira std::make_pair("_D8demangle4test03fooZ", "demangle.test.foo"),
408a7ddf9eSLuís Ferreira std::make_pair("_D8demangle4test6__initZ",
418a7ddf9eSLuís Ferreira "initializer for demangle.test"),
428a7ddf9eSLuís Ferreira std::make_pair("_D8demangle4test6__vtblZ", "vtable for demangle.test"),
438a7ddf9eSLuís Ferreira std::make_pair("_D8demangle4test7__ClassZ",
448a7ddf9eSLuís Ferreira "ClassInfo for demangle.test"),
458a7ddf9eSLuís Ferreira std::make_pair("_D8demangle4test11__InterfaceZ",
468a7ddf9eSLuís Ferreira "Interface for demangle.test"),
478a7ddf9eSLuís Ferreira std::make_pair("_D8demangle4test12__ModuleInfoZ",
4883087c09SLuís Ferreira "ModuleInfo for demangle.test"),
4983087c09SLuís Ferreira std::make_pair("_D8demangle4__S14testZ", "demangle.test"),
50669bfcf0SLuís Ferreira std::make_pair("_D8demangle4__Sd4testZ", "demangle.__Sd.test"),
51669bfcf0SLuís Ferreira std::make_pair("_D8demangle3fooi", "demangle.foo"),
52669bfcf0SLuís Ferreira std::make_pair("_D8demangle3foo",
53669bfcf0SLuís Ferreira nullptr), // symbol without a type sequence.
54669bfcf0SLuís Ferreira std::make_pair("_D8demangle3fooinvalidtypeseq",
55bec08795SLuís Ferreira nullptr), // invalid type sequence.
56bec08795SLuís Ferreira std::make_pair(
57bec08795SLuís Ferreira "_D8demangle3ABCQe1ai",
58bec08795SLuís Ferreira "demangle.ABC.ABC.a"), // symbol back reference: `Qe` is a back
59bec08795SLuís Ferreira // reference for position 5, counting from e
60bec08795SLuís Ferreira // char, so decoding it points to `3`. Since
61bec08795SLuís Ferreira // `3` is a number, 3 chars get read and it
62bec08795SLuís Ferreira // succeeded.
63bec08795SLuís Ferreira std::make_pair("_D8demangle3ABCQa1ai",
64bec08795SLuís Ferreira nullptr), // invalid symbol back reference (recursive).
65bec08795SLuís Ferreira std::make_pair("_D8demangleQDXXXXXXXXXXXXx",
66b21ea1c2SLuís Ferreira nullptr), // overflow back reference position.
67b21ea1c2SLuís Ferreira std::make_pair(
68b21ea1c2SLuís Ferreira "_D8demangle4ABCi1aQd",
69b21ea1c2SLuís Ferreira "demangle.ABCi.a"), // type back reference: `Qd` is a back reference
70b21ea1c2SLuís Ferreira // for position 4, counting from `d` char, so
71b21ea1c2SLuís Ferreira // decoding it points to `i`.
72b21ea1c2SLuís Ferreira std::make_pair("_D8demangle3fooQXXXx",
73b21ea1c2SLuís Ferreira nullptr), // invalid type back reference position.
74b21ea1c2SLuís Ferreira std::make_pair("_D8demangle5recurQa",
75b21ea1c2SLuís Ferreira nullptr))); // invalid type back reference (recursive).
76