[libcxx-commits] [libcxx] 68f66f3 - Revert "[libc++][format] Add basic_format_parse_context."

Mehdi Amini via libcxx-commits libcxx-commits at lists.llvm.org
Mon Feb 1 13:19:15 PST 2021


Author: Mehdi Amini
Date: 2021-02-01T21:18:11Z
New Revision: 68f66f37d7d74be7beba56506c4397dadc8538dd

URL: https://github.com/llvm/llvm-project/commit/68f66f37d7d74be7beba56506c4397dadc8538dd
DIFF: https://github.com/llvm/llvm-project/commit/68f66f37d7d74be7beba56506c4397dadc8538dd.diff

LOG: Revert "[libc++][format] Add basic_format_parse_context."

This reverts commit 35a57f39b5d126646335183f1ff0f7adb52d63bc.

A build is broken during clang bootstrap with:

In file included from ../libcxx/src/format.cpp:9:
/tmp/ci-nGNyLRM9V3/include/c++/v1/format:153:16: error: no member named 'is_constant_evaluated' in namespace 'std::__1'
    if (_VSTD::is_constant_evaluated() && __id >= __num_args_)
        ~~~~~~~^
1 error generated.

Added: 
    

Modified: 
    libcxx/include/format

Removed: 
    libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/advance_to.pass.cpp
    libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/begin.pass.cpp
    libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/check_arg_id.pass.cpp
    libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/ctor.pass.cpp
    libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/end.pass.cpp
    libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/next_arg_id.pass.cpp
    libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/types.compile.pass.cpp


################################################################################
diff  --git a/libcxx/include/format b/libcxx/include/format
index b4f9429c7a9b..833423a50527 100644
--- a/libcxx/include/format
+++ b/libcxx/include/format
@@ -19,51 +19,14 @@ namespace std {
     explicit format_error(const string& what_arg);
     explicit format_error(const char* what_arg);
   };
-
-  // [format.parse.ctx], class template basic_format_parse_context
-  template<class charT>
-  class basic_format_parse_context {
-  public:
-    using char_type = charT;
-    using const_iterator = typename basic_string_view<charT>::const_iterator;
-    using iterator = const_iterator;
-
-  private:
-    iterator begin_;                                    // exposition only
-    iterator end_;                                      // exposition only
-    enum indexing { unknown, manual, automatic };       // exposition only
-    indexing indexing_;                                 // exposition only
-    size_t next_arg_id_;                                // exposition only
-    size_t num_args_;                                   // exposition only
-
-  public:
-    constexpr explicit basic_format_parse_context(basic_string_view<charT> fmt,
-                                                  size_t num_args = 0) noexcept;
-    basic_format_parse_context(const basic_format_parse_context&) = delete;
-    basic_format_parse_context& operator=(const basic_format_parse_context&) = delete;
-
-    constexpr const_iterator begin() const noexcept;
-    constexpr const_iterator end() const noexcept;
-    constexpr void advance_to(const_iterator it);
-
-    constexpr size_t next_arg_id();
-    constexpr void check_arg_id(size_t id);
-  };
-  using format_parse_context = basic_format_parse_context<char>;
-  using wformat_parse_context = basic_format_parse_context<wchar_t>;
 }
 
 */
 
 #include <__config>
 #include <stdexcept>
-#include <string_view>
 #include <version>
 
-#ifdef _LIBCPP_NO_EXCEPTIONS
-#include <cstdlib>
-#endif
-
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
 #endif
