| 1 | // RUN: %check_clang_tidy %s cppcoreguidelines-owning-memory %t |
| 2 | |
| 3 | namespace gsl { |
| 4 | template <typename T> |
| 5 | using owner = T; |
| 6 | } |
| 7 | |
| 8 | namespace std { |
| 9 | |
| 10 | // Not actually a vector, but more a dynamic, fixed size array. Just to demonstrate |
| 11 | // functionality or the lack of the same. |
| 12 | template <typename T> |
| 13 | class vector { |
| 14 | public: |
| 15 | vector(unsigned long size, T val) : data{new T[size]}, size{size} { |
| 16 | for (unsigned long i = 0ul; i < size; ++i) { |
| 17 | data[i] = val; |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | T *begin() { return data; } |
| 22 | T *end() { return &data[size]; } |
| 23 | T &operator[](unsigned long index) { return data[index]; } |
| 24 | |
| 25 | private: |
| 26 | T *data; |
| 27 | unsigned long size; |
| 28 | }; |
| 29 | |
| 30 | } // namespace std |
| 31 | |
| 32 | // All of the following codesnippets should be valid with appropriate 'owner<>' analysis, |
| 33 | // but currently the type information of 'gsl::owner<>' gets lost in typededuction. |
| 34 | int main() { |
| 35 | std::vector<gsl::owner<int *>> OwnerStdVector(100, nullptr); |
| 36 | |
| 37 | // Rangebased looping in resource vector. |
| 38 | for (auto *Element : OwnerStdVector) { |
| 39 | Element = new int(42); |
| 40 | // CHECK-NOTES: [[@LINE-1]]:5: warning: assigning newly created 'gsl::owner<>' to non-owner 'int *' |
| 41 | } |
| 42 | for (auto *Element : OwnerStdVector) { |
| 43 | delete Element; |
| 44 | // CHECK-NOTES: [[@LINE-1]]:5: warning: deleting a pointer through a type that is not marked 'gsl::owner<>'; consider using a smart pointer instead |
| 45 | // CHECK-NOTES: [[@LINE-3]]:8: note: variable declared here |
| 46 | } |
| 47 | |
| 48 | // Indexbased looping in resource vector. |
| 49 | for (int i = 0; i < 100; ++i) { |
| 50 | OwnerStdVector[i] = new int(42); |
| 51 | // CHECK-NOTES: [[@LINE-1]]:5: warning: assigning newly created 'gsl::owner<>' to non-owner 'int *' |
| 52 | } |
| 53 | for (int i = 0; i < 100; ++i) { |
| 54 | delete OwnerStdVector[i]; |
| 55 | // CHECK-NOTES: [[@LINE-1]]:5: warning: deleting a pointer through a type that is not marked 'gsl::owner<>'; consider using a smart pointer instead |
| 56 | // CHECK-NOTES: [[@LINE-21]]:3: note: variable declared here |
| 57 | // A note gets emitted here pointing to the return value of the operator[] from the |
| 58 | // vector implementation. Maybe this is considered misleading. |
| 59 | } |
| 60 | |
| 61 | return 0; |
| 62 | } |
| 63 | |