//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03, c++11, c++14
// REQUIRES: availability-pmr-missing

// TODO: This test doesn't work until https://github.com/llvm/llvm-project/issues/40340
//       has been fixed, because we actually disable availability markup.
// XFAIL: *

// Test the availability markup on std::pmr components.

#include <deque>
#include <forward_list>
#include <list>
#include <map>
#include <memory_resource>
#include <regex>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>

void f() {
    [[maybe_unused]] std::pmr::match_results<const char8_t*> m1; // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::cmatch m2;                        // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::wcmatch m3;                       // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::smatch m4;                        // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::wsmatch m5;                       // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::deque<int> m6;                    // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::forward_list<int> m7;             // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::list<int> m8;                     // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::map<int, int> m9;                 // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::multimap<int, int> m10;           // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::set<int> m11;                     // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::multiset<int> m12;                // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::string m13;                       // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::wstring m14;                      // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::u8string m15;                     // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::u16string m16;                    // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::u32string m17;                    // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::basic_string<char8_t> m18;        // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::unordered_map<int, int> m19;      // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::unordered_multimap<int, int> m20; // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::unordered_set<int, int> m21;      // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::unordered_multiset<int, int> m22; // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::vector<int> m23;                  // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::polymorphic_allocator<int> poly;  // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::memory_resource* res = nullptr;   // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::synchronized_pool_resource r1;    // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::monotonic_buffer_resource r2;     // expected-error {{is unavailable}}
    [[maybe_unused]] std::pmr::unsynchronized_pool_resource r3;  // expected-error {{is unavailable}}
    (void)std::pmr::get_default_resource();                      // expected-error {{is unavailable}}
    (void)std::pmr::set_default_resource(nullptr);               // expected-error {{is unavailable}}
    (void)std::pmr::new_delete_resource();                       // expected-error {{is unavailable}}
    (void)std::pmr::null_memory_resource();                      // expected-error {{is unavailable}}
    (void)(*res == *res);                                        // expected-error {{is unavailable}}
}
