[libcxx-commits] [libcxx] 580cc9d - [libc++][format] Fixes escaping string literals.

Mark de Wever via libcxx-commits libcxx-commits at lists.llvm.org
Wed Jan 11 08:48:17 PST 2023


Author: Mark de Wever
Date: 2023-01-11T17:48:08+01:00
New Revision: 580cc9dd7a852ecf7790ef2bb3904b176bfeea56

URL: https://github.com/llvm/llvm-project/commit/580cc9dd7a852ecf7790ef2bb3904b176bfeea56
DIFF: https://github.com/llvm/llvm-project/commit/580cc9dd7a852ecf7790ef2bb3904b176bfeea56.diff

LOG: [libc++][format] Fixes escaping string literals.

D140653 has the same fix, without the extra tests.

Fixes PR59763

Reviewed By: ldionne, #libc

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

Added: 
    

Modified: 
    libcxx/include/__format/formatter_string.h
    libcxx/test/std/utilities/format/format.tuple/format.functions.tests.h

Removed: 
    


################################################################################
diff  --git a/libcxx/include/__format/formatter_string.h b/libcxx/include/__format/formatter_string.h
index d1d1379146b70..606fb792499c5 100644
--- a/libcxx/include/__format/formatter_string.h
+++ b/libcxx/include/__format/formatter_string.h
@@ -65,6 +65,12 @@ struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<const _CharT*,
     _LIBCPP_ASSERT(__str, "The basic_format_arg constructor should have "
                           "prevented an invalid pointer.");
 
+    __format_spec::__parsed_specifications<_CharT> __specs = _Base::__parser_.__get_parsed_std_specifications(__ctx);
+#  if _LIBCPP_STD_VER > 20
+    if (_Base::__parser_.__type_ == __format_spec::__type::__debug)
+      return __formatter::__format_escaped_string(basic_string_view<_CharT>{__str}, __ctx.out(), __specs);
+#  endif
+
     // When using a center or right alignment and the width option the length
     // of __str must be known to add the padding upfront. This case is handled
     // by the base class by converting the argument to a basic_string_view.
@@ -76,7 +82,6 @@ struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<const _CharT*,
     // now these optimizations aren't implemented. Instead the base class
     // handles these options.
     // TODO FMT Implement these improvements.
-    __format_spec::__parsed_specifications<_CharT> __specs = _Base::__parser_.__get_parsed_std_specifications(__ctx);
     if (__specs.__has_width() || __specs.__has_precision())
       return __formatter::__write_string(basic_string_view<_CharT>{__str}, __ctx.out(), __specs);
 

diff  --git a/libcxx/test/std/utilities/format/format.tuple/format.functions.tests.h b/libcxx/test/std/utilities/format/format.tuple/format.functions.tests.h
index 64d3ce4dedd6e..2ad2d879d4e07 100644
--- a/libcxx/test/std/utilities/format/format.tuple/format.functions.tests.h
+++ b/libcxx/test/std/utilities/format/format.tuple/format.functions.tests.h
@@ -153,6 +153,8 @@ void test_pair_int_int(TestFunction check, ExceptionTest check_exception) {
 template <class CharT, class TestFunction, class ExceptionTest>
 void test_pair_int_string(TestFunction check, ExceptionTest check_exception) {
   test_tuple_or_pair_int_string<CharT>(check, check_exception, std::make_pair(42, SV("hello")));
+  test_tuple_or_pair_int_string<CharT>(check, check_exception, std::make_pair(42, STR("hello")));
+  test_tuple_or_pair_int_string<CharT>(check, check_exception, std::make_pair(42, CSTR("hello")));
 }
 
 //
@@ -265,6 +267,8 @@ void test_tuple_int_int(TestFunction check, ExceptionTest check_exception) {
 template <class CharT, class TestFunction, class ExceptionTest>
 void test_tuple_int_string(TestFunction check, ExceptionTest check_exception) {
   test_tuple_or_pair_int_string<CharT>(check, check_exception, std::make_tuple(42, SV("hello")));
+  test_tuple_or_pair_int_string<CharT>(check, check_exception, std::make_tuple(42, STR("hello")));
+  test_tuple_or_pair_int_string<CharT>(check, check_exception, std::make_tuple(42, CSTR("hello")));
 }
 
 //


        


More information about the libcxx-commits mailing list