@@ -84,88 +47,6 @@ public:
   virtual ~format_error() noexcept;
 };
 
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY void
-__throw_format_error(const char* __s) {
-#ifndef _LIBCPP_NO_EXCEPTIONS
-  throw format_error(__s);
-#else
-  (void)__s;
-  _VSTD::abort();
-#endif
-}
-
-template <class _CharT>
-class _LIBCPP_TEMPLATE_VIS basic_format_parse_context {
-public:
-  using char_type = _CharT;
-  using const_iterator =
-      typename _VSTD::basic_string_view<_CharT>::const_iterator;
-  using iterator = const_iterator;
-
-public:
-  _LIBCPP_INLINE_VISIBILITY
-  constexpr explicit basic_format_parse_context(
-      _VSTD::basic_string_view<_CharT> __fmt, size_t __num_args = 0) noexcept
-      : __begin_(__fmt.begin()),
-        __end_(__fmt.end()),
-        __indexing_(__unknown),
-        __next_arg_id_(0),
-        __num_args_(__num_args) {}
-
-  basic_format_parse_context(const basic_format_parse_context&) = delete;
-  basic_format_parse_context&
-  operator=(const basic_format_parse_context&) = delete;
-
-  _LIBCPP_INLINE_VISIBILITY constexpr const_iterator begin() const noexcept {
-    return __begin_;
-  }
-  _LIBCPP_INLINE_VISIBILITY constexpr const_iterator end() const noexcept {
-    return __end_;
-  }
-  _LIBCPP_INLINE_VISIBILITY constexpr void advance_to(const_iterator __it) {
-    __begin_ = __it;
-  }
-
-  _LIBCPP_INLINE_VISIBILITY constexpr size_t next_arg_id() {
-    if (__indexing_ == __manual)
-      __throw_format_error("Using automatic argument numbering in manual "
-                           "argument numbering mode");
-
-    if (__indexing_ == __unknown)
-      __indexing_ = __automatic;
-    return __next_arg_id_++;
-  }
-  _LIBCPP_INLINE_VISIBILITY constexpr void check_arg_id(size_t __id) {
-    if (__indexing_ == __automatic)
-      __throw_format_error("Using manual argument numbering in automatic "
-                           "argument numbering mode");
-
-    if (__indexing_ == __unknown)
-      __indexing_ = __manual;
-
-	// Throws an exception to make the expression a non core constant
-	// expression as required by:
-	// [format.parse.ctx]/11
-	//   Remarks: Call expressions where id >= num_args_ are not core constant
-	//   expressions ([expr.const]).
-	// Note: the Throws clause [format.parse.ctx]/10 doesn't specify the
-	// behavior when id >= num_args_.
-    if (_VSTD::is_constant_evaluated() && __id >= __num_args_)
-      __throw_format_error("Argument index outside the valid range");
-  }
-
-private:
-  iterator __begin_;
-  iterator __end_;
-  enum _Indexing { __unknown, __manual, __automatic };
-  _Indexing __indexing_;
-  size_t __next_arg_id_;
-  size_t __num_args_;
-};
-
-using format_parse_context = basic_format_parse_context<char>;
-using wformat_parse_context = basic_format_parse_context<wchar_t>;
-
 #endif //_LIBCPP_STD_VER > 17
 
 _LIBCPP_END_NAMESPACE_STD

diff  --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/advance_to.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/advance_to.pass.cpp
deleted file mode 100644
index bf268fb4b450..000000000000
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/advance_to.pass.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-//===----------------------------------------------------------------------===//
-// 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, c++17
-
-// <format>
-
-// constexpr void advance_to(const_iterator it);
-
-#include <format>
-#include <cassert>
-
-#include "test_macros.h"
-
-template <class CharT>
-constexpr void test(const CharT* fmt) {
-  {
-    std::basic_format_parse_context<CharT> context(fmt);
-
-    context.advance_to(context.begin() + 1);
-    assert(context.begin() == &fmt[1]);
-
-    context.advance_to(context.begin() + 1);
-    assert(context.begin() == &fmt[2]);
-
-    context.advance_to(context.begin() + 1);
-    assert(context.begin() == context.end());
-  }
-  {
-    std::basic_string_view view{fmt};
-    std::basic_format_parse_context context(view);
-
-    context.advance_to(context.begin() + 1);
-    assert(context.begin() == view.begin() + 1);
-
-    context.advance_to(context.begin() + 1);
-    assert(context.begin() == view.begin() + 2);
-
-    context.advance_to(context.begin() + 1);
-    assert(context.begin() == context.end());
-  }
-}
-
-constexpr bool test() {
-  test("abc");
-  test(L"abc");
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-  test(u8"abc");
-#endif
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-  test(u"abc");
-  test(U"abc");
-#endif
-
-  return true;
-}
-
-int main(int, char**) {
-  test();
-  static_assert(test());
-
-  return 0;
-}

diff  --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/begin.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/begin.pass.cpp
deleted file mode 100644
index dca2d55d8bd6..000000000000
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/begin.pass.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-//===----------------------------------------------------------------------===//
-// 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, c++17
-
-// <format>
-
-// constexpr begin() const noexcept;
-
-#include <format>
-#include <cassert>
-
-#include "test_macros.h"
-
-template <class CharT>
-constexpr void test(const CharT* fmt) {
-  {
-    std::basic_format_parse_context<CharT> context(fmt);
-    assert(context.begin() == &fmt[0]);
-    ASSERT_NOEXCEPT(context.begin());
-  }
-  {
-    std::basic_string_view view{fmt};
-    std::basic_format_parse_context context(view);
-    assert(context.begin() == view.begin());
-    ASSERT_NOEXCEPT(context.begin());
-  }
-}
-
-constexpr bool test() {
-  test("abc");
-  test(L"abc");
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-  test(u8"abc");
-#endif
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-  test(u"abc");
-  test(U"abc");
-#endif
-
-  return true;
-}
-
-int main(int, char**) {
-  test();
-  static_assert(test());
-
-  return 0;
-}

