38 lines · cpp
1//===- TemplateArgumentLocTraverser.cpp -----------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "TestVisitor.h"10 11using namespace clang;12 13namespace {14 15class TemplateArgumentLocTraverser : public ExpectedLocationVisitor {16public:17 bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) override {18 std::string ArgStr;19 llvm::raw_string_ostream Stream(ArgStr);20 const TemplateArgument &Arg = ArgLoc.getArgument();21 22 Arg.print(Context->getPrintingPolicy(), Stream, /*IncludeType*/ true);23 Match(ArgStr, ArgLoc.getLocation());24 return ExpectedLocationVisitor::TraverseTemplateArgumentLoc(ArgLoc);25 }26};27 28TEST(RecursiveASTVisitor, VisitsClassTemplateTemplateParmDefaultArgument) {29 TemplateArgumentLocTraverser Visitor;30 Visitor.ExpectMatch("X", 2, 40);31 EXPECT_TRUE(Visitor.runOver(32 "template<typename T> class X;\n"33 "template<template <typename> class T = X> class Y;\n"34 "template<template <typename> class T> class Y {};\n"));35}36 37} // end anonymous namespace38