xref: /aosp_15_r20/external/abseil-cpp/absl/debugging/internal/demangle_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2018 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #include "absl/debugging/internal/demangle.h"
16*9356374aSAndroid Build Coastguard Worker 
17*9356374aSAndroid Build Coastguard Worker #include <cstdlib>
18*9356374aSAndroid Build Coastguard Worker #include <string>
19*9356374aSAndroid Build Coastguard Worker 
20*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
21*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
22*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
23*9356374aSAndroid Build Coastguard Worker #include "absl/debugging/internal/stack_consumption.h"
24*9356374aSAndroid Build Coastguard Worker #include "absl/log/log.h"
25*9356374aSAndroid Build Coastguard Worker #include "absl/memory/memory.h"
26*9356374aSAndroid Build Coastguard Worker 
27*9356374aSAndroid Build Coastguard Worker namespace absl {
28*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
29*9356374aSAndroid Build Coastguard Worker namespace debugging_internal {
30*9356374aSAndroid Build Coastguard Worker namespace {
31*9356374aSAndroid Build Coastguard Worker 
32*9356374aSAndroid Build Coastguard Worker using ::testing::ContainsRegex;
33*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,FunctionTemplate)34*9356374aSAndroid Build Coastguard Worker TEST(Demangle, FunctionTemplate) {
35*9356374aSAndroid Build Coastguard Worker   char tmp[100];
36*9356374aSAndroid Build Coastguard Worker 
37*9356374aSAndroid Build Coastguard Worker   // template <typename T>
38*9356374aSAndroid Build Coastguard Worker   // int foo(T);
39*9356374aSAndroid Build Coastguard Worker   //
40*9356374aSAndroid Build Coastguard Worker   // foo<int>(5);
41*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooIiEiT_", tmp, sizeof(tmp)));
42*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
43*9356374aSAndroid Build Coastguard Worker }
44*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,FunctionTemplateWithNesting)45*9356374aSAndroid Build Coastguard Worker TEST(Demangle, FunctionTemplateWithNesting) {
46*9356374aSAndroid Build Coastguard Worker   char tmp[100];
47*9356374aSAndroid Build Coastguard Worker 
48*9356374aSAndroid Build Coastguard Worker   // template <typename T>
49*9356374aSAndroid Build Coastguard Worker   // int foo(T);
50*9356374aSAndroid Build Coastguard Worker   //
51*9356374aSAndroid Build Coastguard Worker   // foo<Wrapper<int>>({ .value = 5 });
52*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooI7WrapperIiEEiT_", tmp, sizeof(tmp)));
53*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
54*9356374aSAndroid Build Coastguard Worker }
55*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,FunctionTemplateWithNonTypeParamConstraint)56*9356374aSAndroid Build Coastguard Worker TEST(Demangle, FunctionTemplateWithNonTypeParamConstraint) {
57*9356374aSAndroid Build Coastguard Worker   char tmp[100];
58*9356374aSAndroid Build Coastguard Worker 
59*9356374aSAndroid Build Coastguard Worker   // template <std::integral T>
60*9356374aSAndroid Build Coastguard Worker   // int foo(T);
61*9356374aSAndroid Build Coastguard Worker   //
62*9356374aSAndroid Build Coastguard Worker   // foo<int>(5);
63*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooITkSt8integraliEiT_", tmp, sizeof(tmp)));
64*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
65*9356374aSAndroid Build Coastguard Worker }
66*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,FunctionTemplateWithFunctionRequiresClause)67*9356374aSAndroid Build Coastguard Worker TEST(Demangle, FunctionTemplateWithFunctionRequiresClause) {
68*9356374aSAndroid Build Coastguard Worker   char tmp[100];
69*9356374aSAndroid Build Coastguard Worker 
70*9356374aSAndroid Build Coastguard Worker   // template <typename T>
71*9356374aSAndroid Build Coastguard Worker   // int foo() requires std::integral<T>;
72*9356374aSAndroid Build Coastguard Worker   //
73*9356374aSAndroid Build Coastguard Worker   // foo<int>();
74*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooIiEivQsr3stdE8integralIT_E", tmp, sizeof(tmp)));
75*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
76*9356374aSAndroid Build Coastguard Worker }
77*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,FunctionWithTemplateParamRequiresClause)78*9356374aSAndroid Build Coastguard Worker TEST(Demangle, FunctionWithTemplateParamRequiresClause) {
79*9356374aSAndroid Build Coastguard Worker   char tmp[100];
80*9356374aSAndroid Build Coastguard Worker 
81*9356374aSAndroid Build Coastguard Worker   // template <typename T>
82*9356374aSAndroid Build Coastguard Worker   //     requires std::integral<T>
83*9356374aSAndroid Build Coastguard Worker   // int foo();
84*9356374aSAndroid Build Coastguard Worker   //
85*9356374aSAndroid Build Coastguard Worker   // foo<int>();
86*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooIiQsr3stdE8integralIT_EEiv", tmp, sizeof(tmp)));
87*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
88*9356374aSAndroid Build Coastguard Worker }
89*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,FunctionWithTemplateParamAndFunctionRequiresClauses)90*9356374aSAndroid Build Coastguard Worker TEST(Demangle, FunctionWithTemplateParamAndFunctionRequiresClauses) {
91*9356374aSAndroid Build Coastguard Worker   char tmp[100];
92*9356374aSAndroid Build Coastguard Worker 
93*9356374aSAndroid Build Coastguard Worker   // template <typename T>
94*9356374aSAndroid Build Coastguard Worker   //     requires std::integral<T>
95*9356374aSAndroid Build Coastguard Worker   // int foo() requires std::integral<T>;
96*9356374aSAndroid Build Coastguard Worker   //
97*9356374aSAndroid Build Coastguard Worker   // foo<int>();
98*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooIiQsr3stdE8integralIT_EEivQsr3stdE8integralIS0_E",
99*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
100*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
101*9356374aSAndroid Build Coastguard Worker }
102*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,FunctionTemplateBacktracksOnMalformedRequiresClause)103*9356374aSAndroid Build Coastguard Worker TEST(Demangle, FunctionTemplateBacktracksOnMalformedRequiresClause) {
104*9356374aSAndroid Build Coastguard Worker   char tmp[100];
105*9356374aSAndroid Build Coastguard Worker 
106*9356374aSAndroid Build Coastguard Worker   // template <typename T>
107*9356374aSAndroid Build Coastguard Worker   // int foo(T);
108*9356374aSAndroid Build Coastguard Worker   //
109*9356374aSAndroid Build Coastguard Worker   // foo<int>(5);
110*9356374aSAndroid Build Coastguard Worker   // Except there's an extra `Q` where the mangled requires clause would be.
111*9356374aSAndroid Build Coastguard Worker   ASSERT_FALSE(Demangle("_Z3fooIiQEiT_", tmp, sizeof(tmp)));
112*9356374aSAndroid Build Coastguard Worker }
113*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,FunctionTemplateWithAutoParam)114*9356374aSAndroid Build Coastguard Worker TEST(Demangle, FunctionTemplateWithAutoParam) {
115*9356374aSAndroid Build Coastguard Worker   char tmp[100];
116*9356374aSAndroid Build Coastguard Worker 
117*9356374aSAndroid Build Coastguard Worker   // template <auto>
118*9356374aSAndroid Build Coastguard Worker   // void foo();
119*9356374aSAndroid Build Coastguard Worker   //
120*9356374aSAndroid Build Coastguard Worker   // foo<1>();
121*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooITnDaLi1EEvv", tmp, sizeof(tmp)));
122*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
123*9356374aSAndroid Build Coastguard Worker }
124*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,FunctionTemplateWithNonTypeParamPack)125*9356374aSAndroid Build Coastguard Worker TEST(Demangle, FunctionTemplateWithNonTypeParamPack) {
126*9356374aSAndroid Build Coastguard Worker   char tmp[100];
127*9356374aSAndroid Build Coastguard Worker 
128*9356374aSAndroid Build Coastguard Worker   // template <int&..., typename T>
129*9356374aSAndroid Build Coastguard Worker   // void foo(T);
130*9356374aSAndroid Build Coastguard Worker   //
131*9356374aSAndroid Build Coastguard Worker   // foo(2);
132*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooITpTnRiJEiEvT0_", tmp, sizeof(tmp)));
133*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
134*9356374aSAndroid Build Coastguard Worker }
135*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,FunctionTemplateTemplateParamWithConstrainedArg)136*9356374aSAndroid Build Coastguard Worker TEST(Demangle, FunctionTemplateTemplateParamWithConstrainedArg) {
137*9356374aSAndroid Build Coastguard Worker   char tmp[100];
138*9356374aSAndroid Build Coastguard Worker 
139*9356374aSAndroid Build Coastguard Worker   // template <typename T>
140*9356374aSAndroid Build Coastguard Worker   // concept True = true;
141*9356374aSAndroid Build Coastguard Worker   //
142*9356374aSAndroid Build Coastguard Worker   // template <typename T> requires True<T>
143*9356374aSAndroid Build Coastguard Worker   // struct Fooer {};
144*9356374aSAndroid Build Coastguard Worker   //
145*9356374aSAndroid Build Coastguard Worker   // template <template <typename T> typename>
146*9356374aSAndroid Build Coastguard Worker   // void foo() {}
147*9356374aSAndroid Build Coastguard Worker   //
148*9356374aSAndroid Build Coastguard Worker   // foo<Fooer>();
149*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooITtTyE5FooerEvv", tmp, sizeof(tmp)));
150*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
151*9356374aSAndroid Build Coastguard Worker }
152*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConstrainedAutoInFunctionTemplate)153*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConstrainedAutoInFunctionTemplate) {
154*9356374aSAndroid Build Coastguard Worker   char tmp[100];
155*9356374aSAndroid Build Coastguard Worker 
156*9356374aSAndroid Build Coastguard Worker   // template <typename T> concept C = true;
157*9356374aSAndroid Build Coastguard Worker   // template <C auto N> void f() {}
158*9356374aSAndroid Build Coastguard Worker   // template void f<0>();
159*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z1fITnDk1CLi0EEvv", tmp, sizeof(tmp)));
160*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "f<>()");
161*9356374aSAndroid Build Coastguard Worker }
162*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConstrainedFriendFunctionTemplate)163*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConstrainedFriendFunctionTemplate) {
164*9356374aSAndroid Build Coastguard Worker   char tmp[100];
165*9356374aSAndroid Build Coastguard Worker 
166*9356374aSAndroid Build Coastguard Worker   // Source:
167*9356374aSAndroid Build Coastguard Worker   //
168*9356374aSAndroid Build Coastguard Worker   // namespace ns {
169*9356374aSAndroid Build Coastguard Worker   // template <class T> struct Y {
170*9356374aSAndroid Build Coastguard Worker   //   friend void y(Y) requires true {}
171*9356374aSAndroid Build Coastguard Worker   // };
172*9356374aSAndroid Build Coastguard Worker   // }  // namespace ns
173*9356374aSAndroid Build Coastguard Worker   //
174*9356374aSAndroid Build Coastguard Worker   // y(ns::Y<int>{});
175*9356374aSAndroid Build Coastguard Worker   //
176*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
177*9356374aSAndroid Build Coastguard Worker   //
178*9356374aSAndroid Build Coastguard Worker   // ns::Y<int>::friend y(ns::Y<int>) requires true
179*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZN2ns1YIiEF1yES1_QLb1E", tmp, sizeof(tmp)));
180*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "ns::Y<>::friend y()");
181*9356374aSAndroid Build Coastguard Worker }
182*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConstrainedFriendOperatorTemplate)183*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConstrainedFriendOperatorTemplate) {
184*9356374aSAndroid Build Coastguard Worker   char tmp[100];
185*9356374aSAndroid Build Coastguard Worker 
186*9356374aSAndroid Build Coastguard Worker   // ns::Y<int>::friend operator*(ns::Y<int>) requires true
187*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZN2ns1YIiEFdeES1_QLb1E", tmp, sizeof(tmp)));
188*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "ns::Y<>::friend operator*()");
189*9356374aSAndroid Build Coastguard Worker }
190*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,NonTemplateBuiltinType)191*9356374aSAndroid Build Coastguard Worker TEST(Demangle, NonTemplateBuiltinType) {
192*9356374aSAndroid Build Coastguard Worker   char tmp[100];
193*9356374aSAndroid Build Coastguard Worker 
194*9356374aSAndroid Build Coastguard Worker   // void foo(__my_builtin_type t);
195*9356374aSAndroid Build Coastguard Worker   //
196*9356374aSAndroid Build Coastguard Worker   // foo({});
197*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3foou17__my_builtin_type", tmp, sizeof(tmp)));
198*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo()");
199*9356374aSAndroid Build Coastguard Worker }
200*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SingleArgTemplateBuiltinType)201*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SingleArgTemplateBuiltinType) {
202*9356374aSAndroid Build Coastguard Worker   char tmp[100];
203*9356374aSAndroid Build Coastguard Worker 
204*9356374aSAndroid Build Coastguard Worker   // template <typename T>
205*9356374aSAndroid Build Coastguard Worker   // __my_builtin_type<T> foo();
206*9356374aSAndroid Build Coastguard Worker   //
207*9356374aSAndroid Build Coastguard Worker   // foo<int>();
208*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooIiEu17__my_builtin_typeIT_Ev", tmp, sizeof(tmp)));
209*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
210*9356374aSAndroid Build Coastguard Worker }
211*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TwoArgTemplateBuiltinType)212*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TwoArgTemplateBuiltinType) {
213*9356374aSAndroid Build Coastguard Worker   char tmp[100];
214*9356374aSAndroid Build Coastguard Worker 
215*9356374aSAndroid Build Coastguard Worker   // template <typename T, typename U>
216*9356374aSAndroid Build Coastguard Worker   // __my_builtin_type<T, U> foo();
217*9356374aSAndroid Build Coastguard Worker   //
218*9356374aSAndroid Build Coastguard Worker   // foo<int, char>();
219*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(
220*9356374aSAndroid Build Coastguard Worker       Demangle("_Z3fooIicEu17__my_builtin_typeIT_T0_Ev", tmp, sizeof(tmp)));
221*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
222*9356374aSAndroid Build Coastguard Worker }
223*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TypeNestedUnderTemplatedBuiltinType)224*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TypeNestedUnderTemplatedBuiltinType) {
225*9356374aSAndroid Build Coastguard Worker   char tmp[100];
226*9356374aSAndroid Build Coastguard Worker 
227*9356374aSAndroid Build Coastguard Worker   // Source:
228*9356374aSAndroid Build Coastguard Worker   //
229*9356374aSAndroid Build Coastguard Worker   // template <typename T>
230*9356374aSAndroid Build Coastguard Worker   // typename std::remove_reference_t<T>::type f(T t);
231*9356374aSAndroid Build Coastguard Worker   //
232*9356374aSAndroid Build Coastguard Worker   // struct C { using type = C; };
233*9356374aSAndroid Build Coastguard Worker   //
234*9356374aSAndroid Build Coastguard Worker   // f<const C&>(C{});
235*9356374aSAndroid Build Coastguard Worker   //
236*9356374aSAndroid Build Coastguard Worker   // These days std::remove_reference_t is implemented in terms of a vendor
237*9356374aSAndroid Build Coastguard Worker   // builtin __remove_reference_t.  A full demangling might look like:
238*9356374aSAndroid Build Coastguard Worker   //
239*9356374aSAndroid Build Coastguard Worker   // __remove_reference_t<C const&>::type f<C const&>(C const&)
240*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z1fIRK1CENu20__remove_reference_tIT_E4typeES3_",
241*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
242*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
243*9356374aSAndroid Build Coastguard Worker }
244*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TemplateTemplateParamSubstitution)245*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TemplateTemplateParamSubstitution) {
246*9356374aSAndroid Build Coastguard Worker   char tmp[100];
247*9356374aSAndroid Build Coastguard Worker 
248*9356374aSAndroid Build Coastguard Worker   // template <typename T>
249*9356374aSAndroid Build Coastguard Worker   // concept True = true;
250*9356374aSAndroid Build Coastguard Worker   //
251*9356374aSAndroid Build Coastguard Worker   // template<std::integral T, T> struct Foolable {};
252*9356374aSAndroid Build Coastguard Worker   // template<template<typename T, T> typename> void foo() {}
253*9356374aSAndroid Build Coastguard Worker   //
254*9356374aSAndroid Build Coastguard Worker   // template void foo<Foolable>();
255*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z3fooITtTyTnTL0__E8FoolableEvv", tmp, sizeof(tmp)));
256*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "foo<>()");
257*9356374aSAndroid Build Coastguard Worker }
258*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TemplateParamSubstitutionWithGenericLambda)259*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TemplateParamSubstitutionWithGenericLambda) {
260*9356374aSAndroid Build Coastguard Worker   char tmp[100];
261*9356374aSAndroid Build Coastguard Worker 
262*9356374aSAndroid Build Coastguard Worker   // template <typename>
263*9356374aSAndroid Build Coastguard Worker   // struct Fooer {
264*9356374aSAndroid Build Coastguard Worker   //     template <typename>
265*9356374aSAndroid Build Coastguard Worker   //     void foo(decltype([](auto x, auto y) {})) {}
266*9356374aSAndroid Build Coastguard Worker   // };
267*9356374aSAndroid Build Coastguard Worker   //
268*9356374aSAndroid Build Coastguard Worker   // Fooer<int> f;
269*9356374aSAndroid Build Coastguard Worker   // f.foo<int>({});
270*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(
271*9356374aSAndroid Build Coastguard Worker       Demangle("_ZN5FooerIiE3fooIiEEvNS0_UlTL0__TL0_0_E_E", tmp, sizeof(tmp)));
272*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "Fooer<>::foo<>()");
273*9356374aSAndroid Build Coastguard Worker }
274*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaRequiresTrue)275*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaRequiresTrue) {
276*9356374aSAndroid Build Coastguard Worker   char tmp[100];
277*9356374aSAndroid Build Coastguard Worker 
278*9356374aSAndroid Build Coastguard Worker   // auto $_0::operator()<int>(int) const requires true
279*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QLb1E", tmp, sizeof(tmp)));
280*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "$_0::operator()<>()");
281*9356374aSAndroid Build Coastguard Worker }
282*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaRequiresSimpleExpression)283*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaRequiresSimpleExpression) {
284*9356374aSAndroid Build Coastguard Worker   char tmp[100];
285*9356374aSAndroid Build Coastguard Worker 
286*9356374aSAndroid Build Coastguard Worker   // auto $_0::operator()<int>(int) const requires 2 + 2 == 4
287*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QeqplLi2ELi2ELi4E",
288*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
289*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "$_0::operator()<>()");
290*9356374aSAndroid Build Coastguard Worker }
291*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaRequiresRequiresExpressionContainingTrue)292*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaRequiresRequiresExpressionContainingTrue) {
293*9356374aSAndroid Build Coastguard Worker   char tmp[100];
294*9356374aSAndroid Build Coastguard Worker 
295*9356374aSAndroid Build Coastguard Worker   // auto $_0::operator()<int>(int) const requires requires { true; }
296*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXLb1EE", tmp, sizeof(tmp)));
297*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "$_0::operator()<>()");
298*9356374aSAndroid Build Coastguard Worker }
299*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaRequiresRequiresExpressionContainingConcept)300*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaRequiresRequiresExpressionContainingConcept) {
301*9356374aSAndroid Build Coastguard Worker   char tmp[100];
302*9356374aSAndroid Build Coastguard Worker 
303*9356374aSAndroid Build Coastguard Worker   // auto $_0::operator()<int>(int) const
304*9356374aSAndroid Build Coastguard Worker   // requires requires { std::same_as<decltype(fp), int>; }
305*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXsr3stdE7same_asIDtfp_EiEE",
306*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
307*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "$_0::operator()<>()");
308*9356374aSAndroid Build Coastguard Worker }
309*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaRequiresRequiresExpressionContainingNoexceptExpression)310*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaRequiresRequiresExpressionContainingNoexceptExpression) {
311*9356374aSAndroid Build Coastguard Worker   char tmp[100];
312*9356374aSAndroid Build Coastguard Worker 
313*9356374aSAndroid Build Coastguard Worker   // auto $_0::operator()<int>(int) const
314*9356374aSAndroid Build Coastguard Worker   // requires requires { {fp + fp} noexcept; }
315*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXplfp_fp_NE", tmp, sizeof(tmp)));
316*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "$_0::operator()<>()");
317*9356374aSAndroid Build Coastguard Worker }
318*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaRequiresRequiresExpressionContainingReturnTypeConstraint)319*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaRequiresRequiresExpressionContainingReturnTypeConstraint) {
320*9356374aSAndroid Build Coastguard Worker   char tmp[100];
321*9356374aSAndroid Build Coastguard Worker 
322*9356374aSAndroid Build Coastguard Worker   // auto $_0::operator()<int>(int) const
323*9356374aSAndroid Build Coastguard Worker   // requires requires { {fp + fp} -> std::same_as<decltype(fp)>; }
324*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXplfp_fp_RNSt7same_asIDtfp_EEEE",
325*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
326*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "$_0::operator()<>()");
327*9356374aSAndroid Build Coastguard Worker }
328*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaRequiresRequiresExpressionWithBothNoexceptAndReturnType)329*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaRequiresRequiresExpressionWithBothNoexceptAndReturnType) {
330*9356374aSAndroid Build Coastguard Worker   char tmp[100];
331*9356374aSAndroid Build Coastguard Worker 
332*9356374aSAndroid Build Coastguard Worker   // auto $_0::operator()<int>(int) const
333*9356374aSAndroid Build Coastguard Worker   // requires requires { {fp + fp} noexcept -> std::same_as<decltype(fp)>; }
334*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXplfp_fp_NRNSt7same_asIDtfp_EEEE",
335*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
336*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "$_0::operator()<>()");
337*9356374aSAndroid Build Coastguard Worker }
338*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaRequiresRequiresExpressionContainingType)339*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaRequiresRequiresExpressionContainingType) {
340*9356374aSAndroid Build Coastguard Worker   char tmp[100];
341*9356374aSAndroid Build Coastguard Worker 
342*9356374aSAndroid Build Coastguard Worker   // auto $_0::operator()<S>(S) const
343*9356374aSAndroid Build Coastguard Worker   // requires requires { typename S::T; }
344*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZNK3$_0clI1SEEDaT_QrqTNS2_1TEE", tmp, sizeof(tmp)));
345*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "$_0::operator()<>()");
346*9356374aSAndroid Build Coastguard Worker }
347*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaRequiresRequiresExpressionNestingAnotherRequires)348*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaRequiresRequiresExpressionNestingAnotherRequires) {
349*9356374aSAndroid Build Coastguard Worker   char tmp[100];
350*9356374aSAndroid Build Coastguard Worker 
351*9356374aSAndroid Build Coastguard Worker   // auto $_0::operator()<int>(int) const requires requires { requires true; }
352*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqQLb1EE", tmp, sizeof(tmp)));
353*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "$_0::operator()<>()");
354*9356374aSAndroid Build Coastguard Worker }
355*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaRequiresRequiresExpressionContainingTwoRequirements)356*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaRequiresRequiresExpressionContainingTwoRequirements) {
357*9356374aSAndroid Build Coastguard Worker   char tmp[100];
358*9356374aSAndroid Build Coastguard Worker 
359*9356374aSAndroid Build Coastguard Worker   // auto $_0::operator()<int>(int) const
360*9356374aSAndroid Build Coastguard Worker   // requires requires { requires true; requires 2 + 2 == 4; }
361*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZNK3$_0clIiEEDaT_QrqXLb1EXeqplLi2ELi2ELi4EE",
362*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
363*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "$_0::operator()<>()");
364*9356374aSAndroid Build Coastguard Worker }
365*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,RequiresExpressionWithItsOwnParameter)366*9356374aSAndroid Build Coastguard Worker TEST(Demangle, RequiresExpressionWithItsOwnParameter) {
367*9356374aSAndroid Build Coastguard Worker   char tmp[100];
368*9356374aSAndroid Build Coastguard Worker 
369*9356374aSAndroid Build Coastguard Worker   // S<requires (int) { fp + fp; }> f<int>(int)
370*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_Z1fIiE1SIXrQT__XplfL0p_fp_EEES1_", tmp, sizeof(tmp)));
371*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "f<>()");
372*9356374aSAndroid Build Coastguard Worker }
373*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaWithExplicitTypeArgument)374*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaWithExplicitTypeArgument) {
375*9356374aSAndroid Build Coastguard Worker   char tmp[100];
376*9356374aSAndroid Build Coastguard Worker 
377*9356374aSAndroid Build Coastguard Worker   // Source:
378*9356374aSAndroid Build Coastguard Worker   //
379*9356374aSAndroid Build Coastguard Worker   // template <class T> T f(T t) {
380*9356374aSAndroid Build Coastguard Worker   //   return []<class U>(U u) { return u + u; }(t);
381*9356374aSAndroid Build Coastguard Worker   // }
382*9356374aSAndroid Build Coastguard Worker   //
383*9356374aSAndroid Build Coastguard Worker   // template int f<int>(int);
384*9356374aSAndroid Build Coastguard Worker   //
385*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the lambda call operator:
386*9356374aSAndroid Build Coastguard Worker   //
387*9356374aSAndroid Build Coastguard Worker   // auto int f<int>(int)::'lambda'<typename $T>(int)::
388*9356374aSAndroid Build Coastguard Worker   // operator()<int>(int) const
389*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZZ1fIiET_S0_ENKUlTyS0_E_clIiEEDaS0_",
390*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
391*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "f<>()::{lambda()#1}::operator()<>()");
392*9356374aSAndroid Build Coastguard Worker }
393*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaWithExplicitPackArgument)394*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaWithExplicitPackArgument) {
395*9356374aSAndroid Build Coastguard Worker   char tmp[100];
396*9356374aSAndroid Build Coastguard Worker 
397*9356374aSAndroid Build Coastguard Worker   // Source:
398*9356374aSAndroid Build Coastguard Worker   //
399*9356374aSAndroid Build Coastguard Worker   // template <class T> T h(T t) {
400*9356374aSAndroid Build Coastguard Worker   //   return []<class... U>(U... u) {
401*9356374aSAndroid Build Coastguard Worker   //     return ((u + u) + ... + 0);
402*9356374aSAndroid Build Coastguard Worker   //   }(t);
403*9356374aSAndroid Build Coastguard Worker   // }
404*9356374aSAndroid Build Coastguard Worker   //
405*9356374aSAndroid Build Coastguard Worker   // template int h<int>(int);
406*9356374aSAndroid Build Coastguard Worker   //
407*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the lambda call operator:
408*9356374aSAndroid Build Coastguard Worker   //
409*9356374aSAndroid Build Coastguard Worker   // auto int f<int>(int)::'lambda'<typename ...$T>($T...)::
410*9356374aSAndroid Build Coastguard Worker   // operator()<int>($T...) const
411*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZZ1fIiET_S0_ENKUlTpTyDpT_E_clIJiEEEDaS2_",
412*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
413*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "f<>()::{lambda()#1}::operator()<>()");
414*9356374aSAndroid Build Coastguard Worker }
415*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LambdaInClassMemberDefaultArgument)416*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LambdaInClassMemberDefaultArgument) {
417*9356374aSAndroid Build Coastguard Worker   char tmp[100];
418*9356374aSAndroid Build Coastguard Worker 
419*9356374aSAndroid Build Coastguard Worker   // Source:
420*9356374aSAndroid Build Coastguard Worker   //
421*9356374aSAndroid Build Coastguard Worker   // struct S {
422*9356374aSAndroid Build Coastguard Worker   //   static auto f(void (*g)() = [] {}) { return g; }
423*9356374aSAndroid Build Coastguard Worker   // };
424*9356374aSAndroid Build Coastguard Worker   // void (*p)() = S::f();
425*9356374aSAndroid Build Coastguard Worker   //
426*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the lambda call operator:
427*9356374aSAndroid Build Coastguard Worker   //
428*9356374aSAndroid Build Coastguard Worker   // S::f(void (*)())::'lambda'()::operator()() const
429*9356374aSAndroid Build Coastguard Worker   //
430*9356374aSAndroid Build Coastguard Worker   // Full GNU binutils demangling:
431*9356374aSAndroid Build Coastguard Worker   //
432*9356374aSAndroid Build Coastguard Worker   // S::f(void (*)())::{default arg#1}::{lambda()#1}::operator()() const
433*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd_NKUlvE_clEv", tmp, sizeof(tmp)));
434*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "S::f()::{default arg#1}::{lambda()#1}::operator()()");
435*9356374aSAndroid Build Coastguard Worker 
436*9356374aSAndroid Build Coastguard Worker   // The same but in the second rightmost default argument.
437*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd0_NKUlvE_clEv", tmp, sizeof(tmp)));
438*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "S::f()::{default arg#2}::{lambda()#1}::operator()()");
439*9356374aSAndroid Build Coastguard Worker 
440*9356374aSAndroid Build Coastguard Worker   // Reject negative <(parameter) number> values.
441*9356374aSAndroid Build Coastguard Worker   ASSERT_FALSE(Demangle("_ZZN1S1fEPFvvEEdn1_NKUlvE_clEv", tmp, sizeof(tmp)));
442*9356374aSAndroid Build Coastguard Worker }
443*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,AvoidSignedOverflowForUnfortunateParameterNumbers)444*9356374aSAndroid Build Coastguard Worker TEST(Demangle, AvoidSignedOverflowForUnfortunateParameterNumbers) {
445*9356374aSAndroid Build Coastguard Worker   char tmp[100];
446*9356374aSAndroid Build Coastguard Worker 
447*9356374aSAndroid Build Coastguard Worker   // Here <number> + 2 fits in an int, but just barely.  (We expect no such
448*9356374aSAndroid Build Coastguard Worker   // input in practice: real functions don't have billions of arguments.)
449*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd2147483645_NKUlvE_clEv",
450*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
451*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp,
452*9356374aSAndroid Build Coastguard Worker                "S::f()::{default arg#2147483647}::{lambda()#1}::operator()()");
453*9356374aSAndroid Build Coastguard Worker 
454*9356374aSAndroid Build Coastguard Worker   // Now <number> is an int, but <number> + 2 is not.
455*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd2147483646_NKUlvE_clEv",
456*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
457*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "S::f()::{default arg#1}::{lambda()#1}::operator()()");
458*9356374aSAndroid Build Coastguard Worker 
459*9356374aSAndroid Build Coastguard Worker   // <number> is the largest int.
460*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd2147483647_NKUlvE_clEv",
461*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
462*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "S::f()::{default arg#1}::{lambda()#1}::operator()()");
463*9356374aSAndroid Build Coastguard Worker 
464*9356374aSAndroid Build Coastguard Worker   // <number> itself does not fit into an int.  ParseNumber truncates the value
465*9356374aSAndroid Build Coastguard Worker   // to int, yielding a large negative number, which we strain out.
466*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZZN1S1fEPFvvEEd2147483648_NKUlvE_clEv",
467*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
468*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "S::f()::{default arg#1}::{lambda()#1}::operator()()");
469*9356374aSAndroid Build Coastguard Worker }
470*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SubstpackNotationForTroublesomeTemplatePack)471*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SubstpackNotationForTroublesomeTemplatePack) {
472*9356374aSAndroid Build Coastguard Worker   char tmp[100];
473*9356374aSAndroid Build Coastguard Worker 
474*9356374aSAndroid Build Coastguard Worker   // Source:
475*9356374aSAndroid Build Coastguard Worker   //
476*9356374aSAndroid Build Coastguard Worker   // template <template <class> class, template <class> class> struct B {};
477*9356374aSAndroid Build Coastguard Worker   //
478*9356374aSAndroid Build Coastguard Worker   // template <template <class> class... T> struct A {
479*9356374aSAndroid Build Coastguard Worker   //   template <template <class> class... U> void f(B<T, U>&&...) {}
480*9356374aSAndroid Build Coastguard Worker   // };
481*9356374aSAndroid Build Coastguard Worker   //
482*9356374aSAndroid Build Coastguard Worker   // template void A<>::f<>();
483*9356374aSAndroid Build Coastguard Worker   //
484*9356374aSAndroid Build Coastguard Worker   // LLVM can't demangle its own _SUBSTPACK_ notation.
485*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZN1AIJEE1fIJEEEvDpO1BI_SUBSTPACK_T_E",
486*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
487*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "A<>::f<>()");
488*9356374aSAndroid Build Coastguard Worker }
489*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TemplateTemplateParamAppearingAsBackrefFollowedByTemplateArgs)490*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TemplateTemplateParamAppearingAsBackrefFollowedByTemplateArgs) {
491*9356374aSAndroid Build Coastguard Worker   char tmp[100];
492*9356374aSAndroid Build Coastguard Worker 
493*9356374aSAndroid Build Coastguard Worker   // Source:
494*9356374aSAndroid Build Coastguard Worker   //
495*9356374aSAndroid Build Coastguard Worker   // template <template <class> class C> struct W {
496*9356374aSAndroid Build Coastguard Worker   //   template <class T> static decltype(C<T>::m()) f() { return {}; }
497*9356374aSAndroid Build Coastguard Worker   // };
498*9356374aSAndroid Build Coastguard Worker   //
499*9356374aSAndroid Build Coastguard Worker   // template <class T> struct S { static int m() { return 0; } };
500*9356374aSAndroid Build Coastguard Worker   // template decltype(S<int>::m()) W<S>::f<int>();
501*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(Demangle("_ZN1WI1SE1fIiEEDTclsrS0_IT_EE1mEEv", tmp, sizeof(tmp)));
502*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ(tmp, "W<>::f<>()");
503*9356374aSAndroid Build Coastguard Worker }
504*9356374aSAndroid Build Coastguard Worker 
505*9356374aSAndroid Build Coastguard Worker // Test corner cases of boundary conditions.
TEST(Demangle,CornerCases)506*9356374aSAndroid Build Coastguard Worker TEST(Demangle, CornerCases) {
507*9356374aSAndroid Build Coastguard Worker   char tmp[10];
508*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z6foobarv", tmp, sizeof(tmp)));
509*9356374aSAndroid Build Coastguard Worker   // sizeof("foobar()") == 9
510*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("foobar()", tmp);
511*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z6foobarv", tmp, 9));
512*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("foobar()", tmp);
513*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(Demangle("_Z6foobarv", tmp, 8));  // Not enough.
514*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(Demangle("_Z6foobarv", tmp, 1));
515*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(Demangle("_Z6foobarv", tmp, 0));
516*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(Demangle("_Z6foobarv", nullptr, 0));  // Should not cause SEGV.
517*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(Demangle("_Z1000000", tmp, 9));
518*9356374aSAndroid Build Coastguard Worker }
519*9356374aSAndroid Build Coastguard Worker 
520*9356374aSAndroid Build Coastguard Worker // Test handling of functions suffixed with .clone.N, which is used
521*9356374aSAndroid Build Coastguard Worker // by GCC 4.5.x (and our locally-modified version of GCC 4.4.x), and
522*9356374aSAndroid Build Coastguard Worker // .constprop.N and .isra.N, which are used by GCC 4.6.x.  These
523*9356374aSAndroid Build Coastguard Worker // suffixes are used to indicate functions which have been cloned
524*9356374aSAndroid Build Coastguard Worker // during optimization.  We ignore these suffixes.
TEST(Demangle,Clones)525*9356374aSAndroid Build Coastguard Worker TEST(Demangle, Clones) {
526*9356374aSAndroid Build Coastguard Worker   char tmp[20];
527*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov", tmp, sizeof(tmp)));
528*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
529*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.clone.3", tmp, sizeof(tmp)));
530*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
531*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.constprop.80", tmp, sizeof(tmp)));
532*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
533*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.isra.18", tmp, sizeof(tmp)));
534*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
535*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.isra.2.constprop.18", tmp, sizeof(tmp)));
536*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
537*9356374aSAndroid Build Coastguard Worker   // Demangle suffixes produced by -funique-internal-linkage-names.
538*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.__uniq.12345", tmp, sizeof(tmp)));
539*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
540*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.__uniq.12345.isra.2.constprop.18", tmp,
541*9356374aSAndroid Build Coastguard Worker                        sizeof(tmp)));
542*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
543*9356374aSAndroid Build Coastguard Worker   // Suffixes without the number should also demangle.
544*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.clo", tmp, sizeof(tmp)));
545*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
546*9356374aSAndroid Build Coastguard Worker   // Suffixes with just the number should also demangle.
547*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.123", tmp, sizeof(tmp)));
548*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
549*9356374aSAndroid Build Coastguard Worker   // (.clone. followed by non-number), should also demangle.
550*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.clone.foo", tmp, sizeof(tmp)));
551*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
552*9356374aSAndroid Build Coastguard Worker   // (.clone. followed by multiple numbers), should also demangle.
553*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.clone.123.456", tmp, sizeof(tmp)));
554*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
555*9356374aSAndroid Build Coastguard Worker   // (a long valid suffix), should demangle.
556*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZL3Foov.part.9.165493.constprop.775.31805", tmp,
557*9356374aSAndroid Build Coastguard Worker                        sizeof(tmp)));
558*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("Foo()", tmp);
559*9356374aSAndroid Build Coastguard Worker   // Invalid (. without anything else), should not demangle.
560*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(Demangle("_ZL3Foov.", tmp, sizeof(tmp)));
561*9356374aSAndroid Build Coastguard Worker   // Invalid (. with mix of alpha and digits), should not demangle.
562*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(Demangle("_ZL3Foov.abc123", tmp, sizeof(tmp)));
563*9356374aSAndroid Build Coastguard Worker   // Invalid (.clone. not followed by number), should not demangle.
564*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(Demangle("_ZL3Foov.clone.", tmp, sizeof(tmp)));
565*9356374aSAndroid Build Coastguard Worker   // Invalid (.constprop. not followed by number), should not demangle.
566*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(Demangle("_ZL3Foov.isra.2.constprop.", tmp, sizeof(tmp)));
567*9356374aSAndroid Build Coastguard Worker }
568*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,Discriminators)569*9356374aSAndroid Build Coastguard Worker TEST(Demangle, Discriminators) {
570*9356374aSAndroid Build Coastguard Worker   char tmp[80];
571*9356374aSAndroid Build Coastguard Worker 
572*9356374aSAndroid Build Coastguard Worker   // Source:
573*9356374aSAndroid Build Coastguard Worker   //
574*9356374aSAndroid Build Coastguard Worker   // using Thunk = void (*)();
575*9356374aSAndroid Build Coastguard Worker   //
576*9356374aSAndroid Build Coastguard Worker   // Thunk* f() {
577*9356374aSAndroid Build Coastguard Worker   //   static Thunk thunks[12] = {};
578*9356374aSAndroid Build Coastguard Worker   //
579*9356374aSAndroid Build Coastguard Worker   // #define THUNK(i) [backslash here]
580*9356374aSAndroid Build Coastguard Worker   //   do { struct S { static void g() {} }; thunks[i] = &S::g; } while (0)
581*9356374aSAndroid Build Coastguard Worker   //
582*9356374aSAndroid Build Coastguard Worker   //   THUNK(0);
583*9356374aSAndroid Build Coastguard Worker   //   [... repeat for 1 to 10 ...]
584*9356374aSAndroid Build Coastguard Worker   //   THUNK(11);
585*9356374aSAndroid Build Coastguard Worker   //
586*9356374aSAndroid Build Coastguard Worker   //   return thunks;
587*9356374aSAndroid Build Coastguard Worker   // }
588*9356374aSAndroid Build Coastguard Worker   //
589*9356374aSAndroid Build Coastguard Worker   // The test inputs are manglings of some of the S::g member functions.
590*9356374aSAndroid Build Coastguard Worker 
591*9356374aSAndroid Build Coastguard Worker   // The first one omits the discriminator.
592*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZZ1fvEN1S1gEv", tmp, sizeof(tmp)));
593*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()::S::g()", tmp);
594*9356374aSAndroid Build Coastguard Worker 
595*9356374aSAndroid Build Coastguard Worker   // The second one encodes 0.
596*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZZ1fvEN1S1gE_0v", tmp, sizeof(tmp)));
597*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()::S::g()", tmp);
598*9356374aSAndroid Build Coastguard Worker 
599*9356374aSAndroid Build Coastguard Worker   // The eleventh one encodes 9.
600*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZZ1fvEN1S1gE_9v", tmp, sizeof(tmp)));
601*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()::S::g()", tmp);
602*9356374aSAndroid Build Coastguard Worker 
603*9356374aSAndroid Build Coastguard Worker   // The twelfth one encodes 10 with extra underscores delimiting it.
604*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZZ1fvEN1S1gE__10_v", tmp, sizeof(tmp)));
605*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()::S::g()", tmp);
606*9356374aSAndroid Build Coastguard Worker }
607*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SingleDigitDiscriminatorFollowedByADigit)608*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SingleDigitDiscriminatorFollowedByADigit) {
609*9356374aSAndroid Build Coastguard Worker   char tmp[80];
610*9356374aSAndroid Build Coastguard Worker 
611*9356374aSAndroid Build Coastguard Worker   // Don't parse 911 as a number.
612*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZZ1fvEN1S1gE_911return_type", tmp, sizeof(tmp)));
613*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()::S::g()", tmp);
614*9356374aSAndroid Build Coastguard Worker }
615*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,LiteralOfGlobalNamespaceEnumType)616*9356374aSAndroid Build Coastguard Worker TEST(Demangle, LiteralOfGlobalNamespaceEnumType) {
617*9356374aSAndroid Build Coastguard Worker   char tmp[80];
618*9356374aSAndroid Build Coastguard Worker 
619*9356374aSAndroid Build Coastguard Worker   // void f<(E)42>()
620*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIL1E42EEvv", tmp, sizeof(tmp)));
621*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
622*9356374aSAndroid Build Coastguard Worker }
623*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,NullptrLiterals)624*9356374aSAndroid Build Coastguard Worker TEST(Demangle, NullptrLiterals) {
625*9356374aSAndroid Build Coastguard Worker   char tmp[80];
626*9356374aSAndroid Build Coastguard Worker 
627*9356374aSAndroid Build Coastguard Worker   // void f<nullptr>()
628*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fILDnEEvv", tmp, sizeof(tmp)));
629*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
630*9356374aSAndroid Build Coastguard Worker 
631*9356374aSAndroid Build Coastguard Worker   // also void f<nullptr>()
632*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fILDn0EEvv", tmp, sizeof(tmp)));
633*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
634*9356374aSAndroid Build Coastguard Worker }
635*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,StringLiterals)636*9356374aSAndroid Build Coastguard Worker TEST(Demangle, StringLiterals) {
637*9356374aSAndroid Build Coastguard Worker   char tmp[80];
638*9356374aSAndroid Build Coastguard Worker 
639*9356374aSAndroid Build Coastguard Worker   // void f<"<char const [42]>">()
640*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fILA42_KcEEvv", tmp, sizeof(tmp)));
641*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
642*9356374aSAndroid Build Coastguard Worker }
643*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ComplexFloatingPointLiterals)644*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ComplexFloatingPointLiterals) {
645*9356374aSAndroid Build Coastguard Worker   char tmp[80];
646*9356374aSAndroid Build Coastguard Worker 
647*9356374aSAndroid Build Coastguard Worker   // Source (use g++ -fext-numeric-literals to compile):
648*9356374aSAndroid Build Coastguard Worker   //
649*9356374aSAndroid Build Coastguard Worker   // using C = double _Complex;
650*9356374aSAndroid Build Coastguard Worker   // template <class T> void f(char (&)[sizeof(C{sizeof(T)} + 4.0j)]) {}
651*9356374aSAndroid Build Coastguard Worker   // template void f<int>(char (&)[sizeof(C{sizeof(int)} + 4.0j)]);
652*9356374aSAndroid Build Coastguard Worker   //
653*9356374aSAndroid Build Coastguard Worker   // GNU demangling:
654*9356374aSAndroid Build Coastguard Worker   //
655*9356374aSAndroid Build Coastguard Worker   // void f<int>(char (&) [sizeof (double _Complex{sizeof (int)}+
656*9356374aSAndroid Build Coastguard Worker   // ((double _Complex)0000000000000000_4010000000000000))])
657*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle(
658*9356374aSAndroid Build Coastguard Worker       "_Z1fIiEvRAszpltlCdstT_ELS0_0000000000000000_4010000000000000E_c",
659*9356374aSAndroid Build Coastguard Worker       tmp, sizeof(tmp)));
660*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
661*9356374aSAndroid Build Coastguard Worker }
662*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,Float128)663*9356374aSAndroid Build Coastguard Worker TEST(Demangle, Float128) {
664*9356374aSAndroid Build Coastguard Worker   char tmp[80];
665*9356374aSAndroid Build Coastguard Worker 
666*9356374aSAndroid Build Coastguard Worker   // S::operator _Float128() const
667*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvDF128_Ev", tmp, sizeof(tmp)));
668*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator _Float128()", tmp);
669*9356374aSAndroid Build Coastguard Worker }
670*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,Float128x)671*9356374aSAndroid Build Coastguard Worker TEST(Demangle, Float128x) {
672*9356374aSAndroid Build Coastguard Worker   char tmp[80];
673*9356374aSAndroid Build Coastguard Worker 
674*9356374aSAndroid Build Coastguard Worker   // S::operator _Float128x() const
675*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvDF128xEv", tmp, sizeof(tmp)));
676*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator _Float128x()", tmp);
677*9356374aSAndroid Build Coastguard Worker }
678*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,Bfloat16)679*9356374aSAndroid Build Coastguard Worker TEST(Demangle, Bfloat16) {
680*9356374aSAndroid Build Coastguard Worker   char tmp[80];
681*9356374aSAndroid Build Coastguard Worker 
682*9356374aSAndroid Build Coastguard Worker   // S::operator std::bfloat16_t() const
683*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvDF16bEv", tmp, sizeof(tmp)));
684*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator std::bfloat16_t()", tmp);
685*9356374aSAndroid Build Coastguard Worker }
686*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SimpleSignedBitInt)687*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SimpleSignedBitInt) {
688*9356374aSAndroid Build Coastguard Worker   char tmp[80];
689*9356374aSAndroid Build Coastguard Worker 
690*9356374aSAndroid Build Coastguard Worker   // S::operator _BitInt(256)() const
691*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvDB256_Ev", tmp, sizeof(tmp)));
692*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator _BitInt(256)()", tmp);
693*9356374aSAndroid Build Coastguard Worker }
694*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SimpleUnsignedBitInt)695*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SimpleUnsignedBitInt) {
696*9356374aSAndroid Build Coastguard Worker   char tmp[80];
697*9356374aSAndroid Build Coastguard Worker 
698*9356374aSAndroid Build Coastguard Worker   // S::operator unsigned _BitInt(256)() const
699*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvDU256_Ev", tmp, sizeof(tmp)));
700*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator unsigned _BitInt(256)()", tmp);
701*9356374aSAndroid Build Coastguard Worker }
702*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,DependentBitInt)703*9356374aSAndroid Build Coastguard Worker TEST(Demangle, DependentBitInt) {
704*9356374aSAndroid Build Coastguard Worker   char tmp[80];
705*9356374aSAndroid Build Coastguard Worker 
706*9356374aSAndroid Build Coastguard Worker   // S::operator _BitInt(256)<256>() const
707*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvDBT__ILi256EEEv", tmp, sizeof(tmp)));
708*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator _BitInt(?)<>()", tmp);
709*9356374aSAndroid Build Coastguard Worker }
710*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConversionToPointerType)711*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConversionToPointerType) {
712*9356374aSAndroid Build Coastguard Worker   char tmp[80];
713*9356374aSAndroid Build Coastguard Worker 
714*9356374aSAndroid Build Coastguard Worker   // S::operator int*() const
715*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvPiEv", tmp, sizeof(tmp)));
716*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator int*()", tmp);
717*9356374aSAndroid Build Coastguard Worker }
718*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConversionToLvalueReferenceType)719*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConversionToLvalueReferenceType) {
720*9356374aSAndroid Build Coastguard Worker   char tmp[80];
721*9356374aSAndroid Build Coastguard Worker 
722*9356374aSAndroid Build Coastguard Worker   // S::operator int&() const
723*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvRiEv", tmp, sizeof(tmp)));
724*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator int&()", tmp);
725*9356374aSAndroid Build Coastguard Worker }
726*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConversionToRvalueReferenceType)727*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConversionToRvalueReferenceType) {
728*9356374aSAndroid Build Coastguard Worker   char tmp[80];
729*9356374aSAndroid Build Coastguard Worker 
730*9356374aSAndroid Build Coastguard Worker   // S::operator int&&() const
731*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvOiEv", tmp, sizeof(tmp)));
732*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator int&&()", tmp);
733*9356374aSAndroid Build Coastguard Worker }
734*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConversionToComplexFloatingPointType)735*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConversionToComplexFloatingPointType) {
736*9356374aSAndroid Build Coastguard Worker   char tmp[80];
737*9356374aSAndroid Build Coastguard Worker 
738*9356374aSAndroid Build Coastguard Worker   // S::operator float _Complex() const
739*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvCfEv", tmp, sizeof(tmp)));
740*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator float _Complex()", tmp);
741*9356374aSAndroid Build Coastguard Worker }
742*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConversionToImaginaryFloatingPointType)743*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConversionToImaginaryFloatingPointType) {
744*9356374aSAndroid Build Coastguard Worker   char tmp[80];
745*9356374aSAndroid Build Coastguard Worker 
746*9356374aSAndroid Build Coastguard Worker   // S::operator float _Imaginary() const
747*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvGfEv", tmp, sizeof(tmp)));
748*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator float _Imaginary()", tmp);
749*9356374aSAndroid Build Coastguard Worker }
750*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConversionToPointerToCvQualifiedType)751*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConversionToPointerToCvQualifiedType) {
752*9356374aSAndroid Build Coastguard Worker   char tmp[80];
753*9356374aSAndroid Build Coastguard Worker 
754*9356374aSAndroid Build Coastguard Worker   // S::operator int const volatile restrict*() const
755*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvPrVKiEv", tmp, sizeof(tmp)));
756*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator int const volatile restrict*()", tmp);
757*9356374aSAndroid Build Coastguard Worker }
758*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConversionToLayeredPointerType)759*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConversionToLayeredPointerType) {
760*9356374aSAndroid Build Coastguard Worker   char tmp[80];
761*9356374aSAndroid Build Coastguard Worker 
762*9356374aSAndroid Build Coastguard Worker   // S::operator int const* const*() const
763*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvPKPKiEv", tmp, sizeof(tmp)));
764*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator int const* const*()", tmp);
765*9356374aSAndroid Build Coastguard Worker }
766*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConversionToTypeWithExtendedQualifier)767*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConversionToTypeWithExtendedQualifier) {
768*9356374aSAndroid Build Coastguard Worker   char tmp[80];
769*9356374aSAndroid Build Coastguard Worker 
770*9356374aSAndroid Build Coastguard Worker   // S::operator int const AS128*() const
771*9356374aSAndroid Build Coastguard Worker   //
772*9356374aSAndroid Build Coastguard Worker   // Because our scan of easy type constructors stops at the extended qualifier,
773*9356374aSAndroid Build Coastguard Worker   // the demangling preserves the * but loses the const.
774*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1ScvPU5AS128KiEv", tmp, sizeof(tmp)));
775*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator int*()", tmp);
776*9356374aSAndroid Build Coastguard Worker }
777*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,GlobalInitializers)778*9356374aSAndroid Build Coastguard Worker TEST(Demangle, GlobalInitializers) {
779*9356374aSAndroid Build Coastguard Worker   char tmp[80];
780*9356374aSAndroid Build Coastguard Worker 
781*9356374aSAndroid Build Coastguard Worker   // old form without suffix
782*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZGR1v", tmp, sizeof(tmp)));
783*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("reference temporary for v", tmp);
784*9356374aSAndroid Build Coastguard Worker 
785*9356374aSAndroid Build Coastguard Worker   // modern form for the whole initializer
786*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZGR1v_", tmp, sizeof(tmp)));
787*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("reference temporary for v", tmp);
788*9356374aSAndroid Build Coastguard Worker 
789*9356374aSAndroid Build Coastguard Worker   // next subobject in depth-first preorder traversal
790*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZGR1v0_", tmp, sizeof(tmp)));
791*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("reference temporary for v", tmp);
792*9356374aSAndroid Build Coastguard Worker 
793*9356374aSAndroid Build Coastguard Worker   // subobject with a larger seq-id
794*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZGR1v1Z_", tmp, sizeof(tmp)));
795*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("reference temporary for v", tmp);
796*9356374aSAndroid Build Coastguard Worker }
797*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,StructuredBindings)798*9356374aSAndroid Build Coastguard Worker TEST(Demangle, StructuredBindings) {
799*9356374aSAndroid Build Coastguard Worker   char tmp[80];
800*9356374aSAndroid Build Coastguard Worker 
801*9356374aSAndroid Build Coastguard Worker   // Source:
802*9356374aSAndroid Build Coastguard Worker   //
803*9356374aSAndroid Build Coastguard Worker   // struct S { int a, b; };
804*9356374aSAndroid Build Coastguard Worker   // const auto& [x, y] = S{1, 2};
805*9356374aSAndroid Build Coastguard Worker 
806*9356374aSAndroid Build Coastguard Worker   // [x, y]
807*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZDC1x1yE", tmp, sizeof(tmp)));
808*9356374aSAndroid Build Coastguard Worker 
809*9356374aSAndroid Build Coastguard Worker   // reference temporary for [x, y]
810*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZGRDC1x1yE_", tmp, sizeof(tmp)));
811*9356374aSAndroid Build Coastguard Worker }
812*9356374aSAndroid Build Coastguard Worker 
813*9356374aSAndroid Build Coastguard Worker // Test the GNU abi_tag extension.
TEST(Demangle,AbiTags)814*9356374aSAndroid Build Coastguard Worker TEST(Demangle, AbiTags) {
815*9356374aSAndroid Build Coastguard Worker   char tmp[80];
816*9356374aSAndroid Build Coastguard Worker 
817*9356374aSAndroid Build Coastguard Worker   // Mangled name generated via:
818*9356374aSAndroid Build Coastguard Worker   // struct [[gnu::abi_tag("abc")]] A{};
819*9356374aSAndroid Build Coastguard Worker   // A a;
820*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1aB3abc", tmp, sizeof(tmp)));
821*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("a[abi:abc]", tmp);
822*9356374aSAndroid Build Coastguard Worker 
823*9356374aSAndroid Build Coastguard Worker   // Mangled name generated via:
824*9356374aSAndroid Build Coastguard Worker   // struct B {
825*9356374aSAndroid Build Coastguard Worker   //   B [[gnu::abi_tag("xyz")]] (){};
826*9356374aSAndroid Build Coastguard Worker   // };
827*9356374aSAndroid Build Coastguard Worker   // B b;
828*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZN1BC2B3xyzEv", tmp, sizeof(tmp)));
829*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("B::B[abi:xyz]()", tmp);
830*9356374aSAndroid Build Coastguard Worker 
831*9356374aSAndroid Build Coastguard Worker   // Mangled name generated via:
832*9356374aSAndroid Build Coastguard Worker   // [[gnu::abi_tag("foo", "bar")]] void C() {}
833*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1CB3barB3foov", tmp, sizeof(tmp)));
834*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("C[abi:bar][abi:foo]()", tmp);
835*9356374aSAndroid Build Coastguard Worker }
836*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SimpleGnuVectorSize)837*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SimpleGnuVectorSize) {
838*9356374aSAndroid Build Coastguard Worker   char tmp[80];
839*9356374aSAndroid Build Coastguard Worker 
840*9356374aSAndroid Build Coastguard Worker   // Source:
841*9356374aSAndroid Build Coastguard Worker   //
842*9356374aSAndroid Build Coastguard Worker   // #define VECTOR(size) __attribute__((vector_size(size)))
843*9356374aSAndroid Build Coastguard Worker   // void f(int x VECTOR(32)) {}
844*9356374aSAndroid Build Coastguard Worker   //
845*9356374aSAndroid Build Coastguard Worker   // The attribute's size is a number of bytes.  The compiler verifies that this
846*9356374aSAndroid Build Coastguard Worker   // value corresponds to a whole number of elements and emits the number of
847*9356374aSAndroid Build Coastguard Worker   // elements as a <number> in the mangling.  With sizeof(int) == 4, that yields
848*9356374aSAndroid Build Coastguard Worker   // 32/4 = 8.
849*9356374aSAndroid Build Coastguard Worker   //
850*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
851*9356374aSAndroid Build Coastguard Worker   //
852*9356374aSAndroid Build Coastguard Worker   // f(int vector[8])
853*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fDv8_i", tmp, sizeof(tmp)));
854*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()", tmp);
855*9356374aSAndroid Build Coastguard Worker }
856*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,GnuVectorSizeIsATemplateParameter)857*9356374aSAndroid Build Coastguard Worker TEST(Demangle, GnuVectorSizeIsATemplateParameter) {
858*9356374aSAndroid Build Coastguard Worker   char tmp[80];
859*9356374aSAndroid Build Coastguard Worker 
860*9356374aSAndroid Build Coastguard Worker   // Source:
861*9356374aSAndroid Build Coastguard Worker   //
862*9356374aSAndroid Build Coastguard Worker   // #define VECTOR(size) __attribute__((vector_size(size)))
863*9356374aSAndroid Build Coastguard Worker   // template <int n> void f(int x VECTOR(n)) {}
864*9356374aSAndroid Build Coastguard Worker   // template void f<32>(int x VECTOR(32));
865*9356374aSAndroid Build Coastguard Worker   //
866*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
867*9356374aSAndroid Build Coastguard Worker   //
868*9356374aSAndroid Build Coastguard Worker   // void f<32>(int vector[32])
869*9356374aSAndroid Build Coastguard Worker   //
870*9356374aSAndroid Build Coastguard Worker   // Because the size was dependent on a template parameter, it was encoded
871*9356374aSAndroid Build Coastguard Worker   // using the general expression encoding.  Nothing in the mangling says how
872*9356374aSAndroid Build Coastguard Worker   // big the element type is, so the demangler is unable to show the element
873*9356374aSAndroid Build Coastguard Worker   // count 8 instead of the byte count 32.  Arguably it would have been better
874*9356374aSAndroid Build Coastguard Worker   // to make the narrow production encode the byte count, so that nondependent
875*9356374aSAndroid Build Coastguard Worker   // and dependent versions of a 32-byte vector would both come out as
876*9356374aSAndroid Build Coastguard Worker   // vector[32].
877*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fILi32EEvDvT__i", tmp, sizeof(tmp)));
878*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
879*9356374aSAndroid Build Coastguard Worker }
880*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,GnuVectorSizeIsADependentOperatorExpression)881*9356374aSAndroid Build Coastguard Worker TEST(Demangle, GnuVectorSizeIsADependentOperatorExpression) {
882*9356374aSAndroid Build Coastguard Worker   char tmp[80];
883*9356374aSAndroid Build Coastguard Worker 
884*9356374aSAndroid Build Coastguard Worker   // Source:
885*9356374aSAndroid Build Coastguard Worker   //
886*9356374aSAndroid Build Coastguard Worker   // #define VECTOR(size) __attribute__((vector_size(size)))
887*9356374aSAndroid Build Coastguard Worker   // template <int n> void f(int x VECTOR(2 * n)) {}
888*9356374aSAndroid Build Coastguard Worker   // template void f<32>(int x VECTOR(2 * 32));
889*9356374aSAndroid Build Coastguard Worker   //
890*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
891*9356374aSAndroid Build Coastguard Worker   //
892*9356374aSAndroid Build Coastguard Worker   // void f<32>(int vector[2 * 32])
893*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fILi32EEvDvmlLi2ET__i", tmp, sizeof(tmp)));
894*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
895*9356374aSAndroid Build Coastguard Worker }
896*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SimpleAddressSpace)897*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SimpleAddressSpace) {
898*9356374aSAndroid Build Coastguard Worker   char tmp[80];
899*9356374aSAndroid Build Coastguard Worker 
900*9356374aSAndroid Build Coastguard Worker   // Source:
901*9356374aSAndroid Build Coastguard Worker   //
902*9356374aSAndroid Build Coastguard Worker   // void f(const int __attribute__((address_space(128)))*) {}
903*9356374aSAndroid Build Coastguard Worker   //
904*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
905*9356374aSAndroid Build Coastguard Worker   //
906*9356374aSAndroid Build Coastguard Worker   // f(int const AS128*)
907*9356374aSAndroid Build Coastguard Worker   //
908*9356374aSAndroid Build Coastguard Worker   // Itanium ABI 5.1.5.1, "Qualified types", notes that address_space is mangled
909*9356374aSAndroid Build Coastguard Worker   // nonuniformly as a legacy exception: the number is part of the source-name
910*9356374aSAndroid Build Coastguard Worker   // if nondependent but is an expression in template-args if dependent.  Thus
911*9356374aSAndroid Build Coastguard Worker   // it is a convenient test case for both forms.
912*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fPU5AS128Ki", tmp, sizeof(tmp)));
913*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()", tmp);
914*9356374aSAndroid Build Coastguard Worker }
915*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,DependentAddressSpace)916*9356374aSAndroid Build Coastguard Worker TEST(Demangle, DependentAddressSpace) {
917*9356374aSAndroid Build Coastguard Worker   char tmp[80];
918*9356374aSAndroid Build Coastguard Worker 
919*9356374aSAndroid Build Coastguard Worker   // Source:
920*9356374aSAndroid Build Coastguard Worker   //
921*9356374aSAndroid Build Coastguard Worker   // template <int n> void f (const int __attribute__((address_space(n)))*) {}
922*9356374aSAndroid Build Coastguard Worker   // template void f<128>(const int __attribute__((address_space(128)))*);
923*9356374aSAndroid Build Coastguard Worker   //
924*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
925*9356374aSAndroid Build Coastguard Worker   //
926*9356374aSAndroid Build Coastguard Worker   // void f<128>(int AS<128>*)
927*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fILi128EEvPU2ASIT_Ei", tmp, sizeof(tmp)));
928*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
929*9356374aSAndroid Build Coastguard Worker }
930*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TransactionSafeEntryPoint)931*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TransactionSafeEntryPoint) {
932*9356374aSAndroid Build Coastguard Worker   char tmp[80];
933*9356374aSAndroid Build Coastguard Worker 
934*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZGTt1fv", tmp, sizeof(tmp)));
935*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("transaction clone for f()", tmp);
936*9356374aSAndroid Build Coastguard Worker }
937*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TransactionSafeFunctionType)938*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TransactionSafeFunctionType) {
939*9356374aSAndroid Build Coastguard Worker   char tmp[80];
940*9356374aSAndroid Build Coastguard Worker 
941*9356374aSAndroid Build Coastguard Worker   // GNU demangling: f(void (*)() transaction_safe)
942*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fPDxFvvE", tmp, sizeof(tmp)));
943*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()", tmp);
944*9356374aSAndroid Build Coastguard Worker }
945*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TemplateParameterObject)946*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TemplateParameterObject) {
947*9356374aSAndroid Build Coastguard Worker   char tmp[80];
948*9356374aSAndroid Build Coastguard Worker 
949*9356374aSAndroid Build Coastguard Worker   // Source:
950*9356374aSAndroid Build Coastguard Worker   //
951*9356374aSAndroid Build Coastguard Worker   // struct S { int x, y; };
952*9356374aSAndroid Build Coastguard Worker   // template <S s, const S* p = &s> void f() {}
953*9356374aSAndroid Build Coastguard Worker   // template void f<S{1, 2}>();
954*9356374aSAndroid Build Coastguard Worker   //
955*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
956*9356374aSAndroid Build Coastguard Worker   //
957*9356374aSAndroid Build Coastguard Worker   // void f<S{1, 2}, &template parameter object for S{1, 2}>()
958*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIXtl1SLi1ELi2EEEXadL_ZTAXtlS0_Li1ELi2EEEEEEvv",
959*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
960*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
961*9356374aSAndroid Build Coastguard Worker 
962*9356374aSAndroid Build Coastguard Worker   // The name of the object standing alone.
963*9356374aSAndroid Build Coastguard Worker   //
964*9356374aSAndroid Build Coastguard Worker   // LLVM demangling: template parameter object for S{1, 2}
965*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZTAXtl1SLi1ELi2EEE", tmp, sizeof(tmp)));
966*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("template parameter object", tmp);
967*9356374aSAndroid Build Coastguard Worker }
968*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,EnableIfAttributeOnGlobalFunction)969*9356374aSAndroid Build Coastguard Worker TEST(Demangle, EnableIfAttributeOnGlobalFunction) {
970*9356374aSAndroid Build Coastguard Worker   char tmp[80];
971*9356374aSAndroid Build Coastguard Worker 
972*9356374aSAndroid Build Coastguard Worker   // int f(long l) __attribute__((enable_if(l >= 0, ""))) { return l; }
973*9356374aSAndroid Build Coastguard Worker   //
974*9356374aSAndroid Build Coastguard Worker   // f(long) [enable_if:fp >= 0]
975*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fUa9enable_ifIXgefL0p_Li0EEEl", tmp, sizeof(tmp)));
976*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()", tmp);
977*9356374aSAndroid Build Coastguard Worker }
978*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,EnableIfAttributeOnNamespaceScopeFunction)979*9356374aSAndroid Build Coastguard Worker TEST(Demangle, EnableIfAttributeOnNamespaceScopeFunction) {
980*9356374aSAndroid Build Coastguard Worker   char tmp[80];
981*9356374aSAndroid Build Coastguard Worker 
982*9356374aSAndroid Build Coastguard Worker   // namespace ns {
983*9356374aSAndroid Build Coastguard Worker   // int f(long l) __attribute__((enable_if(l >= 0, ""))) { return l; }
984*9356374aSAndroid Build Coastguard Worker   // }  // namespace ns
985*9356374aSAndroid Build Coastguard Worker   //
986*9356374aSAndroid Build Coastguard Worker   // ns::f(long) [enable_if:fp >= 0]
987*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZN2ns1fEUa9enable_ifIXgefL0p_Li0EEEl",
988*9356374aSAndroid Build Coastguard Worker               tmp, sizeof(tmp)));
989*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("ns::f()", tmp);
990*9356374aSAndroid Build Coastguard Worker }
991*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,EnableIfAttributeOnFunctionTemplate)992*9356374aSAndroid Build Coastguard Worker TEST(Demangle, EnableIfAttributeOnFunctionTemplate) {
993*9356374aSAndroid Build Coastguard Worker   char tmp[80];
994*9356374aSAndroid Build Coastguard Worker 
995*9356374aSAndroid Build Coastguard Worker   // template <class T>
996*9356374aSAndroid Build Coastguard Worker   // T f(T t) __attribute__((enable_if(t >= T{}, ""))) { return t; }
997*9356374aSAndroid Build Coastguard Worker   // template int f<int>(int);
998*9356374aSAndroid Build Coastguard Worker   //
999*9356374aSAndroid Build Coastguard Worker   // int f<int>(int) [enable_if:fp >= int{}]
1000*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEUa9enable_ifIXgefL0p_tliEEET_S0_",
1001*9356374aSAndroid Build Coastguard Worker               tmp, sizeof(tmp)));
1002*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1003*9356374aSAndroid Build Coastguard Worker }
1004*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ThisPointerInDependentSignature)1005*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ThisPointerInDependentSignature) {
1006*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1007*9356374aSAndroid Build Coastguard Worker 
1008*9356374aSAndroid Build Coastguard Worker   // decltype(g<int>(this)) S::f<int>()
1009*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZN1S1fIiEEDTcl1gIT_EfpTEEv", tmp, sizeof(tmp)));
1010*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::f<>()", tmp);
1011*9356374aSAndroid Build Coastguard Worker }
1012*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,DependentMemberOperatorCall)1013*9356374aSAndroid Build Coastguard Worker TEST(Demangle, DependentMemberOperatorCall) {
1014*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1015*9356374aSAndroid Build Coastguard Worker 
1016*9356374aSAndroid Build Coastguard Worker   // decltype(fp.operator()()) f<C>(C)
1017*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fI1CEDTcldtfp_onclEET_", tmp, sizeof(tmp)));
1018*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1019*9356374aSAndroid Build Coastguard Worker }
1020*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TypeNestedUnderDecltype)1021*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TypeNestedUnderDecltype) {
1022*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1023*9356374aSAndroid Build Coastguard Worker 
1024*9356374aSAndroid Build Coastguard Worker   // Source:
1025*9356374aSAndroid Build Coastguard Worker   //
1026*9356374aSAndroid Build Coastguard Worker   // template <class T> struct S { using t = int; };
1027*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(S<T>{})::t f() { return {}; }
1028*9356374aSAndroid Build Coastguard Worker   // void g() { f<int>(); }
1029*9356374aSAndroid Build Coastguard Worker   //
1030*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1031*9356374aSAndroid Build Coastguard Worker   //
1032*9356374aSAndroid Build Coastguard Worker   // decltype(S<int>{})::t f<int>()
1033*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiENDTtl1SIT_EEE1tEv", tmp, sizeof(tmp)));
1034*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1035*9356374aSAndroid Build Coastguard Worker }
1036*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ElaboratedTypes)1037*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ElaboratedTypes) {
1038*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1039*9356374aSAndroid Build Coastguard Worker 
1040*9356374aSAndroid Build Coastguard Worker   // Source:
1041*9356374aSAndroid Build Coastguard Worker   //
1042*9356374aSAndroid Build Coastguard Worker   // template <class T> struct S { class C {}; };
1043*9356374aSAndroid Build Coastguard Worker   // template <class T> void f(class S<T>::C) {}
1044*9356374aSAndroid Build Coastguard Worker   // template void f<int>(class S<int>::C);
1045*9356374aSAndroid Build Coastguard Worker   //
1046*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
1047*9356374aSAndroid Build Coastguard Worker   //
1048*9356374aSAndroid Build Coastguard Worker   // void f<int>(struct S<int>::C)
1049*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEvTsN1SIT_E1CE", tmp, sizeof(tmp)));
1050*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1051*9356374aSAndroid Build Coastguard Worker 
1052*9356374aSAndroid Build Coastguard Worker   // The like for unions.
1053*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEvTuN1SIT_E1CE", tmp, sizeof(tmp)));
1054*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1055*9356374aSAndroid Build Coastguard Worker 
1056*9356374aSAndroid Build Coastguard Worker   // The like for enums.
1057*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEvTeN1SIT_E1CE", tmp, sizeof(tmp)));
1058*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1059*9356374aSAndroid Build Coastguard Worker }
1060*9356374aSAndroid Build Coastguard Worker 
1061*9356374aSAndroid Build Coastguard Worker // Test subobject-address template parameters.
TEST(Demangle,SubobjectAddresses)1062*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SubobjectAddresses) {
1063*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1064*9356374aSAndroid Build Coastguard Worker 
1065*9356374aSAndroid Build Coastguard Worker   // void f<a.<char const at offset 123>>()
1066*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIXsoKcL_Z1aE123EEEvv", tmp, sizeof(tmp)));
1067*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1068*9356374aSAndroid Build Coastguard Worker 
1069*9356374aSAndroid Build Coastguard Worker   // void f<&a.<char const at offset 0>>()
1070*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIXadsoKcL_Z1aEEEEvv", tmp, sizeof(tmp)));
1071*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1072*9356374aSAndroid Build Coastguard Worker 
1073*9356374aSAndroid Build Coastguard Worker   // void f<&a.<char const at offset 123>>()
1074*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIXadsoKcL_Z1aE123EEEvv", tmp, sizeof(tmp)));
1075*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1076*9356374aSAndroid Build Coastguard Worker 
1077*9356374aSAndroid Build Coastguard Worker   // void f<&a.<char const at offset 123>>(), past the end this time
1078*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIXadsoKcL_Z1aE123pEEEvv", tmp, sizeof(tmp)));
1079*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1080*9356374aSAndroid Build Coastguard Worker 
1081*9356374aSAndroid Build Coastguard Worker   // void f<&a.<char const at offset 0>>() with union-selectors
1082*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIXadsoKcL_Z1aE__1_234EEEvv", tmp, sizeof(tmp)));
1083*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1084*9356374aSAndroid Build Coastguard Worker 
1085*9356374aSAndroid Build Coastguard Worker   // void f<&a.<char const at offset 123>>(), past the end, with union-selector
1086*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIXadsoKcL_Z1aE123_456pEEEvv", tmp, sizeof(tmp)));
1087*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1088*9356374aSAndroid Build Coastguard Worker }
1089*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,Preincrement)1090*9356374aSAndroid Build Coastguard Worker TEST(Demangle, Preincrement) {
1091*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1092*9356374aSAndroid Build Coastguard Worker 
1093*9356374aSAndroid Build Coastguard Worker   // Source:
1094*9356374aSAndroid Build Coastguard Worker   //
1095*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T t) -> decltype(T{++t}) { return t; }
1096*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int t) -> decltype(int{++t});
1097*9356374aSAndroid Build Coastguard Worker   //
1098*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1099*9356374aSAndroid Build Coastguard Worker   //
1100*9356374aSAndroid Build Coastguard Worker   // decltype(int{++fp}) f<int>(int)
1101*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_pp_fp_EES0_", tmp, sizeof(tmp)));
1102*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1103*9356374aSAndroid Build Coastguard Worker }
1104*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,Postincrement)1105*9356374aSAndroid Build Coastguard Worker TEST(Demangle, Postincrement) {
1106*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1107*9356374aSAndroid Build Coastguard Worker 
1108*9356374aSAndroid Build Coastguard Worker   // Source:
1109*9356374aSAndroid Build Coastguard Worker   //
1110*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T t) -> decltype(T{t++}) { return t; }
1111*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int t) -> decltype(int{t++});
1112*9356374aSAndroid Build Coastguard Worker   //
1113*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1114*9356374aSAndroid Build Coastguard Worker   //
1115*9356374aSAndroid Build Coastguard Worker   // decltype(int{fp++}) f<int>(int)
1116*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_ppfp_EES0_", tmp, sizeof(tmp)));
1117*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1118*9356374aSAndroid Build Coastguard Worker }
1119*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,Predecrement)1120*9356374aSAndroid Build Coastguard Worker TEST(Demangle, Predecrement) {
1121*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1122*9356374aSAndroid Build Coastguard Worker 
1123*9356374aSAndroid Build Coastguard Worker   // Source:
1124*9356374aSAndroid Build Coastguard Worker   //
1125*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T t) -> decltype(T{--t}) { return t; }
1126*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int t) -> decltype(int{--t});
1127*9356374aSAndroid Build Coastguard Worker   //
1128*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1129*9356374aSAndroid Build Coastguard Worker   //
1130*9356374aSAndroid Build Coastguard Worker   // decltype(int{--fp}) f<int>(int)
1131*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_mm_fp_EES0_", tmp, sizeof(tmp)));
1132*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1133*9356374aSAndroid Build Coastguard Worker }
1134*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,Postdecrement)1135*9356374aSAndroid Build Coastguard Worker TEST(Demangle, Postdecrement) {
1136*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1137*9356374aSAndroid Build Coastguard Worker 
1138*9356374aSAndroid Build Coastguard Worker   // Source:
1139*9356374aSAndroid Build Coastguard Worker   //
1140*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T t) -> decltype(T{t--}) { return t; }
1141*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int t) -> decltype(int{t--});
1142*9356374aSAndroid Build Coastguard Worker   //
1143*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1144*9356374aSAndroid Build Coastguard Worker   //
1145*9356374aSAndroid Build Coastguard Worker   // decltype(int{fp--}) f<int>(int)
1146*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_mmfp_EES0_", tmp, sizeof(tmp)));
1147*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1148*9356374aSAndroid Build Coastguard Worker }
1149*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,UnaryFoldExpressions)1150*9356374aSAndroid Build Coastguard Worker TEST(Demangle, UnaryFoldExpressions) {
1151*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1152*9356374aSAndroid Build Coastguard Worker 
1153*9356374aSAndroid Build Coastguard Worker   // Source:
1154*9356374aSAndroid Build Coastguard Worker   //
1155*9356374aSAndroid Build Coastguard Worker   // template <bool b> struct S {};
1156*9356374aSAndroid Build Coastguard Worker   //
1157*9356374aSAndroid Build Coastguard Worker   // template <class... T> auto f(T... t) -> S<((sizeof(T) == 4) || ...)> {
1158*9356374aSAndroid Build Coastguard Worker   //   return {};
1159*9356374aSAndroid Build Coastguard Worker   // }
1160*9356374aSAndroid Build Coastguard Worker   //
1161*9356374aSAndroid Build Coastguard Worker   // void g() { f(1, 2L); }
1162*9356374aSAndroid Build Coastguard Worker   //
1163*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1164*9356374aSAndroid Build Coastguard Worker   //
1165*9356374aSAndroid Build Coastguard Worker   // S<((sizeof (int) == 4, sizeof (long) == 4) || ...)> f<int, long>(int, long)
1166*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIJilEE1SIXfrooeqstT_Li4EEEDpS1_",
1167*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
1168*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1169*9356374aSAndroid Build Coastguard Worker 
1170*9356374aSAndroid Build Coastguard Worker   // The like with a left fold.
1171*9356374aSAndroid Build Coastguard Worker   //
1172*9356374aSAndroid Build Coastguard Worker   // S<(... || (sizeof (int) == 4, sizeof (long) == 4))> f<int, long>(int, long)
1173*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIJilEE1SIXflooeqstT_Li4EEEDpS1_",
1174*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
1175*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1176*9356374aSAndroid Build Coastguard Worker }
1177*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,BinaryFoldExpressions)1178*9356374aSAndroid Build Coastguard Worker TEST(Demangle, BinaryFoldExpressions) {
1179*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1180*9356374aSAndroid Build Coastguard Worker 
1181*9356374aSAndroid Build Coastguard Worker   // Source:
1182*9356374aSAndroid Build Coastguard Worker   //
1183*9356374aSAndroid Build Coastguard Worker   // template <bool b> struct S {};
1184*9356374aSAndroid Build Coastguard Worker   //
1185*9356374aSAndroid Build Coastguard Worker   // template <class... T> auto f(T... t)
1186*9356374aSAndroid Build Coastguard Worker   //     -> S<((sizeof(T) == 4) || ... || false)> {
1187*9356374aSAndroid Build Coastguard Worker   //   return {};
1188*9356374aSAndroid Build Coastguard Worker   // }
1189*9356374aSAndroid Build Coastguard Worker   //
1190*9356374aSAndroid Build Coastguard Worker   // void g() { f(1, 2L); }
1191*9356374aSAndroid Build Coastguard Worker   //
1192*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1193*9356374aSAndroid Build Coastguard Worker   //
1194*9356374aSAndroid Build Coastguard Worker   // S<((sizeof (int) == 4, sizeof (long) == 4) || ... || false)>
1195*9356374aSAndroid Build Coastguard Worker   // f<int, long>(int, long)
1196*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIJilEE1SIXfRooeqstT_Li4ELb0EEEDpS1_",
1197*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
1198*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1199*9356374aSAndroid Build Coastguard Worker 
1200*9356374aSAndroid Build Coastguard Worker   // The like with a left fold.
1201*9356374aSAndroid Build Coastguard Worker   //
1202*9356374aSAndroid Build Coastguard Worker   // S<(false || ... || (sizeof (int) == 4, sizeof (long) == 4))>
1203*9356374aSAndroid Build Coastguard Worker   // f<int, long>(int, long)
1204*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIJilEE1SIXfLooLb0EeqstT_Li4EEEDpS1_",
1205*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
1206*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1207*9356374aSAndroid Build Coastguard Worker }
1208*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SizeofPacks)1209*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SizeofPacks) {
1210*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1211*9356374aSAndroid Build Coastguard Worker 
1212*9356374aSAndroid Build Coastguard Worker   // template <size_t i> struct S {};
1213*9356374aSAndroid Build Coastguard Worker   //
1214*9356374aSAndroid Build Coastguard Worker   // template <class... T> auto f(T... p) -> S<sizeof...(T)> { return {}; }
1215*9356374aSAndroid Build Coastguard Worker   // template auto f<int, long>(int, long) -> S<2>;
1216*9356374aSAndroid Build Coastguard Worker   //
1217*9356374aSAndroid Build Coastguard Worker   // template <class... T> auto g(T... p) -> S<sizeof...(p)> { return {}; }
1218*9356374aSAndroid Build Coastguard Worker   // template auto g<int, long>(int, long) -> S<2>;
1219*9356374aSAndroid Build Coastguard Worker 
1220*9356374aSAndroid Build Coastguard Worker   // S<sizeof...(int, long)> f<int, long>(int, long)
1221*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIJilEE1SIXsZT_EEDpT_", tmp, sizeof(tmp)));
1222*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1223*9356374aSAndroid Build Coastguard Worker 
1224*9356374aSAndroid Build Coastguard Worker   // S<sizeof... (fp)> g<int, long>(int, long)
1225*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1gIJilEE1SIXsZfp_EEDpT_", tmp, sizeof(tmp)));
1226*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("g<>()", tmp);
1227*9356374aSAndroid Build Coastguard Worker }
1228*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SizeofPackInvolvingAnAliasTemplate)1229*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SizeofPackInvolvingAnAliasTemplate) {
1230*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1231*9356374aSAndroid Build Coastguard Worker 
1232*9356374aSAndroid Build Coastguard Worker   // Source:
1233*9356374aSAndroid Build Coastguard Worker   //
1234*9356374aSAndroid Build Coastguard Worker   // template <class... T> using A = char[sizeof...(T)];
1235*9356374aSAndroid Build Coastguard Worker   // template <class... U> void f(const A<U..., int>&) {}
1236*9356374aSAndroid Build Coastguard Worker   // template void f<int>(const A<int, int>&);
1237*9356374aSAndroid Build Coastguard Worker   //
1238*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1239*9356374aSAndroid Build Coastguard Worker   //
1240*9356374aSAndroid Build Coastguard Worker   // void f<int>(char const (&) [sizeof... (int, int)])
1241*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIJiEEvRAsPDpT_iE_Kc", tmp, sizeof(tmp)));
1242*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1243*9356374aSAndroid Build Coastguard Worker }
1244*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,UserDefinedLiteral)1245*9356374aSAndroid Build Coastguard Worker TEST(Demangle, UserDefinedLiteral) {
1246*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1247*9356374aSAndroid Build Coastguard Worker 
1248*9356374aSAndroid Build Coastguard Worker   // Source:
1249*9356374aSAndroid Build Coastguard Worker   //
1250*9356374aSAndroid Build Coastguard Worker   // unsigned long long operator""_lit(unsigned long long x) { return x; }
1251*9356374aSAndroid Build Coastguard Worker   //
1252*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
1253*9356374aSAndroid Build Coastguard Worker   //
1254*9356374aSAndroid Build Coastguard Worker   // operator"" _lit(unsigned long long)
1255*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Zli4_lity", tmp, sizeof(tmp)));
1256*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("operator\"\" _lit()", tmp);
1257*9356374aSAndroid Build Coastguard Worker }
1258*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,Spaceship)1259*9356374aSAndroid Build Coastguard Worker TEST(Demangle, Spaceship) {
1260*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1261*9356374aSAndroid Build Coastguard Worker 
1262*9356374aSAndroid Build Coastguard Worker   // #include <compare>
1263*9356374aSAndroid Build Coastguard Worker   //
1264*9356374aSAndroid Build Coastguard Worker   // struct S { auto operator<=>(const S&) const = default; };
1265*9356374aSAndroid Build Coastguard Worker   // auto (S::*f) = &S::operator<=>;  // make sure S::operator<=> is emitted
1266*9356374aSAndroid Build Coastguard Worker   //
1267*9356374aSAndroid Build Coastguard Worker   // template <class T> auto g(T x, T y) -> decltype(x <=> y) {
1268*9356374aSAndroid Build Coastguard Worker   //   return x <=> y;
1269*9356374aSAndroid Build Coastguard Worker   // }
1270*9356374aSAndroid Build Coastguard Worker   // template auto g<S>(S x, S y) -> decltype(x <=> y);
1271*9356374aSAndroid Build Coastguard Worker 
1272*9356374aSAndroid Build Coastguard Worker   // S::operator<=>(S const&) const
1273*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK1SssERKS_", tmp, sizeof(tmp)));
1274*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("S::operator<=>()", tmp);
1275*9356374aSAndroid Build Coastguard Worker 
1276*9356374aSAndroid Build Coastguard Worker   // decltype(fp <=> fp0) g<S>(S, S)
1277*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1gI1SEDTssfp_fp0_ET_S2_", tmp, sizeof(tmp)));
1278*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("g<>()", tmp);
1279*9356374aSAndroid Build Coastguard Worker }
1280*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,CoAwait)1281*9356374aSAndroid Build Coastguard Worker TEST(Demangle, CoAwait) {
1282*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1283*9356374aSAndroid Build Coastguard Worker 
1284*9356374aSAndroid Build Coastguard Worker   // ns::Awaitable::operator co_await() const
1285*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZNK2ns9AwaitableawEv", tmp, sizeof(tmp)));
1286*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("ns::Awaitable::operator co_await()", tmp);
1287*9356374aSAndroid Build Coastguard Worker }
1288*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,VendorExtendedExpressions)1289*9356374aSAndroid Build Coastguard Worker TEST(Demangle, VendorExtendedExpressions) {
1290*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1291*9356374aSAndroid Build Coastguard Worker 
1292*9356374aSAndroid Build Coastguard Worker   // void f<__e()>()
1293*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIXu3__eEEEvv", tmp, sizeof(tmp)));
1294*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1295*9356374aSAndroid Build Coastguard Worker 
1296*9356374aSAndroid Build Coastguard Worker   // void f<__e(int, long)>()
1297*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIXu3__eilEEEvv", tmp, sizeof(tmp)));
1298*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1299*9356374aSAndroid Build Coastguard Worker }
1300*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,DirectListInitialization)1301*9356374aSAndroid Build Coastguard Worker TEST(Demangle, DirectListInitialization) {
1302*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1303*9356374aSAndroid Build Coastguard Worker 
1304*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{}) f() { return T{}; }
1305*9356374aSAndroid Build Coastguard Worker   // template decltype(int{}) f<int>();
1306*9356374aSAndroid Build Coastguard Worker   //
1307*9356374aSAndroid Build Coastguard Worker   // struct XYZ { int x, y, z; };
1308*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{1, 2, 3}) g() { return T{1, 2, 3}; }
1309*9356374aSAndroid Build Coastguard Worker   // template decltype(XYZ{1, 2, 3}) g<XYZ>();
1310*9356374aSAndroid Build Coastguard Worker   //
1311*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{.x = 1, .y = 2, .z = 3}) h() {
1312*9356374aSAndroid Build Coastguard Worker   //   return T{.x = 1, .y = 2, .z = 3};
1313*9356374aSAndroid Build Coastguard Worker   // }
1314*9356374aSAndroid Build Coastguard Worker   // template decltype(XYZ{.x = 1, .y = 2, .z = 3}) h<XYZ>();
1315*9356374aSAndroid Build Coastguard Worker   //
1316*9356374aSAndroid Build Coastguard Worker   // // The following two cases require full C99 designated initializers,
1317*9356374aSAndroid Build Coastguard Worker   // // not part of C++ but likely available as an extension if you ask your
1318*9356374aSAndroid Build Coastguard Worker   // // compiler nicely.
1319*9356374aSAndroid Build Coastguard Worker   //
1320*9356374aSAndroid Build Coastguard Worker   // struct A { int a[4]; };
1321*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{.a[2] = 42}) i() { return T{.a[2] = 42}; }
1322*9356374aSAndroid Build Coastguard Worker   // template decltype(A{.a[2] = 42}) i<A>();
1323*9356374aSAndroid Build Coastguard Worker   //
1324*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{.a[1 ... 3] = 42}) j() {
1325*9356374aSAndroid Build Coastguard Worker   //   return T{.a[1 ... 3] = 42};
1326*9356374aSAndroid Build Coastguard Worker   // }
1327*9356374aSAndroid Build Coastguard Worker   // template decltype(A{.a[1 ... 3] = 42}) j<A>();
1328*9356374aSAndroid Build Coastguard Worker 
1329*9356374aSAndroid Build Coastguard Worker   // decltype(int{}) f<int>()
1330*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_EEv", tmp, sizeof(tmp)));
1331*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1332*9356374aSAndroid Build Coastguard Worker 
1333*9356374aSAndroid Build Coastguard Worker   // decltype(XYZ{1, 2, 3}) g<XYZ>()
1334*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1gI3XYZEDTtlT_Li1ELi2ELi3EEEv", tmp, sizeof(tmp)));
1335*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("g<>()", tmp);
1336*9356374aSAndroid Build Coastguard Worker 
1337*9356374aSAndroid Build Coastguard Worker   // decltype(XYZ{.x = 1, .y = 2, .z = 3}) h<XYZ>()
1338*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1hI3XYZEDTtlT_di1xLi1Edi1yLi2Edi1zLi3EEEv",
1339*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
1340*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("h<>()", tmp);
1341*9356374aSAndroid Build Coastguard Worker 
1342*9356374aSAndroid Build Coastguard Worker   // decltype(A{.a[2] = 42}) i<A>()
1343*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1iI1AEDTtlT_di1adxLi2ELi42EEEv", tmp, sizeof(tmp)));
1344*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("i<>()", tmp);
1345*9356374aSAndroid Build Coastguard Worker 
1346*9356374aSAndroid Build Coastguard Worker   // decltype(A{.a[1 ... 3] = 42}) j<A>()
1347*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1jI1AEDTtlT_di1adXLi1ELi3ELi42EEEv",
1348*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
1349*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("j<>()", tmp);
1350*9356374aSAndroid Build Coastguard Worker }
1351*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SimpleInitializerLists)1352*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SimpleInitializerLists) {
1353*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1354*9356374aSAndroid Build Coastguard Worker 
1355*9356374aSAndroid Build Coastguard Worker   // Common preamble of source-code examples in this test function:
1356*9356374aSAndroid Build Coastguard Worker   //
1357*9356374aSAndroid Build Coastguard Worker   // #include <initializer_list>
1358*9356374aSAndroid Build Coastguard Worker   //
1359*9356374aSAndroid Build Coastguard Worker   // template <class T> void g(std::initializer_list<T>) {}
1360*9356374aSAndroid Build Coastguard Worker 
1361*9356374aSAndroid Build Coastguard Worker   // Source:
1362*9356374aSAndroid Build Coastguard Worker   //
1363*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f() -> decltype(g<T>({})) {}
1364*9356374aSAndroid Build Coastguard Worker   // template auto f<int>() -> decltype(g<int>({}));
1365*9356374aSAndroid Build Coastguard Worker   //
1366*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1367*9356374aSAndroid Build Coastguard Worker   //
1368*9356374aSAndroid Build Coastguard Worker   // decltype(g<int>({})) f<int>()
1369*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTcl1gIT_EilEEEv", tmp, sizeof(tmp)));
1370*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1371*9356374aSAndroid Build Coastguard Worker 
1372*9356374aSAndroid Build Coastguard Worker   // Source:
1373*9356374aSAndroid Build Coastguard Worker   //
1374*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T x) -> decltype(g({x})) {}
1375*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int x) -> decltype(g({x}));
1376*9356374aSAndroid Build Coastguard Worker   //
1377*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1378*9356374aSAndroid Build Coastguard Worker   //
1379*9356374aSAndroid Build Coastguard Worker   // decltype(g({fp})) f<int>(int)
1380*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTcl1gilfp_EEET_", tmp, sizeof(tmp)));
1381*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1382*9356374aSAndroid Build Coastguard Worker 
1383*9356374aSAndroid Build Coastguard Worker   // Source:
1384*9356374aSAndroid Build Coastguard Worker   //
1385*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T x, T y) -> decltype(g({x, y})) {}
1386*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int x, int y) -> decltype(g({x, y}));
1387*9356374aSAndroid Build Coastguard Worker   //
1388*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1389*9356374aSAndroid Build Coastguard Worker   //
1390*9356374aSAndroid Build Coastguard Worker   // decltype(g({fp, fp0})) f<int>(int, int)
1391*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTcl1gilfp_fp0_EEET_S1_", tmp, sizeof(tmp)));
1392*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1393*9356374aSAndroid Build Coastguard Worker }
1394*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,BracedListImplicitlyConstructingAClassObject)1395*9356374aSAndroid Build Coastguard Worker TEST(Demangle, BracedListImplicitlyConstructingAClassObject) {
1396*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1397*9356374aSAndroid Build Coastguard Worker 
1398*9356374aSAndroid Build Coastguard Worker   // Source:
1399*9356374aSAndroid Build Coastguard Worker   //
1400*9356374aSAndroid Build Coastguard Worker   // struct S { int v; };
1401*9356374aSAndroid Build Coastguard Worker   // void g(S) {}
1402*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T x) -> decltype(g({.v = x})) {}
1403*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int x) -> decltype(g({.v = x}));
1404*9356374aSAndroid Build Coastguard Worker   //
1405*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1406*9356374aSAndroid Build Coastguard Worker   //
1407*9356374aSAndroid Build Coastguard Worker   // decltype(g({.v = fp})) f<int>(int)
1408*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTcl1gildi1vfp_EEET_", tmp, sizeof(tmp)));
1409*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1410*9356374aSAndroid Build Coastguard Worker }
1411*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SimpleNewExpression)1412*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SimpleNewExpression) {
1413*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1414*9356374aSAndroid Build Coastguard Worker 
1415*9356374aSAndroid Build Coastguard Worker   // Source:
1416*9356374aSAndroid Build Coastguard Worker   //
1417*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{*new T}) f() { return T{}; }
1418*9356374aSAndroid Build Coastguard Worker   // template decltype(int{*new int}) f<int>();
1419*9356374aSAndroid Build Coastguard Worker   //
1420*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1421*9356374aSAndroid Build Coastguard Worker   //
1422*9356374aSAndroid Build Coastguard Worker   // decltype(int{*(new int)}) f<int>()
1423*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_denw_S0_EEEv", tmp, sizeof(tmp)));
1424*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1425*9356374aSAndroid Build Coastguard Worker }
1426*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,NewExpressionWithEmptyParentheses)1427*9356374aSAndroid Build Coastguard Worker TEST(Demangle, NewExpressionWithEmptyParentheses) {
1428*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1429*9356374aSAndroid Build Coastguard Worker 
1430*9356374aSAndroid Build Coastguard Worker   // Source:
1431*9356374aSAndroid Build Coastguard Worker   //
1432*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{*new T()}) f() { return T{}; }
1433*9356374aSAndroid Build Coastguard Worker   // template decltype(int{*new int()}) f<int>();
1434*9356374aSAndroid Build Coastguard Worker   //
1435*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1436*9356374aSAndroid Build Coastguard Worker   //
1437*9356374aSAndroid Build Coastguard Worker   // decltype(int{*(new int)}) f<int>()
1438*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_denw_S0_piEEEv", tmp, sizeof(tmp)));
1439*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1440*9356374aSAndroid Build Coastguard Worker }
1441*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,NewExpressionWithNonemptyParentheses)1442*9356374aSAndroid Build Coastguard Worker TEST(Demangle, NewExpressionWithNonemptyParentheses) {
1443*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1444*9356374aSAndroid Build Coastguard Worker 
1445*9356374aSAndroid Build Coastguard Worker   // Source:
1446*9356374aSAndroid Build Coastguard Worker   //
1447*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{*new T(42)}) f() { return T{}; }
1448*9356374aSAndroid Build Coastguard Worker   // template decltype(int{*new int(42)}) f<int>();
1449*9356374aSAndroid Build Coastguard Worker   //
1450*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1451*9356374aSAndroid Build Coastguard Worker   //
1452*9356374aSAndroid Build Coastguard Worker   // decltype(int{*(new int(42))}) f<int>()
1453*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_denw_S0_piLi42EEEEv", tmp, sizeof(tmp)));
1454*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1455*9356374aSAndroid Build Coastguard Worker }
1456*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,PlacementNewExpression)1457*9356374aSAndroid Build Coastguard Worker TEST(Demangle, PlacementNewExpression) {
1458*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1459*9356374aSAndroid Build Coastguard Worker 
1460*9356374aSAndroid Build Coastguard Worker   // Source:
1461*9356374aSAndroid Build Coastguard Worker   //
1462*9356374aSAndroid Build Coastguard Worker   // #include <new>
1463*9356374aSAndroid Build Coastguard Worker   //
1464*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T t) -> decltype(T{*new (&t) T(42)}) {
1465*9356374aSAndroid Build Coastguard Worker   //   return t;
1466*9356374aSAndroid Build Coastguard Worker   // }
1467*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int t) -> decltype(int{*new (&t) int(42)});
1468*9356374aSAndroid Build Coastguard Worker   //
1469*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1470*9356374aSAndroid Build Coastguard Worker   //
1471*9356374aSAndroid Build Coastguard Worker   // decltype(int{*(new(&fp) int(42))}) f<int>(int)
1472*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_denwadfp__S0_piLi42EEEES0_",
1473*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
1474*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1475*9356374aSAndroid Build Coastguard Worker }
1476*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,GlobalScopeNewExpression)1477*9356374aSAndroid Build Coastguard Worker TEST(Demangle, GlobalScopeNewExpression) {
1478*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1479*9356374aSAndroid Build Coastguard Worker 
1480*9356374aSAndroid Build Coastguard Worker   // Source:
1481*9356374aSAndroid Build Coastguard Worker   //
1482*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{*::new T}) f() { return T{}; }
1483*9356374aSAndroid Build Coastguard Worker   // template decltype(int{*::new int}) f<int>();
1484*9356374aSAndroid Build Coastguard Worker   //
1485*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1486*9356374aSAndroid Build Coastguard Worker   //
1487*9356374aSAndroid Build Coastguard Worker   // decltype(int{*(::new int)}) f<int>()
1488*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_degsnw_S0_EEEv", tmp, sizeof(tmp)));
1489*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1490*9356374aSAndroid Build Coastguard Worker }
1491*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,NewExpressionWithEmptyBraces)1492*9356374aSAndroid Build Coastguard Worker TEST(Demangle, NewExpressionWithEmptyBraces) {
1493*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1494*9356374aSAndroid Build Coastguard Worker 
1495*9356374aSAndroid Build Coastguard Worker   // Source:
1496*9356374aSAndroid Build Coastguard Worker   //
1497*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{*new T{}}) f() { return T{}; }
1498*9356374aSAndroid Build Coastguard Worker   // template decltype(int{*new int{}}) f<int>();
1499*9356374aSAndroid Build Coastguard Worker   //
1500*9356374aSAndroid Build Coastguard Worker   // GNU demangling:
1501*9356374aSAndroid Build Coastguard Worker   //
1502*9356374aSAndroid Build Coastguard Worker   // decltype (int{*(new int{})}) f<int>()
1503*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_denw_S0_ilEEEv", tmp, sizeof(tmp)));
1504*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1505*9356374aSAndroid Build Coastguard Worker }
1506*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,NewExpressionWithNonemptyBraces)1507*9356374aSAndroid Build Coastguard Worker TEST(Demangle, NewExpressionWithNonemptyBraces) {
1508*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1509*9356374aSAndroid Build Coastguard Worker 
1510*9356374aSAndroid Build Coastguard Worker   // Source:
1511*9356374aSAndroid Build Coastguard Worker   //
1512*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{*new T{42}}) f() { return T{}; }
1513*9356374aSAndroid Build Coastguard Worker   // template decltype(int{*new int{42}}) f<int>();
1514*9356374aSAndroid Build Coastguard Worker   //
1515*9356374aSAndroid Build Coastguard Worker   // GNU demangling:
1516*9356374aSAndroid Build Coastguard Worker   //
1517*9356374aSAndroid Build Coastguard Worker   // decltype (int{*(new int{42})}) f<int>()
1518*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_denw_S0_ilLi42EEEEv", tmp, sizeof(tmp)));
1519*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1520*9356374aSAndroid Build Coastguard Worker }
1521*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SimpleArrayNewExpression)1522*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SimpleArrayNewExpression) {
1523*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1524*9356374aSAndroid Build Coastguard Worker 
1525*9356374aSAndroid Build Coastguard Worker   // Source:
1526*9356374aSAndroid Build Coastguard Worker   //
1527*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{*new T[1]}) f() { return T{}; }
1528*9356374aSAndroid Build Coastguard Worker   // template decltype(int{*new int[1]}) f<int>();
1529*9356374aSAndroid Build Coastguard Worker   //
1530*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1531*9356374aSAndroid Build Coastguard Worker   //
1532*9356374aSAndroid Build Coastguard Worker   // decltype(int{*(new[] int)}) f<int>()
1533*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_dena_S0_EEEv", tmp, sizeof(tmp)));
1534*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1535*9356374aSAndroid Build Coastguard Worker }
1536*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ArrayNewExpressionWithEmptyParentheses)1537*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ArrayNewExpressionWithEmptyParentheses) {
1538*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1539*9356374aSAndroid Build Coastguard Worker 
1540*9356374aSAndroid Build Coastguard Worker   // Source:
1541*9356374aSAndroid Build Coastguard Worker   //
1542*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{*new T[1]()}) f() { return T{}; }
1543*9356374aSAndroid Build Coastguard Worker   // template decltype(int{*new int[1]()}) f<int>();
1544*9356374aSAndroid Build Coastguard Worker   //
1545*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1546*9356374aSAndroid Build Coastguard Worker   //
1547*9356374aSAndroid Build Coastguard Worker   // decltype(int{*(new[] int)}) f<int>()
1548*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_dena_S0_piEEEv", tmp, sizeof(tmp)));
1549*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1550*9356374aSAndroid Build Coastguard Worker }
1551*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ArrayPlacementNewExpression)1552*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ArrayPlacementNewExpression) {
1553*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1554*9356374aSAndroid Build Coastguard Worker 
1555*9356374aSAndroid Build Coastguard Worker   // Source:
1556*9356374aSAndroid Build Coastguard Worker   //
1557*9356374aSAndroid Build Coastguard Worker   // #include <new>
1558*9356374aSAndroid Build Coastguard Worker   //
1559*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T t) -> decltype(T{*new (&t) T[1]}) {
1560*9356374aSAndroid Build Coastguard Worker   //   return T{};
1561*9356374aSAndroid Build Coastguard Worker   // }
1562*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int t) -> decltype(int{*new (&t) int[1]});
1563*9356374aSAndroid Build Coastguard Worker   //
1564*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1565*9356374aSAndroid Build Coastguard Worker   //
1566*9356374aSAndroid Build Coastguard Worker   // decltype(int{*(new[](&fp) int)}) f<int>(int)
1567*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_denaadfp__S0_EEES0_", tmp, sizeof(tmp)));
1568*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1569*9356374aSAndroid Build Coastguard Worker }
1570*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,GlobalScopeArrayNewExpression)1571*9356374aSAndroid Build Coastguard Worker TEST(Demangle, GlobalScopeArrayNewExpression) {
1572*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1573*9356374aSAndroid Build Coastguard Worker 
1574*9356374aSAndroid Build Coastguard Worker   // Source:
1575*9356374aSAndroid Build Coastguard Worker   //
1576*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{*::new T[1]}) f() { return T{}; }
1577*9356374aSAndroid Build Coastguard Worker   // template decltype(int{*::new int[1]}) f<int>();
1578*9356374aSAndroid Build Coastguard Worker   //
1579*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1580*9356374aSAndroid Build Coastguard Worker   //
1581*9356374aSAndroid Build Coastguard Worker   // decltype(int{*(::new[] int)}) f<int>()
1582*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_degsna_S0_EEEv", tmp, sizeof(tmp)));
1583*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1584*9356374aSAndroid Build Coastguard Worker }
1585*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ArrayNewExpressionWithTwoElementsInBraces)1586*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ArrayNewExpressionWithTwoElementsInBraces) {
1587*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1588*9356374aSAndroid Build Coastguard Worker 
1589*9356374aSAndroid Build Coastguard Worker   // Source:
1590*9356374aSAndroid Build Coastguard Worker   //
1591*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(T{*new T[2]{1, 2}}) f() { return T{}; }
1592*9356374aSAndroid Build Coastguard Worker   // template decltype(int{*new int[2]{1, 2}}) f<int>();
1593*9356374aSAndroid Build Coastguard Worker   //
1594*9356374aSAndroid Build Coastguard Worker   // GNU demangling:
1595*9356374aSAndroid Build Coastguard Worker   //
1596*9356374aSAndroid Build Coastguard Worker   // decltype (int{*(new int{1, 2})}) f<int>()
1597*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTtlT_dena_S0_ilLi1ELi2EEEEv",
1598*9356374aSAndroid Build Coastguard Worker                        tmp, sizeof(tmp)));
1599*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1600*9356374aSAndroid Build Coastguard Worker }
1601*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SimpleDeleteExpression)1602*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SimpleDeleteExpression) {
1603*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1604*9356374aSAndroid Build Coastguard Worker 
1605*9356374aSAndroid Build Coastguard Worker   // Source:
1606*9356374aSAndroid Build Coastguard Worker   //
1607*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T* p) -> decltype(delete p) {}
1608*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int* p) -> decltype(delete p);
1609*9356374aSAndroid Build Coastguard Worker   //
1610*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
1611*9356374aSAndroid Build Coastguard Worker   //
1612*9356374aSAndroid Build Coastguard Worker   // decltype(delete fp) f<int>(int*)
1613*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTdlfp_EPT_", tmp, sizeof(tmp)));
1614*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1615*9356374aSAndroid Build Coastguard Worker }
1616*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,GlobalScopeDeleteExpression)1617*9356374aSAndroid Build Coastguard Worker TEST(Demangle, GlobalScopeDeleteExpression) {
1618*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1619*9356374aSAndroid Build Coastguard Worker 
1620*9356374aSAndroid Build Coastguard Worker   // Source:
1621*9356374aSAndroid Build Coastguard Worker   //
1622*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T* p) -> decltype(::delete p) {}
1623*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int* p) -> decltype(::delete p);
1624*9356374aSAndroid Build Coastguard Worker   //
1625*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
1626*9356374aSAndroid Build Coastguard Worker   //
1627*9356374aSAndroid Build Coastguard Worker   // decltype(::delete fp) f<int>(int*)
1628*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTgsdlfp_EPT_", tmp, sizeof(tmp)));
1629*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1630*9356374aSAndroid Build Coastguard Worker }
1631*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,SimpleArrayDeleteExpression)1632*9356374aSAndroid Build Coastguard Worker TEST(Demangle, SimpleArrayDeleteExpression) {
1633*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1634*9356374aSAndroid Build Coastguard Worker 
1635*9356374aSAndroid Build Coastguard Worker   // Source:
1636*9356374aSAndroid Build Coastguard Worker   //
1637*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T* a) -> decltype(delete[] a) {}
1638*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int* a) -> decltype(delete[] a);
1639*9356374aSAndroid Build Coastguard Worker   //
1640*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
1641*9356374aSAndroid Build Coastguard Worker   //
1642*9356374aSAndroid Build Coastguard Worker   // decltype(delete[] fp) f<int>(int*)
1643*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTdafp_EPT_", tmp, sizeof(tmp)));
1644*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1645*9356374aSAndroid Build Coastguard Worker }
1646*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,GlobalScopeArrayDeleteExpression)1647*9356374aSAndroid Build Coastguard Worker TEST(Demangle, GlobalScopeArrayDeleteExpression) {
1648*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1649*9356374aSAndroid Build Coastguard Worker 
1650*9356374aSAndroid Build Coastguard Worker   // Source:
1651*9356374aSAndroid Build Coastguard Worker   //
1652*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T* a) -> decltype(::delete[] a) {}
1653*9356374aSAndroid Build Coastguard Worker   // template auto f<int>(int* a) -> decltype(::delete[] a);
1654*9356374aSAndroid Build Coastguard Worker   //
1655*9356374aSAndroid Build Coastguard Worker   // LLVM demangling:
1656*9356374aSAndroid Build Coastguard Worker   //
1657*9356374aSAndroid Build Coastguard Worker   // decltype(::delete[] fp) f<int>(int*)
1658*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTgsdafp_EPT_", tmp, sizeof(tmp)));
1659*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1660*9356374aSAndroid Build Coastguard Worker }
1661*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ReferenceQualifiedFunctionTypes)1662*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ReferenceQualifiedFunctionTypes) {
1663*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1664*9356374aSAndroid Build Coastguard Worker 
1665*9356374aSAndroid Build Coastguard Worker   // void f(void (*)() const &, int)
1666*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fPKFvvREi", tmp, sizeof(tmp)));
1667*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()", tmp);
1668*9356374aSAndroid Build Coastguard Worker 
1669*9356374aSAndroid Build Coastguard Worker   // void f(void (*)() &&, int)
1670*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fPFvvOEi", tmp, sizeof(tmp)));
1671*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()", tmp);
1672*9356374aSAndroid Build Coastguard Worker 
1673*9356374aSAndroid Build Coastguard Worker   // void f(void (*)(int&) &, int)
1674*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fPFvRiREi", tmp, sizeof(tmp)));
1675*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()", tmp);
1676*9356374aSAndroid Build Coastguard Worker 
1677*9356374aSAndroid Build Coastguard Worker   // void f(void (*)(S&&) &&, int)
1678*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fPFvO1SOEi", tmp, sizeof(tmp)));
1679*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f()", tmp);
1680*9356374aSAndroid Build Coastguard Worker }
1681*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,DynamicCast)1682*9356374aSAndroid Build Coastguard Worker TEST(Demangle, DynamicCast) {
1683*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1684*9356374aSAndroid Build Coastguard Worker 
1685*9356374aSAndroid Build Coastguard Worker   // Source:
1686*9356374aSAndroid Build Coastguard Worker   //
1687*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T* p) -> decltype(dynamic_cast<const T*>(p)) {
1688*9356374aSAndroid Build Coastguard Worker   //   return p;
1689*9356374aSAndroid Build Coastguard Worker   // }
1690*9356374aSAndroid Build Coastguard Worker   // struct S {};
1691*9356374aSAndroid Build Coastguard Worker   // void g(S* p) { f(p); }
1692*9356374aSAndroid Build Coastguard Worker   //
1693*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1694*9356374aSAndroid Build Coastguard Worker   //
1695*9356374aSAndroid Build Coastguard Worker   // decltype(dynamic_cast<S const*>(fp)) f<S>(S*)
1696*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fI1SEDTdcPKT_fp_EPS1_", tmp, sizeof(tmp)));
1697*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1698*9356374aSAndroid Build Coastguard Worker }
1699*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,StaticCast)1700*9356374aSAndroid Build Coastguard Worker TEST(Demangle, StaticCast) {
1701*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1702*9356374aSAndroid Build Coastguard Worker 
1703*9356374aSAndroid Build Coastguard Worker   // Source:
1704*9356374aSAndroid Build Coastguard Worker   //
1705*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T* p) -> decltype(static_cast<const T*>(p)) {
1706*9356374aSAndroid Build Coastguard Worker   //   return p;
1707*9356374aSAndroid Build Coastguard Worker   // }
1708*9356374aSAndroid Build Coastguard Worker   // void g(int* p) { f(p); }
1709*9356374aSAndroid Build Coastguard Worker   //
1710*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1711*9356374aSAndroid Build Coastguard Worker   //
1712*9356374aSAndroid Build Coastguard Worker   // decltype(static_cast<int const*>(fp)) f<int>(int*)
1713*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTscPKT_fp_EPS0_", tmp, sizeof(tmp)));
1714*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1715*9356374aSAndroid Build Coastguard Worker }
1716*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ConstCast)1717*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ConstCast) {
1718*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1719*9356374aSAndroid Build Coastguard Worker 
1720*9356374aSAndroid Build Coastguard Worker   // Source:
1721*9356374aSAndroid Build Coastguard Worker   //
1722*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T* p) -> decltype(const_cast<const T*>(p)) {
1723*9356374aSAndroid Build Coastguard Worker   //   return p;
1724*9356374aSAndroid Build Coastguard Worker   // }
1725*9356374aSAndroid Build Coastguard Worker   // void g(int* p) { f(p); }
1726*9356374aSAndroid Build Coastguard Worker   //
1727*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1728*9356374aSAndroid Build Coastguard Worker   //
1729*9356374aSAndroid Build Coastguard Worker   // decltype(const_cast<int const*>(fp)) f<int>(int*)
1730*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTccPKT_fp_EPS0_", tmp, sizeof(tmp)));
1731*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1732*9356374aSAndroid Build Coastguard Worker }
1733*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ReinterpretCast)1734*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ReinterpretCast) {
1735*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1736*9356374aSAndroid Build Coastguard Worker 
1737*9356374aSAndroid Build Coastguard Worker   // Source:
1738*9356374aSAndroid Build Coastguard Worker   //
1739*9356374aSAndroid Build Coastguard Worker   // template <class T> auto f(T* p)
1740*9356374aSAndroid Build Coastguard Worker   //     -> decltype(reinterpret_cast<const T*>(p)) {
1741*9356374aSAndroid Build Coastguard Worker   //   return p;
1742*9356374aSAndroid Build Coastguard Worker   // }
1743*9356374aSAndroid Build Coastguard Worker   // void g(int* p) { f(p); }
1744*9356374aSAndroid Build Coastguard Worker   //
1745*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1746*9356374aSAndroid Build Coastguard Worker   //
1747*9356374aSAndroid Build Coastguard Worker   // decltype(reinterpret_cast<int const*>(fp)) f<int>(int*)
1748*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTrcPKT_fp_EPS0_", tmp, sizeof(tmp)));
1749*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1750*9356374aSAndroid Build Coastguard Worker }
1751*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TypeidType)1752*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TypeidType) {
1753*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1754*9356374aSAndroid Build Coastguard Worker 
1755*9356374aSAndroid Build Coastguard Worker   // Source:
1756*9356374aSAndroid Build Coastguard Worker   //
1757*9356374aSAndroid Build Coastguard Worker   // #include <typeinfo>
1758*9356374aSAndroid Build Coastguard Worker   //
1759*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(typeid(T).name()) f(T) { return nullptr; }
1760*9356374aSAndroid Build Coastguard Worker   // template decltype(typeid(int).name()) f<int>(int);
1761*9356374aSAndroid Build Coastguard Worker   //
1762*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1763*9356374aSAndroid Build Coastguard Worker   //
1764*9356374aSAndroid Build Coastguard Worker   // decltype(typeid (int).name()) f<int>(int)
1765*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTcldttiT_4nameEES0_", tmp, sizeof(tmp)));
1766*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1767*9356374aSAndroid Build Coastguard Worker }
1768*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,TypeidExpression)1769*9356374aSAndroid Build Coastguard Worker TEST(Demangle, TypeidExpression) {
1770*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1771*9356374aSAndroid Build Coastguard Worker 
1772*9356374aSAndroid Build Coastguard Worker   // Source:
1773*9356374aSAndroid Build Coastguard Worker   //
1774*9356374aSAndroid Build Coastguard Worker   // #include <typeinfo>
1775*9356374aSAndroid Build Coastguard Worker   //
1776*9356374aSAndroid Build Coastguard Worker   // template <class T> decltype(typeid(T{}).name()) f(T) { return nullptr; }
1777*9356374aSAndroid Build Coastguard Worker   // template decltype(typeid(int{}).name()) f<int>(int);
1778*9356374aSAndroid Build Coastguard Worker   //
1779*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1780*9356374aSAndroid Build Coastguard Worker   //
1781*9356374aSAndroid Build Coastguard Worker   // decltype(typeid (int{}).name()) f<int>(int)
1782*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEDTcldttetlT_E4nameEES0_", tmp, sizeof(tmp)));
1783*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1784*9356374aSAndroid Build Coastguard Worker }
1785*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,AlignofType)1786*9356374aSAndroid Build Coastguard Worker TEST(Demangle, AlignofType) {
1787*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1788*9356374aSAndroid Build Coastguard Worker 
1789*9356374aSAndroid Build Coastguard Worker   // Source:
1790*9356374aSAndroid Build Coastguard Worker   //
1791*9356374aSAndroid Build Coastguard Worker   // template <class T> T f(T (&a)[alignof(T)]) { return a[0]; }
1792*9356374aSAndroid Build Coastguard Worker   // template int f<int>(int (&)[alignof(int)]);
1793*9356374aSAndroid Build Coastguard Worker   //
1794*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1795*9356374aSAndroid Build Coastguard Worker   //
1796*9356374aSAndroid Build Coastguard Worker   // int f<int>(int (&) [alignof (int)])
1797*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiET_RAatS0__S0_", tmp, sizeof(tmp)));
1798*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1799*9356374aSAndroid Build Coastguard Worker }
1800*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,AlignofExpression)1801*9356374aSAndroid Build Coastguard Worker TEST(Demangle, AlignofExpression) {
1802*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1803*9356374aSAndroid Build Coastguard Worker 
1804*9356374aSAndroid Build Coastguard Worker   // Source (note that this uses a GNU extension; it is not standard C++):
1805*9356374aSAndroid Build Coastguard Worker   //
1806*9356374aSAndroid Build Coastguard Worker   // template <class T> T f(T (&a)[alignof(T{})]) { return a[0]; }
1807*9356374aSAndroid Build Coastguard Worker   // template int f<int>(int (&)[alignof(int{})]);
1808*9356374aSAndroid Build Coastguard Worker   //
1809*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1810*9356374aSAndroid Build Coastguard Worker   //
1811*9356374aSAndroid Build Coastguard Worker   // int f<int>(int (&) [alignof (int{})])
1812*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiET_RAaztlS0_E_S0_", tmp, sizeof(tmp)));
1813*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1814*9356374aSAndroid Build Coastguard Worker }
1815*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,NoexceptExpression)1816*9356374aSAndroid Build Coastguard Worker TEST(Demangle, NoexceptExpression) {
1817*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1818*9356374aSAndroid Build Coastguard Worker 
1819*9356374aSAndroid Build Coastguard Worker   // Source:
1820*9356374aSAndroid Build Coastguard Worker   //
1821*9356374aSAndroid Build Coastguard Worker   // template <class T> void f(T (&a)[noexcept(T{})]) {}
1822*9356374aSAndroid Build Coastguard Worker   // template void f<int>(int (&)[noexcept(int{})]);
1823*9356374aSAndroid Build Coastguard Worker   //
1824*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1825*9356374aSAndroid Build Coastguard Worker   //
1826*9356374aSAndroid Build Coastguard Worker   // void f<int>(int (&) [noexcept (int{})])
1827*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIiEvRAnxtlT_E_S0_", tmp, sizeof(tmp)));
1828*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1829*9356374aSAndroid Build Coastguard Worker }
1830*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,UnaryThrow)1831*9356374aSAndroid Build Coastguard Worker TEST(Demangle, UnaryThrow) {
1832*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1833*9356374aSAndroid Build Coastguard Worker 
1834*9356374aSAndroid Build Coastguard Worker   // Source:
1835*9356374aSAndroid Build Coastguard Worker   //
1836*9356374aSAndroid Build Coastguard Worker   // template <bool b> decltype(b ? throw b : 0) f() { return 0; }
1837*9356374aSAndroid Build Coastguard Worker   // template decltype(false ? throw false : 0) f<false>();
1838*9356374aSAndroid Build Coastguard Worker   //
1839*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1840*9356374aSAndroid Build Coastguard Worker   //
1841*9356374aSAndroid Build Coastguard Worker   // decltype(false ? throw false : 0) f<false>()
1842*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fILb0EEDTquT_twT_Li0EEv", tmp, sizeof(tmp)));
1843*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1844*9356374aSAndroid Build Coastguard Worker }
1845*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,NullaryThrow)1846*9356374aSAndroid Build Coastguard Worker TEST(Demangle, NullaryThrow) {
1847*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1848*9356374aSAndroid Build Coastguard Worker 
1849*9356374aSAndroid Build Coastguard Worker   // Source:
1850*9356374aSAndroid Build Coastguard Worker   //
1851*9356374aSAndroid Build Coastguard Worker   // template <bool b> decltype(b ? throw : 0) f() { return 0; }
1852*9356374aSAndroid Build Coastguard Worker   // template decltype(false ? throw : 0) f<false>();
1853*9356374aSAndroid Build Coastguard Worker   //
1854*9356374aSAndroid Build Coastguard Worker   // Full LLVM demangling of the instantiation of f:
1855*9356374aSAndroid Build Coastguard Worker   //
1856*9356374aSAndroid Build Coastguard Worker   // decltype(false ? throw : 0) f<false>()
1857*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fILb0EEDTquT_trLi0EEv", tmp, sizeof(tmp)));
1858*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1859*9356374aSAndroid Build Coastguard Worker }
1860*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,ThreadLocalWrappers)1861*9356374aSAndroid Build Coastguard Worker TEST(Demangle, ThreadLocalWrappers) {
1862*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1863*9356374aSAndroid Build Coastguard Worker 
1864*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZTWN2ns3varE", tmp, sizeof(tmp)));
1865*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("thread-local wrapper routine for ns::var", tmp);
1866*9356374aSAndroid Build Coastguard Worker 
1867*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_ZTHN2ns3varE", tmp, sizeof(tmp)));
1868*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("thread-local initialization routine for ns::var", tmp);
1869*9356374aSAndroid Build Coastguard Worker }
1870*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,DubiousSrStSymbols)1871*9356374aSAndroid Build Coastguard Worker TEST(Demangle, DubiousSrStSymbols) {
1872*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1873*9356374aSAndroid Build Coastguard Worker 
1874*9356374aSAndroid Build Coastguard Worker   // GNU demangling (not accepted by LLVM):
1875*9356374aSAndroid Build Coastguard Worker   //
1876*9356374aSAndroid Build Coastguard Worker   // S<std::u<char>::v> f<char>()
1877*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_Z1fIcE1SIXsrSt1uIT_E1vEEv", tmp, sizeof(tmp)));
1878*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("f<>()", tmp);
1879*9356374aSAndroid Build Coastguard Worker 
1880*9356374aSAndroid Build Coastguard Worker   // A real case from the wild.
1881*9356374aSAndroid Build Coastguard Worker   //
1882*9356374aSAndroid Build Coastguard Worker   // GNU demangling (not accepted by LLVM) with line breaks and indentation
1883*9356374aSAndroid Build Coastguard Worker   // added for readability:
1884*9356374aSAndroid Build Coastguard Worker   //
1885*9356374aSAndroid Build Coastguard Worker   // __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type
1886*9356374aSAndroid Build Coastguard Worker   // std::operator==<char>(
1887*9356374aSAndroid Build Coastguard Worker   //     std::__cxx11::basic_string<char, std::char_traits<char>,
1888*9356374aSAndroid Build Coastguard Worker   //                                std::allocator<char> > const&,
1889*9356374aSAndroid Build Coastguard Worker   //     std::__cxx11::basic_string<char, std::char_traits<char>,
1890*9356374aSAndroid Build Coastguard Worker   //                                std::allocator<char> > const&)
1891*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle(
1892*9356374aSAndroid Build Coastguard Worker       "_ZSteqIcEN9__gnu_cxx11__enable_if"
1893*9356374aSAndroid Build Coastguard Worker       "IXsrSt9__is_charIT_E7__valueEbE"
1894*9356374aSAndroid Build Coastguard Worker       "6__typeE"
1895*9356374aSAndroid Build Coastguard Worker       "RKNSt7__cxx1112basic_stringIS3_St11char_traitsIS3_ESaIS3_EEESE_",
1896*9356374aSAndroid Build Coastguard Worker       tmp, sizeof(tmp)));
1897*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("std::operator==<>()", tmp);
1898*9356374aSAndroid Build Coastguard Worker }
1899*9356374aSAndroid Build Coastguard Worker 
1900*9356374aSAndroid Build Coastguard Worker // Test one Rust symbol to exercise Demangle's delegation path.  Rust demangling
1901*9356374aSAndroid Build Coastguard Worker // itself is more thoroughly tested in demangle_rust_test.cc.
TEST(Demangle,DelegatesToDemangleRustSymbolEncoding)1902*9356374aSAndroid Build Coastguard Worker TEST(Demangle, DelegatesToDemangleRustSymbolEncoding) {
1903*9356374aSAndroid Build Coastguard Worker   char tmp[80];
1904*9356374aSAndroid Build Coastguard Worker 
1905*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(Demangle("_RNvC8my_crate7my_func", tmp, sizeof(tmp)));
1906*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("my_crate::my_func", tmp);
1907*9356374aSAndroid Build Coastguard Worker }
1908*9356374aSAndroid Build Coastguard Worker 
1909*9356374aSAndroid Build Coastguard Worker // Tests that verify that Demangle footprint is within some limit.
1910*9356374aSAndroid Build Coastguard Worker // They are not to be run under sanitizers as the sanitizers increase
1911*9356374aSAndroid Build Coastguard Worker // stack consumption by about 4x.
1912*9356374aSAndroid Build Coastguard Worker #if defined(ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION) && \
1913*9356374aSAndroid Build Coastguard Worker     !defined(ABSL_HAVE_ADDRESS_SANITIZER) &&                   \
1914*9356374aSAndroid Build Coastguard Worker     !defined(ABSL_HAVE_MEMORY_SANITIZER) &&                    \
1915*9356374aSAndroid Build Coastguard Worker     !defined(ABSL_HAVE_THREAD_SANITIZER)
1916*9356374aSAndroid Build Coastguard Worker 
1917*9356374aSAndroid Build Coastguard Worker static const char *g_mangled;
1918*9356374aSAndroid Build Coastguard Worker static char g_demangle_buffer[4096];
1919*9356374aSAndroid Build Coastguard Worker static char *g_demangle_result;
1920*9356374aSAndroid Build Coastguard Worker 
DemangleSignalHandler(int signo)1921*9356374aSAndroid Build Coastguard Worker static void DemangleSignalHandler(int signo) {
1922*9356374aSAndroid Build Coastguard Worker   if (Demangle(g_mangled, g_demangle_buffer, sizeof(g_demangle_buffer))) {
1923*9356374aSAndroid Build Coastguard Worker     g_demangle_result = g_demangle_buffer;
1924*9356374aSAndroid Build Coastguard Worker   } else {
1925*9356374aSAndroid Build Coastguard Worker     g_demangle_result = nullptr;
1926*9356374aSAndroid Build Coastguard Worker   }
1927*9356374aSAndroid Build Coastguard Worker }
1928*9356374aSAndroid Build Coastguard Worker 
1929*9356374aSAndroid Build Coastguard Worker // Call Demangle and figure out the stack footprint of this call.
DemangleStackConsumption(const char * mangled,int * stack_consumed)1930*9356374aSAndroid Build Coastguard Worker static const char *DemangleStackConsumption(const char *mangled,
1931*9356374aSAndroid Build Coastguard Worker                                             int *stack_consumed) {
1932*9356374aSAndroid Build Coastguard Worker   g_mangled = mangled;
1933*9356374aSAndroid Build Coastguard Worker   *stack_consumed = GetSignalHandlerStackConsumption(DemangleSignalHandler);
1934*9356374aSAndroid Build Coastguard Worker   LOG(INFO) << "Stack consumption of Demangle: " << *stack_consumed;
1935*9356374aSAndroid Build Coastguard Worker   return g_demangle_result;
1936*9356374aSAndroid Build Coastguard Worker }
1937*9356374aSAndroid Build Coastguard Worker 
1938*9356374aSAndroid Build Coastguard Worker // Demangle stack consumption should be within 8kB for simple mangled names
1939*9356374aSAndroid Build Coastguard Worker // with some level of nesting. With alternate signal stack we have 64K,
1940*9356374aSAndroid Build Coastguard Worker // but some signal handlers run on thread stack, and could have arbitrarily
1941*9356374aSAndroid Build Coastguard Worker // little space left (so we don't want to make this number too large).
1942*9356374aSAndroid Build Coastguard Worker const int kStackConsumptionUpperLimit = 8192;
1943*9356374aSAndroid Build Coastguard Worker 
1944*9356374aSAndroid Build Coastguard Worker // Returns a mangled name nested to the given depth.
NestedMangledName(int depth)1945*9356374aSAndroid Build Coastguard Worker static std::string NestedMangledName(int depth) {
1946*9356374aSAndroid Build Coastguard Worker   std::string mangled_name = "_Z1a";
1947*9356374aSAndroid Build Coastguard Worker   if (depth > 0) {
1948*9356374aSAndroid Build Coastguard Worker     mangled_name += "IXL";
1949*9356374aSAndroid Build Coastguard Worker     mangled_name += NestedMangledName(depth - 1);
1950*9356374aSAndroid Build Coastguard Worker     mangled_name += "EEE";
1951*9356374aSAndroid Build Coastguard Worker   }
1952*9356374aSAndroid Build Coastguard Worker   return mangled_name;
1953*9356374aSAndroid Build Coastguard Worker }
1954*9356374aSAndroid Build Coastguard Worker 
TEST(Demangle,DemangleStackConsumption)1955*9356374aSAndroid Build Coastguard Worker TEST(Demangle, DemangleStackConsumption) {
1956*9356374aSAndroid Build Coastguard Worker   // Measure stack consumption of Demangle for nested mangled names of varying
1957*9356374aSAndroid Build Coastguard Worker   // depth.  Since Demangle is implemented as a recursive descent parser,
1958*9356374aSAndroid Build Coastguard Worker   // stack consumption will grow as the nesting depth increases.  By measuring
1959*9356374aSAndroid Build Coastguard Worker   // the stack consumption for increasing depths, we can see the growing
1960*9356374aSAndroid Build Coastguard Worker   // impact of any stack-saving changes made to the code for Demangle.
1961*9356374aSAndroid Build Coastguard Worker   int stack_consumed = 0;
1962*9356374aSAndroid Build Coastguard Worker 
1963*9356374aSAndroid Build Coastguard Worker   const char *demangled =
1964*9356374aSAndroid Build Coastguard Worker       DemangleStackConsumption("_Z6foobarv", &stack_consumed);
1965*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("foobar()", demangled);
1966*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(stack_consumed, 0);
1967*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
1968*9356374aSAndroid Build Coastguard Worker 
1969*9356374aSAndroid Build Coastguard Worker   const std::string nested_mangled_name0 = NestedMangledName(0);
1970*9356374aSAndroid Build Coastguard Worker   demangled = DemangleStackConsumption(nested_mangled_name0.c_str(),
1971*9356374aSAndroid Build Coastguard Worker                                        &stack_consumed);
1972*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("a", demangled);
1973*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(stack_consumed, 0);
1974*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
1975*9356374aSAndroid Build Coastguard Worker 
1976*9356374aSAndroid Build Coastguard Worker   const std::string nested_mangled_name1 = NestedMangledName(1);
1977*9356374aSAndroid Build Coastguard Worker   demangled = DemangleStackConsumption(nested_mangled_name1.c_str(),
1978*9356374aSAndroid Build Coastguard Worker                                        &stack_consumed);
1979*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("a<>", demangled);
1980*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(stack_consumed, 0);
1981*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
1982*9356374aSAndroid Build Coastguard Worker 
1983*9356374aSAndroid Build Coastguard Worker   const std::string nested_mangled_name2 = NestedMangledName(2);
1984*9356374aSAndroid Build Coastguard Worker   demangled = DemangleStackConsumption(nested_mangled_name2.c_str(),
1985*9356374aSAndroid Build Coastguard Worker                                        &stack_consumed);
1986*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("a<>", demangled);
1987*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(stack_consumed, 0);
1988*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
1989*9356374aSAndroid Build Coastguard Worker 
1990*9356374aSAndroid Build Coastguard Worker   const std::string nested_mangled_name3 = NestedMangledName(3);
1991*9356374aSAndroid Build Coastguard Worker   demangled = DemangleStackConsumption(nested_mangled_name3.c_str(),
1992*9356374aSAndroid Build Coastguard Worker                                        &stack_consumed);
1993*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("a<>", demangled);
1994*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(stack_consumed, 0);
1995*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
1996*9356374aSAndroid Build Coastguard Worker }
1997*9356374aSAndroid Build Coastguard Worker 
1998*9356374aSAndroid Build Coastguard Worker #endif  // Stack consumption tests
1999*9356374aSAndroid Build Coastguard Worker 
TestOnInput(const char * input)2000*9356374aSAndroid Build Coastguard Worker static void TestOnInput(const char* input) {
2001*9356374aSAndroid Build Coastguard Worker   static const int kOutSize = 1048576;
2002*9356374aSAndroid Build Coastguard Worker   auto out = absl::make_unique<char[]>(kOutSize);
2003*9356374aSAndroid Build Coastguard Worker   Demangle(input, out.get(), kOutSize);
2004*9356374aSAndroid Build Coastguard Worker }
2005*9356374aSAndroid Build Coastguard Worker 
TEST(DemangleRegression,NegativeLength)2006*9356374aSAndroid Build Coastguard Worker TEST(DemangleRegression, NegativeLength) {
2007*9356374aSAndroid Build Coastguard Worker   TestOnInput("_ZZn4");
2008*9356374aSAndroid Build Coastguard Worker }
2009*9356374aSAndroid Build Coastguard Worker 
TEST(DemangleRegression,DeeplyNestedArrayType)2010*9356374aSAndroid Build Coastguard Worker TEST(DemangleRegression, DeeplyNestedArrayType) {
2011*9356374aSAndroid Build Coastguard Worker   const int depth = 100000;
2012*9356374aSAndroid Build Coastguard Worker   std::string data = "_ZStI";
2013*9356374aSAndroid Build Coastguard Worker   data.reserve(data.size() + 3 * depth + 1);
2014*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < depth; i++) {
2015*9356374aSAndroid Build Coastguard Worker     data += "A1_";
2016*9356374aSAndroid Build Coastguard Worker   }
2017*9356374aSAndroid Build Coastguard Worker   TestOnInput(data.c_str());
2018*9356374aSAndroid Build Coastguard Worker }
2019*9356374aSAndroid Build Coastguard Worker 
2020*9356374aSAndroid Build Coastguard Worker struct Base {
2021*9356374aSAndroid Build Coastguard Worker   virtual ~Base() = default;
2022*9356374aSAndroid Build Coastguard Worker };
2023*9356374aSAndroid Build Coastguard Worker 
2024*9356374aSAndroid Build Coastguard Worker struct Derived : public Base {};
2025*9356374aSAndroid Build Coastguard Worker 
TEST(DemangleStringTest,SupportsSymbolNameReturnedByTypeId)2026*9356374aSAndroid Build Coastguard Worker TEST(DemangleStringTest, SupportsSymbolNameReturnedByTypeId) {
2027*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(DemangleString(typeid(int).name()), "int");
2028*9356374aSAndroid Build Coastguard Worker   // We want to test that `DemangleString` can demangle the symbol names
2029*9356374aSAndroid Build Coastguard Worker   // returned by `typeid`, but without hard-coding the actual demangled values
2030*9356374aSAndroid Build Coastguard Worker   // (because they are platform-specific).
2031*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
2032*9356374aSAndroid Build Coastguard Worker       DemangleString(typeid(Base).name()),
2033*9356374aSAndroid Build Coastguard Worker       ContainsRegex("absl.*debugging_internal.*anonymous namespace.*::Base"));
2034*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(DemangleString(typeid(Derived).name()),
2035*9356374aSAndroid Build Coastguard Worker               ContainsRegex(
2036*9356374aSAndroid Build Coastguard Worker                   "absl.*debugging_internal.*anonymous namespace.*::Derived"));
2037*9356374aSAndroid Build Coastguard Worker }
2038*9356374aSAndroid Build Coastguard Worker 
2039*9356374aSAndroid Build Coastguard Worker }  // namespace
2040*9356374aSAndroid Build Coastguard Worker }  // namespace debugging_internal
2041*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
2042*9356374aSAndroid Build Coastguard Worker }  // namespace absl
2043