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