Skip to content

Commit

Permalink
Workaround an issue with mixing std versions in gcc (#2017)
Browse files Browse the repository at this point in the history
  • Loading branch information
vitaut committed Nov 14, 2020
1 parent 5555651 commit f81c14a
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 23 deletions.
14 changes: 3 additions & 11 deletions include/fmt/format.h
Original file line number Diff line number Diff line change
Expand Up @@ -1174,8 +1174,8 @@ template <typename T = void> struct null {};
template <typename Char> struct fill_t {
private:
enum { max_size = 4 };
Char data_[max_size];
unsigned char size_;
Char data_[max_size] = {Char(' '), Char(0), Char(0), Char(0)};
unsigned char size_ = 1;

public:
FMT_CONSTEXPR void operator=(basic_string_view<Char> s) {
Expand All @@ -1195,13 +1195,6 @@ template <typename Char> struct fill_t {
FMT_CONSTEXPR const Char& operator[](size_t index) const {
return data_[index];
}

static FMT_CONSTEXPR fill_t<Char> make() {
auto fill = fill_t<Char>();
fill[0] = Char(' ');
fill.size_ = 1;
return fill;
}
};
} // namespace detail

Expand Down Expand Up @@ -1233,8 +1226,7 @@ template <typename Char> struct basic_format_specs {
type(0),
align(align::none),
sign(sign::none),
alt(false),
fill(detail::fill_t<Char>::make()) {}
alt(false) {}
};

using format_specs = basic_format_specs<char>;
Expand Down
23 changes: 11 additions & 12 deletions test/format-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -355,22 +355,20 @@ TEST(MemoryBufferTest, ExceptionInDeallocate) {
}

template <typename Allocator, size_t MaxSize>
class allocator_max_size: public Allocator {
class allocator_max_size : public Allocator {
public:
using typename Allocator::value_type;
size_t max_size() const FMT_NOEXCEPT {
return MaxSize;
}
size_t max_size() const FMT_NOEXCEPT { return MaxSize; }
value_type* allocate(size_t n) {
if (n > max_size()) {
throw std::length_error("size > max_size");
}
return std::allocator_traits<Allocator>::allocate(
*static_cast<Allocator *>(this), n);
*static_cast<Allocator*>(this), n);
}
void deallocate(value_type* p, size_t n) {
std::allocator_traits<Allocator>::deallocate(
*static_cast<Allocator *>(this), p, n);
std::allocator_traits<Allocator>::deallocate(*static_cast<Allocator*>(this),
p, n);
}
};

Expand All @@ -383,7 +381,7 @@ TEST(MemoryBufferTest, AllocatorMaxSize) {
try {
// new_capacity = 128 + 128/2 = 192 > 160
buffer.resize(160);
} catch (const std::exception &) {
} catch (const std::exception&) {
throws_on_resize = true;
}
EXPECT_FALSE(throws_on_resize);
Expand All @@ -395,7 +393,7 @@ TEST(MemoryBufferTest, AllocatorMaxSizeOverflow) {
bool throws_on_resize = false;
try {
buffer.resize(161);
} catch (const std::exception &) {
} catch (const std::exception&) {
throws_on_resize = true;
}
EXPECT_TRUE(throws_on_resize);
Expand Down Expand Up @@ -2470,17 +2468,17 @@ TEST(FormatTest, CharTraitsIsNotAmbiguous) {
#endif
}

#if __cplusplus > 201103L
struct custom_char {
int value;
custom_char() = default;

template <typename T> custom_char(T val) : value(static_cast<int>(val)) {}
template <typename T>
constexpr custom_char(T val) : value(static_cast<int>(val)) {}

operator int() const { return value; }
};

int to_ascii(custom_char c) { return c; }

FMT_BEGIN_NAMESPACE
template <> struct is_char<custom_char> : std::true_type {};
FMT_END_NAMESPACE
Expand All @@ -2491,6 +2489,7 @@ TEST(FormatTest, FormatCustomChar) {
EXPECT_EQ(result.size(), 1);
EXPECT_EQ(result[0], custom_char('x'));
}
#endif

// Convert a char8_t string to std::string. Otherwise GTest will insist on
// inserting `char8_t` NTBS into a `char` stream which is disabled by P1423.
Expand Down

0 comments on commit f81c14a

Please sign in to comment.