[llvm] [ADT] Add noexcept to SmallVector accessor methods (PR #178605)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 28 23:01:50 PST 2026


https://github.com/mugiwaraluffy56 updated https://github.com/llvm/llvm-project/pull/178605

>From 0a82fb1acf754ac48ec41875a1ec4384e3b86407 Mon Sep 17 00:00:00 2001
From: mugiwaraluffy56 <myakampuneeth at gmail.com>
Date: Thu, 29 Jan 2026 12:21:39 +0530
Subject: [PATCH] [ADT] Add noexcept to SmallVector accessor methods

Add noexcept specifier to SmallVector's basic accessor methods that
cannot throw exceptions:
- size(), capacity(), empty() in SmallVectorBase
- begin(), end(), rbegin(), rend() in SmallVectorTemplateCommon
- data() in SmallVectorTemplateCommon

These methods only perform pointer arithmetic and member access, making
them suitable for noexcept. This enables better optimization in generic
code and improves compatibility with standard library algorithms that
can leverage noexcept guarantees.
---
 llvm/include/llvm/ADT/SmallVector.h | 30 ++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h
index 23d40c3e07675..64ee6efa9b6e2 100644
--- a/llvm/include/llvm/ADT/SmallVector.h
+++ b/llvm/include/llvm/ADT/SmallVector.h
@@ -77,10 +77,10 @@ template <class Size_T> class SmallVectorBase {
   LLVM_ABI void grow_pod(void *FirstEl, size_t MinSize, size_t TSize);
 
 public:
-  size_t size() const { return Size; }
-  size_t capacity() const { return Capacity; }
+  size_t size() const noexcept { return Size; }
+  size_t capacity() const noexcept { return Capacity; }
 
-  [[nodiscard]] bool empty() const { return !Size; }
+  [[nodiscard]] bool empty() const noexcept { return !Size; }
 
 protected:
   /// Set the array size to \p N, which the current array must have enough
@@ -270,16 +270,20 @@ class SmallVectorTemplateCommon
   using Base::size;
 
   // forward iterator creation methods.
-  iterator begin() { return (iterator)this->BeginX; }
-  const_iterator begin() const { return (const_iterator)this->BeginX; }
-  iterator end() { return begin() + size(); }
-  const_iterator end() const { return begin() + size(); }
+  iterator begin() noexcept { return (iterator)this->BeginX; }
+  const_iterator begin() const noexcept { return (const_iterator)this->BeginX; }
+  iterator end() noexcept { return begin() + size(); }
+  const_iterator end() const noexcept { return begin() + size(); }
 
   // reverse iterator creation methods.
-  reverse_iterator rbegin()            { return reverse_iterator(end()); }
-  const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); }
-  reverse_iterator rend()              { return reverse_iterator(begin()); }
-  const_reverse_iterator rend() const { return const_reverse_iterator(begin());}
+  reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const noexcept {
+    return const_reverse_iterator(end());
+  }
+  reverse_iterator rend() noexcept { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const noexcept {
+    return const_reverse_iterator(begin());
+  }
 
   size_type size_in_bytes() const { return size() * sizeof(T); }
   size_type max_size() const {
@@ -289,9 +293,9 @@ class SmallVectorTemplateCommon
   size_t capacity_in_bytes() const { return capacity() * sizeof(T); }
 
   /// Return a pointer to the vector's buffer, even if empty().
-  pointer data() { return pointer(begin()); }
+  pointer data() noexcept { return pointer(begin()); }
   /// Return a pointer to the vector's buffer, even if empty().
-  const_pointer data() const { return const_pointer(begin()); }
+  const_pointer data() const noexcept { return const_pointer(begin()); }
 
   reference operator[](size_type idx) {
     assert(idx < size());



More information about the llvm-commits mailing list