This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.

### 2819. Unspecified Return type: elements

Section: 33.2.5 [thread.req.lockable], 33.6.4 [thread.mutex.requirements] Status: New Submitter: Agustín K-ballo Bergé Opened: 2016-11-12 Last modified: 2022-11-06

Priority: 3

View all issues with New status.

Discussion:

The current draft contains 14 occurrences of a Return type: clause. That clause is not covered by 16.3.2.4 [structure.specifications] p3. This was reported as editorial request #266.

[Issues Telecon 16-Dec-2016]

Priority 3; Jonathan to provide wording.

[12-May-2020, Jonathan provides wording to correct the 13 occurrences.]

Previous resolution [SUPERSEDED]:

> This wording is relative to N4681.

> 1. Modify 33.2.5.3 [thread.req.lockable.req] as indicated:

>    > -1- A type `L` meets the Cpp17Lockable requirements if it meets the Cpp17BasicLockable requirements and the following expressions are well-formed, have type `bool`, and have the specified semantics (`m` denotes a value of type `L`).

>    > `m.try_lock()`

>    > > -2- Effects: [...]

>    > > -3- Return type: `bool`.

>    > > -4- Returns: `true` if the lock was acquired, `false` otherwise.

> 2. Modify 33.2.5.4 [thread.req.lockable.timed] as indicated:

>    > -1- A type `L` meets the Cpp17TimedLockable requirements if it meets the Cpp17BasicLockable requirements and the following expressions are well-formed, have type `bool`, and have the specified semantics (`m` denotes a value of type `L`, `rel_time` denotes a value of an instantiation of `duration` (29.5 [time.duration]), and `abs_time` denotes a value of an instantiation of `time_point` (29.6 [time.point])).

>    > `m.try_lock_for(rel_time)`

>    > > -2- Effects: [...]

>    > > -3- Return type: `bool`.

>    > > -4- Returns: `true` if the lock was acquired, `false` otherwise.

>    > `m.try_lock_until(abs_time)`

>    > > -2- Effects: [...]

>    > > -3- Return type: `bool`.

>    > > -4- Returns: `true` if the lock was acquired, `false` otherwise.

> 3. Modify 33.6.4.2 [thread.mutex.requirements.mutex] as indicated:

>    > -6- The expression `m.lock()` is well-formed, has type `void`, and has the following semantics:

>    > > -7- Preconditions: [...]

>    > > -8- Effects: [...]

>    > > -9- Postconditions: [...]

>    > > -10- Return type: `void`.

>    > > -11- Synchronization: [...]

>    > > -12- Throws: [...]

>    > > -13- Error conditions: [...]

>    > -14- The expression `m.try_lock()` is well-formed, has type `bool`, and has the following semantics:

>    > > -15- Preconditions: [...]

>    > > -16- Effects: [...]

>    > > -17- Return type: `bool`.

>    > > -18- Returns: `true` if ownership of the mutex was obtained for the calling thread, otherwise `false`.

>    > > -19- Synchronization: [...]

>    > > -20- Throws: Nothing.

>    > -21- The expression `m.unlock()` is well-formed, has type `void`, and has the following semantics:

>    > > -22- Preconditions: [...]

>    > > -23- Effects: [...]

>    > > -24- Return type: `void`.

>    > > -25- Synchronization: [...]

>    > > -26- Throws: Nothing.

> 4. Modify 33.6.4.3 [thread.timedmutex.requirements] as indicated:

>    > -1- The timed mutex types are the standard library types [...]

>    > -2- The timed mutex types meet the Cpp17TimedLockable requirements (33.2.5.4 [thread.req.lockable.timed]).

>    > -3- The expression `m.try_lock_for(rel_time)` is well-formed, has type `bool`, and has the following semantics:

>    > > -4- Preconditions: [...]

>    > > -5- Effects: [...]

>    > > -6- Return type: `bool`.

>    > > -7- Returns: `true` if the shared lock was acquired, `false` otherwise.

>    > > -8- Synchronization: [...]

>    > > -9- Throws: [...]

>    > -10- The expression `m.try_lock_until(abs_time)` is well-formed, has type `bool`, and has the following semantics:

>    > > -11- Preconditions: [...]

