TemplateArgumentLocTraverser.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. //===- unittest/Tooling/RecursiveASTVisitorTests/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-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "TestVisitor.h"
  9. using namespace clang;
  10. namespace {
  11. class TemplateArgumentLocTraverser
  12. : public ExpectedLocationVisitor<TemplateArgumentLocTraverser> {
  13. public:
  14. bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) {
  15. std::string ArgStr;
  16. llvm::raw_string_ostream Stream(ArgStr);
  17. const TemplateArgument &Arg = ArgLoc.getArgument();
  18. Arg.print(Context->getPrintingPolicy(), Stream);
  19. Match(Stream.str(), ArgLoc.getLocation());
  20. return ExpectedLocationVisitor<TemplateArgumentLocTraverser>::
  21. TraverseTemplateArgumentLoc(ArgLoc);
  22. }
  23. };
  24. TEST(RecursiveASTVisitor, VisitsClassTemplateTemplateParmDefaultArgument) {
  25. TemplateArgumentLocTraverser Visitor;
  26. Visitor.ExpectMatch("X", 2, 40);
  27. EXPECT_TRUE(Visitor.runOver(
  28. "template<typename T> class X;\n"
  29. "template<template <typename> class T = X> class Y;\n"
  30. "template<template <typename> class T> class Y {};\n"));
  31. }
  32. } // end anonymous namespace