1*67d82d6eSErik Pilkington //===----------------------- PartialDemangleTest.cpp ----------------------===//
2*67d82d6eSErik Pilkington //
3*67d82d6eSErik Pilkington //                     The LLVM Compiler Infrastructure
4*67d82d6eSErik Pilkington //
5*67d82d6eSErik Pilkington // This file is dual licensed under the MIT and the University of Illinois Open
6*67d82d6eSErik Pilkington // Source Licenses. See LICENSE.TXT for details.
7*67d82d6eSErik Pilkington //
8*67d82d6eSErik Pilkington //===----------------------------------------------------------------------===//
9*67d82d6eSErik Pilkington 
10*67d82d6eSErik Pilkington #include <cstdlib>
11*67d82d6eSErik Pilkington #include "llvm/Demangle/Demangle.h"
12*67d82d6eSErik Pilkington #include "gtest/gtest.h"
13*67d82d6eSErik Pilkington 
14*67d82d6eSErik Pilkington struct ChoppedName {
15*67d82d6eSErik Pilkington   const char *Mangled;
16*67d82d6eSErik Pilkington   const char *ContextName, *BaseName, *ReturnType, *Params;
17*67d82d6eSErik Pilkington };
18*67d82d6eSErik Pilkington 
19*67d82d6eSErik Pilkington static ChoppedName NamesToTest[] = {
20*67d82d6eSErik Pilkington   {"_Z1fv", "", "f", "", "()"},
21*67d82d6eSErik Pilkington   {"_ZN1a1b1cIiiiEEvm", "a::b", "c", "void", "(unsigned long)"},
22*67d82d6eSErik Pilkington   {"_ZZ5OuterIiEivEN5Inner12inner_memberEv",
23*67d82d6eSErik Pilkington    "int Outer<int>()::Inner", "inner_member", "", "()"},
24*67d82d6eSErik Pilkington   {"_Z1fIiEPFvvEv", "", "f", "void (*)()", "()"},
25*67d82d6eSErik Pilkington   {"_ZN1S1fIiEEvv", "S", "f", "void", "()"},
26*67d82d6eSErik Pilkington 
27*67d82d6eSErik Pilkington   // Call operator for a lambda in f().
28*67d82d6eSErik Pilkington   {"_ZZ1fvENK3$_0clEi", "f()::$_0", "operator()", "", "(int)"},
29*67d82d6eSErik Pilkington 
30*67d82d6eSErik Pilkington   // A call operator for a lambda in a lambda in f().
31*67d82d6eSErik Pilkington   {"_ZZZ1fvENK3$_0clEvENKUlvE_clEv",
32*67d82d6eSErik Pilkington    "f()::$_0::operator()() const::'lambda'()", "operator()", "", "()"},
33*67d82d6eSErik Pilkington 
34*67d82d6eSErik Pilkington   {"_ZZN1S1fEiiEd0_NKUlvE_clEv",
35*67d82d6eSErik Pilkington    "S::f(int, int)::'lambda'()", "operator()", "", "()"},
36*67d82d6eSErik Pilkington 
37*67d82d6eSErik Pilkington   {"_ZN1Scv7MuncherIJDpPT_EEIJFivEA_iEEEv",
38*67d82d6eSErik Pilkington    "S", "operator Muncher<int (*)(), int (*) []>", "", "()"},
39*67d82d6eSErik Pilkington 
40*67d82d6eSErik Pilkington   // Attributes.
41*67d82d6eSErik Pilkington   {"_ZN5test4IdE1fEUa9enable_ifIXeqfL0p_Li1EEXeqfL0p0_Li2EEEi",
42*67d82d6eSErik Pilkington    "test4<double>", "f", "", "(int)"},
43*67d82d6eSErik Pilkington   {"_ZN1SC2B8ctor_tagEv", "S", "S", "", "()"},
44*67d82d6eSErik Pilkington   {"_ZN1S1fB4MERPIiEEvv", "S", "f", "void", "()"},
45*67d82d6eSErik Pilkington 
46*67d82d6eSErik Pilkington   {"_ZNSsC1EmcRKSaIcE",
47*67d82d6eSErik Pilkington    "std::basic_string<char, std::char_traits<char>, std::allocator<char> >",
48*67d82d6eSErik Pilkington    "basic_string", "", "(unsigned long, char, std::allocator<char> const&)"},
49*67d82d6eSErik Pilkington   {"_ZNSsixEm", "std::string", "operator[]", "", "(unsigned long)"},
50*67d82d6eSErik Pilkington   {"_ZSt17__throw_bad_allocv", "std", "__throw_bad_alloc", "", "()"},
51*67d82d6eSErik Pilkington 
52*67d82d6eSErik Pilkington   {"_ZN1AI1BEC2Ev", "A<B>", "A", "", "()"},
53*67d82d6eSErik Pilkington   {"_ZN1AI1BED2Ev", "A<B>", "~A", "", "()"},
54*67d82d6eSErik Pilkington   {"_ZN1AI1BECI24BaseEi", "A<B>", "A", "", "(int)"},
55*67d82d6eSErik Pilkington   {"_ZNKR1AI1BE1fIiEEiv", "A<B>", "f", "int", "()"},
56*67d82d6eSErik Pilkington 
57*67d82d6eSErik Pilkington   {"_ZN1SIJicfEE3mfnIJjcdEEEvicfDpT_", "S<int, char, float>",
58*67d82d6eSErik Pilkington    "mfn", "void", "(int, char, float, unsigned int, char, double)"},
59*67d82d6eSErik Pilkington };
60*67d82d6eSErik Pilkington 
61*67d82d6eSErik Pilkington TEST(PartialDemangleTest, TestNameChopping) {
62*67d82d6eSErik Pilkington   size_t Size = 1;
63*67d82d6eSErik Pilkington   char *Buf = static_cast<char *>(std::malloc(Size));
64*67d82d6eSErik Pilkington 
65*67d82d6eSErik Pilkington   llvm::ItaniumPartialDemangler D;
66*67d82d6eSErik Pilkington 
67*67d82d6eSErik Pilkington   for (ChoppedName &N : NamesToTest) {
68*67d82d6eSErik Pilkington     EXPECT_FALSE(D.partialDemangle(N.Mangled));
69*67d82d6eSErik Pilkington     EXPECT_TRUE(D.isFunction());
70*67d82d6eSErik Pilkington     EXPECT_FALSE(D.isData());
71*67d82d6eSErik Pilkington     EXPECT_FALSE(D.isSpecialName());
72*67d82d6eSErik Pilkington 
73*67d82d6eSErik Pilkington     Buf = D.getFunctionDeclContextName(Buf, &Size);
74*67d82d6eSErik Pilkington     EXPECT_STREQ(Buf, N.ContextName);
75*67d82d6eSErik Pilkington 
76*67d82d6eSErik Pilkington     Buf = D.getFunctionBaseName(Buf, &Size);
77*67d82d6eSErik Pilkington     EXPECT_STREQ(Buf, N.BaseName);
78*67d82d6eSErik Pilkington 
79*67d82d6eSErik Pilkington     Buf = D.getFunctionReturnType(Buf, &Size);
80*67d82d6eSErik Pilkington     EXPECT_STREQ(Buf, N.ReturnType);
81*67d82d6eSErik Pilkington 
82*67d82d6eSErik Pilkington     Buf = D.getFunctionParameters(Buf, &Size);
83*67d82d6eSErik Pilkington     EXPECT_STREQ(Buf, N.Params);
84*67d82d6eSErik Pilkington   }
85*67d82d6eSErik Pilkington }
86*67d82d6eSErik Pilkington 
87*67d82d6eSErik Pilkington TEST(PartialDemangleTest, TestNameMeta) {
88*67d82d6eSErik Pilkington   llvm::ItaniumPartialDemangler Demangler;
89*67d82d6eSErik Pilkington 
90*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.partialDemangle("_ZNK1f1gEv"));
91*67d82d6eSErik Pilkington   EXPECT_TRUE(Demangler.isFunction());
92*67d82d6eSErik Pilkington   EXPECT_TRUE(Demangler.hasFunctionQualifiers());
93*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.isSpecialName());
94*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.isData());
95*67d82d6eSErik Pilkington 
96*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.partialDemangle("_Z1fv"));
97*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.hasFunctionQualifiers());
98*67d82d6eSErik Pilkington 
99*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.partialDemangle("_ZTV1S"));
100*67d82d6eSErik Pilkington   EXPECT_TRUE(Demangler.isSpecialName());
101*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.isData());
102*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.isFunction());
103*67d82d6eSErik Pilkington 
104*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.partialDemangle("_ZN1aDC1a1b1cEE"));
105*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.isFunction());
106*67d82d6eSErik Pilkington   EXPECT_FALSE(Demangler.isSpecialName());
107*67d82d6eSErik Pilkington   EXPECT_TRUE(Demangler.isData());
108*67d82d6eSErik Pilkington }
109*67d82d6eSErik Pilkington 
110*67d82d6eSErik Pilkington TEST(PartialDemanglerTest, TestMisc) {
111*67d82d6eSErik Pilkington   llvm::ItaniumPartialDemangler D1, D2;
112*67d82d6eSErik Pilkington 
113*67d82d6eSErik Pilkington   EXPECT_FALSE(D1.partialDemangle("_Z1fv"));
114*67d82d6eSErik Pilkington   EXPECT_FALSE(D2.partialDemangle("_Z1g"));
115*67d82d6eSErik Pilkington   std::swap(D1, D2);
116*67d82d6eSErik Pilkington   EXPECT_FALSE(D1.isFunction());
117*67d82d6eSErik Pilkington   EXPECT_TRUE(D2.isFunction());
118*67d82d6eSErik Pilkington 
119*67d82d6eSErik Pilkington   EXPECT_TRUE(D1.partialDemangle("Not a mangled name!"));
120*67d82d6eSErik Pilkington 
121*67d82d6eSErik Pilkington }
122