1c2df7076SLouis Dionne //===----------------------------------------------------------------------===//
2c2df7076SLouis Dionne //
3c2df7076SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c2df7076SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5c2df7076SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c2df7076SLouis Dionne //
7c2df7076SLouis Dionne //===----------------------------------------------------------------------===//
8c2df7076SLouis Dionne
9c2df7076SLouis Dionne // UNSUPPORTED: no-threads
10*f98a3dd7SMark de Wever // UNSUPPORTED: c++03, c++11, c++14
11c2df7076SLouis Dionne
12c2df7076SLouis Dionne // <mutex>
13c2df7076SLouis Dionne
14c2df7076SLouis Dionne // scoped_lock
15c2df7076SLouis Dionne
16c2df7076SLouis Dionne // Make sure that the implicitly-generated CTAD works.
17c2df7076SLouis Dionne
18c2df7076SLouis Dionne #include <mutex>
19c2df7076SLouis Dionne
20c2df7076SLouis Dionne #include "test_macros.h"
21c2df7076SLouis Dionne
main(int,char **)22c2df7076SLouis Dionne int main(int, char**) {
23c2df7076SLouis Dionne std::mutex m1;
24c2df7076SLouis Dionne std::recursive_mutex m2;
25c2df7076SLouis Dionne std::recursive_timed_mutex m3;
26c2df7076SLouis Dionne {
27c2df7076SLouis Dionne std::scoped_lock lock(m1);
28c2df7076SLouis Dionne ASSERT_SAME_TYPE(decltype(lock), std::scoped_lock<std::mutex>);
29c2df7076SLouis Dionne }
30c2df7076SLouis Dionne {
31c2df7076SLouis Dionne std::scoped_lock lock(m1, m2);
32c2df7076SLouis Dionne ASSERT_SAME_TYPE(decltype(lock), std::scoped_lock<std::mutex, std::recursive_mutex>);
33c2df7076SLouis Dionne }
34c2df7076SLouis Dionne {
35c2df7076SLouis Dionne std::scoped_lock lock(m1, m2, m3);
36c2df7076SLouis Dionne ASSERT_SAME_TYPE(decltype(lock), std::scoped_lock<std::mutex, std::recursive_mutex, std::recursive_timed_mutex>);
37c2df7076SLouis Dionne }
38c2df7076SLouis Dionne
39c2df7076SLouis Dionne return 0;
40c2df7076SLouis Dionne }
41c2df7076SLouis Dionne
42