1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//===- unittest/Tooling/RecursiveASTVisitorTestExprVisitor.cpp ------------===// 2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// 3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// The LLVM Compiler Infrastructure 4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// 5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// This file is distributed under the University of Illinois Open Source 6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// License. See LICENSE.TXT for details. 7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// 8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//===----------------------------------------------------------------------===// 9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "TestVisitor.h" 11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include <stack> 12176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 13176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesusing namespace clang; 14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace { 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass ParenExprVisitor : public ExpectedLocationVisitor<ParenExprVisitor> { 18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 19176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool VisitParenExpr(ParenExpr *Parens) { 20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Match("", Parens->getExprLoc()); 21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 24176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, VisitsParensDuringDataRecursion) { 26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ParenExprVisitor Visitor; 27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("", 1, 9); 28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver("int k = (4) + 9;\n")); 29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass TemplateArgumentLocTraverser 32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : public ExpectedLocationVisitor<TemplateArgumentLocTraverser> { 33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) { 35176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string ArgStr; 36176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::raw_string_ostream Stream(ArgStr); 37176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const TemplateArgument &Arg = ArgLoc.getArgument(); 38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 39176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Arg.print(Context->getPrintingPolicy(), Stream); 40176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Match(Stream.str(), ArgLoc.getLocation()); 41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return ExpectedLocationVisitor<TemplateArgumentLocTraverser>:: 42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TraverseTemplateArgumentLoc(ArgLoc); 43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, VisitsClassTemplateTemplateParmDefaultArgument) { 47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TemplateArgumentLocTraverser Visitor; 48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("X", 2, 40); 49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver( 50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "template<typename T> class X;\n" 51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "template<template <typename> class T = X> class Y;\n" 52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "template<template <typename> class T> class Y {};\n")); 53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass CXXBoolLiteralExprVisitor 56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : public ExpectedLocationVisitor<CXXBoolLiteralExprVisitor> { 57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *BE) { 59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (BE->getValue()) 60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Match("true", BE->getLocation()); 61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else 62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Match("false", BE->getLocation()); 63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, VisitsClassTemplateNonTypeParmDefaultArgument) { 68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CXXBoolLiteralExprVisitor Visitor; 69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("true", 2, 19); 70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver( 71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "template<bool B> class X;\n" 72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "template<bool B = true> class Y;\n" 73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "template<bool B> class Y {};\n")); 74176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// A visitor that visits implicit declarations and matches constructors. 77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass ImplicitCtorVisitor 78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : public ExpectedLocationVisitor<ImplicitCtorVisitor> { 79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool shouldVisitImplicitCode() const { return true; } 81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool VisitCXXConstructorDecl(CXXConstructorDecl* Ctor) { 83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Ctor->isImplicit()) { // Was not written in source code 84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (const CXXRecordDecl* Class = Ctor->getParent()) { 85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Match(Class->getName(), Ctor->getLocation()); 86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, VisitsImplicitCopyConstructors) { 93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ImplicitCtorVisitor Visitor; 94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("Simple", 2, 8); 95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Note: Clang lazily instantiates implicit declarations, so we need 96176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // to use them in order to force them to appear in the AST. 97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver( 98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "struct WithCtor { WithCtor(); }; \n" 99176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "struct Simple { Simple(); WithCtor w; }; \n" 100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "int main() { Simple s; Simple t(s); }\n")); 101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief A visitor that optionally includes implicit code and matches 104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// CXXConstructExpr. 105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// 106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// The name recorded for the match is the name of the class whose constructor 107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// is invoked by the CXXConstructExpr, not the name of the class whose 108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// constructor the CXXConstructExpr is contained in. 109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass ConstructExprVisitor 110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : public ExpectedLocationVisitor<ConstructExprVisitor> { 111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ConstructExprVisitor() : ShouldVisitImplicitCode(false) {} 113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool shouldVisitImplicitCode() const { return ShouldVisitImplicitCode; } 115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void setShouldVisitImplicitCode(bool NewValue) { 117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ShouldVisitImplicitCode = NewValue; 118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool VisitCXXConstructExpr(CXXConstructExpr* Expr) { 121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (const CXXConstructorDecl* Ctor = Expr->getConstructor()) { 122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (const CXXRecordDecl* Class = Ctor->getParent()) { 123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Match(Class->getName(), Expr->getLocation()); 124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines private: 130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool ShouldVisitImplicitCode; 131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, CanVisitImplicitMemberInitializations) { 134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ConstructExprVisitor Visitor; 135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.setShouldVisitImplicitCode(true); 136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("WithCtor", 2, 8); 137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Simple has a constructor that implicitly initializes 'w'. Test 138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // that a visitor that visits implicit code visits that initialization. 139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Note: Clang lazily instantiates implicit declarations, so we need 140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // to use them in order to force them to appear in the AST. 141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver( 142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "struct WithCtor { WithCtor(); }; \n" 143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "struct Simple { WithCtor w; }; \n" 144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "int main() { Simple s; }\n")); 145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// The same as CanVisitImplicitMemberInitializations, but checking that the 148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// visits are omitted when the visitor does not include implicit code. 149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, CanSkipImplicitMemberInitializations) { 150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ConstructExprVisitor Visitor; 151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.setShouldVisitImplicitCode(false); 152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.DisallowMatch("WithCtor", 2, 8); 153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Simple has a constructor that implicitly initializes 'w'. Test 154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // that a visitor that skips implicit code skips that initialization. 155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Note: Clang lazily instantiates implicit declarations, so we need 156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // to use them in order to force them to appear in the AST. 157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver( 158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "struct WithCtor { WithCtor(); }; \n" 159176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "struct Simple { WithCtor w; }; \n" 160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "int main() { Simple s; }\n")); 161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 163176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass DeclRefExprVisitor : public ExpectedLocationVisitor<DeclRefExprVisitor> { 164176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool VisitDeclRefExpr(DeclRefExpr *Reference) { 166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Match(Reference->getNameInfo().getAsString(), Reference->getLocation()); 167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 168176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 169176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, VisitsBaseClassTemplateArguments) { 172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclRefExprVisitor Visitor; 173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("x", 2, 3); 174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver( 175176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "void x(); template <void (*T)()> class X {};\nX<x> y;")); 176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 177176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, VisitsCXXForRangeStmtRange) { 179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclRefExprVisitor Visitor; 180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("x", 2, 25); 181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("x", 2, 30); 182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver( 183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "int x[5];\n" 184176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "void f() { for (int i : x) { x[0] = 1; } }", 185176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclRefExprVisitor::Lang_CXX11)); 186176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 187176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 188176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, VisitsCallExpr) { 189176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclRefExprVisitor Visitor; 190176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("x", 1, 22); 191176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver( 192176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "void x(); void y() { x(); }")); 193176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* FIXME: According to Richard Smith this is a bug in the AST. 196176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, VisitsBaseClassTemplateArgumentsInInstantiation) { 197176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclRefExprVisitor Visitor; 198176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("x", 3, 43); 199176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver( 200176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "template <typename T> void x();\n" 201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "template <void (*T)()> class X {};\n" 202176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "template <typename T> class Y : public X< x<T> > {};\n" 203176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "Y<int> y;")); 204176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 205176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines*/ 206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 207176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, VisitsExtension) { 208176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclRefExprVisitor Visitor; 209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("s", 1, 24); 210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver( 211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "int s = __extension__ (s);\n")); 212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(RecursiveASTVisitor, VisitsCopyExprOfBlockDeclCapture) { 215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclRefExprVisitor Visitor; 216176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Visitor.ExpectMatch("x", 3, 24); 217176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EXPECT_TRUE(Visitor.runOver("void f(int(^)(int)); \n" 218176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "void g() { \n" 219176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines " f([&](int x){ return x; }); \n" 220176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "}", 221176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclRefExprVisitor::Lang_OBJCXX11)); 222176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 223176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 224176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} // end anonymous namespace 225