>    > > -12- Effects: [...]

>    > > -13- Return type: `bool`.

>    > > -14- Returns: `true` if ownership was obtained, otherwise `false`.

>    > > -15- Synchronization: [...]

>    > > -16- Throws: [...]

> 5. Modify 33.6.4.4 [thread.sharedmutex.requirements] as indicated:

>    > -1- The standard library types `shared_mutex` and `shared_timed_mutex` are shared mutex types. [...]

>    > -2- In addition to the exclusive lock ownership mode [...]

>    > -3- The expression `m.lock_shared()` is well-formed, has type `void`, and has the following semantics:

>    > > -4- Preconditions: [...]

>    > > -5- Effects: [...]

>    > > -6- Postconditions: [...]

>    > > -7- Return type: `void`.

>    > > -8- Synchronization: [...]

>    > > -9- Throws: [...]

>    > > -10- Error conditions: [...]

>    > -11- The expression `m.unlock_shared()` is well-formed, has type `void`, and has the following semantics:

>    > > -12- Preconditions: [...]

>    > > -13- Effects: [...]

>    > > -14- Return type: `void`.

>    > > -15- Synchronization: [...]

>    > > -16- Throws: [...]

>    > -17- The expression `m.try_lock_shared()` is well-formed, has type `bool`, and has the following semantics:

>    > > -18- Preconditions: [...]

>    > > -19- Effects: [...]

>    > > -20- Return type: `bool`.

>    > > -21- Returns: `true` if the shared ownership lock was acquired, `false` otherwise.

>    > > -22- Synchronization: [...]

>    > > -23- Throws: [...]

> 6. Modify 33.6.4.5 [thread.sharedtimedmutex.requirements] as indicated:

>    > -1- The standard library type `shared_timed_mutex` is a shared timed mutex type. [...]

>    > -2- The expression `m.try_lock_shared_for(rel_time)` is well-formed, has type `bool`, and has the following semantics:

>    > > -3- Preconditions: [...]

>    > > -4- Effects: [...]

>    > > -5- Return type: `bool`.

>    > > -6- Returns: `true` if the shared lock was acquired, `false` otherwise.

>    > > -7- Synchronization: [...]

>    > > -8- Throws: [...]

>    > -9- The expression `m.try_lock_shared_until(abs_time)` is well-formed, has type `bool`, and has the following semantics:

>    > > -10- Preconditions: [...]

>    > > -11- Effects: [...]

>    > > -12- Return type: `bool`.

>    > > -13- Returns: `true` if the shared lock was acquired, `false` otherwise.

>    > > -14- Synchronization: [...]

>    > > -15- Throws: [...]

[2022-11-06; Daniel comments and provides alternative wording]

Now that we have the new element Result: specified in 16.3.2.4 [structure.specifications], we can simply replace all occurrences of the Return type: by this element.

Proposed resolution:

This wording is relative to N4917.

1. Modify 33.2.5.3 [thread.req.lockable.req] as indicated:

   > -1- A type `L` meets the Cpp17Lockable requirements if it meets the Cpp17BasicLockable requirements and the following expressions are well-formed and have the specified semantics (`m` denotes a value of type `L`).

   > `m.try_lock()`

   > > -2- Effects: [...]

   > > -3- Return type Result: `bool`.

   > > -4- Returns: `true` if the lock was acquired, otherwise `false`.

2. Modify 33.2.5.4 [thread.req.lockable.timed] as indicated:

   > -1- A type `L` meets the Cpp17TimedLockable requirements if it meets the Cpp17Lockable requirements and the following expressions are well-formed and have the specified semantics (`m` denotes a value of type `L`, `rel_time` denotes a value of an instantiation of `duration` (29.5 [time.duration]), and `abs_time` denotes a value of an instantiation of `time_point` (29.6 [time.point])).

   > `m.try_lock_for(rel_time)`

   > > -2- Effects: [...]

   > > -3- Return type Result: `bool`.

   > > -4- Returns: `true` if the lock was acquired, otherwise `false`.

   > `m.try_lock_until(abs_time)`

   > > -5- Effects: [...]

   > > -6- Return type Result: `bool`.

   > > -7- Returns: `true` if the lock was acquired, otherwise `false`.

