ASTTypeTraitsTest.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. //===- unittest/AST/ASTTypeTraits.cpp - AST type traits unit tests ------===//
  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 "clang/AST/ASTTypeTraits.h"
  9. #include "MatchVerifier.h"
  10. #include "gtest/gtest.h"
  11. using namespace clang::ast_matchers;
  12. namespace clang {
  13. namespace ast_type_traits {
  14. TEST(ASTNodeKind, NoKind) {
  15. EXPECT_FALSE(ASTNodeKind().isBaseOf(ASTNodeKind()));
  16. EXPECT_FALSE(ASTNodeKind().isSame(ASTNodeKind()));
  17. }
  18. template <typename T> static ASTNodeKind DNT() {
  19. return ASTNodeKind::getFromNodeKind<T>();
  20. }
  21. TEST(ASTNodeKind, IsNone) {
  22. EXPECT_TRUE(ASTNodeKind().isNone());
  23. EXPECT_FALSE(DNT<Decl>().isNone());
  24. EXPECT_FALSE(DNT<VarDecl>().isNone());
  25. }
  26. TEST(ASTNodeKind, Bases) {
  27. EXPECT_TRUE(DNT<Decl>().isBaseOf(DNT<VarDecl>()));
  28. EXPECT_FALSE(DNT<Decl>().isSame(DNT<VarDecl>()));
  29. EXPECT_FALSE(DNT<VarDecl>().isBaseOf(DNT<Decl>()));
  30. EXPECT_TRUE(DNT<Decl>().isSame(DNT<Decl>()));
  31. }
  32. TEST(ASTNodeKind, BaseDistances) {
  33. unsigned Distance = 1;
  34. EXPECT_TRUE(DNT<Expr>().isBaseOf(DNT<Expr>(), &Distance));
  35. EXPECT_EQ(0u, Distance);
  36. EXPECT_TRUE(DNT<Stmt>().isBaseOf(DNT<IfStmt>(), &Distance));
  37. EXPECT_EQ(1u, Distance);
  38. Distance = 3;
  39. EXPECT_TRUE(DNT<DeclaratorDecl>().isBaseOf(DNT<ParmVarDecl>(), &Distance));
  40. EXPECT_EQ(2u, Distance);
  41. }
  42. TEST(ASTNodeKind, SameBase) {
  43. EXPECT_TRUE(DNT<Expr>().isBaseOf(DNT<CallExpr>()));
  44. EXPECT_TRUE(DNT<Expr>().isBaseOf(DNT<BinaryOperator>()));
  45. EXPECT_FALSE(DNT<CallExpr>().isBaseOf(DNT<BinaryOperator>()));
  46. EXPECT_FALSE(DNT<BinaryOperator>().isBaseOf(DNT<CallExpr>()));
  47. }
  48. TEST(ASTNodeKind, DiffBase) {
  49. EXPECT_FALSE(DNT<Expr>().isBaseOf(DNT<ArrayType>()));
  50. EXPECT_FALSE(DNT<QualType>().isBaseOf(DNT<FunctionDecl>()));
  51. EXPECT_FALSE(DNT<Type>().isSame(DNT<QualType>()));
  52. }
  53. TEST(ASTNodeKind, MostDerivedType) {
  54. EXPECT_TRUE(DNT<BinaryOperator>().isSame(
  55. ASTNodeKind::getMostDerivedType(DNT<Expr>(), DNT<BinaryOperator>())));
  56. EXPECT_TRUE(DNT<BinaryOperator>().isSame(
  57. ASTNodeKind::getMostDerivedType(DNT<BinaryOperator>(), DNT<Expr>())));
  58. EXPECT_TRUE(DNT<VarDecl>().isSame(
  59. ASTNodeKind::getMostDerivedType(DNT<VarDecl>(), DNT<VarDecl>())));
  60. // Not related. Returns nothing.
  61. EXPECT_TRUE(
  62. ASTNodeKind::getMostDerivedType(DNT<IfStmt>(), DNT<VarDecl>()).isNone());
  63. EXPECT_TRUE(ASTNodeKind::getMostDerivedType(DNT<IfStmt>(),
  64. DNT<BinaryOperator>()).isNone());
  65. }
  66. TEST(ASTNodeKind, MostDerivedCommonAncestor) {
  67. EXPECT_TRUE(DNT<Expr>().isSame(ASTNodeKind::getMostDerivedCommonAncestor(
  68. DNT<Expr>(), DNT<BinaryOperator>())));
  69. EXPECT_TRUE(DNT<Expr>().isSame(ASTNodeKind::getMostDerivedCommonAncestor(
  70. DNT<BinaryOperator>(), DNT<Expr>())));
  71. EXPECT_TRUE(DNT<VarDecl>().isSame(ASTNodeKind::getMostDerivedCommonAncestor(
  72. DNT<VarDecl>(), DNT<VarDecl>())));
  73. // A little related. Returns the ancestor.
  74. EXPECT_TRUE(
  75. DNT<NamedDecl>().isSame(ASTNodeKind::getMostDerivedCommonAncestor(
  76. DNT<CXXMethodDecl>(), DNT<RecordDecl>())));
  77. // Not related. Returns nothing.
  78. EXPECT_TRUE(ASTNodeKind::getMostDerivedCommonAncestor(
  79. DNT<IfStmt>(), DNT<VarDecl>()).isNone());
  80. }
  81. struct Foo {};
  82. TEST(ASTNodeKind, UnknownKind) {
  83. // We can construct one, but it is nowhere in the hierarchy.
  84. EXPECT_FALSE(DNT<Foo>().isSame(DNT<Foo>()));
  85. }
  86. TEST(ASTNodeKind, Name) {
  87. EXPECT_EQ("<None>", ASTNodeKind().asStringRef());
  88. #define VERIFY_NAME(Node) EXPECT_EQ(#Node, DNT<Node>().asStringRef());
  89. VERIFY_NAME(TemplateArgument);
  90. VERIFY_NAME(NestedNameSpecifierLoc);
  91. VERIFY_NAME(QualType);
  92. VERIFY_NAME(TypeLoc);
  93. VERIFY_NAME(CXXCtorInitializer);
  94. VERIFY_NAME(NestedNameSpecifier);
  95. VERIFY_NAME(Decl);
  96. VERIFY_NAME(CXXRecordDecl);
  97. VERIFY_NAME(Stmt);
  98. VERIFY_NAME(CallExpr);
  99. VERIFY_NAME(Type);
  100. VERIFY_NAME(ConstantArrayType);
  101. #undef VERIFY_NAME
  102. }
  103. TEST(DynTypedNode, DeclSourceRange) {
  104. RangeVerifier<DynTypedNode> Verifier;
  105. Verifier.expectRange(1, 1, 1, 11);
  106. EXPECT_TRUE(Verifier.match("void f() {}", decl()));
  107. }
  108. TEST(DynTypedNode, StmtSourceRange) {
  109. RangeVerifier<DynTypedNode> Verifier;
  110. Verifier.expectRange(1, 10, 1, 11);
  111. EXPECT_TRUE(Verifier.match("void f() {}", stmt()));
  112. }
  113. TEST(DynTypedNode, TypeLocSourceRange) {
  114. RangeVerifier<DynTypedNode> Verifier;
  115. Verifier.expectRange(1, 1, 1, 8);
  116. EXPECT_TRUE(Verifier.match("void f() {}", typeLoc(loc(functionType()))));
  117. }
  118. TEST(DynTypedNode, NNSLocSourceRange) {
  119. RangeVerifier<DynTypedNode> Verifier;
  120. Verifier.expectRange(1, 33, 1, 34);
  121. EXPECT_TRUE(Verifier.match("namespace N { typedef void T; } N::T f() {}",
  122. nestedNameSpecifierLoc()));
  123. }
  124. TEST(DynTypedNode, DeclDump) {
  125. DumpVerifier Verifier;
  126. Verifier.expectSubstring("FunctionDecl");
  127. EXPECT_TRUE(Verifier.match("void f() {}", functionDecl()));
  128. }
  129. TEST(DynTypedNode, StmtDump) {
  130. DumpVerifier Verifier;
  131. Verifier.expectSubstring("CompoundStmt");
  132. EXPECT_TRUE(Verifier.match("void f() {}", stmt()));
  133. }
  134. TEST(DynTypedNode, DeclPrint) {
  135. PrintVerifier Verifier;
  136. Verifier.expectString("void f() {\n}\n");
  137. EXPECT_TRUE(Verifier.match("void f() {}", functionDecl()));
  138. }
  139. TEST(DynTypedNode, StmtPrint) {
  140. PrintVerifier Verifier;
  141. Verifier.expectString("{\n}\n");
  142. EXPECT_TRUE(Verifier.match("void f() {}", stmt()));
  143. }
  144. TEST(DynTypedNode, QualType) {
  145. QualType Q;
  146. DynTypedNode Node = DynTypedNode::create(Q);
  147. EXPECT_TRUE(Node == Node);
  148. EXPECT_FALSE(Node < Node);
  149. }
  150. } // namespace ast_type_traits
  151. } // namespace clang