diff  --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/check_arg_id.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/check_arg_id.pass.cpp
deleted file mode 100644
index 734dc417694b..000000000000
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/check_arg_id.pass.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-//===----------------------------------------------------------------------===//
-// 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, c++17
-// UNSUPPORTED: no-exceptions
-
-// This test requires the dylib support introduced in D92214.
-// XFAIL: with_system_cxx_lib=macosx10.15
-// XFAIL: with_system_cxx_lib=macosx10.14
-// XFAIL: with_system_cxx_lib=macosx10.13
-// XFAIL: with_system_cxx_lib=macosx10.12
-// XFAIL: with_system_cxx_lib=macosx10.11
-// XFAIL: with_system_cxx_lib=macosx10.10
-// XFAIL: with_system_cxx_lib=macosx10.9
-
-// <format>
-
-// constexpr void check_arg_id(size_t id);
-
-#include <format>
-#include <cassert>
-
-#include "test_macros.h"
-
-constexpr bool test() {
-  std::format_parse_context context("", 10);
-  for (size_t i = 0; i < 10; ++i)
-    context.check_arg_id(i);
-
-  return true;
-}
-
-void test_exception() {
-  [] {
-    std::format_parse_context context("", 1);
-    context.next_arg_id();
-    try {
-      context.check_arg_id(0);
-      assert(false);
-    } catch (const std::format_error& e) {
-      assert(strcmp(e.what(), "Using manual argument numbering in automatic "
-                              "argument numbering mode") == 0);
-      return;
-    }
-    assert(false);
-  }();
-
-  auto test_arg = [](size_t num_args) {
-    std::format_parse_context context("", num_args);
-    // Out of bounds access is valid if !std::is_constant_evaluated()
-    for (size_t i = 0; i <= num_args; ++i)
-      context.check_arg_id(i);
-  };
-  for (size_t i = 0; i < 10; ++i)
-    test_arg(i);
-}
-
-int main(int, char**) {
-  test();
-  test_exception();
-  static_assert(test());
-
-  return 0;
-}

diff  --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/ctor.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/ctor.pass.cpp
deleted file mode 100644
index 226c2e0c6810..000000000000
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/ctor.pass.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-//===----------------------------------------------------------------------===//
-// 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, c++17
-
-// <format>
-
-// constexpr explicit
-// basic_format_parse_context(basic_string_view<charT> fmt,
-//                            size_t num_args = 0) noexcept
-
-#include <format>
-#include <cassert>
-#include <type_traits>
-
-#include "test_macros.h"
-
-template <class CharT>
-constexpr void test(const CharT* fmt) {
-  // Validate the constructor is explicit.
-  static_assert(
-      !std::is_convertible_v<std::basic_string_view<CharT>,
-                             std::basic_format_parse_context<CharT> >);
-  static_assert(
-      !std::is_copy_constructible_v<std::basic_format_parse_context<CharT> >);
-  static_assert(
-      !std::is_copy_assignable_v<std::basic_format_parse_context<CharT> >);
-  // The move operations are implicitly deleted due to the
-  // deleted copy operations.
-  static_assert(
-      !std::is_move_constructible_v<std::basic_format_parse_context<CharT> >);
-  static_assert(
-      !std::is_move_assignable_v<std::basic_format_parse_context<CharT> >);
-
-  ASSERT_NOEXCEPT(
-      std::basic_format_parse_context{std::basic_string_view<CharT>{}});
-  ASSERT_NOEXCEPT(
-      std::basic_format_parse_context{std::basic_string_view<CharT>{}, 42});
-
-  {
-    std::basic_format_parse_context<CharT> context(fmt);
-    assert(context.begin() == &fmt[0]);
-    assert(context.end() == &fmt[3]);
-  }
-  {
-    std::basic_string_view view{fmt};
-    std::basic_format_parse_context context(view);
-    assert(context.begin() == view.begin());
-    assert(context.end() == view.end());
-  }
-}
-
-constexpr bool test() {
-  test("abc");
-  test(L"abc");
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-  test(u8"abc");
-#endif
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-  test(u"abc");
-  test(U"abc");
-#endif
-
-  return true;
-}
-
-int main(int, char**) {
-  test();
-  static_assert(test());
-
-  return 0;
-}

