attr-gsl-owner-pointer-std.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // RUN: %clang_cc1 -ast-dump %s | \
  2. // RUN: FileCheck --implicit-check-not OwnerAttr --implicit-check-not PointerAttr %s
  3. // Test attribute inference for types in the standard library.
  4. namespace std {
  5. // Attributes are inferred for a (complete) class.
  6. class any {
  7. // CHECK: CXXRecordDecl {{.*}} any
  8. // CHECK: OwnerAttr {{.*}}
  9. };
  10. // Attributes are inferred for instantiations of a complete template.
  11. template <typename T>
  12. class vector {
  13. public:
  14. class iterator {};
  15. // CHECK: ClassTemplateDecl {{.*}} vector
  16. // CHECK: OwnerAttr {{.*}}
  17. // CHECK: CXXRecordDecl {{.*}} iterator
  18. // CHECK: PointerAttr {{.*}}
  19. // CHECK: ClassTemplateSpecializationDecl {{.*}} vector
  20. // CHECK: TemplateArgument type 'int'
  21. // CHECK: OwnerAttr
  22. // CHECK: CXXRecordDecl {{.*}} iterator
  23. // CHECK: PointerAttr {{.*}}
  24. };
  25. static_assert(sizeof(vector<int>), ""); // Force instantiation.
  26. static_assert(sizeof(vector<int>::iterator), ""); // Force instantiation.
  27. // If std::container::iterator is a using declaration, attributes are inferred
  28. // for the underlying class.
  29. template <typename T>
  30. class __set_iterator {};
  31. // CHECK: ClassTemplateDecl {{.*}} __set_iterator
  32. // CHECK: PointerAttr
  33. // CHECK: ClassTemplateSpecializationDecl {{.*}} __set_iterator
  34. // CHECK: TemplateArgument type 'int'
  35. // CHECK: PointerAttr
  36. template <typename T>
  37. class set {
  38. // CHECK: ClassTemplateDecl {{.*}} set
  39. // CHECK: OwnerAttr {{.*}}
  40. // CHECK: ClassTemplateSpecializationDecl {{.*}} set
  41. // CHECK: OwnerAttr {{.*}}
  42. public:
  43. using iterator = __set_iterator<T>;
  44. };
  45. static_assert(sizeof(set<int>::iterator), ""); // Force instantiation.
  46. // If std::container::iterator is a typedef, attributes are inferred for the
  47. // underlying class.
  48. template <typename T>
  49. class __map_iterator {};
  50. // CHECK: ClassTemplateDecl {{.*}} __map_iterator
  51. // CHECK: PointerAttr
  52. // CHECK: ClassTemplateSpecializationDecl {{.*}} __map_iterator
  53. // CHECK: TemplateArgument type 'int'
  54. // CHECK: PointerAttr
  55. template <typename T>
  56. class map {
  57. // CHECK: ClassTemplateDecl {{.*}} map
  58. // CHECK: OwnerAttr {{.*}}
  59. // CHECK: ClassTemplateSpecializationDecl {{.*}} map
  60. // CHECK: OwnerAttr {{.*}}
  61. public:
  62. typedef __map_iterator<T> iterator;
  63. };
  64. static_assert(sizeof(map<int>::iterator), ""); // Force instantiation.
  65. // Inline namespaces are ignored when checking if
  66. // the class lives in the std namespace.
  67. inline namespace inlinens {
  68. template <typename T>
  69. class __unordered_map_iterator {};
  70. // CHECK: ClassTemplateDecl {{.*}} __unordered_map_iterator
  71. // CHECK: PointerAttr
  72. // CHECK: ClassTemplateSpecializationDecl {{.*}} __unordered_map_iterator
  73. // CHECK: TemplateArgument type 'int'
  74. // CHECK: PointerAttr
  75. template <typename T>
  76. class unordered_map {
  77. // CHECK: ClassTemplateDecl {{.*}} unordered_map
  78. // CHECK: OwnerAttr {{.*}}
  79. // CHECK: ClassTemplateSpecializationDecl {{.*}} unordered_map
  80. // CHECK: OwnerAttr {{.*}}
  81. public:
  82. typedef __unordered_map_iterator<T> iterator;
  83. };
  84. static_assert(sizeof(unordered_map<int>::iterator), ""); // Force instantiation.
  85. } // namespace inlinens
  86. // The iterator typedef is a DependentNameType.
  87. template <typename T>
  88. class __unordered_multimap_iterator {};
  89. // CHECK: ClassTemplateDecl {{.*}} __unordered_multimap_iterator
  90. // CHECK: ClassTemplateSpecializationDecl {{.*}} __unordered_multimap_iterator
  91. // CHECK: TemplateArgument type 'int'
  92. // CHECK: PointerAttr
  93. template <typename T>
  94. class __unordered_multimap_base {
  95. public:
  96. using iterator = __unordered_multimap_iterator<T>;
  97. };
  98. template <typename T>
  99. class unordered_multimap {
  100. // CHECK: ClassTemplateDecl {{.*}} unordered_multimap
  101. // CHECK: OwnerAttr {{.*}}
  102. // CHECK: ClassTemplateSpecializationDecl {{.*}} unordered_multimap
  103. // CHECK: OwnerAttr {{.*}}
  104. public:
  105. using _Mybase = __unordered_multimap_base<T>;
  106. using iterator = typename _Mybase::iterator;
  107. };
  108. static_assert(sizeof(unordered_multimap<int>::iterator), ""); // Force instantiation.
  109. // The canonical declaration of the iterator template is not its definition.
  110. template <typename T>
  111. class __unordered_multiset_iterator;
  112. // CHECK: ClassTemplateDecl {{.*}} __unordered_multiset_iterator
  113. // CHECK: PointerAttr
  114. // CHECK: ClassTemplateSpecializationDecl {{.*}} __unordered_multiset_iterator
  115. // CHECK: TemplateArgument type 'int'
  116. // CHECK: PointerAttr
  117. template <typename T>
  118. class __unordered_multiset_iterator {
  119. // CHECK: ClassTemplateDecl {{.*}} prev {{.*}} __unordered_multiset_iterator
  120. // CHECK: PointerAttr
  121. };
  122. template <typename T>
  123. class unordered_multiset {
  124. // CHECK: ClassTemplateDecl {{.*}} unordered_multiset
  125. // CHECK: OwnerAttr {{.*}}
  126. // CHECK: ClassTemplateSpecializationDecl {{.*}} unordered_multiset
  127. // CHECK: OwnerAttr {{.*}}
  128. public:
  129. using iterator = __unordered_multiset_iterator<T>;
  130. };
  131. static_assert(sizeof(unordered_multiset<int>::iterator), ""); // Force instantiation.
  132. // std::list has an implicit gsl::Owner attribute,
  133. // but explicit attributes take precedence.
  134. template <typename T>
  135. class [[gsl::Pointer]] list{};
  136. // CHECK: ClassTemplateDecl {{.*}} list
  137. // CHECK: PointerAttr {{.*}}
  138. // CHECK: ClassTemplateSpecializationDecl {{.*}} list
  139. // CHECK: PointerAttr {{.*}}
  140. static_assert(sizeof(list<int>), ""); // Force instantiation.
  141. // Forward declared template (Owner).
  142. template <
  143. class CharT,
  144. class Traits>
  145. class basic_regex;
  146. // CHECK: ClassTemplateDecl {{.*}} basic_regex
  147. // CHECK: OwnerAttr {{.*}}
  148. // Forward declared template (Pointer).
  149. template <class T>
  150. class reference_wrapper;
  151. // CHECK: ClassTemplateDecl {{.*}} reference_wrapper
  152. // CHECK: PointerAttr {{.*}}
  153. class some_unknown_type;
  154. // CHECK: CXXRecordDecl {{.*}} some_unknown_type
  155. } // namespace std
  156. namespace user {
  157. // If a class is not in the std namespace, we don't infer the attributes.
  158. class any {
  159. };
  160. } // namespace user