From e78a79b31b297d7c675208aa36c55403ef8c26d4 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Mon, 20 Apr 2026 17:05:22 +0200 Subject: [PATCH 01/34] document Closure capture precision --- src/changelog.rst | 29 ++++++++++++++--- src/types-and-traits.rst | 68 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 4 deletions(-) diff --git a/src/changelog.rst b/src/changelog.rst index fb04a8b7..7eef61de 100644 --- a/src/changelog.rst +++ b/src/changelog.rst @@ -169,15 +169,36 @@ Language changes in Rust 1.95.0 - `Make operational semantics of pattern matching independent of crate and module `_ -FLS fixes/improvements ----------------------- - -- Changed paragraph: :p:`fls_1941wid94hlg` +FLS maintenance +--------------- - New paragraphs: - :p:`fls_CSuxTkwR96j9` - :p:`fls_LV94x3HlpBWk` + - :p:`fls_rdDT7jsaOMbs` + - :p:`fls_j9WyKVyOLFon` + - :p:`fls_TbfUxVf8PKPs` + - :p:`fls_4TESOxGpEY2h` + - :p:`fls_eNkZWskzznW6` + - :p:`fls_v8IFXHJnXhez` + - :p:`fls_gujpU7p5n9Zx` + - :p:`fls_t8tFLUg8O83Q` + - :p:`fls_RaONmCLH2KGM` + - :p:`fls_Vt9C9mKxHOwo` + - :p:`fls_Fs12dmznjsMf` + - :p:`fls_7EXHdE2eOVek` + - :p:`fls_iLH8X2U4ADHb` + - :p:`fls_HMJUXHrvOmPl` + - :p:`fls_Gj1znNpthHY6` + - :p:`fls_IFyJvb6mlFU4` + - :p:`fls_7NEEJgKSpQQ8` + - :p:`fls_kYFd3p06pWWV` + - :p:`fls_fATMTNUOHsfb` + - :p:`fls_fITor3jpmgrl` + - :p:`fls_XFwPNGsVsu05` + +- Changed paragraph: :p:`fls_1941wid94hlg` - Replace the term "simple path prefix" with "common path prefix", to improve clarity. diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index f142329d..5d41bea9 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -903,6 +903,74 @@ A :t:`closure type` implicitly implements the :std:`core::marker::Sync` :t:`trait` if all the :t:`[type]s` of the :t:`[value]s` of the :t:`capturing environment` implement the :std:`core::marker::Send` :t:`trait`. +.. _fls_G64vdcIyB2Is: + +Closure capture precision +^^^^^^^^^^^^^^^^^^^^^^^^^ + +:dp:`fls_rdDT7jsaOMbs` +A :dt:`capture path` is a sequence starting with a :t:`variable` from the environment followed by zero or more :t:`[place projection]s` from that variable. + +:dp:`fls_j9WyKVyOLFon` +A :dt:`place projection` is a :t:`field access expression`, tuple :t:`field access expression`, :t:`dereference`, array or slice :t:`index expression`, or :t:`pattern` destructuring applied to a variable. + +:dp:`fls_TbfUxVf8PKPs` +The closure :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, which may be truncated based on these rules: + +- :dp:`fls_4TESOxGpEY2h` + When a :t:`capture path` and one of the ancestors of that path are both captured by a closure, the ancestor path is captured with the highest capture mode among the two captures, using the strict weak ordering: :t:`immutable borrow` < :t:`unique immutable borrow` < :t:`mutable borrow` < :t:`move `. + +- :dp:`fls_eNkZWskzznW6` + The :t:`capture path` is truncated at the rightmost :t:`dereference` in the capture path if the dereference is applied to a :t:`shared reference`. + +:dp:`fls_v8IFXHJnXhez` +A :t:`place` is not captured when an :t:`underscore expression` is used to bind it. + +:dp:`fls_gujpU7p5n9Zx` +A :t:`place` is not captured by destructuring tuples, structs, and single-variant enums. + +:dp:`fls_t8tFLUg8O83Q` +A :t:`place` is not captured by being matched against a :t:`rest pattern`. + +:dp:`fls_RaONmCLH2KGM` +The entire :t:`slice` or :t:`array` is always captured even if used with :t:`underscore expression`, :t:`indexing `, or :t:`slicing `. + +:dp:`fls_Vt9C9mKxHOwo` +A :t:`place` is captured by :t:`immutable borrow` if its :t:`discriminant` is read by :t:`pattern matching`. + +:dp:`fls_Fs12dmznjsMf` +Matching against a variant of an enum that has more than one variant captures the :t:`place` by :t:`immutable borrow`. + +:dp:`fls_7EXHdE2eOVek` +Matching against a variant of an enum that has one variant does not capture the place, unless is marked with :t:`attribute` ``non_exhaustive``, in which case the place is captured by :t:`immutable borrow`. + +:dp:`fls_iLH8X2U4ADHb` +Matching against a :t:`range pattern` captures the place by :t:`immutable borrow`. + +:dp:`fls_HMJUXHrvOmPl` +Matching a :t:`slice` against a slice :t:`pattern`, other than one with only a single rest pattern ``[..]``, captures the slice by :t:`immutable borrow`. + +:dp:`fls_Gj1znNpthHY6` +Matching an array against a slice pattern does not capture the :t:`place`. + +:dp:`fls_IFyJvb6mlFU4` +Move closures can only capture the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`reference`. + +:dp:`fls_7NEEJgKSpQQ8` +Closures will only capture the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`raw pointer`. + +:dp:`fls_kYFd3p06pWWV` +Closures will only capture the prefix of a :t:`capture path` of a :t:`union` that runs up to union itself. + +:dp:`fls_fATMTNUOHsfb` +Closures will only capture the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a structure that uses the :t:`attribute` ``packed`` representation, in unalidged :t:`[field]s` in a struct. + +:dp:`fls_fITor3jpmgrl` +Taking the address of an unaligned :t:`field` captures the entire struct. + +:dp:`fls_XFwPNGsVsu05` +A :dt:`unique immutable borrow` is a capture that occurs when modifying the :t:`referent` of a :t:`mutable reference`. + .. _fls_airvr79xkcag: Function Item Types From c38603905066b26a02ce0d9f724138d89dd9e89b Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Mon, 20 Apr 2026 19:33:59 +0200 Subject: [PATCH 02/34] typo Co-authored-by: Ana Hobden --- src/types-and-traits.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index 5d41bea9..b9154ca0 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -963,7 +963,7 @@ Closures will only capture the prefix of a :t:`capture path` that runs up to, bu Closures will only capture the prefix of a :t:`capture path` of a :t:`union` that runs up to union itself. :dp:`fls_fATMTNUOHsfb` -Closures will only capture the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a structure that uses the :t:`attribute` ``packed`` representation, in unalidged :t:`[field]s` in a struct. +Closures will only capture the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a structure that uses the :t:`attribute` ``packed`` representation, in unaligned :t:`[field]s` in a struct. :dp:`fls_fITor3jpmgrl` Taking the address of an unaligned :t:`field` captures the entire struct. From 1ae776e2f69c13a435cadad18c0f509bdd5a735c Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 11:34:34 +0200 Subject: [PATCH 03/34] use a defined term Co-authored-by: Hristian Kirtchev <60669983+kirtchev-adacore@users.noreply.github.com> --- src/types-and-traits.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index b9154ca0..f937917e 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -909,7 +909,7 @@ Closure capture precision ^^^^^^^^^^^^^^^^^^^^^^^^^ :dp:`fls_rdDT7jsaOMbs` -A :dt:`capture path` is a sequence starting with a :t:`variable` from the environment followed by zero or more :t:`[place projection]s` from that variable. +A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`variable`. :dp:`fls_j9WyKVyOLFon` A :dt:`place projection` is a :t:`field access expression`, tuple :t:`field access expression`, :t:`dereference`, array or slice :t:`index expression`, or :t:`pattern` destructuring applied to a variable. From 1ca67a5ead21b9dec97788ad931b3df6eaf98567 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 11:40:38 +0200 Subject: [PATCH 04/34] remove a redundancy, and add some links Co-authored-by: Hristian Kirtchev <60669983+kirtchev-adacore@users.noreply.github.com> --- src/types-and-traits.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index f937917e..5bd604aa 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -912,7 +912,7 @@ Closure capture precision A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`variable`. :dp:`fls_j9WyKVyOLFon` -A :dt:`place projection` is a :t:`field access expression`, tuple :t:`field access expression`, :t:`dereference`, array or slice :t:`index expression`, or :t:`pattern` destructuring applied to a variable. +A :dt:`place projection` is a :t:`field access expression`, :t:`dereference`, :t:`array` or :t:`slice` :t:`index expression`, or :t:`pattern` destructuring applied to a :t:`variable`. :dp:`fls_TbfUxVf8PKPs` The closure :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, which may be truncated based on these rules: From 233507cf4dfc4741a2ce2d172ebc2e534dc19505 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 11:44:23 +0200 Subject: [PATCH 05/34] grammar and consistency fix --- src/types-and-traits.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index 5bd604aa..179c15dc 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -915,7 +915,7 @@ A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`ca A :dt:`place projection` is a :t:`field access expression`, :t:`dereference`, :t:`array` or :t:`slice` :t:`index expression`, or :t:`pattern` destructuring applied to a :t:`variable`. :dp:`fls_TbfUxVf8PKPs` -The closure :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, which may be truncated based on these rules: +A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, which may be truncated based on these rules: - :dp:`fls_4TESOxGpEY2h` When a :t:`capture path` and one of the ancestors of that path are both captured by a closure, the ancestor path is captured with the highest capture mode among the two captures, using the strict weak ordering: :t:`immutable borrow` < :t:`unique immutable borrow` < :t:`mutable borrow` < :t:`move `. From c54308d0334e216719154331e7c14740f1965e37 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 11:49:35 +0200 Subject: [PATCH 06/34] link-it Co-authored-by: Hristian Kirtchev <60669983+kirtchev-adacore@users.noreply.github.com> --- src/types-and-traits.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index 179c15dc..c4c06e4e 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -921,7 +921,7 @@ A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture When a :t:`capture path` and one of the ancestors of that path are both captured by a closure, the ancestor path is captured with the highest capture mode among the two captures, using the strict weak ordering: :t:`immutable borrow` < :t:`unique immutable borrow` < :t:`mutable borrow` < :t:`move `. - :dp:`fls_eNkZWskzznW6` - The :t:`capture path` is truncated at the rightmost :t:`dereference` in the capture path if the dereference is applied to a :t:`shared reference`. + The :t:`capture path` is truncated at the rightmost :t:`dereference` in the :t:`capture path` if the :t:`dereference` is applied to a :t:`shared reference`. :dp:`fls_v8IFXHJnXhez` A :t:`place` is not captured when an :t:`underscore expression` is used to bind it. From 8c664bbf8a05d5c9c7b496ea7971bf59ff7b9146 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 13:28:46 +0200 Subject: [PATCH 07/34] define the term before using it --- src/types-and-traits.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index c4c06e4e..08d53ec9 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -908,12 +908,12 @@ environment` implement the :std:`core::marker::Send` :t:`trait`. Closure capture precision ^^^^^^^^^^^^^^^^^^^^^^^^^ -:dp:`fls_rdDT7jsaOMbs` -A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`variable`. - :dp:`fls_j9WyKVyOLFon` A :dt:`place projection` is a :t:`field access expression`, :t:`dereference`, :t:`array` or :t:`slice` :t:`index expression`, or :t:`pattern` destructuring applied to a :t:`variable`. +:dp:`fls_rdDT7jsaOMbs` +A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`variable`. + :dp:`fls_TbfUxVf8PKPs` A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, which may be truncated based on these rules: From 6eb57a3d301841136ee3c17cb2135c2c108b4293 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 13:35:28 +0200 Subject: [PATCH 08/34] be more consise and clear, remove redundancy, and link to a definition --- src/types-and-traits.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index 08d53ec9..7f49c190 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -918,7 +918,7 @@ A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`ca A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, which may be truncated based on these rules: - :dp:`fls_4TESOxGpEY2h` - When a :t:`capture path` and one of the ancestors of that path are both captured by a closure, the ancestor path is captured with the highest capture mode among the two captures, using the strict weak ordering: :t:`immutable borrow` < :t:`unique immutable borrow` < :t:`mutable borrow` < :t:`move `. + When a :t:`capture path` and an ancestor :t:`capture path` are both :t:`captured `, the ancestor :t:`capture path` is captured with the highest capture mode among the two :t:`[capture path]s`. - :dp:`fls_eNkZWskzznW6` The :t:`capture path` is truncated at the rightmost :t:`dereference` in the :t:`capture path` if the :t:`dereference` is applied to a :t:`shared reference`. From a3a44f5f4e7e23ed01ceb2dab19ee45b8bb2651b Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 13:41:35 +0200 Subject: [PATCH 09/34] be more consise and clear, remove redundancy, and link to some definitions --- src/types-and-traits.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index 7f49c190..a3bd0228 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -918,7 +918,7 @@ A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`ca A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, which may be truncated based on these rules: - :dp:`fls_4TESOxGpEY2h` - When a :t:`capture path` and an ancestor :t:`capture path` are both :t:`captured `, the ancestor :t:`capture path` is captured with the highest capture mode among the two :t:`[capture path]s`. + When a :t:`capture path` and an ancestor :t:`capture path` are both :t:`captured `, the ancestor :t:`capture path` is captured with the highest :t:`capture mode` among the two :t:`[capture path]s`. - :dp:`fls_eNkZWskzznW6` The :t:`capture path` is truncated at the rightmost :t:`dereference` in the :t:`capture path` if the :t:`dereference` is applied to a :t:`shared reference`. From eb5790020fced1bd22d6c86509d345350032c974 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 13:44:22 +0200 Subject: [PATCH 10/34] clarity --- src/changelog.rst | 8 ++++++-- src/expressions.rst | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/changelog.rst b/src/changelog.rst index 7eef61de..8c40306a 100644 --- a/src/changelog.rst +++ b/src/changelog.rst @@ -172,6 +172,12 @@ Language changes in Rust 1.95.0 FLS maintenance --------------- +- Changed paragraphs: + + - :p:`fls_33hfay24hx8u` + - :p:`fls_uqy5w9uc8gla` + - :p:`fls_1941wid94hlg` + - New paragraphs: - :p:`fls_CSuxTkwR96j9` @@ -198,8 +204,6 @@ FLS maintenance - :p:`fls_fITor3jpmgrl` - :p:`fls_XFwPNGsVsu05` -- Changed paragraph: :p:`fls_1941wid94hlg` - - Replace the term "simple path prefix" with "common path prefix", to improve clarity. Language changes in Rust 1.94.0 diff --git a/src/expressions.rst b/src/expressions.rst index 77848884..43b0c3da 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5332,7 +5332,7 @@ within the :t:`capturing expression`, as follows: precedence: #. :dp:`fls_33hfay24hx8u` - :t:`By immutable reference capture`. + :t:`By immutable reference capture` (lowest precedence). #. :dp:`fls_wmxsd0i2yemf` :t:`By unique immutable reference capture` mode, if the @@ -5342,7 +5342,7 @@ within the :t:`capturing expression`, as follows: :t:`By mutable reference capture` mode. #. :dp:`fls_uqy5w9uc8gla` - :t:`By value capture`. + :t:`By value capture` (highest precedence). :dp:`fls_wvob7114tfat` A tool selects the first :t:`capture mode` that is compatible with the use of From 9d93e6100408cc6a8d5cb5e07a1a89be1b1c9286 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 15:27:24 +0200 Subject: [PATCH 11/34] missing word --- src/types-and-traits.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index a3bd0228..1977b821 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -942,7 +942,7 @@ A :t:`place` is captured by :t:`immutable borrow` if its :t:`discriminant` is re Matching against a variant of an enum that has more than one variant captures the :t:`place` by :t:`immutable borrow`. :dp:`fls_7EXHdE2eOVek` -Matching against a variant of an enum that has one variant does not capture the place, unless is marked with :t:`attribute` ``non_exhaustive``, in which case the place is captured by :t:`immutable borrow`. +Matching against a variant of an enum that has one variant does not capture the place, unless it is marked with :t:`attribute` ``non_exhaustive``, in which case the place is captured by :t:`immutable borrow`. :dp:`fls_iLH8X2U4ADHb` Matching against a :t:`range pattern` captures the place by :t:`immutable borrow`. @@ -960,7 +960,7 @@ Move closures can only capture the prefix of a :t:`capture path` that runs up to Closures will only capture the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`raw pointer`. :dp:`fls_kYFd3p06pWWV` -Closures will only capture the prefix of a :t:`capture path` of a :t:`union` that runs up to union itself. +Closures will only capture the prefix of a :t:`capture path` of a :t:`union` that runs up to the union itself. :dp:`fls_fATMTNUOHsfb` Closures will only capture the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a structure that uses the :t:`attribute` ``packed`` representation, in unaligned :t:`[field]s` in a struct. From 5a5c650cc516d143fd8f66d90075cfa53eb39fdd Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 15:29:34 +0200 Subject: [PATCH 12/34] dangling term --- src/changelog.rst | 1 - src/types-and-traits.rst | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/changelog.rst b/src/changelog.rst index 8c40306a..5bdb76be 100644 --- a/src/changelog.rst +++ b/src/changelog.rst @@ -202,7 +202,6 @@ FLS maintenance - :p:`fls_kYFd3p06pWWV` - :p:`fls_fATMTNUOHsfb` - :p:`fls_fITor3jpmgrl` - - :p:`fls_XFwPNGsVsu05` - Replace the term "simple path prefix" with "common path prefix", to improve clarity. diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index 1977b821..8d072e1e 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -968,9 +968,6 @@ Closures will only capture the prefix of the :t:`capture path` that runs up to, :dp:`fls_fITor3jpmgrl` Taking the address of an unaligned :t:`field` captures the entire struct. -:dp:`fls_XFwPNGsVsu05` -A :dt:`unique immutable borrow` is a capture that occurs when modifying the :t:`referent` of a :t:`mutable reference`. - .. _fls_airvr79xkcag: Function Item Types From 614611e407f2edfb57e1bda152c3e100902ece21 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 21 Apr 2026 15:36:05 +0200 Subject: [PATCH 13/34] move to a more suitable place --- src/expressions.rst | 65 ++++++++++++++++++++++++++++++++++++++++ src/types-and-traits.rst | 65 ---------------------------------------- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/src/expressions.rst b/src/expressions.rst index 43b0c3da..1ed5ebc8 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5348,6 +5348,71 @@ within the :t:`capturing expression`, as follows: A tool selects the first :t:`capture mode` that is compatible with the use of the :t:`capture target`. +.. _fls_G64vdcIyB2Is: + +Capture precision +~~~~~~~~~~~~~~~~~ + +:dp:`fls_j9WyKVyOLFon` +A :dt:`place projection` is a :t:`field access expression`, :t:`dereference`, :t:`array` or :t:`slice` :t:`index expression`, or :t:`pattern` destructuring applied to a :t:`variable`. + +:dp:`fls_rdDT7jsaOMbs` +A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`variable`. + +:dp:`fls_TbfUxVf8PKPs` +A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, which may be truncated based on these rules: + +- :dp:`fls_4TESOxGpEY2h` + When a :t:`capture path` and an ancestor :t:`capture path` are both :t:`captured `, the ancestor :t:`capture path` is captured with the highest :t:`capture mode` among the two :t:`[capture path]s`. + +- :dp:`fls_eNkZWskzznW6` + The :t:`capture path` is truncated at the rightmost :t:`dereference` in the :t:`capture path` if the :t:`dereference` is applied to a :t:`shared reference`. + +:dp:`fls_v8IFXHJnXhez` +A :t:`place` is not captured when an :t:`underscore expression` is used to bind it. + +:dp:`fls_gujpU7p5n9Zx` +A :t:`place` is not captured by destructuring tuples, structs, and single-variant enums. + +:dp:`fls_t8tFLUg8O83Q` +A :t:`place` is not captured by being matched against a :t:`rest pattern`. + +:dp:`fls_RaONmCLH2KGM` +The entire :t:`slice` or :t:`array` is always captured even if used with :t:`underscore expression`, :t:`indexing `, or :t:`slicing `. + +:dp:`fls_Vt9C9mKxHOwo` +A :t:`place` is captured by :t:`immutable borrow` if its :t:`discriminant` is read by :t:`pattern matching`. + +:dp:`fls_Fs12dmznjsMf` +Matching against a variant of an enum that has more than one variant captures the :t:`place` by :t:`immutable borrow`. + +:dp:`fls_7EXHdE2eOVek` +Matching against a variant of an enum that has one variant does not capture the place, unless it is marked with :t:`attribute` ``non_exhaustive``, in which case the place is captured by :t:`immutable borrow`. + +:dp:`fls_iLH8X2U4ADHb` +Matching against a :t:`range pattern` captures the place by :t:`immutable borrow`. + +:dp:`fls_HMJUXHrvOmPl` +Matching a :t:`slice` against a slice :t:`pattern`, other than one with only a single rest pattern ``[..]``, captures the slice by :t:`immutable borrow`. + +:dp:`fls_Gj1znNpthHY6` +Matching an array against a slice pattern does not capture the :t:`place`. + +:dp:`fls_IFyJvb6mlFU4` +Move closures can only capture the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`reference`. + +:dp:`fls_7NEEJgKSpQQ8` +Closures will only capture the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`raw pointer`. + +:dp:`fls_kYFd3p06pWWV` +Closures will only capture the prefix of a :t:`capture path` of a :t:`union` that runs up to the union itself. + +:dp:`fls_fATMTNUOHsfb` +Closures will only capture the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a structure that uses the :t:`attribute` ``packed`` representation, in unaligned :t:`[field]s` in a struct. + +:dp:`fls_fITor3jpmgrl` +Taking the address of an unaligned :t:`field` captures the entire struct. + .. _fls_ZfIBiJMf8qE1: Arithmetic Overflow diff --git a/src/types-and-traits.rst b/src/types-and-traits.rst index 8d072e1e..f142329d 100644 --- a/src/types-and-traits.rst +++ b/src/types-and-traits.rst @@ -903,71 +903,6 @@ A :t:`closure type` implicitly implements the :std:`core::marker::Sync` :t:`trait` if all the :t:`[type]s` of the :t:`[value]s` of the :t:`capturing environment` implement the :std:`core::marker::Send` :t:`trait`. -.. _fls_G64vdcIyB2Is: - -Closure capture precision -^^^^^^^^^^^^^^^^^^^^^^^^^ - -:dp:`fls_j9WyKVyOLFon` -A :dt:`place projection` is a :t:`field access expression`, :t:`dereference`, :t:`array` or :t:`slice` :t:`index expression`, or :t:`pattern` destructuring applied to a :t:`variable`. - -:dp:`fls_rdDT7jsaOMbs` -A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`variable`. - -:dp:`fls_TbfUxVf8PKPs` -A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, which may be truncated based on these rules: - -- :dp:`fls_4TESOxGpEY2h` - When a :t:`capture path` and an ancestor :t:`capture path` are both :t:`captured `, the ancestor :t:`capture path` is captured with the highest :t:`capture mode` among the two :t:`[capture path]s`. - -- :dp:`fls_eNkZWskzznW6` - The :t:`capture path` is truncated at the rightmost :t:`dereference` in the :t:`capture path` if the :t:`dereference` is applied to a :t:`shared reference`. - -:dp:`fls_v8IFXHJnXhez` -A :t:`place` is not captured when an :t:`underscore expression` is used to bind it. - -:dp:`fls_gujpU7p5n9Zx` -A :t:`place` is not captured by destructuring tuples, structs, and single-variant enums. - -:dp:`fls_t8tFLUg8O83Q` -A :t:`place` is not captured by being matched against a :t:`rest pattern`. - -:dp:`fls_RaONmCLH2KGM` -The entire :t:`slice` or :t:`array` is always captured even if used with :t:`underscore expression`, :t:`indexing `, or :t:`slicing `. - -:dp:`fls_Vt9C9mKxHOwo` -A :t:`place` is captured by :t:`immutable borrow` if its :t:`discriminant` is read by :t:`pattern matching`. - -:dp:`fls_Fs12dmznjsMf` -Matching against a variant of an enum that has more than one variant captures the :t:`place` by :t:`immutable borrow`. - -:dp:`fls_7EXHdE2eOVek` -Matching against a variant of an enum that has one variant does not capture the place, unless it is marked with :t:`attribute` ``non_exhaustive``, in which case the place is captured by :t:`immutable borrow`. - -:dp:`fls_iLH8X2U4ADHb` -Matching against a :t:`range pattern` captures the place by :t:`immutable borrow`. - -:dp:`fls_HMJUXHrvOmPl` -Matching a :t:`slice` against a slice :t:`pattern`, other than one with only a single rest pattern ``[..]``, captures the slice by :t:`immutable borrow`. - -:dp:`fls_Gj1znNpthHY6` -Matching an array against a slice pattern does not capture the :t:`place`. - -:dp:`fls_IFyJvb6mlFU4` -Move closures can only capture the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`reference`. - -:dp:`fls_7NEEJgKSpQQ8` -Closures will only capture the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`raw pointer`. - -:dp:`fls_kYFd3p06pWWV` -Closures will only capture the prefix of a :t:`capture path` of a :t:`union` that runs up to the union itself. - -:dp:`fls_fATMTNUOHsfb` -Closures will only capture the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a structure that uses the :t:`attribute` ``packed`` representation, in unaligned :t:`[field]s` in a struct. - -:dp:`fls_fITor3jpmgrl` -Taking the address of an unaligned :t:`field` captures the entire struct. - .. _fls_airvr79xkcag: Function Item Types From f6d88b0980758139f1e58b9deba87caf6bf0f717 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Thu, 23 Apr 2026 18:14:02 +0200 Subject: [PATCH 14/34] be less verbose (and nearly all the paragraphs are rules, so don't overload the term) Co-authored-by: Hristian Kirtchev <60669983+kirtchev-adacore@users.noreply.github.com> --- src/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expressions.rst b/src/expressions.rst index 1ed5ebc8..66936683 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5360,7 +5360,7 @@ A :dt:`place projection` is a :t:`field access expression`, :t:`dereference`, :t A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`variable`. :dp:`fls_TbfUxVf8PKPs` -A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, which may be truncated based on these rules: +A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, as follows: - :dp:`fls_4TESOxGpEY2h` When a :t:`capture path` and an ancestor :t:`capture path` are both :t:`captured `, the ancestor :t:`capture path` is captured with the highest :t:`capture mode` among the two :t:`[capture path]s`. From 39446e99e7f76379db06193d5d74cb9f457f9238 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Thu, 23 Apr 2026 18:21:19 +0200 Subject: [PATCH 15/34] link-it --- src/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expressions.rst b/src/expressions.rst index 66936683..a7a0940c 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5363,7 +5363,7 @@ A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`ca A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, as follows: - :dp:`fls_4TESOxGpEY2h` - When a :t:`capture path` and an ancestor :t:`capture path` are both :t:`captured `, the ancestor :t:`capture path` is captured with the highest :t:`capture mode` among the two :t:`[capture path]s`. + When a :t:`capture path` and an ancestor :t:`capture path` are both :t:`captured `, the ancestor :t:`capture path` is :t:`captured` with the highest :t:`capture mode` among the two :t:`[capture path]s`. - :dp:`fls_eNkZWskzznW6` The :t:`capture path` is truncated at the rightmost :t:`dereference` in the :t:`capture path` if the :t:`dereference` is applied to a :t:`shared reference`. From cc832e5914ee5ef599e259bf78b5a1e672d1cf5c Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 28 Apr 2026 09:28:11 +0200 Subject: [PATCH 16/34] match FLS style, and re-oder one rule Co-authored-by: Hristian Kirtchev <60669983+kirtchev-adacore@users.noreply.github.com> --- src/expressions.rst | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/expressions.rst b/src/expressions.rst index a7a0940c..354b4cbb 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5368,47 +5368,47 @@ A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture - :dp:`fls_eNkZWskzznW6` The :t:`capture path` is truncated at the rightmost :t:`dereference` in the :t:`capture path` if the :t:`dereference` is applied to a :t:`shared reference`. +:dp:`fls_Vt9C9mKxHOwo` +A :t:`place` is :t:`captured` by :t:`immutable borrow` if its :t:`discriminant` is read by :t:`pattern matching`. + :dp:`fls_v8IFXHJnXhez` -A :t:`place` is not captured when an :t:`underscore expression` is used to bind it. +A :t:`place` is not :t:`captured` when an :t:`underscore expression` is used to bind it. :dp:`fls_gujpU7p5n9Zx` -A :t:`place` is not captured by destructuring tuples, structs, and single-variant enums. +A :t:`place` is not :t:`captured` by destructuring :t:`[struct]s`, :t:`[tuple]s`, and :t:`[enum]s` with a single :t:`enum variant`. :dp:`fls_t8tFLUg8O83Q` -A :t:`place` is not captured by being matched against a :t:`rest pattern`. +A :t:`place` is not :t:`captured` by being matched against a :t:`rest pattern`. :dp:`fls_RaONmCLH2KGM` -The entire :t:`slice` or :t:`array` is always captured even if used with :t:`underscore expression`, :t:`indexing `, or :t:`slicing `. - -:dp:`fls_Vt9C9mKxHOwo` -A :t:`place` is captured by :t:`immutable borrow` if its :t:`discriminant` is read by :t:`pattern matching`. +An :t:`array` or :t:`slice` is :t:`captured` whole. :dp:`fls_Fs12dmznjsMf` -Matching against a variant of an enum that has more than one variant captures the :t:`place` by :t:`immutable borrow`. +Matching against an :t:`enum variant` of an :t:`enum` with more than one :t:`[enum variant]s` :t:`captures` the :t:`place` by :t:`immutable borrow`. :dp:`fls_7EXHdE2eOVek` -Matching against a variant of an enum that has one variant does not capture the place, unless it is marked with :t:`attribute` ``non_exhaustive``, in which case the place is captured by :t:`immutable borrow`. +Matching against an :t:`enum variant` of an :t:`enum` with one :t:`enum variant` does not :t:`capture` the :t:`place`, unless it is subject to :t:`attribute` ``non_exhaustive``, in which case the :t:`place` is captured by :t:`immutable borrow`. :dp:`fls_iLH8X2U4ADHb` -Matching against a :t:`range pattern` captures the place by :t:`immutable borrow`. +Matching against a :t:`range pattern` :t:`captures` the :t:`place` by :t:`immutable borrow`. :dp:`fls_HMJUXHrvOmPl` -Matching a :t:`slice` against a slice :t:`pattern`, other than one with only a single rest pattern ``[..]``, captures the slice by :t:`immutable borrow`. +Matching a :t:`slice` against a :t:`slice pattern`, other than one with only a single :t:`rest pattern`, :t:`captures` the :t:`slice` by :t:`immutable borrow`. :dp:`fls_Gj1znNpthHY6` -Matching an array against a slice pattern does not capture the :t:`place`. +Matching an :t:`array` against a :t:`slice pattern` does not :t:`capture` the :t:`place`. :dp:`fls_IFyJvb6mlFU4` -Move closures can only capture the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`reference`. +A :t:`closure expression` subject to keyword ``move`` :t:`captures` the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`reference`. :dp:`fls_7NEEJgKSpQQ8` -Closures will only capture the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`raw pointer`. +A :t:`closure expression` :t:`captures` the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`raw pointer`. :dp:`fls_kYFd3p06pWWV` -Closures will only capture the prefix of a :t:`capture path` of a :t:`union` that runs up to the union itself. +A :t:`closure expression` :t:`captures` the prefix of a :t:`capture path` of a :t:`union` that runs up to the :t:`union` itself. :dp:`fls_fATMTNUOHsfb` -Closures will only capture the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a structure that uses the :t:`attribute` ``packed`` representation, in unaligned :t:`[field]s` in a struct. +A :t:`closure expression` :t:`captures` the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a :t:`struct` that uses the :t:`attribute` :c:`repr` with modifier ``packed``, in unaligned :t:`[field]s` in a :t:`struct`. :dp:`fls_fITor3jpmgrl` Taking the address of an unaligned :t:`field` captures the entire struct. From 89a9ee32abb5ba5a9660c933064948ddfadf0274 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 28 Apr 2026 09:37:22 +0200 Subject: [PATCH 17/34] fix links --- src/expressions.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/expressions.rst b/src/expressions.rst index 354b4cbb..1a23485b 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5384,31 +5384,31 @@ A :t:`place` is not :t:`captured` by being matched against a :t:`rest pattern`. An :t:`array` or :t:`slice` is :t:`captured` whole. :dp:`fls_Fs12dmznjsMf` -Matching against an :t:`enum variant` of an :t:`enum` with more than one :t:`[enum variant]s` :t:`captures` the :t:`place` by :t:`immutable borrow`. +Matching against an :t:`enum variant` of an :t:`enum` with more than one :t:`[enum variant]s` :t:`captures ` the :t:`place` by :t:`immutable borrow`. :dp:`fls_7EXHdE2eOVek` -Matching against an :t:`enum variant` of an :t:`enum` with one :t:`enum variant` does not :t:`capture` the :t:`place`, unless it is subject to :t:`attribute` ``non_exhaustive``, in which case the :t:`place` is captured by :t:`immutable borrow`. +Matching against an :t:`enum variant` of an :t:`enum` with one :t:`enum variant` does not :t:`capture ` the :t:`place`, unless it is subject to :t:`attribute` ``non_exhaustive``, in which case the :t:`place` is captured by :t:`immutable borrow`. :dp:`fls_iLH8X2U4ADHb` -Matching against a :t:`range pattern` :t:`captures` the :t:`place` by :t:`immutable borrow`. +Matching against a :t:`range pattern` :t:`captures ` the :t:`place` by :t:`immutable borrow`. :dp:`fls_HMJUXHrvOmPl` -Matching a :t:`slice` against a :t:`slice pattern`, other than one with only a single :t:`rest pattern`, :t:`captures` the :t:`slice` by :t:`immutable borrow`. +Matching a :t:`slice` against a :t:`slice pattern`, other than one with only a single :t:`rest pattern`, :t:`captures ` the :t:`slice` by :t:`immutable borrow`. :dp:`fls_Gj1znNpthHY6` -Matching an :t:`array` against a :t:`slice pattern` does not :t:`capture` the :t:`place`. +Matching an :t:`array` against a :t:`slice pattern` does not :t:`capture ` the :t:`place`. :dp:`fls_IFyJvb6mlFU4` -A :t:`closure expression` subject to keyword ``move`` :t:`captures` the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`reference`. +A :t:`closure expression` subject to keyword ``move`` :t:`captures ` the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`reference`. :dp:`fls_7NEEJgKSpQQ8` -A :t:`closure expression` :t:`captures` the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`raw pointer`. +A :t:`closure expression` :t:`captures ` the prefix of a :t:`capture path` that runs up to, but not including, the first :t:`dereference` of a :t:`raw pointer`. :dp:`fls_kYFd3p06pWWV` -A :t:`closure expression` :t:`captures` the prefix of a :t:`capture path` of a :t:`union` that runs up to the :t:`union` itself. +A :t:`closure expression` :t:`captures ` the prefix of a :t:`capture path` of a :t:`union` that runs up to the :t:`union` itself. :dp:`fls_fATMTNUOHsfb` -A :t:`closure expression` :t:`captures` the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a :t:`struct` that uses the :t:`attribute` :c:`repr` with modifier ``packed``, in unaligned :t:`[field]s` in a :t:`struct`. +A :t:`closure expression` :t:`captures ` the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a :t:`struct` that uses the :t:`attribute` :c:`repr` with modifier ``packed``, in unaligned :t:`[field]s` in a :t:`struct`. :dp:`fls_fITor3jpmgrl` Taking the address of an unaligned :t:`field` captures the entire struct. From 9fe965ca98638849b722bea484eca26be36561c9 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 28 Apr 2026 10:03:18 +0200 Subject: [PATCH 18/34] these should not be conflated --- src/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expressions.rst b/src/expressions.rst index 1a23485b..068ea900 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5372,7 +5372,7 @@ A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture A :t:`place` is :t:`captured` by :t:`immutable borrow` if its :t:`discriminant` is read by :t:`pattern matching`. :dp:`fls_v8IFXHJnXhez` -A :t:`place` is not :t:`captured` when an :t:`underscore expression` is used to bind it. +A :t:`place` is not :t:`captured` when an :t:`underscore pattern` is used to bind it. :dp:`fls_gujpU7p5n9Zx` A :t:`place` is not :t:`captured` by destructuring :t:`[struct]s`, :t:`[tuple]s`, and :t:`[enum]s` with a single :t:`enum variant`. From b6440a5b218b0c32d0da1d6d410e57701f6a15c9 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 28 Apr 2026 11:49:07 +0200 Subject: [PATCH 19/34] add some clarity --- src/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expressions.rst b/src/expressions.rst index 068ea900..33d45f76 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5375,7 +5375,7 @@ A :t:`place` is :t:`captured` by :t:`immutable borrow` if its :t:`discriminant` A :t:`place` is not :t:`captured` when an :t:`underscore pattern` is used to bind it. :dp:`fls_gujpU7p5n9Zx` -A :t:`place` is not :t:`captured` by destructuring :t:`[struct]s`, :t:`[tuple]s`, and :t:`[enum]s` with a single :t:`enum variant`. +A :t:`place` is not :t:`captured` by using a :t:`rest pattern` when destructuring :t:`[struct]s`, :t:`[tuple]s`, and :t:`[enum]s` with a single :t:`enum variant`. :dp:`fls_t8tFLUg8O83Q` A :t:`place` is not :t:`captured` by being matched against a :t:`rest pattern`. From e8b422ab2be9d05e8ee078dd138da841673c643e Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Mon, 4 May 2026 13:08:09 +0200 Subject: [PATCH 20/34] add pattern destructing rules --- src/changelog.rst | 4 ++++ src/expressions.rst | 2 +- src/patterns.rst | 12 ++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/changelog.rst b/src/changelog.rst index 5bdb76be..8494ee66 100644 --- a/src/changelog.rst +++ b/src/changelog.rst @@ -202,6 +202,10 @@ FLS maintenance - :p:`fls_kYFd3p06pWWV` - :p:`fls_fATMTNUOHsfb` - :p:`fls_fITor3jpmgrl` + - :p:`fls_UfvoShNTxVD2` + - :p:`fls_wAMHIDvLG0LM` + - :p:`fls_YuQxJCjneaW5` + - :p:`fls_nrTZ4mn6IJCl` - Replace the term "simple path prefix" with "common path prefix", to improve clarity. diff --git a/src/expressions.rst b/src/expressions.rst index 33d45f76..1189a01e 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5354,7 +5354,7 @@ Capture precision ~~~~~~~~~~~~~~~~~ :dp:`fls_j9WyKVyOLFon` -A :dt:`place projection` is a :t:`field access expression`, :t:`dereference`, :t:`array` or :t:`slice` :t:`index expression`, or :t:`pattern` destructuring applied to a :t:`variable`. +A :dt:`place projection` is a :t:`field access expression`, :t:`dereference`, :t:`array` or :t:`slice` :t:`index expression`, or :t:`pattern destructuring` applied to a :t:`variable`. :dp:`fls_rdDT7jsaOMbs` A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`variable`. diff --git a/src/patterns.rst b/src/patterns.rst index b78f2cd9..5c2ac587 100644 --- a/src/patterns.rst +++ b/src/patterns.rst @@ -92,6 +92,18 @@ restrictions: Any two :t:`[binding]s` with the same name in the two :t:`[pattern-without-alternation]s` shall have :t:`[unifiable type]s` and shall have the same :t:`[binding mode]s`. +:dp:`fls_UfvoShNTxVD2` +:dt:`Pattern destructuring` is where :t:`[value]s` of :t:`[struct]s`, :t:`[enum]s`, and :t:`[tuple]s` are broken into :t:`[struct field]s`, :t:`[enum variant]s`, and :t:`[tuple field]s`, respectively. + +:dp:`fls_wAMHIDvLG0LM` +In a pattern whose :t:`subject expression` is a :t:`struct type`, an :t:`underscore pattern` matches a single :t:`struct field`, and a :t:`rest pattern` matches the remaining fields. + +:dp:`fls_YuQxJCjneaW5` +In a pattern whose :t:`subject expression` is an :t:`enum type`, an :t:`underscore pattern` matches a single :t:`enum variant`, and a :t:`rest pattern` matches the remaining variants. + +:dp:`fls_nrTZ4mn6IJCl` +In a pattern whose :t:`subject expression` is a :t:`tuple type`, an :t:`underscore pattern` matches a single :t:`tuple field`, and a :t:`rest pattern` matches the remaining fields. + .. _fls_uh76pw6ykd57: Refutability From 36b380094ff7b3de85b91b24eeb95e9eafe441ac Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 5 May 2026 12:16:21 +0200 Subject: [PATCH 21/34] clarity Co-authored-by: Hristian Kirtchev <60669983+kirtchev-adacore@users.noreply.github.com> --- src/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expressions.rst b/src/expressions.rst index 1189a01e..109d8ed7 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5387,7 +5387,7 @@ An :t:`array` or :t:`slice` is :t:`captured` whole. Matching against an :t:`enum variant` of an :t:`enum` with more than one :t:`[enum variant]s` :t:`captures ` the :t:`place` by :t:`immutable borrow`. :dp:`fls_7EXHdE2eOVek` -Matching against an :t:`enum variant` of an :t:`enum` with one :t:`enum variant` does not :t:`capture ` the :t:`place`, unless it is subject to :t:`attribute` ``non_exhaustive``, in which case the :t:`place` is captured by :t:`immutable borrow`. +Matching against an :t:`enum variant` of an :t:`enum` with one :t:`enum variant` does not :t:`capture ` the :t:`place`, unless the :t:`enum` is subject to :t:`attribute` ``non_exhaustive``, in which case the :t:`place` is captured by :t:`immutable borrow`. :dp:`fls_iLH8X2U4ADHb` Matching against a :t:`range pattern` :t:`captures ` the :t:`place` by :t:`immutable borrow`. From a20022f860205a43ef612c9b916a308694a7ce0d Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 5 May 2026 14:25:09 +0200 Subject: [PATCH 22/34] sort Co-authored-by: Hristian Kirtchev <60669983+kirtchev-adacore@users.noreply.github.com> --- src/patterns.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/patterns.rst b/src/patterns.rst index 5c2ac587..6756ab24 100644 --- a/src/patterns.rst +++ b/src/patterns.rst @@ -93,7 +93,7 @@ restrictions: :t:`[unifiable type]s` and shall have the same :t:`[binding mode]s`. :dp:`fls_UfvoShNTxVD2` -:dt:`Pattern destructuring` is where :t:`[value]s` of :t:`[struct]s`, :t:`[enum]s`, and :t:`[tuple]s` are broken into :t:`[struct field]s`, :t:`[enum variant]s`, and :t:`[tuple field]s`, respectively. +:dt:`Pattern destructuring` is where :t:`[value]s` of :t:`[enum]s`, :t:`[struct]s`, and :t:`[tuple]s` are broken into :t:`[enum variant]s`, :t:`[struct field]s`, and :t:`[tuple field]s`, respectively. :dp:`fls_wAMHIDvLG0LM` In a pattern whose :t:`subject expression` is a :t:`struct type`, an :t:`underscore pattern` matches a single :t:`struct field`, and a :t:`rest pattern` matches the remaining fields. From fd77027dd9d0cd5846c7046c2b31f93395ec5b53 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 5 May 2026 14:30:03 +0200 Subject: [PATCH 23/34] more sorting Co-authored-by: Hristian Kirtchev <60669983+kirtchev-adacore@users.noreply.github.com> --- src/patterns.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/patterns.rst b/src/patterns.rst index 6756ab24..2318d301 100644 --- a/src/patterns.rst +++ b/src/patterns.rst @@ -95,15 +95,14 @@ restrictions: :dp:`fls_UfvoShNTxVD2` :dt:`Pattern destructuring` is where :t:`[value]s` of :t:`[enum]s`, :t:`[struct]s`, and :t:`[tuple]s` are broken into :t:`[enum variant]s`, :t:`[struct field]s`, and :t:`[tuple field]s`, respectively. -:dp:`fls_wAMHIDvLG0LM` -In a pattern whose :t:`subject expression` is a :t:`struct type`, an :t:`underscore pattern` matches a single :t:`struct field`, and a :t:`rest pattern` matches the remaining fields. - :dp:`fls_YuQxJCjneaW5` In a pattern whose :t:`subject expression` is an :t:`enum type`, an :t:`underscore pattern` matches a single :t:`enum variant`, and a :t:`rest pattern` matches the remaining variants. +:dp:`fls_wAMHIDvLG0LM` +In a pattern whose :t:`subject expression` is a :t:`struct type`, an :t:`underscore pattern` matches a single :t:`struct field`, and a :t:`rest pattern` matches the remaining fields. + :dp:`fls_nrTZ4mn6IJCl` In a pattern whose :t:`subject expression` is a :t:`tuple type`, an :t:`underscore pattern` matches a single :t:`tuple field`, and a :t:`rest pattern` matches the remaining fields. - .. _fls_uh76pw6ykd57: Refutability From 14a3bd2fc718e9db6844dd95b7cb87df3f9c81de Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 5 May 2026 14:47:27 +0200 Subject: [PATCH 24/34] create section for pattern destructuring --- src/changelog.rst | 2 ++ src/patterns.rst | 28 +++++++++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/changelog.rst b/src/changelog.rst index 8494ee66..d576083a 100644 --- a/src/changelog.rst +++ b/src/changelog.rst @@ -178,6 +178,8 @@ FLS maintenance - :p:`fls_uqy5w9uc8gla` - :p:`fls_1941wid94hlg` +- New section: :ref:`fls_buRbhu22Gfdu` + - New paragraphs: - :p:`fls_CSuxTkwR96j9` diff --git a/src/patterns.rst b/src/patterns.rst index 2318d301..a20ca8de 100644 --- a/src/patterns.rst +++ b/src/patterns.rst @@ -92,17 +92,6 @@ restrictions: Any two :t:`[binding]s` with the same name in the two :t:`[pattern-without-alternation]s` shall have :t:`[unifiable type]s` and shall have the same :t:`[binding mode]s`. -:dp:`fls_UfvoShNTxVD2` -:dt:`Pattern destructuring` is where :t:`[value]s` of :t:`[enum]s`, :t:`[struct]s`, and :t:`[tuple]s` are broken into :t:`[enum variant]s`, :t:`[struct field]s`, and :t:`[tuple field]s`, respectively. - -:dp:`fls_YuQxJCjneaW5` -In a pattern whose :t:`subject expression` is an :t:`enum type`, an :t:`underscore pattern` matches a single :t:`enum variant`, and a :t:`rest pattern` matches the remaining variants. - -:dp:`fls_wAMHIDvLG0LM` -In a pattern whose :t:`subject expression` is a :t:`struct type`, an :t:`underscore pattern` matches a single :t:`struct field`, and a :t:`rest pattern` matches the remaining fields. - -:dp:`fls_nrTZ4mn6IJCl` -In a pattern whose :t:`subject expression` is a :t:`tuple type`, an :t:`underscore pattern` matches a single :t:`tuple field`, and a :t:`rest pattern` matches the remaining fields. .. _fls_uh76pw6ykd57: Refutability @@ -149,6 +138,23 @@ A :t:`refutable constant` is a :t:`constant` of a :t:`refutable type`. if let core::option::Option::Some(y) = value { +.. _fls_buRbhu22Gfdu: + +Pattern Destructuring +--------------------- + +:dp:`fls_UfvoShNTxVD2` +:dt:`Pattern destructuring` is where :t:`[value]s` of :t:`[enum]s`, :t:`[struct]s`, and :t:`[tuple]s` are broken into :t:`[enum variant]s`, :t:`[struct field]s`, and :t:`[tuple field]s`, respectively. + +:dp:`fls_YuQxJCjneaW5` +In a pattern whose :t:`subject expression` is an :t:`enum type`, an :t:`underscore pattern` matches a single :t:`enum variant`, and a :t:`rest pattern` matches the remaining variants. + +:dp:`fls_wAMHIDvLG0LM` +In a pattern whose :t:`subject expression` is a :t:`struct type`, an :t:`underscore pattern` matches a single :t:`struct field`, and a :t:`rest pattern` matches the remaining fields. + +:dp:`fls_nrTZ4mn6IJCl` +In a pattern whose :t:`subject expression` is a :t:`tuple type`, an :t:`underscore pattern` matches a single :t:`tuple field`, and a :t:`rest pattern` matches the remaining fields. + .. _fls_7bxv8lybxm18: Identifier Patterns From 1429479e30eb823b6aaba4510fd6bbeffba417f7 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 5 May 2026 15:39:13 +0200 Subject: [PATCH 25/34] link-it --- src/expressions.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/expressions.rst b/src/expressions.rst index 109d8ed7..7e53fec1 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5375,7 +5375,7 @@ A :t:`place` is :t:`captured` by :t:`immutable borrow` if its :t:`discriminant` A :t:`place` is not :t:`captured` when an :t:`underscore pattern` is used to bind it. :dp:`fls_gujpU7p5n9Zx` -A :t:`place` is not :t:`captured` by using a :t:`rest pattern` when destructuring :t:`[struct]s`, :t:`[tuple]s`, and :t:`[enum]s` with a single :t:`enum variant`. +A :t:`place` is not :t:`captured` by using a :t:`rest pattern` when :t:`destructuring ` :t:`[struct]s`, :t:`[tuple]s`, and :t:`[enum]s` with a single :t:`enum variant`. :dp:`fls_t8tFLUg8O83Q` A :t:`place` is not :t:`captured` by being matched against a :t:`rest pattern`. @@ -5411,7 +5411,7 @@ A :t:`closure expression` :t:`captures ` the prefix of a :t:`capture A :t:`closure expression` :t:`captures ` the prefix of the :t:`capture path` that runs up to, but not including, the first :t:`field access expression` into a :t:`struct` that uses the :t:`attribute` :c:`repr` with modifier ``packed``, in unaligned :t:`[field]s` in a :t:`struct`. :dp:`fls_fITor3jpmgrl` -Taking the address of an unaligned :t:`field` captures the entire struct. +Taking the address of an unaligned :t:`field` :t:`captures ` the entire :t:`struct`. .. _fls_ZfIBiJMf8qE1: From bdeb5af79d88eee369e8006b9272e234e01f3b77 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Tue, 5 May 2026 15:43:07 +0200 Subject: [PATCH 26/34] fix --- src/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expressions.rst b/src/expressions.rst index 7e53fec1..160abb7e 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5378,7 +5378,7 @@ A :t:`place` is not :t:`captured` when an :t:`underscore pattern` is used to bin A :t:`place` is not :t:`captured` by using a :t:`rest pattern` when :t:`destructuring ` :t:`[struct]s`, :t:`[tuple]s`, and :t:`[enum]s` with a single :t:`enum variant`. :dp:`fls_t8tFLUg8O83Q` -A :t:`place` is not :t:`captured` by being matched against a :t:`rest pattern`. +A :t:`field` is not :t:`captured` by being matched against a :t:`rest pattern`. :dp:`fls_RaONmCLH2KGM` An :t:`array` or :t:`slice` is :t:`captured` whole. From e667c86529153d7abea6f82cbb6ca7ac9d6369fe Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Wed, 6 May 2026 11:18:04 +0200 Subject: [PATCH 27/34] remove misapplied plurality --- src/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expressions.rst b/src/expressions.rst index 160abb7e..94b3d1db 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5384,7 +5384,7 @@ A :t:`field` is not :t:`captured` by being matched against a :t:`rest pattern`. An :t:`array` or :t:`slice` is :t:`captured` whole. :dp:`fls_Fs12dmznjsMf` -Matching against an :t:`enum variant` of an :t:`enum` with more than one :t:`[enum variant]s` :t:`captures ` the :t:`place` by :t:`immutable borrow`. +Matching against an :t:`enum variant` of an :t:`enum` with more than one :t:`enum variant` :t:`captures ` the :t:`place` by :t:`immutable borrow`. :dp:`fls_7EXHdE2eOVek` Matching against an :t:`enum variant` of an :t:`enum` with one :t:`enum variant` does not :t:`capture ` the :t:`place`, unless the :t:`enum` is subject to :t:`attribute` ``non_exhaustive``, in which case the :t:`place` is captured by :t:`immutable borrow`. From fa83afbc0efd3b16de5d894371f2291ac0085054 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Thu, 25 Jun 2026 11:46:06 +0200 Subject: [PATCH 28/34] make more clear that this is recursive --- src/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expressions.rst b/src/expressions.rst index 94b3d1db..d7fa6f5d 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5363,7 +5363,7 @@ A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`ca A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, as follows: - :dp:`fls_4TESOxGpEY2h` - When a :t:`capture path` and an ancestor :t:`capture path` are both :t:`captured `, the ancestor :t:`capture path` is :t:`captured` with the highest :t:`capture mode` among the two :t:`[capture path]s`. + When a :t:`capture path` and an ancestor :t:`capture path` are both :t:`captured `, the ancestor :t:`capture path` is :t:`captured` with the highest :t:`capture mode` among the two :t:`[capture path]s`, recursively, for all such pairs of :t:`[capture path]s`. - :dp:`fls_eNkZWskzznW6` The :t:`capture path` is truncated at the rightmost :t:`dereference` in the :t:`capture path` if the :t:`dereference` is applied to a :t:`shared reference`. From 1bca7cb2b9b1a20feafc5f7d7b944bbf01137039 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Thu, 25 Jun 2026 13:28:22 +0200 Subject: [PATCH 29/34] it is important to mention the "read" --- src/changelog.rst | 1 + src/expressions.rst | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/changelog.rst b/src/changelog.rst index d576083a..dc97b3a4 100644 --- a/src/changelog.rst +++ b/src/changelog.rst @@ -184,6 +184,7 @@ FLS maintenance - :p:`fls_CSuxTkwR96j9` - :p:`fls_LV94x3HlpBWk` + - :p:`fls_zxcXuPAadEUH` - :p:`fls_rdDT7jsaOMbs` - :p:`fls_j9WyKVyOLFon` - :p:`fls_TbfUxVf8PKPs` diff --git a/src/expressions.rst b/src/expressions.rst index d7fa6f5d..8fc88149 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5287,6 +5287,9 @@ The :t:`capturing environment` of a :t:`capturing expression` consists of the :t:`Capturing` is the process of saving the :t:`[capture target]s` of a :t:`[capturing expression]'s` :t:`capturing environment`. +:dp:`fls_zxcXuPAadEUH` +:t:`Capturing` shall only happen when the :t:`capture target` needs to be read. + :dp:`fls_ip81lt2mm940` A :t:`capture target` requires :t:`capturing` when it is used by the :t:`capturing expression` and it is defined outside of the From b431dfe6dcb4d0db74774e343a5bc8b793a2f641 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Thu, 25 Jun 2026 14:28:06 +0200 Subject: [PATCH 30/34] include autoderef in definition Also, sort by alphabet --- src/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expressions.rst b/src/expressions.rst index 8fc88149..08869db0 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5357,7 +5357,7 @@ Capture precision ~~~~~~~~~~~~~~~~~ :dp:`fls_j9WyKVyOLFon` -A :dt:`place projection` is a :t:`field access expression`, :t:`dereference`, :t:`array` or :t:`slice` :t:`index expression`, or :t:`pattern destructuring` applied to a :t:`variable`. +A :dt:`place projection` is an :t:`array` :t:`index expression`, an automatic :t:`dereference`, an explicit :t:`dereference`, a :t:`field access expression`, a :t:`pattern destructuring` applied to a :t:`variable`, or a :t:`slice` :t:`index expression`. :dp:`fls_rdDT7jsaOMbs` A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`variable`. From 895b3a8bd9e2d973505a170e63f96033e38ce5b3 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Thu, 25 Jun 2026 14:54:16 +0200 Subject: [PATCH 31/34] a more a more specific term --- src/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expressions.rst b/src/expressions.rst index 08869db0..5ebd2c80 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5360,7 +5360,7 @@ Capture precision A :dt:`place projection` is an :t:`array` :t:`index expression`, an automatic :t:`dereference`, an explicit :t:`dereference`, a :t:`field access expression`, a :t:`pattern destructuring` applied to a :t:`variable`, or a :t:`slice` :t:`index expression`. :dp:`fls_rdDT7jsaOMbs` -A :dt:`capture path` is a sequence starting with a :t:`variable` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`variable`. +A :dt:`capture path` is a sequence starting with a :t:`capture target` from the :t:`capturing environment` followed by zero or more :t:`[place projection]s` from that :t:`capture target`. :dp:`fls_TbfUxVf8PKPs` A :t:`closure expression` :t:`[borrow]s` or :t:`moves ` the :t:`capture path`, as follows: From c14483ebb47f763a5d15c9c94d2533ac27425a0a Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Fri, 26 Jun 2026 18:52:59 +0200 Subject: [PATCH 32/34] Revert "it is important to mention the "read"" In an FLS call, we decided that it's not important after all... my thinking is that mentioning a read is not exactly relevant, as FLS is not a place to explain mechanics of rustc. It should be enough to only explain surface behavior, and not why that behavior is so. This reverts commit a3d7be401ee9a7eee01e907cec9e17c2208791aa. --- src/changelog.rst | 1 - src/expressions.rst | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/changelog.rst b/src/changelog.rst index dc97b3a4..d576083a 100644 --- a/src/changelog.rst +++ b/src/changelog.rst @@ -184,7 +184,6 @@ FLS maintenance - :p:`fls_CSuxTkwR96j9` - :p:`fls_LV94x3HlpBWk` - - :p:`fls_zxcXuPAadEUH` - :p:`fls_rdDT7jsaOMbs` - :p:`fls_j9WyKVyOLFon` - :p:`fls_TbfUxVf8PKPs` diff --git a/src/expressions.rst b/src/expressions.rst index 5ebd2c80..acafeb01 100644 --- a/src/expressions.rst +++ b/src/expressions.rst @@ -5287,9 +5287,6 @@ The :t:`capturing environment` of a :t:`capturing expression` consists of the :t:`Capturing` is the process of saving the :t:`[capture target]s` of a :t:`[capturing expression]'s` :t:`capturing environment`. -:dp:`fls_zxcXuPAadEUH` -:t:`Capturing` shall only happen when the :t:`capture target` needs to be read. - :dp:`fls_ip81lt2mm940` A :t:`capture target` requires :t:`capturing` when it is used by the :t:`capturing expression` and it is defined outside of the From 3149c0de14ae8aee320b16be3b8db1b6bd986e7c Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Fri, 24 Jul 2026 08:52:20 +0200 Subject: [PATCH 33/34] re-order This avoids the entry getting missed, due to the much larger "New paragraphs" entry --- src/changelog.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/changelog.rst b/src/changelog.rst index d576083a..d2abecde 100644 --- a/src/changelog.rst +++ b/src/changelog.rst @@ -172,6 +172,8 @@ Language changes in Rust 1.95.0 FLS maintenance --------------- +- Replace the term "simple path prefix" with "common path prefix", to improve clarity. + - Changed paragraphs: - :p:`fls_33hfay24hx8u` @@ -209,8 +211,6 @@ FLS maintenance - :p:`fls_YuQxJCjneaW5` - :p:`fls_nrTZ4mn6IJCl` -- Replace the term "simple path prefix" with "common path prefix", to improve clarity. - Language changes in Rust 1.94.0 ------------------------------- From 74f0b285d376b754f2b534a1598d6e7629c0b7ec Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Fri, 24 Jul 2026 11:50:51 +0200 Subject: [PATCH 34/34] point to new behavior introduced by release note entry --- src/changelog.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/changelog.rst b/src/changelog.rst index d2abecde..513bb647 100644 --- a/src/changelog.rst +++ b/src/changelog.rst @@ -169,6 +169,9 @@ Language changes in Rust 1.95.0 - `Make operational semantics of pattern matching independent of crate and module `_ + Previous behavior was not documented, + and a new paragraph was added to include the new behavior: :p:`fls_7EXHdE2eOVek`. + FLS maintenance --------------- @@ -197,7 +200,6 @@ FLS maintenance - :p:`fls_RaONmCLH2KGM` - :p:`fls_Vt9C9mKxHOwo` - :p:`fls_Fs12dmznjsMf` - - :p:`fls_7EXHdE2eOVek` - :p:`fls_iLH8X2U4ADHb` - :p:`fls_HMJUXHrvOmPl` - :p:`fls_Gj1znNpthHY6`