1 //===------------------ ItaniumDemangleTest.cpp ---------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/Demangle/ItaniumDemangle.h"
11 #include "llvm/Support/Allocator.h"
12 #include "gmock/gmock.h"
13 #include "gtest/gtest.h"
14 #include <cstdlib>
15 #include <vector>
16 
17 using namespace llvm;
18 using namespace llvm::itanium_demangle;
19 
20 namespace {
21 class TestAllocator {
22   BumpPtrAllocator Alloc;
23 
24 public:
25   void reset() { Alloc.Reset(); }
26 
27   template <typename T, typename... Args> T *makeNode(Args &&... args) {
28     return new (Alloc.Allocate(sizeof(T), alignof(T)))
29         T(std::forward<Args>(args)...);
30   }
31 
32   void *allocateNodeArray(size_t sz) {
33     return Alloc.Allocate(sizeof(Node *) * sz, alignof(Node *));
34   }
35 };
36 } // namespace
37 
38 TEST(ItaniumDemangle, MethodOverride) {
39   struct TestParser : AbstractManglingParser<TestParser, TestAllocator> {
40     std::vector<char> Types;
41 
42     TestParser(const char *Str)
43         : AbstractManglingParser(Str, Str + strlen(Str)) {}
44 
45     Node *parseType() {
46       Types.push_back(*First);
47       return AbstractManglingParser<TestParser, TestAllocator>::parseType();
48     }
49   };
50 
51   TestParser Parser("_Z1fIiEjl");
52   ASSERT_NE(nullptr, Parser.parse());
53   EXPECT_THAT(Parser.Types, testing::ElementsAre('i', 'j', 'l'));
54 }
55