aboutsummaryrefslogtreecommitdiff
path: root/clang/unittests/AST/ProfilingTest.cpp
blob: 27a4a197f1cbfa7e5c0fddab929128a772ee78be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//===- unittests/AST/ProfilingTest.cpp --- Tests for Profiling ------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/Tooling/Tooling.h"
#include "gtest/gtest.h"
#include <utility>

namespace clang {
namespace {
using namespace ast_matchers;

static auto getClassTemplateRedecls() {
  std::string Code = R"cpp(
    template <class> struct A;
    template <class> struct A;
    template <class> struct A;
  )cpp";
  auto AST = tooling::buildASTFromCode(Code);
  ASTContext &Ctx = AST->getASTContext();

  auto MatchResults = match(classTemplateDecl().bind("id"), Ctx);
  SmallVector<ClassTemplateDecl *, 3> Res;
  for (BoundNodes &N : MatchResults) {
    if (auto *CTD = const_cast<ClassTemplateDecl *>(
            N.getNodeAs<ClassTemplateDecl>("id")))
      Res.push_back(CTD);
  }
  assert(Res.size() == 3);
#ifndef NDEBUG
  for (auto &&I : Res)
    assert(I->getCanonicalDecl() == Res[0]);
#endif
  return std::make_tuple(std::move(AST), Res[1], Res[2]);
}

template <class T> static void testTypeNode(const T *T1, const T *T2) {
  {
    llvm::FoldingSetNodeID ID1, ID2;
    T1->Profile(ID1);
    T2->Profile(ID2);
    ASSERT_NE(ID1, ID2);
  }
  auto *CT1 = cast<T>(T1->getCanonicalTypeInternal());
  auto *CT2 = cast<T>(T2->getCanonicalTypeInternal());
  {
    llvm::FoldingSetNodeID ID1, ID2;
    CT1->Profile(ID1);
    CT2->Profile(ID2);
    ASSERT_EQ(ID1, ID2);
  }
}

TEST(Profiling, DeducedTemplateSpecializationType_Name) {
  auto [AST, CTD1, CTD2] = getClassTemplateRedecls();
  ASTContext &Ctx = AST->getASTContext();

  auto *T1 = cast<DeducedTemplateSpecializationType>(
      Ctx.getDeducedTemplateSpecializationType(TemplateName(CTD1), QualType(),
                                               false));
  auto *T2 = cast<DeducedTemplateSpecializationType>(
      Ctx.getDeducedTemplateSpecializationType(TemplateName(CTD2), QualType(),
                                               false));
  testTypeNode(T1, T2);
}

} // namespace
} // namespace clang