xref: /llvm-project/clang/test/AST/attr-lifetime-capture-by.cpp (revision 1374aa35a3f62c774548361276a87eb472893262)
1 // RUN: %clang_cc1 %s -ast-dump | FileCheck %s
2 
3 // Verify that we print the [[clang::lifetime_capture_by(X)]] attribute.
4 
5 struct S {
6     void foo(int &a, int &b) [[clang::lifetime_capture_by(a, b, global)]];
7 };
8 
9 // CHECK: CXXMethodDecl {{.*}}clang::lifetime_capture_by(a, b, global)
10 
11 // ****************************************************************************
12 // Infer annotation for STL container methods.
13 // ****************************************************************************
14 namespace __gnu_cxx {
15 template <typename T>
16 struct basic_iterator {};
17 }
18 
19 namespace std {
20 template<typename T> class allocator {};
21 template <typename T, typename Alloc = allocator<T>>
22 struct vector {
23   typedef __gnu_cxx::basic_iterator<T> iterator;
24   iterator begin();
25 
26   vector();
27 
28   void push_back(const T&);
29   void push_back(T&&);
30 
31   void insert(iterator, T&&);
32 };
33 
34 template <typename Key, typename Value>
35 struct map {
36   Value& operator[](Key&& p);
37   Value& operator[](const Key& p);
38 };
39 } // namespace std
40 
41 // CHECK-NOT:   LifetimeCaptureByAttr
42 
43 struct [[gsl::Pointer()]] View {};
44 std::vector<View> views;
45 // CHECK:   ClassTemplateSpecializationDecl {{.*}} struct vector definition implicit_instantiation
46 
47 // CHECK:       CXXMethodDecl {{.*}} push_back 'void (const View &)'
48 // CHECK-NEXT:           ParmVarDecl {{.*}} 'const View &'
49 // CHECK-NEXT:               LifetimeCaptureByAttr {{.*}} Implicit
50 
51 // CHECK:       CXXMethodDecl {{.*}} push_back 'void (View &&)'
52 // CHECK-NEXT:           ParmVarDecl {{.*}} 'View &&'
53 // CHECK-NEXT:               LifetimeCaptureByAttr {{.*}} Implicit
54 
55 // CHECK:       CXXMethodDecl {{.*}} insert 'void (iterator, View &&)'
56 // CHECK-NEXT:           ParmVarDecl {{.*}} 'iterator'
57 // CHECK-NEXT:           ParmVarDecl {{.*}} 'View &&'
58 // CHECK-NEXT:               LifetimeCaptureByAttr {{.*}} Implicit
59 
60 template <class T> struct [[gsl::Pointer()]] ViewTemplate {};
61 std::vector<ViewTemplate<int>> templated_views;
62 // CHECK:       ClassTemplateSpecializationDecl {{.*}} struct vector definition implicit_instantiation
63 
64 // CHECK:       CXXMethodDecl {{.*}} push_back 'void (const ViewTemplate<int> &)'
65 // CHECK-NEXT:           ParmVarDecl {{.*}} 'const ViewTemplate<int> &'
66 // CHECK-NEXT:               LifetimeCaptureByAttr {{.*}} Implicit
67 // CHECK-NOT:   LifetimeCaptureByAttr
68 
69 // CHECK:       CXXMethodDecl {{.*}} push_back 'void (ViewTemplate<int> &&)'
70 // CHECK-NEXT:           ParmVarDecl {{.*}} 'ViewTemplate<int> &&'
71 // CHECK-NEXT:               LifetimeCaptureByAttr {{.*}} Implicit
72 
73 // CHECK:       CXXMethodDecl {{.*}} insert 'void (iterator, ViewTemplate<int> &&)'
74 // CHECK-NEXT:           ParmVarDecl {{.*}} 'iterator'
75 // CHECK-NEXT:           ParmVarDecl {{.*}} 'ViewTemplate<int> &&'
76 // CHECK-NEXT:               LifetimeCaptureByAttr {{.*}} Implicit
77 
78 std::vector<int*> pointers;
79 // CHECK:   ClassTemplateSpecializationDecl {{.*}} struct vector definition implicit_instantiation
80 
81 // CHECK:       CXXMethodDecl {{.*}} push_back 'void (int *const &)'
82 // CHECK-NEXT:           ParmVarDecl {{.*}} 'int *const &'
83 // CHECK-NOT:               LifetimeCaptureByAttr
84 
85 // CHECK:       CXXMethodDecl {{.*}} push_back 'void (int *&&)'
86 // CHECK-NEXT:           ParmVarDecl {{.*}} 'int *&&'
87 // CHECK-NOT:               LifetimeCaptureByAttr
88 
89 // CHECK:       CXXMethodDecl {{.*}} insert 'void (iterator, int *&&)'
90 // CHECK-NEXT:           ParmVarDecl {{.*}} 'iterator'
91 // CHECK-NEXT:           ParmVarDecl {{.*}} 'int *&&'
92 // CHECK-NOT:               LifetimeCaptureByAttr
93 
94 std::vector<int> ints;
95 // CHECK:   ClassTemplateSpecializationDecl {{.*}} struct vector definition implicit_instantiation
96 // CHECK:       TemplateArgument type 'int'
97 
98 // CHECK:       CXXMethodDecl {{.*}} push_back 'void (const int &)'
99 // CHECK-NOT:   LifetimeCaptureByAttr
100 
101 // CHECK:       CXXMethodDecl {{.*}} push_back 'void (int &&)'
102 // CHECK-NOT:   LifetimeCaptureByAttr
103 
104 // CHECK:       CXXMethodDecl {{.*}} insert 'void (iterator, int &&)'
105 // CHECK-NEXT:           ParmVarDecl {{.*}} 'iterator'
106 // CHECK-NEXT:           ParmVarDecl {{.*}} 'int &&'
107 // CHECK-NOT:   LifetimeCaptureByAttr
108 
109 std::map<View, int> map;
110 // CHECK:   ClassTemplateSpecializationDecl {{.*}} struct map definition implicit_instantiation
111 
112 // CHECK:       CXXMethodDecl {{.*}} operator[] 'int &(View &&)' implicit_instantiation
113 // CHECK-NEXT:           ParmVarDecl {{.*}} p 'View &&'
114 // CHECK-NEXT:               LifetimeCaptureByAttr {{.*}} Implicit
115 // CHECK:       CXXMethodDecl {{.*}} operator[] 'int &(const View &)' implicit_instantiation
116 // CHECK-NEXT:           ParmVarDecl {{.*}} p 'const View &'
117 // CHECK-NEXT:               LifetimeCaptureByAttr {{.*}} Implicit
118