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 Hosekint 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