1 //===- unittest/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp -===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "TestVisitor.h" 11 12 using namespace clang; 13 14 namespace { 15 16 class TemplateArgumentLocTraverser 17 : public ExpectedLocationVisitor<TemplateArgumentLocTraverser> { 18 public: 19 bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) { 20 std::string ArgStr; 21 llvm::raw_string_ostream Stream(ArgStr); 22 const TemplateArgument &Arg = ArgLoc.getArgument(); 23 24 Arg.print(Context->getPrintingPolicy(), Stream); 25 Match(Stream.str(), ArgLoc.getLocation()); 26 return ExpectedLocationVisitor<TemplateArgumentLocTraverser>:: 27 TraverseTemplateArgumentLoc(ArgLoc); 28 } 29 }; 30 31 TEST(RecursiveASTVisitor, VisitsClassTemplateTemplateParmDefaultArgument) { 32 TemplateArgumentLocTraverser Visitor; 33 Visitor.ExpectMatch("X", 2, 40); 34 EXPECT_TRUE(Visitor.runOver( 35 "template<typename T> class X;\n" 36 "template<template <typename> class T = X> class Y;\n" 37 "template<template <typename> class T> class Y {};\n")); 38 } 39 40 } // end anonymous namespace 41