2
2
struct [[gsl::Owner(int )]] MyIntOwner {
3
3
MyIntOwner ();
4
4
int &operator *();
5
- int *c_str () const ;
6
5
};
7
6
8
7
struct [[gsl::Pointer(int )]] MyIntPointer {
@@ -52,16 +51,6 @@ long *ownershipTransferToRawPointer() {
52
51
return t.releaseAsRawPointer (); // ok
53
52
}
54
53
55
- int *danglingRawPtrFromLocal () {
56
- MyIntOwner t;
57
- return t.c_str (); // TODO
58
- }
59
-
60
- int *danglingRawPtrFromTemp () {
61
- MyIntPointer p;
62
- return p.toOwner ().c_str (); // TODO
63
- }
64
-
65
54
struct Y {
66
55
int a[4 ];
67
56
};
@@ -103,6 +92,12 @@ MyIntPointer danglingGslPtrFromTemporary() {
103
92
return MyIntOwner{}; // expected-warning {{returning address of local temporary object}}
104
93
}
105
94
95
+ MyIntOwner makeTempOwner ();
96
+
97
+ MyIntPointer danglingGslPtrFromTemporary2 () {
98
+ return makeTempOwner (); // expected-warning {{returning address of local temporary object}}
99
+ }
100
+
106
101
MyLongPointerFromConversion danglingGslPtrFromTemporaryConv () {
107
102
return MyLongOwnerWithConversion{}; // expected-warning {{returning address of local temporary object}}
108
103
}
@@ -124,12 +119,52 @@ void initLocalGslPtrWithTempOwner() {
124
119
global2 = MyLongOwnerWithConversion{}; // TODO ?
125
120
}
126
121
127
- struct IntVector {
128
- int *begin ();
129
- int *end ();
122
+ namespace std {
123
+ template <typename T>
124
+ struct basic_iterator {};
125
+
126
+ template <typename T>
127
+ struct vector {
128
+ typedef basic_iterator<T> iterator;
129
+ iterator begin ();
130
+ T *data ();
131
+ };
132
+
133
+ template <typename T>
134
+ struct basic_string {
135
+ const T *c_str () const ;
136
+ };
137
+
138
+ template <typename T>
139
+ struct unique_ptr {
140
+ T *get () const ;
130
141
};
142
+ }
131
143
132
144
void modelIterators () {
133
- int * it = IntVector{} .begin (); // TODO ?
145
+ std::vector< int >::iterator it = std::vector< int >() .begin (); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}}
134
146
(void )it;
135
147
}
148
+
149
+ std::vector<int >::iterator modelIteratorReturn () {
150
+ return std::vector<int >().begin (); // expected-warning {{returning address of local temporary object}}
151
+ }
152
+
153
+ const char *danglingRawPtrFromLocal () {
154
+ std::basic_string<char > s;
155
+ return s.c_str (); // expected-warning {{address of stack memory associated with local variable 's' returned}}
156
+ }
157
+
158
+ const char *danglingRawPtrFromTemp () {
159
+ return std::basic_string<char >().c_str (); // expected-warning {{returning address of local temporary object}}
160
+ }
161
+
162
+ std::unique_ptr<int > getUniquePtr ();
163
+
164
+ int *danglingUniquePtrFromTemp () {
165
+ return getUniquePtr ().get (); // expected-warning {{returning address of local temporary object}}
166
+ }
167
+
168
+ int *danglingUniquePtrFromTemp2 () {
169
+ return std::unique_ptr<int >().get (); // expected-warning {{returning address of local temporary object}}
170
+ }
0 commit comments