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