Commit a3f17ba3 authored by PragmaTwice's avatar PragmaTwice Committed by Louis Dionne
Browse files

[libc++] Implement P2467R1: Support exclusive mode for fstreams

This patch brings std::ios_base::noreplace from P2467R1 to libc++.
This requires compiling the shared library in C++23 mode since otherwise
fstream::open(...) doesn't know about the new flag.

Differential Revision: https://reviews.llvm.org/D137640


Co-authored-by: default avatarLouis Dionne <ldionne.2@gmail.com>
parent 341ca1ad
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -332,6 +332,8 @@ Status
    --------------------------------------------------- -----------------
    ``__cpp_lib_invoke_r``                              ``202106L``
    --------------------------------------------------- -----------------
    ``__cpp_lib_ios_noreplace``                         ``202207L``
    --------------------------------------------------- -----------------
    ``__cpp_lib_is_scoped_enum``                        ``202011L``
    --------------------------------------------------- -----------------
    ``__cpp_lib_mdspan``                                ``202207L``
+1 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ Implemented Papers
- P2538R1 - ADL-proof ``std::projected``
- P2614R2 - Deprecate ``numeric_limits::has_denorm``
- P0053R7 - C++ Synchronized Buffered Ostream (in the experimental library)
- P2467R1 - Support exclusive mode for fstreams


Improvements and New Features
+1 −1
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@
"`P2446R2 <https://wg21.link/P2446R2>`__","LWG","``views::as_rvalue``","July 2022","|Complete|","16.0","|ranges|"
"`P2460R2 <https://wg21.link/P2460R2>`__","LWG","Relax requirements on ``wchar_t`` to match existing practices","July 2022","",""
"`P2465R3 <https://wg21.link/P2465R3>`__","LWG","Standard Library Modules ``std`` and ``std.compat``","July 2022","",""
"`P2467R1 <https://wg21.link/P2467R1>`__","LWG","Support exclusive mode for ``fstreams``","July 2022","",""
"`P2467R1 <https://wg21.link/P2467R1>`__","LWG","Support exclusive mode for ``fstreams``","July 2022","|Complete|","18.0",""
"`P2474R2 <https://wg21.link/P2474R2>`__","LWG","``views::repeat``","July 2022","|Complete|","17.0","|ranges|"
"`P2494R2 <https://wg21.link/P2494R2>`__","LWG","Relaxing range adaptors to allow for move only types","July 2022","|Complete|","17.0","|ranges|"
"`P2499R0 <https://wg21.link/P2499R0>`__","LWG","``string_view`` range constructor should be ``explicit``","July 2022","|Complete|","16.0","|ranges|"
+28 −0
Original line number Diff line number Diff line
@@ -552,6 +552,18 @@ const char* basic_filebuf<_CharT, _Traits>::__make_mdstring(
  case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
  case ios_base::in | ios_base::app | ios_base::binary:
    return "a+b" _LIBCPP_FOPEN_CLOEXEC_MODE;
#if _LIBCPP_STD_VER >= 23
  case ios_base::out | ios_base::noreplace:
  case ios_base::out | ios_base::trunc | ios_base::noreplace:
    return "wx" _LIBCPP_FOPEN_CLOEXEC_MODE;
  case ios_base::in | ios_base::out | ios_base::trunc | ios_base::noreplace:
    return "w+x" _LIBCPP_FOPEN_CLOEXEC_MODE;
  case ios_base::out | ios_base::binary | ios_base::noreplace:
  case ios_base::out | ios_base::trunc | ios_base::binary | ios_base::noreplace:
    return "wbx" _LIBCPP_FOPEN_CLOEXEC_MODE;
  case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary | ios_base::noreplace:
    return "w+bx" _LIBCPP_FOPEN_CLOEXEC_MODE;
#endif // _LIBCPP_STD_VER >= 23
  default:
    return nullptr;
  }
@@ -665,6 +677,22 @@ basic_filebuf<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mo
        case ios_base::in | ios_base::app | ios_base::binary:
            __mdstr = L"a+b";
            break;
#  if _LIBCPP_STD_VER >= 23
        case ios_base::out | ios_base::noreplace:
        case ios_base::out | ios_base::trunc | ios_base::noreplace:
          __mdstr = L"wx";
          break;
        case ios_base::in | ios_base::out | ios_base::trunc | ios_base::noreplace:
          __mdstr = L"w+x";
          break;
        case ios_base::out | ios_base::binary | ios_base::noreplace:
        case ios_base::out | ios_base::trunc | ios_base::binary | ios_base::noreplace:
          __mdstr = L"wbx";
          break;
        case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary | ios_base::noreplace:
          __mdstr = L"w+bx";
          break;
#  endif // _LIBCPP_STD_VER >= 23
        default:
            __rt = nullptr;
            break;
+10 −6
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ public:
    static constexpr openmode ate;
    static constexpr openmode binary;
    static constexpr openmode in;
    static constexpr openmode noreplace; // since C++23
    static constexpr openmode out;
    static constexpr openmode trunc;

@@ -283,6 +284,9 @@ public:
    static const openmode in        = 0x08;
    static const openmode out       = 0x10;
    static const openmode trunc     = 0x20;
#if _LIBCPP_STD_VER >= 23
    static const openmode noreplace = 0x40;
#endif

    enum seekdir {beg, cur, end};

Loading