xref: /llvm-project/lldb/unittests/Core/MangledTest.cpp (revision 68fdc1cf87eb04686e079af27eaeec0f1c41f8cc)
180814287SRaphael Isemann //===-- MangledTest.cpp ---------------------------------------------------===//
22f842d68SStefan Granitz //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62f842d68SStefan Granitz //
72f842d68SStefan Granitz //===----------------------------------------------------------------------===//
82f842d68SStefan Granitz 
9149fede1SStefan Granitz #include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
1084a68569SPavel Labath #include "Plugins/SymbolFile/Symtab/SymbolFileSymtab.h"
115dca0596SRaphael Isemann #include "TestingSupport/SubsystemRAII.h"
12149fede1SStefan Granitz #include "TestingSupport/TestUtilities.h"
132f842d68SStefan Granitz 
142f842d68SStefan Granitz #include "lldb/Core/Mangled.h"
15149fede1SStefan Granitz #include "lldb/Core/Module.h"
16149fede1SStefan Granitz #include "lldb/Core/ModuleSpec.h"
1746376966SJonas Devlieghere #include "lldb/Host/FileSystem.h"
18149fede1SStefan Granitz #include "lldb/Host/HostInfo.h"
19149fede1SStefan Granitz #include "lldb/Symbol/SymbolContext.h"
20149fede1SStefan Granitz 
21149fede1SStefan Granitz #include "llvm/Support/FileUtilities.h"
22149fede1SStefan Granitz #include "llvm/Support/Path.h"
23149fede1SStefan Granitz #include "llvm/Support/Program.h"
248a777920SGreg Clayton #include "llvm/Testing/Support/Error.h"
25149fede1SStefan Granitz 
26149fede1SStefan Granitz #include "gtest/gtest.h"
272f842d68SStefan Granitz 
282f842d68SStefan Granitz using namespace lldb;
292f842d68SStefan Granitz using namespace lldb_private;
302f842d68SStefan Granitz 
TEST(MangledTest,ResultForValidName)312f842d68SStefan Granitz TEST(MangledTest, ResultForValidName) {
322f842d68SStefan Granitz   ConstString MangledName("_ZN1a1b1cIiiiEEvm");
33939411c1SAdrian Prantl   Mangled TheMangled(MangledName);
3422b04487SAlex Langford   ConstString TheDemangled = TheMangled.GetDemangledName();
352f842d68SStefan Granitz 
362f842d68SStefan Granitz   ConstString ExpectedResult("void a::b::c<int, int, int>(unsigned long)");
372f842d68SStefan Granitz   EXPECT_STREQ(ExpectedResult.GetCString(), TheDemangled.GetCString());
382f842d68SStefan Granitz }
392f842d68SStefan Granitz 
TEST(MangledTest,ResultForBlockInvocation)4083393d27Sshafik TEST(MangledTest, ResultForBlockInvocation) {
4183393d27Sshafik   ConstString MangledName("___Z1fU13block_pointerFviE_block_invoke");
4283393d27Sshafik   Mangled TheMangled(MangledName);
4322b04487SAlex Langford   ConstString TheDemangled = TheMangled.GetDemangledName();
4483393d27Sshafik 
4583393d27Sshafik   ConstString ExpectedResult(
4683393d27Sshafik       "invocation function for block in f(void (int) block_pointer)");
4783393d27Sshafik   EXPECT_STREQ(ExpectedResult.GetCString(), TheDemangled.GetCString());
4883393d27Sshafik }
4983393d27Sshafik 
TEST(MangledTest,EmptyForInvalidName)502f842d68SStefan Granitz TEST(MangledTest, EmptyForInvalidName) {
512f842d68SStefan Granitz   ConstString MangledName("_ZN1a1b1cmxktpEEvm");
52939411c1SAdrian Prantl   Mangled TheMangled(MangledName);
5322b04487SAlex Langford   ConstString TheDemangled = TheMangled.GetDemangledName();
542f842d68SStefan Granitz 
552f842d68SStefan Granitz   EXPECT_STREQ("", TheDemangled.GetCString());
562f842d68SStefan Granitz }
57149fede1SStefan Granitz 
TEST(MangledTest,ResultForValidRustV0Name)580a2d4f3fSAlexander Mols TEST(MangledTest, ResultForValidRustV0Name) {
590a2d4f3fSAlexander Mols   ConstString mangled_name("_RNvC1a4main");
600a2d4f3fSAlexander Mols   Mangled the_mangled(mangled_name);
610a2d4f3fSAlexander Mols   ConstString the_demangled = the_mangled.GetDemangledName();
620a2d4f3fSAlexander Mols 
630a2d4f3fSAlexander Mols   ConstString expected_result("a::main");
640a2d4f3fSAlexander Mols   EXPECT_STREQ(expected_result.GetCString(), the_demangled.GetCString());
650a2d4f3fSAlexander Mols }
660a2d4f3fSAlexander Mols 
TEST(MangledTest,EmptyForInvalidRustV0Name)670a2d4f3fSAlexander Mols TEST(MangledTest, EmptyForInvalidRustV0Name) {
680a2d4f3fSAlexander Mols   ConstString mangled_name("_RRR");
690a2d4f3fSAlexander Mols   Mangled the_mangled(mangled_name);
700a2d4f3fSAlexander Mols   ConstString the_demangled = the_mangled.GetDemangledName();
710a2d4f3fSAlexander Mols 
720a2d4f3fSAlexander Mols   EXPECT_STREQ("", the_demangled.GetCString());
730a2d4f3fSAlexander Mols }
740a2d4f3fSAlexander Mols 
TEST(MangledTest,ResultForValidDLangName)7596a73599SLuís Ferreira TEST(MangledTest, ResultForValidDLangName) {
7696a73599SLuís Ferreira   ConstString mangled_name("_Dmain");
7796a73599SLuís Ferreira   Mangled the_mangled(mangled_name);
7896a73599SLuís Ferreira   ConstString the_demangled = the_mangled.GetDemangledName();
7996a73599SLuís Ferreira 
8096a73599SLuís Ferreira   ConstString expected_result("D main");
8196a73599SLuís Ferreira   EXPECT_STREQ(expected_result.GetCString(), the_demangled.GetCString());
8296a73599SLuís Ferreira }
8396a73599SLuís Ferreira 
TEST(MangledTest,SameForInvalidDLangPrefixedName)84*68fdc1cfSDave Lee TEST(MangledTest, SameForInvalidDLangPrefixedName) {
8596a73599SLuís Ferreira   ConstString mangled_name("_DDD");
8696a73599SLuís Ferreira   Mangled the_mangled(mangled_name);
8796a73599SLuís Ferreira   ConstString the_demangled = the_mangled.GetDemangledName();
8896a73599SLuís Ferreira 
89*68fdc1cfSDave Lee   EXPECT_STREQ("_DDD", the_demangled.GetCString());
9096a73599SLuís Ferreira }
9196a73599SLuís Ferreira 
TEST(MangledTest,RecognizeSwiftMangledNames)92edc64d49SAlex Langford TEST(MangledTest, RecognizeSwiftMangledNames) {
93edc64d49SAlex Langford   llvm::StringRef valid_swift_mangled_names[] = {
94edc64d49SAlex Langford       "_TtC4main7MyClass",   // Mangled objc class name
95edc64d49SAlex Langford       "_TtP4main3Foo_",      // Mangld objc protocol name
96edc64d49SAlex Langford       "$s4main3BarCACycfC",  // Mangled name
97edc64d49SAlex Langford       "_$s4main3BarCACycfC", // Mangled name with leading underscore
98edc64d49SAlex Langford       "$S4main3BarCACycfC",  // Older swift mangled name
99edc64d49SAlex Langford       "_$S4main3BarCACycfC", // Older swift mangled name
100edc64d49SAlex Langford                              // with leading underscore
101edc64d49SAlex Langford       // Mangled swift filename
102edc64d49SAlex Langford       "@__swiftmacro_4main16FunVariableNames9OptionSetfMm_.swift",
103edc64d49SAlex Langford   };
104edc64d49SAlex Langford 
105edc64d49SAlex Langford   for (llvm::StringRef mangled : valid_swift_mangled_names)
106edc64d49SAlex Langford     EXPECT_EQ(Mangled::GetManglingScheme(mangled),
107edc64d49SAlex Langford               Mangled::eManglingSchemeSwift);
108edc64d49SAlex Langford }
109edc64d49SAlex Langford 
TEST(MangledTest,BoolConversionOperator)110633b0029SPoYao Chang TEST(MangledTest, BoolConversionOperator) {
111633b0029SPoYao Chang   {
112633b0029SPoYao Chang     ConstString MangledName("_ZN1a1b1cIiiiEEvm");
113633b0029SPoYao Chang     Mangled TheMangled(MangledName);
114633b0029SPoYao Chang     EXPECT_EQ(true, bool(TheMangled));
115633b0029SPoYao Chang     EXPECT_EQ(false, !TheMangled);
116633b0029SPoYao Chang   }
117633b0029SPoYao Chang   {
118633b0029SPoYao Chang     ConstString UnmangledName("puts");
119633b0029SPoYao Chang     Mangled TheMangled(UnmangledName);
120633b0029SPoYao Chang     EXPECT_EQ(true, bool(TheMangled));
121633b0029SPoYao Chang     EXPECT_EQ(false, !TheMangled);
122633b0029SPoYao Chang   }
123633b0029SPoYao Chang   {
124633b0029SPoYao Chang     Mangled TheMangled{};
125633b0029SPoYao Chang     EXPECT_EQ(false, bool(TheMangled));
126633b0029SPoYao Chang     EXPECT_EQ(true, !TheMangled);
127633b0029SPoYao Chang   }
128633b0029SPoYao Chang }
12996a73599SLuís Ferreira 
TEST(MangledTest,NameIndexes_FindFunctionSymbols)130149fede1SStefan Granitz TEST(MangledTest, NameIndexes_FindFunctionSymbols) {
1315dca0596SRaphael Isemann   SubsystemRAII<FileSystem, HostInfo, ObjectFileELF, SymbolFileSymtab>
1325dca0596SRaphael Isemann       subsystems;
133149fede1SStefan Granitz 
134a2e270faSPavel Labath   auto ExpectedFile = TestFile::fromYaml(R"(
135a2e270faSPavel Labath --- !ELF
136a2e270faSPavel Labath FileHeader:
137a2e270faSPavel Labath   Class:           ELFCLASS64
138a2e270faSPavel Labath   Data:            ELFDATA2LSB
139a2e270faSPavel Labath   Type:            ET_EXEC
140a2e270faSPavel Labath   Machine:         EM_X86_64
141a2e270faSPavel Labath Sections:
142a2e270faSPavel Labath   - Name:            .text
143a2e270faSPavel Labath     Type:            SHT_PROGBITS
144a2e270faSPavel Labath     Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
145a2e270faSPavel Labath     AddressAlign:    0x0000000000000010
146a2e270faSPavel Labath     Size:            0x20
147a2e270faSPavel Labath   - Name:            .anothertext
148a2e270faSPavel Labath     Type:            SHT_PROGBITS
149a2e270faSPavel Labath     Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
150a2e270faSPavel Labath     Address:         0x0000000000000010
151a2e270faSPavel Labath     AddressAlign:    0x0000000000000010
152a2e270faSPavel Labath     Size:            0x40
153a2e270faSPavel Labath   - Name:            .data
154a2e270faSPavel Labath     Type:            SHT_PROGBITS
155a2e270faSPavel Labath     Flags:           [ SHF_WRITE, SHF_ALLOC ]
156a2e270faSPavel Labath     Address:         0x00000000000000A8
157a2e270faSPavel Labath     AddressAlign:    0x0000000000000004
158a2e270faSPavel Labath     Content:         '01000000'
159a2e270faSPavel Labath Symbols:
160a2e270faSPavel Labath   - Name:            somedata
161a2e270faSPavel Labath     Type:            STT_OBJECT
162a2e270faSPavel Labath     Section:         .anothertext
163a2e270faSPavel Labath     Value:           0x0000000000000045
164a2e270faSPavel Labath     Binding:         STB_GLOBAL
165a2e270faSPavel Labath   - Name:            main
166a2e270faSPavel Labath     Type:            STT_FUNC
167a2e270faSPavel Labath     Section:         .anothertext
168a2e270faSPavel Labath     Value:           0x0000000000000010
169a2e270faSPavel Labath     Size:            0x000000000000003F
170a2e270faSPavel Labath     Binding:         STB_GLOBAL
171a2e270faSPavel Labath   - Name:            _Z3foov
172a2e270faSPavel Labath     Type:            STT_FUNC
173a2e270faSPavel Labath     Section:         .text
174a2e270faSPavel Labath     Size:            0x000000000000000D
175a2e270faSPavel Labath     Binding:         STB_GLOBAL
176a2e270faSPavel Labath   - Name:            puts@GLIBC_2.5
177a2e270faSPavel Labath     Type:            STT_FUNC
178a2e270faSPavel Labath     Section:         .text
179a2e270faSPavel Labath     Size:            0x000000000000000D
180a2e270faSPavel Labath     Binding:         STB_GLOBAL
181a2e270faSPavel Labath   - Name:            puts@GLIBC_2.6
182a2e270faSPavel Labath     Type:            STT_FUNC
183a2e270faSPavel Labath     Section:         .text
184a2e270faSPavel Labath     Size:            0x000000000000000D
185a2e270faSPavel Labath     Binding:         STB_GLOBAL
186a2e270faSPavel Labath   - Name:            _Z5annotv@VERSION3
187a2e270faSPavel Labath     Type:            STT_FUNC
188a2e270faSPavel Labath     Section:         .text
189a2e270faSPavel Labath     Size:            0x000000000000000D
190a2e270faSPavel Labath     Binding:         STB_GLOBAL
191a2e270faSPavel Labath   - Name:            _ZN1AC2Ev
192a2e270faSPavel Labath     Type:            STT_FUNC
193a2e270faSPavel Labath     Section:         .text
194a2e270faSPavel Labath     Size:            0x000000000000000D
195a2e270faSPavel Labath     Binding:         STB_GLOBAL
196a2e270faSPavel Labath   - Name:            _ZN1AD2Ev
197a2e270faSPavel Labath     Type:            STT_FUNC
198a2e270faSPavel Labath     Section:         .text
199a2e270faSPavel Labath     Size:            0x000000000000000D
200a2e270faSPavel Labath     Binding:         STB_GLOBAL
201a2e270faSPavel Labath   - Name:            _ZN1A3barEv
202a2e270faSPavel Labath     Type:            STT_FUNC
203a2e270faSPavel Labath     Section:         .text
204a2e270faSPavel Labath     Size:            0x000000000000000D
205a2e270faSPavel Labath     Binding:         STB_GLOBAL
206a2e270faSPavel Labath   - Name:            _ZGVZN4llvm4dbgsEvE7thestrm
207a2e270faSPavel Labath     Type:            STT_FUNC
208a2e270faSPavel Labath     Section:         .text
209a2e270faSPavel Labath     Size:            0x000000000000000D
210a2e270faSPavel Labath     Binding:         STB_GLOBAL
211a2e270faSPavel Labath   - Name:            _ZZN4llvm4dbgsEvE7thestrm
212a2e270faSPavel Labath     Type:            STT_FUNC
213a2e270faSPavel Labath     Section:         .text
214a2e270faSPavel Labath     Size:            0x000000000000000D
215a2e270faSPavel Labath     Binding:         STB_GLOBAL
216a2e270faSPavel Labath   - Name:            _ZTVN5clang4DeclE
217a2e270faSPavel Labath     Type:            STT_FUNC
218a2e270faSPavel Labath     Section:         .text
219a2e270faSPavel Labath     Size:            0x000000000000000D
220a2e270faSPavel Labath     Binding:         STB_GLOBAL
221a2e270faSPavel Labath   - Name:            -[ObjCfoo]
222a2e270faSPavel Labath     Type:            STT_FUNC
223a2e270faSPavel Labath     Section:         .text
224a2e270faSPavel Labath     Size:            0x000000000000000D
225a2e270faSPavel Labath     Binding:         STB_GLOBAL
226a2e270faSPavel Labath   - Name:            +[B ObjCbar(WithCategory)]
227a2e270faSPavel Labath     Type:            STT_FUNC
228a2e270faSPavel Labath     Section:         .text
229a2e270faSPavel Labath     Size:            0x000000000000000D
230a2e270faSPavel Labath     Binding:         STB_GLOBAL
231a2e270faSPavel Labath   - Name:            _Z12undemangableEvx42
232a2e270faSPavel Labath     Type:            STT_FUNC
233a2e270faSPavel Labath     Section:         .text
234a2e270faSPavel Labath     Size:            0x000000000000000D
235a2e270faSPavel Labath     Binding:         STB_GLOBAL
236a2e270faSPavel Labath ...
237a2e270faSPavel Labath )");
238a2e270faSPavel Labath   ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
239149fede1SStefan Granitz 
240a4a00cedSFred Riss   auto M = std::make_shared<Module>(ExpectedFile->moduleSpec());
241149fede1SStefan Granitz 
242149fede1SStefan Granitz   auto Count = [M](const char *Name, FunctionNameType Type) -> int {
243149fede1SStefan Granitz     SymbolContextList SymList;
2441ad655e2SAdrian Prantl     M->FindFunctionSymbols(ConstString(Name), Type, SymList);
2451ad655e2SAdrian Prantl     return SymList.GetSize();
246149fede1SStefan Granitz   };
247149fede1SStefan Granitz 
248149fede1SStefan Granitz   // Unmangled
249149fede1SStefan Granitz   EXPECT_EQ(1, Count("main", eFunctionNameTypeFull));
250149fede1SStefan Granitz   EXPECT_EQ(1, Count("main", eFunctionNameTypeBase));
251149fede1SStefan Granitz   EXPECT_EQ(0, Count("main", eFunctionNameTypeMethod));
252149fede1SStefan Granitz 
253149fede1SStefan Granitz   // Itanium mangled
254149fede1SStefan Granitz   EXPECT_EQ(1, Count("_Z3foov", eFunctionNameTypeFull));
255149fede1SStefan Granitz   EXPECT_EQ(1, Count("_Z3foov", eFunctionNameTypeBase));
256149fede1SStefan Granitz   EXPECT_EQ(1, Count("foo", eFunctionNameTypeBase));
257149fede1SStefan Granitz   EXPECT_EQ(0, Count("foo", eFunctionNameTypeMethod));
258149fede1SStefan Granitz 
259149fede1SStefan Granitz   // Unmangled with linker annotation
260149fede1SStefan Granitz   EXPECT_EQ(1, Count("puts@GLIBC_2.5", eFunctionNameTypeFull));
261149fede1SStefan Granitz   EXPECT_EQ(1, Count("puts@GLIBC_2.6", eFunctionNameTypeFull));
262149fede1SStefan Granitz   EXPECT_EQ(2, Count("puts", eFunctionNameTypeFull));
263149fede1SStefan Granitz   EXPECT_EQ(2, Count("puts", eFunctionNameTypeBase));
264149fede1SStefan Granitz   EXPECT_EQ(0, Count("puts", eFunctionNameTypeMethod));
265149fede1SStefan Granitz 
266149fede1SStefan Granitz   // Itanium mangled with linker annotation
267149fede1SStefan Granitz   EXPECT_EQ(1, Count("_Z5annotv@VERSION3", eFunctionNameTypeFull));
268149fede1SStefan Granitz   EXPECT_EQ(1, Count("_Z5annotv", eFunctionNameTypeFull));
269149fede1SStefan Granitz   EXPECT_EQ(1, Count("_Z5annotv", eFunctionNameTypeBase));
270149fede1SStefan Granitz   EXPECT_EQ(0, Count("annot", eFunctionNameTypeBase));
271149fede1SStefan Granitz   EXPECT_EQ(0, Count("annot", eFunctionNameTypeMethod));
272149fede1SStefan Granitz 
273149fede1SStefan Granitz   // Itanium mangled ctor A::A()
274149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZN1AC2Ev", eFunctionNameTypeFull));
275149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZN1AC2Ev", eFunctionNameTypeBase));
276149fede1SStefan Granitz   EXPECT_EQ(1, Count("A", eFunctionNameTypeMethod));
277149fede1SStefan Granitz   EXPECT_EQ(0, Count("A", eFunctionNameTypeBase));
278149fede1SStefan Granitz 
279149fede1SStefan Granitz   // Itanium mangled dtor A::~A()
280149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZN1AD2Ev", eFunctionNameTypeFull));
281149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZN1AD2Ev", eFunctionNameTypeBase));
282149fede1SStefan Granitz   EXPECT_EQ(1, Count("~A", eFunctionNameTypeMethod));
283149fede1SStefan Granitz   EXPECT_EQ(0, Count("~A", eFunctionNameTypeBase));
284149fede1SStefan Granitz 
285149fede1SStefan Granitz   // Itanium mangled method A::bar()
286149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZN1A3barEv", eFunctionNameTypeFull));
287149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZN1A3barEv", eFunctionNameTypeBase));
288149fede1SStefan Granitz   EXPECT_EQ(1, Count("bar", eFunctionNameTypeMethod));
289149fede1SStefan Granitz   EXPECT_EQ(0, Count("bar", eFunctionNameTypeBase));
290149fede1SStefan Granitz 
291149fede1SStefan Granitz   // Itanium mangled names that are explicitly excluded from parsing
292149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZGVZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeFull));
293149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZGVZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeBase));
294149fede1SStefan Granitz   EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeMethod));
295149fede1SStefan Granitz   EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeBase));
296149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeFull));
297149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeBase));
298149fede1SStefan Granitz   EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeMethod));
299149fede1SStefan Granitz   EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeBase));
300149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZTVN5clang4DeclE", eFunctionNameTypeFull));
301149fede1SStefan Granitz   EXPECT_EQ(1, Count("_ZTVN5clang4DeclE", eFunctionNameTypeBase));
302149fede1SStefan Granitz   EXPECT_EQ(0, Count("Decl", eFunctionNameTypeMethod));
303149fede1SStefan Granitz   EXPECT_EQ(0, Count("Decl", eFunctionNameTypeBase));
304149fede1SStefan Granitz 
305149fede1SStefan Granitz   // ObjC mangled static
306149fede1SStefan Granitz   EXPECT_EQ(1, Count("-[ObjCfoo]", eFunctionNameTypeFull));
307149fede1SStefan Granitz   EXPECT_EQ(1, Count("-[ObjCfoo]", eFunctionNameTypeBase));
308149fede1SStefan Granitz   EXPECT_EQ(0, Count("ObjCfoo", eFunctionNameTypeMethod));
309149fede1SStefan Granitz 
310149fede1SStefan Granitz   // ObjC mangled method with category
311149fede1SStefan Granitz   EXPECT_EQ(1, Count("+[B ObjCbar(WithCategory)]", eFunctionNameTypeFull));
312149fede1SStefan Granitz   EXPECT_EQ(1, Count("+[B ObjCbar(WithCategory)]", eFunctionNameTypeBase));
313149fede1SStefan Granitz   EXPECT_EQ(0, Count("ObjCbar", eFunctionNameTypeMethod));
314149fede1SStefan Granitz 
315149fede1SStefan Granitz   // Invalid things: unable to decode but still possible to find by full name
316149fede1SStefan Granitz   EXPECT_EQ(1, Count("_Z12undemangableEvx42", eFunctionNameTypeFull));
317149fede1SStefan Granitz   EXPECT_EQ(1, Count("_Z12undemangableEvx42", eFunctionNameTypeBase));
318149fede1SStefan Granitz   EXPECT_EQ(0, Count("_Z12undemangableEvx42", eFunctionNameTypeMethod));
319149fede1SStefan Granitz   EXPECT_EQ(0, Count("undemangable", eFunctionNameTypeBase));
320149fede1SStefan Granitz   EXPECT_EQ(0, Count("undemangable", eFunctionNameTypeMethod));
321149fede1SStefan Granitz }
322