diff  --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/end.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/end.pass.cpp
deleted file mode 100644
index 93fdeb434f17..000000000000
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/end.pass.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-//===----------------------------------------------------------------------===//
-// 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, c++17
-
-// <format>
-
-// constexpr end() const noexcept;
-
-#include <format>
-#include <cassert>
-
-#include "test_macros.h"
-
-template <class CharT>
-constexpr void test(const CharT* fmt) {
-  {
-    std::basic_format_parse_context<CharT> context(fmt);
-    assert(context.end() == &fmt[3]);
-    ASSERT_NOEXCEPT(context.end());
-  }
-  {
-    std::basic_string_view view{fmt};
-    std::basic_format_parse_context context(view);
-    assert(context.end() == view.end());
-    ASSERT_NOEXCEPT(context.end());
-  }
-}
-
-constexpr bool test() {
-  test("abc");
-  test(L"abc");
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-  test(u8"abc");
-#endif
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-  test(u"abc");
-  test(U"abc");
-#endif
-
-  return true;
-}
-
-int main(int, char**) {
-  test();
-  static_assert(test());
-
-  return 0;
-}

diff  --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/next_arg_id.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/next_arg_id.pass.cpp
deleted file mode 100644
index 77197ad0500e..000000000000
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/next_arg_id.pass.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-//===----------------------------------------------------------------------===//
-// 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, c++17
-// UNSUPPORTED: no-exceptions
-
-// This test requires the dylib support introduced in D92214.
-// XFAIL: with_system_cxx_lib=macosx10.15
-// XFAIL: with_system_cxx_lib=macosx10.14
-// XFAIL: with_system_cxx_lib=macosx10.13
-// XFAIL: with_system_cxx_lib=macosx10.12
-// XFAIL: with_system_cxx_lib=macosx10.11
-// XFAIL: with_system_cxx_lib=macosx10.10
-// XFAIL: with_system_cxx_lib=macosx10.9
-
-// <format>
-
-// constexpr size_t next_arg_id();
-
-#include <format>
-#include <cassert>
-
-#include "test_macros.h"
-
-constexpr bool test() {
-  std::format_parse_context context("");
-  for (size_t i = 0; i < 10; ++i)
-    assert(i == context.next_arg_id());
-
-  return true;
-}
-
-void test_exception() {
-  std::format_parse_context context("", 1);
-  context.check_arg_id(0);
-
-  try {
-    context.next_arg_id();
-    assert(false);
-  } catch (const std::format_error& e) {
-    assert(strcmp(e.what(), "Using automatic argument numbering in manual "
-                            "argument numbering mode") == 0);
-    return;
-  }
-  assert(false);
-}
-
-int main(int, char**) {
-  test();
-  test_exception();
-  static_assert(test());
-
-  return 0;
-}

diff  --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/types.compile.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/types.compile.pass.cpp
deleted file mode 100644
index ab308461247c..000000000000
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/types.compile.pass.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-//===----------------------------------------------------------------------===//
-// 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, c++17
-
-// <format>
-
-// Class typedefs:
-// template<class charT>
-// class basic_format_parse_context {
-// public:
-//   using char_type = charT;
-//   using const_iterator = typename basic_string_view<charT>::const_iterator;
-//   using iterator = const_iterator;
-// }
-//
-// Namespace std typedefs:
-// using format_parse_context = basic_format_parse_context<char>;
-// using wformat_parse_context = basic_format_parse_context<wchar_t>;
-
-#include <format>
-#include <type_traits>
-
-#include "test_macros.h"
-
-template <class CharT>
-constexpr void test() {
-  static_assert(
-      std::is_same_v<typename std::basic_format_parse_context<CharT>::char_type,
-                     CharT>);
-  static_assert(std::is_same_v<
-                typename std::basic_format_parse_context<CharT>::const_iterator,
-                typename std::basic_string_view<CharT>::const_iterator>);
-  static_assert(
-      std::is_same_v<
-          typename std::basic_format_parse_context<CharT>::iterator,
-          typename std::basic_format_parse_context<CharT>::const_iterator>);
-}
-
-constexpr void test() {
-  test<char>();
-  test<wchar_t>();
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-  test<char8_t>();
-#endif
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-  test<char16_t>();
-  test<char32_t>();
-#endif
-}
-
-static_assert(std::is_same_v<std::format_parse_context,
-                             std::basic_format_parse_context<char> >);
-static_assert(std::is_same_v<std::wformat_parse_context,
-                             std::basic_format_parse_context<wchar_t> >);
-
-// Required for MSVC internal test runner compatibility.
-int main(int, char**) { return 0; }


        


More information about the libcxx-commits mailing list