xref: /aosp_15_r20/external/clang/unittests/AST/ASTImporterTest.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- unittest/AST/ASTImporterTest.cpp - AST node import test ------------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // Tests for the correct import of AST nodes from one AST context to another.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #include "clang/AST/ASTContext.h"
15*67e74705SXin Li #include "clang/AST/ASTImporter.h"
16*67e74705SXin Li #include "MatchVerifier.h"
17*67e74705SXin Li #include "clang/ASTMatchers/ASTMatchFinder.h"
18*67e74705SXin Li #include "clang/ASTMatchers/ASTMatchers.h"
19*67e74705SXin Li #include "clang/Tooling/Tooling.h"
20*67e74705SXin Li #include "gtest/gtest.h"
21*67e74705SXin Li 
22*67e74705SXin Li namespace clang {
23*67e74705SXin Li namespace ast_matchers {
24*67e74705SXin Li 
25*67e74705SXin Li typedef std::vector<std::string> StringVector;
26*67e74705SXin Li 
getLangArgs(Language Lang,StringVector & Args)27*67e74705SXin Li void getLangArgs(Language Lang, StringVector &Args) {
28*67e74705SXin Li   switch (Lang) {
29*67e74705SXin Li   case Lang_C:
30*67e74705SXin Li     Args.insert(Args.end(), { "-x", "c", "-std=c99" });
31*67e74705SXin Li     break;
32*67e74705SXin Li   case Lang_C89:
33*67e74705SXin Li     Args.insert(Args.end(), { "-x", "c", "-std=c89" });
34*67e74705SXin Li     break;
35*67e74705SXin Li   case Lang_CXX:
36*67e74705SXin Li     Args.push_back("-std=c++98");
37*67e74705SXin Li     break;
38*67e74705SXin Li   case Lang_CXX11:
39*67e74705SXin Li     Args.push_back("-std=c++11");
40*67e74705SXin Li     break;
41*67e74705SXin Li   case Lang_OpenCL:
42*67e74705SXin Li   case Lang_OBJCXX:
43*67e74705SXin Li     break;
44*67e74705SXin Li   }
45*67e74705SXin Li }
46*67e74705SXin Li 
47*67e74705SXin Li template<typename NodeType, typename MatcherType>
48*67e74705SXin Li testing::AssertionResult
testImport(const std::string & FromCode,Language FromLang,const std::string & ToCode,Language ToLang,MatchVerifier<NodeType> & Verifier,const MatcherType & AMatcher)49*67e74705SXin Li testImport(const std::string &FromCode, Language FromLang,
50*67e74705SXin Li            const std::string &ToCode, Language ToLang,
51*67e74705SXin Li            MatchVerifier<NodeType> &Verifier,
52*67e74705SXin Li            const MatcherType &AMatcher) {
53*67e74705SXin Li   StringVector FromArgs, ToArgs;
54*67e74705SXin Li   getLangArgs(FromLang, FromArgs);
55*67e74705SXin Li   getLangArgs(ToLang, ToArgs);
56*67e74705SXin Li 
57*67e74705SXin Li   const char *const InputFileName = "input.cc";
58*67e74705SXin Li   const char *const OutputFileName = "output.cc";
59*67e74705SXin Li 
60*67e74705SXin Li   std::unique_ptr<ASTUnit>
61*67e74705SXin Li       FromAST = tooling::buildASTFromCodeWithArgs(
62*67e74705SXin Li         FromCode, FromArgs, InputFileName),
63*67e74705SXin Li       ToAST = tooling::buildASTFromCodeWithArgs(ToCode, ToArgs, OutputFileName);
64*67e74705SXin Li 
65*67e74705SXin Li   ASTContext &FromCtx = FromAST->getASTContext(),
66*67e74705SXin Li       &ToCtx = ToAST->getASTContext();
67*67e74705SXin Li 
68*67e74705SXin Li   // Add input.cc to virtual file system so importer can 'find' it
69*67e74705SXin Li   // while importing SourceLocations.
70*67e74705SXin Li   vfs::OverlayFileSystem *OFS = static_cast<vfs::OverlayFileSystem *>(
71*67e74705SXin Li         ToCtx.getSourceManager().getFileManager().getVirtualFileSystem().get());
72*67e74705SXin Li   vfs::InMemoryFileSystem *MFS = static_cast<vfs::InMemoryFileSystem *>(
73*67e74705SXin Li         OFS->overlays_begin()->get());
74*67e74705SXin Li   MFS->addFile(InputFileName, 0,
75*67e74705SXin Li                llvm::MemoryBuffer::getMemBuffer(FromCode.c_str()));
76*67e74705SXin Li 
77*67e74705SXin Li   ASTImporter Importer(ToCtx, ToAST->getFileManager(),
78*67e74705SXin Li                        FromCtx, FromAST->getFileManager(), false);
79*67e74705SXin Li 
80*67e74705SXin Li   IdentifierInfo *ImportedII = &FromCtx.Idents.get("declToImport");
81*67e74705SXin Li   assert(ImportedII && "Declaration with 'declToImport' name"
82*67e74705SXin Li                        "should be specified in test!");
83*67e74705SXin Li   DeclarationName ImportDeclName(ImportedII);
84*67e74705SXin Li   SmallVector<NamedDecl *, 4> FoundDecls;
85*67e74705SXin Li   FromCtx.getTranslationUnitDecl()->localUncachedLookup(
86*67e74705SXin Li         ImportDeclName, FoundDecls);
87*67e74705SXin Li 
88*67e74705SXin Li   if (FoundDecls.size() != 1)
89*67e74705SXin Li     return testing::AssertionFailure() << "Multiple declarations were found!";
90*67e74705SXin Li 
91*67e74705SXin Li   auto Imported = Importer.Import(*FoundDecls.begin());
92*67e74705SXin Li   if (!Imported)
93*67e74705SXin Li     return testing::AssertionFailure() << "Import failed, nullptr returned!";
94*67e74705SXin Li 
95*67e74705SXin Li   // This should dump source locations and assert if some source locations
96*67e74705SXin Li   // were not imported
97*67e74705SXin Li   SmallString<1024> ImportChecker;
98*67e74705SXin Li   llvm::raw_svector_ostream ToNothing(ImportChecker);
99*67e74705SXin Li   ToCtx.getTranslationUnitDecl()->print(ToNothing);
100*67e74705SXin Li 
101*67e74705SXin Li   return Verifier.match(Imported, AMatcher);
102*67e74705SXin Li }
103*67e74705SXin Li 
TEST(ImportExpr,ImportStringLiteral)104*67e74705SXin Li TEST(ImportExpr, ImportStringLiteral) {
105*67e74705SXin Li   MatchVerifier<Decl> Verifier;
106*67e74705SXin Li   EXPECT_TRUE(testImport("void declToImport() { \"foo\"; }",
107*67e74705SXin Li                          Lang_CXX, "", Lang_CXX, Verifier,
108*67e74705SXin Li                          functionDecl(
109*67e74705SXin Li                            hasBody(
110*67e74705SXin Li                              compoundStmt(
111*67e74705SXin Li                                has(
112*67e74705SXin Li                                  stringLiteral(
113*67e74705SXin Li                                    hasType(
114*67e74705SXin Li                                      asString("const char [4]")))))))));
115*67e74705SXin Li   EXPECT_TRUE(testImport("void declToImport() { L\"foo\"; }",
116*67e74705SXin Li                          Lang_CXX, "", Lang_CXX, Verifier,
117*67e74705SXin Li                          functionDecl(
118*67e74705SXin Li                            hasBody(
119*67e74705SXin Li                              compoundStmt(
120*67e74705SXin Li                                has(
121*67e74705SXin Li                                  stringLiteral(
122*67e74705SXin Li                                    hasType(
123*67e74705SXin Li                                      asString("const wchar_t [4]")))))))));
124*67e74705SXin Li   EXPECT_TRUE(testImport("void declToImport() { \"foo\" \"bar\"; }",
125*67e74705SXin Li                          Lang_CXX, "", Lang_CXX, Verifier,
126*67e74705SXin Li                          functionDecl(
127*67e74705SXin Li                            hasBody(
128*67e74705SXin Li                              compoundStmt(
129*67e74705SXin Li                                has(
130*67e74705SXin Li                                  stringLiteral(
131*67e74705SXin Li                                    hasType(
132*67e74705SXin Li                                      asString("const char [7]")))))))));
133*67e74705SXin Li }
134*67e74705SXin Li 
TEST(ImportExpr,ImportGNUNullExpr)135*67e74705SXin Li TEST(ImportExpr, ImportGNUNullExpr) {
136*67e74705SXin Li   MatchVerifier<Decl> Verifier;
137*67e74705SXin Li   EXPECT_TRUE(testImport("void declToImport() { __null; }",
138*67e74705SXin Li                          Lang_CXX, "", Lang_CXX, Verifier,
139*67e74705SXin Li                          functionDecl(
140*67e74705SXin Li                            hasBody(
141*67e74705SXin Li                              compoundStmt(
142*67e74705SXin Li                                has(
143*67e74705SXin Li                                  gnuNullExpr(
144*67e74705SXin Li                                    hasType(isInteger()))))))));
145*67e74705SXin Li }
146*67e74705SXin Li 
TEST(ImportExpr,ImportCXXNullPtrLiteralExpr)147*67e74705SXin Li TEST(ImportExpr, ImportCXXNullPtrLiteralExpr) {
148*67e74705SXin Li   MatchVerifier<Decl> Verifier;
149*67e74705SXin Li   EXPECT_TRUE(testImport("void declToImport() { nullptr; }",
150*67e74705SXin Li                          Lang_CXX11, "", Lang_CXX11, Verifier,
151*67e74705SXin Li                          functionDecl(
152*67e74705SXin Li                            hasBody(
153*67e74705SXin Li                              compoundStmt(
154*67e74705SXin Li                                has(
155*67e74705SXin Li                                  cxxNullPtrLiteralExpr()))))));
156*67e74705SXin Li }
157*67e74705SXin Li 
158*67e74705SXin Li 
TEST(ImportExpr,ImportFloatinglLiteralExpr)159*67e74705SXin Li TEST(ImportExpr, ImportFloatinglLiteralExpr) {
160*67e74705SXin Li   MatchVerifier<Decl> Verifier;
161*67e74705SXin Li   EXPECT_TRUE(testImport("void declToImport() { 1.0; }",
162*67e74705SXin Li                          Lang_CXX, "", Lang_CXX, Verifier,
163*67e74705SXin Li                          functionDecl(
164*67e74705SXin Li                            hasBody(
165*67e74705SXin Li                              compoundStmt(
166*67e74705SXin Li                                has(
167*67e74705SXin Li                                  floatLiteral(
168*67e74705SXin Li                                    equals(1.0),
169*67e74705SXin Li                                    hasType(asString("double")))))))));
170*67e74705SXin Li   EXPECT_TRUE(testImport("void declToImport() { 1.0e-5f; }",
171*67e74705SXin Li                          Lang_CXX, "", Lang_CXX, Verifier,
172*67e74705SXin Li                          functionDecl(
173*67e74705SXin Li                            hasBody(
174*67e74705SXin Li                              compoundStmt(
175*67e74705SXin Li                                has(
176*67e74705SXin Li                                  floatLiteral(
177*67e74705SXin Li                                    equals(1.0e-5f),
178*67e74705SXin Li                                    hasType(asString("float")))))))));
179*67e74705SXin Li }
180*67e74705SXin Li 
TEST(ImportExpr,ImportCompoundLiteralExpr)181*67e74705SXin Li TEST(ImportExpr, ImportCompoundLiteralExpr) {
182*67e74705SXin Li   MatchVerifier<Decl> Verifier;
183*67e74705SXin Li   EXPECT_TRUE(
184*67e74705SXin Li         testImport(
185*67e74705SXin Li           "void declToImport() {"
186*67e74705SXin Li           "  struct s { int x; long y; unsigned z; }; "
187*67e74705SXin Li           "  (struct s){ 42, 0L, 1U }; }",
188*67e74705SXin Li           Lang_CXX, "", Lang_CXX, Verifier,
189*67e74705SXin Li           functionDecl(
190*67e74705SXin Li             hasBody(
191*67e74705SXin Li               compoundStmt(
192*67e74705SXin Li                 has(
193*67e74705SXin Li                   compoundLiteralExpr(
194*67e74705SXin Li                     hasType(asString("struct s")),
195*67e74705SXin Li                     has(initListExpr(
196*67e74705SXin Li                       hasType(asString("struct s")),
197*67e74705SXin Li                       has(integerLiteral(
198*67e74705SXin Li                             equals(42), hasType(asString("int")))),
199*67e74705SXin Li                       has(integerLiteral(
200*67e74705SXin Li                             equals(0), hasType(asString("long")))),
201*67e74705SXin Li                       has(integerLiteral(
202*67e74705SXin Li                             equals(1),
203*67e74705SXin Li                             hasType(asString("unsigned int"))))
204*67e74705SXin Li                       )))))))));
205*67e74705SXin Li }
206*67e74705SXin Li 
TEST(ImportExpr,ImportCXXThisExpr)207*67e74705SXin Li TEST(ImportExpr, ImportCXXThisExpr) {
208*67e74705SXin Li   MatchVerifier<Decl> Verifier;
209*67e74705SXin Li   EXPECT_TRUE(
210*67e74705SXin Li         testImport("class declToImport { void f() { this; } };",
211*67e74705SXin Li                    Lang_CXX, "", Lang_CXX, Verifier,
212*67e74705SXin Li                    cxxRecordDecl(
213*67e74705SXin Li                      hasMethod(
214*67e74705SXin Li                        hasBody(
215*67e74705SXin Li                          compoundStmt(
216*67e74705SXin Li                            has(
217*67e74705SXin Li                              cxxThisExpr(
218*67e74705SXin Li                                hasType(
219*67e74705SXin Li                                  asString("class declToImport *"))))))))));
220*67e74705SXin Li }
221*67e74705SXin Li 
TEST(ImportExpr,ImportAtomicExpr)222*67e74705SXin Li TEST(ImportExpr, ImportAtomicExpr) {
223*67e74705SXin Li   MatchVerifier<Decl> Verifier;
224*67e74705SXin Li   EXPECT_TRUE(testImport(
225*67e74705SXin Li       "void declToImport() { int *ptr; __atomic_load_n(ptr, 1); }", Lang_CXX,
226*67e74705SXin Li       "", Lang_CXX, Verifier,
227*67e74705SXin Li       functionDecl(hasBody(compoundStmt(has(atomicExpr(
228*67e74705SXin Li           has(ignoringParenImpCasts(
229*67e74705SXin Li               declRefExpr(hasDeclaration(varDecl(hasName("ptr"))),
230*67e74705SXin Li                           hasType(asString("int *"))))),
231*67e74705SXin Li           has(integerLiteral(equals(1), hasType(asString("int")))))))))));
232*67e74705SXin Li }
233*67e74705SXin Li 
TEST(ImportExpr,ImportLabelDeclAndAddrLabelExpr)234*67e74705SXin Li TEST(ImportExpr, ImportLabelDeclAndAddrLabelExpr) {
235*67e74705SXin Li   MatchVerifier<Decl> Verifier;
236*67e74705SXin Li   EXPECT_TRUE(
237*67e74705SXin Li         testImport(
238*67e74705SXin Li           "void declToImport() { loop: goto loop; &&loop; }",
239*67e74705SXin Li           Lang_CXX, "", Lang_CXX, Verifier,
240*67e74705SXin Li           functionDecl(
241*67e74705SXin Li             hasBody(
242*67e74705SXin Li               compoundStmt(
243*67e74705SXin Li                 has(labelStmt(hasDeclaration(labelDecl(hasName("loop"))))),
244*67e74705SXin Li                 has(addrLabelExpr(hasDeclaration(labelDecl(hasName("loop")))))
245*67e74705SXin Li                 )))));
246*67e74705SXin Li }
247*67e74705SXin Li 
AST_MATCHER_P(TemplateDecl,hasTemplateDecl,internal::Matcher<NamedDecl>,InnerMatcher)248*67e74705SXin Li AST_MATCHER_P(TemplateDecl, hasTemplateDecl,
249*67e74705SXin Li               internal::Matcher<NamedDecl>, InnerMatcher) {
250*67e74705SXin Li   const NamedDecl *Template = Node.getTemplatedDecl();
251*67e74705SXin Li   return Template && InnerMatcher.matches(*Template, Finder, Builder);
252*67e74705SXin Li }
253*67e74705SXin Li 
TEST(ImportExpr,ImportParenListExpr)254*67e74705SXin Li TEST(ImportExpr, ImportParenListExpr) {
255*67e74705SXin Li   MatchVerifier<Decl> Verifier;
256*67e74705SXin Li   EXPECT_TRUE(
257*67e74705SXin Li         testImport(
258*67e74705SXin Li           "template<typename T> class dummy { void f() { dummy X(*this); } };"
259*67e74705SXin Li           "typedef dummy<int> declToImport;"
260*67e74705SXin Li           "template class dummy<int>;",
261*67e74705SXin Li           Lang_CXX, "", Lang_CXX, Verifier,
262*67e74705SXin Li           typedefDecl(
263*67e74705SXin Li             hasType(
264*67e74705SXin Li               templateSpecializationType(
265*67e74705SXin Li                 hasDeclaration(
266*67e74705SXin Li                   classTemplateDecl(
267*67e74705SXin Li                     hasTemplateDecl(
268*67e74705SXin Li                       cxxRecordDecl(
269*67e74705SXin Li                         hasMethod(
270*67e74705SXin Li                         allOf(
271*67e74705SXin Li                           hasName("f"),
272*67e74705SXin Li                           hasBody(
273*67e74705SXin Li                             compoundStmt(
274*67e74705SXin Li                               has(
275*67e74705SXin Li                                 declStmt(
276*67e74705SXin Li                                   hasSingleDecl(
277*67e74705SXin Li                                     varDecl(
278*67e74705SXin Li                                       hasInitializer(
279*67e74705SXin Li                                         parenListExpr(
280*67e74705SXin Li                                           has(
281*67e74705SXin Li                                             unaryOperator(
282*67e74705SXin Li                                               hasOperatorName("*"),
283*67e74705SXin Li                                               hasUnaryOperand(cxxThisExpr())
284*67e74705SXin Li                                               )))))))))))))))))))));
285*67e74705SXin Li }
286*67e74705SXin Li 
TEST(ImportExpr,ImportStmtExpr)287*67e74705SXin Li TEST(ImportExpr, ImportStmtExpr) {
288*67e74705SXin Li   MatchVerifier<Decl> Verifier;
289*67e74705SXin Li   // NOTE: has() ignores implicit casts, using hasDescendant() to match it
290*67e74705SXin Li   EXPECT_TRUE(
291*67e74705SXin Li         testImport(
292*67e74705SXin Li           "void declToImport() { int b; int a = b ?: 1; int C = ({int X=4; X;}); }",
293*67e74705SXin Li           Lang_CXX, "", Lang_CXX, Verifier,
294*67e74705SXin Li           functionDecl(
295*67e74705SXin Li             hasBody(
296*67e74705SXin Li               compoundStmt(
297*67e74705SXin Li                 has(
298*67e74705SXin Li                   declStmt(
299*67e74705SXin Li                     hasSingleDecl(
300*67e74705SXin Li                       varDecl(
301*67e74705SXin Li                         hasName("C"),
302*67e74705SXin Li                         hasType(asString("int")),
303*67e74705SXin Li                         hasInitializer(
304*67e74705SXin Li                           stmtExpr(
305*67e74705SXin Li                             hasAnySubstatement(
306*67e74705SXin Li                               declStmt(
307*67e74705SXin Li                                 hasSingleDecl(
308*67e74705SXin Li                                   varDecl(
309*67e74705SXin Li                                     hasName("X"),
310*67e74705SXin Li                                     hasType(asString("int")),
311*67e74705SXin Li                                     hasInitializer(
312*67e74705SXin Li                                       integerLiteral(equals(4))))))),
313*67e74705SXin Li                             hasDescendant(
314*67e74705SXin Li                               implicitCastExpr()
315*67e74705SXin Li                               ))))))))))));
316*67e74705SXin Li }
317*67e74705SXin Li 
TEST(ImportExpr,ImportConditionalOperator)318*67e74705SXin Li TEST(ImportExpr, ImportConditionalOperator) {
319*67e74705SXin Li   MatchVerifier<Decl> Verifier;
320*67e74705SXin Li   EXPECT_TRUE(
321*67e74705SXin Li         testImport(
322*67e74705SXin Li           "void declToImport() { true ? 1 : -5; }",
323*67e74705SXin Li           Lang_CXX, "", Lang_CXX, Verifier,
324*67e74705SXin Li           functionDecl(
325*67e74705SXin Li             hasBody(
326*67e74705SXin Li               compoundStmt(
327*67e74705SXin Li                 has(
328*67e74705SXin Li                   conditionalOperator(
329*67e74705SXin Li                     hasCondition(cxxBoolLiteral(equals(true))),
330*67e74705SXin Li                     hasTrueExpression(integerLiteral(equals(1))),
331*67e74705SXin Li                     hasFalseExpression(
332*67e74705SXin Li                       unaryOperator(hasUnaryOperand(integerLiteral(equals(5))))
333*67e74705SXin Li                       ))))))));
334*67e74705SXin Li }
335*67e74705SXin Li 
TEST(ImportExpr,ImportBinaryConditionalOperator)336*67e74705SXin Li TEST(ImportExpr, ImportBinaryConditionalOperator) {
337*67e74705SXin Li   MatchVerifier<Decl> Verifier;
338*67e74705SXin Li   EXPECT_TRUE(
339*67e74705SXin Li         testImport(
340*67e74705SXin Li           "void declToImport() { 1 ?: -5; }",
341*67e74705SXin Li           Lang_CXX, "", Lang_CXX, Verifier,
342*67e74705SXin Li           functionDecl(
343*67e74705SXin Li             hasBody(
344*67e74705SXin Li               compoundStmt(
345*67e74705SXin Li                 has(
346*67e74705SXin Li                   binaryConditionalOperator(
347*67e74705SXin Li                     hasCondition(
348*67e74705SXin Li                       implicitCastExpr(
349*67e74705SXin Li                         hasSourceExpression(
350*67e74705SXin Li                           opaqueValueExpr(
351*67e74705SXin Li                             hasSourceExpression(integerLiteral(equals(1))))),
352*67e74705SXin Li                         hasType(booleanType()))),
353*67e74705SXin Li                     hasTrueExpression(
354*67e74705SXin Li                       opaqueValueExpr(hasSourceExpression(
355*67e74705SXin Li                                         integerLiteral(equals(1))))),
356*67e74705SXin Li                     hasFalseExpression(
357*67e74705SXin Li                       unaryOperator(hasOperatorName("-"),
358*67e74705SXin Li                                     hasUnaryOperand(integerLiteral(equals(5)))))
359*67e74705SXin Li                       )))))));
360*67e74705SXin Li }
361*67e74705SXin Li 
TEST(ImportExpr,ImportDesignatedInitExpr)362*67e74705SXin Li TEST(ImportExpr, ImportDesignatedInitExpr) {
363*67e74705SXin Li   MatchVerifier<Decl> Verifier;
364*67e74705SXin Li   EXPECT_TRUE(testImport("void declToImport() {"
365*67e74705SXin Li                          "  struct point { double x; double y; };"
366*67e74705SXin Li                          "  struct point ptarray[10] = "
367*67e74705SXin Li                                 "{ [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; }",
368*67e74705SXin Li                          Lang_C, "", Lang_C, Verifier,
369*67e74705SXin Li                          functionDecl(
370*67e74705SXin Li                            hasBody(
371*67e74705SXin Li                              compoundStmt(
372*67e74705SXin Li                                has(
373*67e74705SXin Li                                  declStmt(
374*67e74705SXin Li                                    hasSingleDecl(
375*67e74705SXin Li                                      varDecl(
376*67e74705SXin Li                                        hasInitializer(
377*67e74705SXin Li                                          initListExpr(
378*67e74705SXin Li                                            hasSyntacticForm(
379*67e74705SXin Li                                              initListExpr(
380*67e74705SXin Li                                                has(
381*67e74705SXin Li                                                  designatedInitExpr(
382*67e74705SXin Li                                                    designatorCountIs(2),
383*67e74705SXin Li                                                    has(floatLiteral(
384*67e74705SXin Li                                                          equals(1.0))),
385*67e74705SXin Li                                                    has(integerLiteral(
386*67e74705SXin Li                                                          equals(2))))),
387*67e74705SXin Li                                                has(
388*67e74705SXin Li                                                  designatedInitExpr(
389*67e74705SXin Li                                                    designatorCountIs(2),
390*67e74705SXin Li                                                    has(floatLiteral(
391*67e74705SXin Li                                                          equals(2.0))),
392*67e74705SXin Li                                                    has(integerLiteral(
393*67e74705SXin Li                                                          equals(2))))),
394*67e74705SXin Li                                                has(
395*67e74705SXin Li                                                  designatedInitExpr(
396*67e74705SXin Li                                                    designatorCountIs(2),
397*67e74705SXin Li                                                    has(floatLiteral(
398*67e74705SXin Li                                                          equals(1.0))),
399*67e74705SXin Li                                                    has(integerLiteral(
400*67e74705SXin Li                                                          equals(0)))))
401*67e74705SXin Li                                                )))))))))))));
402*67e74705SXin Li }
403*67e74705SXin Li 
404*67e74705SXin Li 
TEST(ImportExpr,ImportPredefinedExpr)405*67e74705SXin Li TEST(ImportExpr, ImportPredefinedExpr) {
406*67e74705SXin Li   MatchVerifier<Decl> Verifier;
407*67e74705SXin Li   // __func__ expands as StringLiteral("declToImport")
408*67e74705SXin Li   EXPECT_TRUE(testImport("void declToImport() { __func__; }",
409*67e74705SXin Li                          Lang_CXX, "", Lang_CXX, Verifier,
410*67e74705SXin Li                          functionDecl(
411*67e74705SXin Li                            hasBody(
412*67e74705SXin Li                              compoundStmt(
413*67e74705SXin Li                                has(
414*67e74705SXin Li                                  predefinedExpr(
415*67e74705SXin Li                                    hasType(
416*67e74705SXin Li                                      asString("const char [13]")),
417*67e74705SXin Li                                    has(
418*67e74705SXin Li                                      stringLiteral(
419*67e74705SXin Li                                        hasType(
420*67e74705SXin Li                                          asString("const char [13]")))))))))));
421*67e74705SXin Li }
422*67e74705SXin Li 
TEST(ImportExpr,ImportInitListExpr)423*67e74705SXin Li TEST(ImportExpr, ImportInitListExpr) {
424*67e74705SXin Li   MatchVerifier<Decl> Verifier;
425*67e74705SXin Li   EXPECT_TRUE(
426*67e74705SXin Li         testImport(
427*67e74705SXin Li           "void declToImport() {"
428*67e74705SXin Li           "  struct point { double x; double y; };"
429*67e74705SXin Li           "  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0,"
430*67e74705SXin Li           "                        [0].x = 1.0 }; }",
431*67e74705SXin Li           Lang_CXX, "", Lang_CXX, Verifier,
432*67e74705SXin Li           functionDecl(
433*67e74705SXin Li             hasBody(
434*67e74705SXin Li               compoundStmt(
435*67e74705SXin Li                 has(
436*67e74705SXin Li                   declStmt(
437*67e74705SXin Li                     hasSingleDecl(
438*67e74705SXin Li                       varDecl(
439*67e74705SXin Li                         hasInitializer(
440*67e74705SXin Li                           initListExpr(
441*67e74705SXin Li                             has(
442*67e74705SXin Li                               cxxConstructExpr(
443*67e74705SXin Li                                 requiresZeroInitialization())),
444*67e74705SXin Li                             has(
445*67e74705SXin Li                               initListExpr(
446*67e74705SXin Li                                 hasType(asString("struct point")),
447*67e74705SXin Li                                 has(floatLiteral(equals(1.0))),
448*67e74705SXin Li                                 has(implicitValueInitExpr(
449*67e74705SXin Li                                       hasType(asString("double")))))),
450*67e74705SXin Li                             has(
451*67e74705SXin Li                               initListExpr(
452*67e74705SXin Li                                 hasType(asString("struct point")),
453*67e74705SXin Li                                 has(floatLiteral(equals(2.0))),
454*67e74705SXin Li                                 has(floatLiteral(equals(1.0)))))
455*67e74705SXin Li                               )))))))))));
456*67e74705SXin Li }
457*67e74705SXin Li 
458*67e74705SXin Li 
459*67e74705SXin Li } // end namespace ast_matchers
460*67e74705SXin Li } // end namespace clang
461