-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add tests for FMT_ENFORCE_COMPILE_STRING, fix several errors #2038
Changes from 29 commits
e05c8fc
f76c64a
b75bd49
2f9484c
3b6d21b
aa65e99
54d6d5b
e805e8e
1fbfccc
55600c9
35b94fa
1e034bd
900adeb
7f1c041
d343e4b
c4c8351
60bceae
b61537a
d539f76
dafbc05
9fafb14
2489501
b8ebadd
098de0d
8e575bd
f2a5a0f
c85d5e3
b9063f9
98a8830
b0c65df
6f393f2
06a576c
99ed2a8
5083486
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -291,10 +291,10 @@ struct formatter<TupleT, Char, enable_if_t<fmt::is_tuple_like<TupleT>::value>> { | |
} | ||
out = detail::copy(formatting.delimiter, out); | ||
} | ||
out = format_to(out, | ||
detail::format_str_quoted( | ||
(formatting.add_delimiter_spaces && i > 0), v), | ||
v); | ||
out = vformat_to(out, | ||
detail::format_str_quoted( | ||
(formatting.add_delimiter_spaces && i > 0), v), | ||
make_format_args<FormatContext>(v)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here and below: it would be better to refactor this to use compile string and There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I considered that but given that the format string used appeared to be determined at run-time I wasn't sure it was possible. I'll give it a go. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looking at this more I'm reaching the same conclusion -
I couldn't have a function that returned one of several format strings, and I don't think I could have a function that returned a constexpr string that would work with FMT_STRING either -
for example will not compile in godbolt. I also cant return the result of FMT_STRING since they'd be different types between branches. My best guess for how to do this would be to have a wrapping function that used template specialization on a bool for add_delimiter_spaces and runtime switching on i > 0 and called format_to with the appropriate FMT_STRING directly. Am I missing an option here or should I try that? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's use |
||
++i; | ||
} | ||
|
||
|
@@ -366,12 +366,12 @@ struct formatter< | |
if (formatting.add_prepostfix_space) *out++ = ' '; | ||
out = detail::copy(formatting.delimiter, out); | ||
} | ||
out = format_to(out, | ||
detail::format_str_quoted( | ||
(formatting.add_delimiter_spaces && i > 0), *it), | ||
*it); | ||
out = vformat_to(out, | ||
detail::format_str_quoted( | ||
(formatting.add_delimiter_spaces && i > 0), *it), | ||
make_format_args<FormatContext>(*it)); | ||
if (++i > formatting.range_length_limit) { | ||
out = format_to(out, " ... <other elements>"); | ||
out = format_to(out, FMT_STRING("{}"), " ... <other elements>"); | ||
break; | ||
} | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -106,6 +106,14 @@ add_fmt_test(printf-test) | |
add_fmt_test(ranges-test) | ||
add_fmt_test(scan-test) | ||
|
||
if (NOT MSVC) | ||
# FMT_ENFORCE_COMPILE_STRING not supported under MSVC | ||
# See https://developercommunity.visualstudio.com/content/problem/1277597/internal-compiler-c0001-error-on-complex-nested-la.html | ||
add_fmt_test(enforce-compile-string-test) | ||
target_compile_definitions(enforce-compile-string-test PRIVATE | ||
"-DFMT_ENFORCE_COMPILE_STRING") | ||
endif() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||
|
||
if (NOT DEFINED MSVC_STATIC_RUNTIME AND MSVC) | ||
foreach (flag_var | ||
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
// Formatting library for C++ - formatting library tests | ||
// | ||
// Copyright (c) 2012 - present, Victor Zverovich | ||
// All rights reserved. | ||
// | ||
// For the license information refer to format.h. | ||
|
||
#include <array> | ||
#include <chrono> | ||
#include <iterator> | ||
#include <list> | ||
#include <string> | ||
|
||
#include "fmt/chrono.h" | ||
#include "fmt/color.h" | ||
#include "fmt/format.h" | ||
#include "fmt/locale.h" | ||
#include "fmt/ostream.h" | ||
#include "fmt/ranges.h" | ||
|
||
// Exercise the API to verify that everything we expect to can compile. | ||
void test_format_api() { | ||
fmt::format(FMT_STRING("{}"), 42); | ||
fmt::format(FMT_STRING(L"{}"), 42); | ||
fmt::format(FMT_STRING("noop")); | ||
|
||
fmt::to_string(42); | ||
fmt::to_wstring(42); | ||
|
||
std::list<char> out; | ||
fmt::format_to(std::back_inserter(out), FMT_STRING("{}"), 42); | ||
|
||
char buffer[4]; | ||
fmt::format_to_n(buffer, 3, FMT_STRING("{}"), 12345); | ||
|
||
wchar_t wbuffer[4]; | ||
fmt::format_to_n(wbuffer, 3, FMT_STRING(L"{}"), 12345); | ||
} | ||
|
||
void test_literals_api() { | ||
#if FMT_USE_UDL_TEMPLATE | ||
using namespace fmt::literals; | ||
"{}c{}"_format("ab", 1); | ||
L"{}c{}"_format(L"ab", 1); | ||
#endif | ||
} | ||
|
||
void test_chrono() { | ||
fmt::format(FMT_STRING("{}"), std::chrono::seconds(42)); | ||
fmt::format(FMT_STRING(L"{}"), std::chrono::seconds(42)); | ||
} | ||
|
||
void test_text_style() { | ||
fmt::print(fg(fmt::rgb(255, 20, 30)), FMT_STRING("{}"), "rgb(255,20,30)"); | ||
fmt::format(fg(fmt::rgb(255, 20, 30)), FMT_STRING("{}"), | ||
"rgb(255,20,30)"); | ||
|
||
fmt::text_style ts = fg(fmt::rgb(255, 20, 30)); | ||
std::string out; | ||
fmt::format_to(std::back_inserter(out), ts, | ||
FMT_STRING("rgb(255,20,30){}{}{}"), 1, 2, 3); | ||
} | ||
|
||
void test_range() { | ||
std::array<char, 5> hello = {'h','e','l','l','o'}; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please apply clang-format. |
||
fmt::format(FMT_STRING("{}"), hello); | ||
} | ||
|
||
int main() { | ||
test_format_api(); | ||
test_literals_api(); | ||
test_chrono(); | ||
test_text_style(); | ||
test_range(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is unnecessary. You can write to
out
directly.