Add the gsl::Pointer/gsl::Owner combo to ArrayRef and SmallVector so it can diagnose...
authorBenjamin Kramer <benny.kra@googlemail.com>
Mon, 27 Apr 2020 10:31:07 +0000 (12:31 +0200)
committerBenjamin Kramer <benny.kra@googlemail.com>
Mon, 27 Apr 2020 10:31:07 +0000 (12:31 +0200)
llvm/include/llvm/ADT/ArrayRef.h
llvm/include/llvm/ADT/SmallVector.h
llvm/include/llvm/Support/Compiler.h

index d11f8b5..5ed4d07 100644 (file)
@@ -38,7 +38,7 @@ namespace llvm {
   /// This is intended to be trivially copyable, so it should be passed by
   /// value.
   template<typename T>
-  class LLVM_NODISCARD ArrayRef {
+  class LLVM_GSL_POINTER LLVM_NODISCARD ArrayRef {
   public:
     using iterator = const T *;
     using const_iterator = const T *;
index 12a5876..5656a28 100644 (file)
@@ -841,7 +841,8 @@ template <typename T> struct alignas(alignof(T)) SmallVectorStorage<T, 0> {};
 /// Note that this does not attempt to be exception safe.
 ///
 template <typename T, unsigned N>
-class SmallVector : public SmallVectorImpl<T>, SmallVectorStorage<T, N> {
+class LLVM_GSL_OWNER SmallVector : public SmallVectorImpl<T>,
+                                   SmallVectorStorage<T, N> {
 public:
   SmallVector() : SmallVectorImpl<T>(N) {}
 
index cc64b54..79af6f5 100644 (file)
 #define LLVM_REQUIRE_CONSTANT_INITIALIZATION
 #endif
 
+/// LLVM_GSL_OWNER - Apply this to owning classes like SmallVector to enable
+/// lifetime warnings.
+#if LLVM_HAS_CPP_ATTRIBUTE(gsl::Owner)
+#define LLVM_GSL_OWNER [[gsl::Owner]]
+#else
+#define LLVM_GSL_OWNER
+#endif
+
 /// LLVM_GSL_POINTER - Apply this to non-owning classes like
 /// StringRef to enable lifetime warnings.
 #if LLVM_HAS_CPP_ATTRIBUTE(gsl::Pointer)