3. Modify 33.6.4.2.1 [thread.mutex.requirements.mutex.general] as indicated:

   > -5- The expression `m.lock()` is well-formed and has the following semantics:

   > > -6- Preconditions: [...]

   > > -7- Effects: [...]

   > > -8- Synchronization: [...]

   > > -9- Postconditions: [...]

   > > -10- Return type Result: `void`.

   > > -11- Throws: [...]

   > > -12- Error conditions: [...]

   > -13- The expression `m.try_lock()` is well-formed and has the following semantics:

   > > -14- Preconditions: [...]

   > > -15- Effects: [...]

   > > -16- Synchronization: [...]

   > > -17- Return type Result: `bool`.

   > > -18- Returns: `true` if ownership was obtained, otherwise `false`.

   > > -19- Throws: Nothing.

   > -20- The expression `m.unlock()` is well-formed and has the following semantics:

   > > -21- Preconditions: [...]

   > > -22- Effects: [...]

   > > -23- Return type Result: `void`.

   > > -24- Synchronization: [...]

   > > -25- Throws: Nothing.

4. Modify 33.6.4.3.1 [thread.timedmutex.requirements.general] as indicated:

   > -1- The timed mutex types are the standard library types […]

   > -2- The expression `m.try_lock_for(rel_time)` is well-formed and has the following semantics:

   > > -3- Preconditions: [...]

   > > -4- Effects: [...]

   > > -5- Synchronization: [...]

   > > -6- Return type Result: `bool`.

   > > -7- Returns: `true` if ownership was obtained, otherwise `false`.

   > > -8- Throws: [...]

   > -9- The expression `m.try_lock_until(abs_time)` is well-formed and has the following semantics:

   > > -10- Preconditions: [...]

   > > -11- Effects: [...]

   > > -12- Synchronization: [...]

   > > -13- Return type Result: `bool`.

   > > -14- Returns: `true` if ownership was obtained, otherwise `false`.

   > > -15- Throws: [...]

5. Modify 33.6.4.4.1 [thread.sharedmutex.requirements.general] as indicated:

   > -1- The standard library types `shared_mutex` and `shared_timed_mutex` are shared mutex types. [...]

   > -2- In addition to the exclusive lock ownership mode [...]

   > -3- The expression `m.lock_shared()` is well-formed and has the following semantics:

   > > -4- Preconditions: [...]

   > > -5- Effects: [...]

   > > -6- Synchronization: [...]

   > > -7- Postconditions: [...]

   > > -8- Return type Result: `void`.

   > > -9- Throws: [...]

   > > -10- Error conditions: [...]

   > -11- The expression `m.unlock_shared()` is well-formed and has the following semantics:

   > > -12- Preconditions: [...]

   > > -13- Effects: [...]

   > > -14- Return type Result: `void`.

   > > -15- Synchronization: [...]

   > > -16- Throws: [...]

   > -17- The expression `m.try_lock_shared()` is well-formed and has the following semantics:

   > > -18- Preconditions: [...]

   > > -19- Effects: [...]

   > > -20- Synchronization: [...]

   > > -21- Return type Result: `bool`.

   > > -22- Returns: `true` if the shared lock was acquired, otherwise `false`.

   > > -23- Throws: [...]

6. Modify 33.6.4.5.1 [thread.sharedtimedmutex.requirements.general] as indicated:

   > -1- The standard library type `shared_timed_mutex` is a shared timed mutex type. [...]

   > -2- The expression `m.try_lock_shared_for(rel_time)` is well-formed and has the following semantics:

   > > -3- Preconditions: [...]

   > > -4- Effects: [...]

   > > -5- Synchronization: [...]

   > > -6- Return type Result: `bool`.

   > > -7- Returns: `true` if the shared lock was acquired, otherwise `false`.

   > > -8- Throws: [...]

   > -9- The expression `m.try_lock_shared_until(abs_time)` is well-formed and has the following semantics:

   > > -10- Preconditions: [...]

   > > -11- Effects: [...]

   > > -12- Synchronization: [...]

   > > -13- Return type Result: `bool`.

   > > -14- Returns: `true` if the shared lock was acquired, otherwise `false`.

   > > -15- Throws: [...]