1*89385633SPetr Hosek //===----------------------------------------------------------------------===//
2*89385633SPetr Hosek //
3*89385633SPetr Hosek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*89385633SPetr Hosek // See https://llvm.org/LICENSE.txt for license information.
5*89385633SPetr Hosek // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*89385633SPetr Hosek //
7*89385633SPetr Hosek //===----------------------------------------------------------------------===//
8*89385633SPetr Hosek 
9*89385633SPetr Hosek // <fstream>
10*89385633SPetr Hosek 
11*89385633SPetr Hosek // basic_filebuf<charT,traits>* close();
12*89385633SPetr Hosek 
13*89385633SPetr Hosek #include <fstream>
14*89385633SPetr Hosek #include <cassert>
15*89385633SPetr Hosek #if defined(__unix__)
16*89385633SPetr Hosek #include <fcntl.h>
17*89385633SPetr Hosek #include <unistd.h>
18*89385633SPetr Hosek #endif
19*89385633SPetr Hosek #include "test_macros.h"
20*89385633SPetr Hosek #include "platform_support.h"
21*89385633SPetr Hosek 
main(int,char **)22*89385633SPetr Hosek int main(int, char**)
23*89385633SPetr Hosek {
24*89385633SPetr Hosek     std::string temp = get_temp_file_name();
25*89385633SPetr Hosek     {
26*89385633SPetr Hosek         std::filebuf f;
27*89385633SPetr Hosek         assert(!f.is_open());
28*89385633SPetr Hosek         assert(f.open(temp.c_str(), std::ios_base::out) != 0);
29*89385633SPetr Hosek         assert(f.is_open());
30*89385633SPetr Hosek         assert(f.close() != nullptr);
31*89385633SPetr Hosek         assert(!f.is_open());
32*89385633SPetr Hosek         assert(f.close() == nullptr);
33*89385633SPetr Hosek         assert(!f.is_open());
34*89385633SPetr Hosek     }
35*89385633SPetr Hosek #if defined(__unix__)
36*89385633SPetr Hosek     {
37*89385633SPetr Hosek         std::filebuf f;
38*89385633SPetr Hosek         assert(!f.is_open());
39*89385633SPetr Hosek         // Use open directly to get the file descriptor.
40*89385633SPetr Hosek         int fd = open(temp.c_str(), O_RDWR);
41*89385633SPetr Hosek         assert(fd >= 0);
42*89385633SPetr Hosek         // Use the internal method to create filebuf from the file descriptor.
43*89385633SPetr Hosek         assert(f.__open(fd, std::ios_base::out) != 0);
44*89385633SPetr Hosek         assert(f.is_open());
45*89385633SPetr Hosek         // Close the file descriptor directly to force filebuf::close to fail.
46*89385633SPetr Hosek         assert(close(fd) == 0);
47*89385633SPetr Hosek         // Ensure that filebuf::close handles the failure.
48*89385633SPetr Hosek         assert(f.close() == nullptr);
49*89385633SPetr Hosek         assert(!f.is_open());
50*89385633SPetr Hosek         assert(f.close() == nullptr);
51*89385633SPetr Hosek     }
52*89385633SPetr Hosek #endif
53*89385633SPetr Hosek     std::remove(temp.c_str());
54*89385633SPetr Hosek 
55*89385633SPetr Hosek     return 0;
56*89385633SPetr Hosek }
57