From e8dacba47a59944e4a5ca271c4698e5dfbdbe9d5 Mon Sep 17 00:00:00 2001 From: Mikhail Svetkin Date: Thu, 30 Aug 2018 11:49:44 +0200 Subject: QOffsetStringArray: fix compilation error with MSVC15/17 MSVC 2015/2017 has a bug with constexpr. It is internal compiler error when we are using QtPrivate::IndexSequence with more than 1024 items. Example: template void foo(QtPrivate::IndexSequence) { } void bar() { foo(QtPrivate::makeIndexSequence<1024>()); // works foo(QtPrivate::makeIndexSequence<1025>()); // error: C1202: recursive type or function dependency context too complex } Workaround: template struct Foo; template struct Foo>{ static constexpr void call() { } }; void bar() { Foo>::call(); // works } Change-Id: Iedbf5291ac4a9f51f8b5f6b76b83baba920c092d Reviewed-by: Thiago Macieira --- src/corelib/tools/qoffsetstringarray_p.h | 70 +++++++++++++------------------- 1 file changed, 28 insertions(+), 42 deletions(-) (limited to 'src/corelib') diff --git a/src/corelib/tools/qoffsetstringarray_p.h b/src/corelib/tools/qoffsetstringarray_p.h index 0a7906a3c5..42ce2acb19 100644 --- a/src/corelib/tools/qoffsetstringarray_p.h +++ b/src/corelib/tools/qoffsetstringarray_p.h @@ -84,47 +84,34 @@ struct StaticString { const char data[N]; - constexpr StaticString(const char (&literal)[N]) noexcept - : StaticString(literal, makeIndexSequence {}) - { } - - template - constexpr StaticString(const char (&literal)[N], - IndexesList) noexcept - : data{literal[Idx]...} - { } - - template - constexpr StaticString(const T ... c) noexcept : data{c...} { } - - constexpr char operator[](int i) const noexcept + static constexpr int size() noexcept { - return data[i]; - } - - template - constexpr StaticString operator+(const StaticString &rs) const noexcept - { - return concatenate(rs, makeIndexSequence{}, makeIndexSequence{}); + return N; } +}; - template - constexpr StaticString concatenate(const StaticString &rs, - IndexesList, - IndexesList) const noexcept - { - return StaticString(data[I1]..., rs[I2]...); - } - constexpr int size() const noexcept +template<> +struct StaticString<0> +{ + static constexpr int size() noexcept { - return N; + return 0; } }; -template<> -struct StaticString<0> +template +struct StaticStringBuilder; + +template +struct StaticStringBuilder, IndexesList> { + template + static constexpr StaticString concatenate( + const char (&ls)[N1], const T2 &rs) noexcept + { + return {ls[I1]..., rs.data[I2]...}; + } }; template @@ -136,7 +123,9 @@ constexpr StaticString<0> staticString() noexcept template constexpr StaticString staticString(const char (&s)[I], const char (&...sx)[Ix]) noexcept { - return StaticString(s) + staticString(sx...); + return StaticStringBuilder< + makeIndexSequence, + makeIndexSequence>::concatenate(s, staticString(sx...)); } } // namespace QtPrivate @@ -146,25 +135,24 @@ class QOffsetStringArray public: using Type = T; - template + template constexpr QOffsetStringArray(const QtPrivate::StaticString &str, - QtPrivate::IndexesList, QtPrivate::IndexesList) noexcept - : m_string{str[Cx]...}, + : m_string{str}, m_offsets{Ox...} { } constexpr inline const char *operator[](const int index) const noexcept { - return m_string + m_offsets[qBound(int(0), index, SizeOffsets - 1)]; + return m_string.data + m_offsets[qBound(int(0), index, SizeOffsets - 1)]; } constexpr inline const char *at(const int index) const noexcept { - return m_string + m_offsets[index]; + return m_string.data + m_offsets[index]; } - constexpr inline const char *str() const { return m_string; } + constexpr inline const char *str() const { return m_string.data; } constexpr inline const T *offsets() const { return m_offsets; } constexpr inline int count() const { return SizeOffsets; }; @@ -172,7 +160,7 @@ public: static constexpr const auto sizeOffsets = SizeOffsets; private: - const char m_string[SizeString]; + QtPrivate::StaticString m_string; const T m_offsets[SizeOffsets]; }; @@ -183,7 +171,6 @@ constexpr QOffsetStringArray qOffsetStringArray( { return QOffsetStringArray( string, - QtPrivate::makeIndexSequence {}, offsets); } @@ -202,7 +189,6 @@ constexpr auto qOffsetStringArray(const char (&...strings)[Nx]) noexcept -> type QtPrivate::staticString(strings...), Offsets{}); } - QT_END_NAMESPACE #endif // QOFFSETSTRINGARRAY_P_H -- cgit v1.2.3