Quick Links: |
Provide macros to identify compiler support for C++11 features. More...
BSLS_COMPILERFEATURES_PP_LINE_IS_ON_FIRST
BSLS_COMPILERFEATURES_SUPPORT_ALIAS_TEMPLATES
BSLS_COMPILERFEATURES_SUPPORT_ALIGNAS
BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_NORETURN
BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_NODISCARD
BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_FALLTHROUGH
BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_MAYBE_UNUSED
BSLS_COMPILERFEATURES_SUPPORT_CONSTEXPR
BSLS_COMPILERFEATURES_SUPPORT_CONSTEXPR_CPP14
BSLS_COMPILERFEATURES_SUPPORT_CONSTEXPR_CPP17
BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE
BSLS_COMPILERFEATURES_SUPPORT_DEFAULT_TEMPLATE_ARGS
BSLS_COMPILERFEATURES_SUPPORT_DEFAULTED_FUNCTIONS
BSLS_COMPILERFEATURES_SUPPORT_DELETED_FUNCTIONS
BSLS_COMPILERFEATURES_SUPPORT_EXTERN_TEMPLATE
BSLS_COMPILERFEATURES_SUPPORT_FINAL
BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS
BSLS_COMPILERFEATURES_SUPPORT_HAS_INCLUDE
BSLS_COMPILERFEATURES_SUPPORT_INCLUDE_NEXT
BSLS_COMPILERFEATURES_SUPPORT_INLINE_NAMESPACE
BSLS_COMPILERFEATURES_SUPPORT_INLINE_VARIABLES
BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT
BSLS_COMPILERFEATURES_SUPPORT_NULLPTR
BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
BSLS_COMPILERFEATURES_SUPPORT_OVERRIDE
BSLS_COMPILERFEATURES_SUPPORT_RAW_STRINGS
BSLS_COMPILERFEATURES_SUPPORT_REF_QUALIFIERS
BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES
BSLS_COMPILERFEATURES_SUPPORT_STATIC_ASSERT
BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES
BSLS_COMPILERFEATURES_SUPPORT_VARIABLE_TEMPLATES
BSLS_COMPILERFEATURES_CPLUSPLUS | portable version of __cplusplus |
BSLS_COMPILERFEATURES_FORWARD_REF(T) | argument of type T to be forwarded |
BSLS_COMPILERFEATURES_FORWARD(T, V) | forward argument V of type T |
BSLS_COMPILERFEATURES_GUARANTEED_COPY_ELISION | flag for return optimization |
BSLS_COMPILERFEATURES_INITIALIZER_LIST_LEAKS_ON_EXCEPTIONS | compiler bug |
BSLS_COMPILERFEATURES_PP_LINE_IS_ON_FIRST | __LINE__ value for multi-line |
BSLS_COMPILERFEATURES_SUPPORT_ALIAS_TEMPLATES | flag for alias templates |
BSLS_COMPILERFEATURES_SUPPORT_ALIGNAS | flag for alignas |
BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_FALLTHROUGH | [[fallthrough]] |
BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_MAYBE_UNUSED | [[maybe_unused]] |
BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_NODISCARD | [[nodiscard]] |
BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_NORETURN | [[noreturn]] attribute |
BSLS_COMPILERFEATURES_SUPPORT_CONSTEXPR | constexpr specifier |
BSLS_COMPILERFEATURES_SUPPORT_CONSTEXPR_CPP14 | C++14 constexpr spec. |
BSLS_COMPILERFEATURES_SUPPORT_CONSTEXPR_CPP17 | C++17 constexpr spec. |
BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE | flag for decltype |
BSLS_COMPILERFEATURES_SUPPORT_DEFAULT_TEMPLATE_ARGS | for function templates |
BSLS_COMPILERFEATURES_SUPPORT_DEFAULTED_FUNCTIONS | explicit = default |
BSLS_COMPILERFEATURES_SUPPORT_DELETED_FUNCTIONS | explicit = deleted |
BSLS_COMPILERFEATURES_SUPPORT_ENUM_CLASS | flag for enum class |
BSLS_COMPILERFEATURES_SUPPORT_EXTERN_TEMPLATE | flag for extern template |
BSLS_COMPILERFEATURES_SUPPORT_FINAL | flag for final keyword |
BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS | init.-list syntax |
BSLS_COMPILERFEATURES_SUPPORT_HAS_INCLUDE | flag for __has_include |
BSLS_COMPILERFEATURES_SUPPORT_INCLUDE_NEXT | flag for include_next |
BSLS_COMPILERFEATURES_SUPPORT_INLINE_NAMESPACE | flag for inline namespace |
BSLS_COMPILERFEATURES_SUPPORT_INLINE_VARIABLES | flag for inline variables |
BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT | noexcept operator |
BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES | fnc.-type includes noexcept |
BSLS_COMPILERFEATURES_SUPPORT_NULLPTR | flag for nullptr |
BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT | explicit operator |
BSLS_COMPILERFEATURES_SUPPORT_OVERRIDE | override keyword |
BSLS_COMPILERFEATURES_SUPPORT_RAW_STRINGS | C++11-style R"tag(string)tag" |
BSLS_COMPILERFEATURES_SUPPORT_REF_QUALIFIERS | ref-qualified member function |
BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES | flag for rvalue references |
BSLS_COMPILERFEATURES_SUPPORT_STATIC_ASSERT | flag for static_assert |
BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON | <=> operator |
BSLS_COMPILERFEATURES_SUPPORT_THROW_SPECIFICATIONS | C++98 exception specs. |
BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER | has <type_traits> header |
BSLS_COMPILERFEATURES_SUPPORT_UNICODE_CHAR_TYPES | flag for char(16|32)_t |
BSLS_COMPILERFEATURES_SUPPORT_USER_DEFINED_LITERALS | user-defined literals |
BSLS_COMPILERFEATURES_SUPPORT_UTF8_CHAR_TYPE | flag for char8_t |
BSLS_COMPILERFEATURES_SUPPORT_VARIABLE_TEMPLATES | variable templates flag |
BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES | flag for variadic params. |
BSLS_COMPILERFEATURES_SUPPORT_CTAD | flag for template argument deduction |
extern template
, macros will be defined here to indicate whether the current platform/compiler combination supports the corresponding language features. Note that in some cases, support for a given feature may need to be explicitly enabled by using an appropriate compiler command-line option. BSLS_COMPILERFEATURES_CPLUSPLUS
: __cplusplus
macro, but on some compilers with some settings the standard macro does not get assigned the correct value. The values generally set (as defined in the C++ Standard) are the year and month when the Standard was completed, and the value of this macro should be compared with the appropriate constants -- 199711L
, 201103L
, 201402L
, 201703L
, 202002L
, etc.BSLS_COMPILERFEATURES_FORWARD_REF(T)
: T
that is to be perfect-forwarded. The expansion of the macro will use syntax that is appropriate for the current compiler settings for this platform.BSLS_COMPILERFEATURES_FORWARD(T, V)
: V
, of type T
. The expansion of the macro will use syntax that is appropriate for the current compiler settings for this platform. Note that due to the vagaries of implementing this macro, client code using this macro should provide the following two inclusions (in addition to the requisite inclusion of this header): #include <bslmf_util.h>
#include <bsls_util.h>
BSLS_COMPILERFEATURES_GUARANTEED_COPY_ELISION
: Thing funcReturningThing() { return Thing(ctor-args...); }
, the return value is always initialized with (ctor-args...)
; no copy is performed in the return statement. Additionally, Thing var(funcReturningThing())
always constructs var
directly from the return expression of funcReturningThing()
; again, no copies are involved. The semantics of these optimizations are guaranteed in C++17 and later, but are optional in previous versions of C++.BSLS_COMPILERFEATURES_INITIALIZER_LIST_LEAKS_ON_EXCEPTIONS
: BSLS_COMPILERFEATURES_INITIALIZER_LIST_LEAKS_ON_EXCEPTIONS
macro is defined for implementations that leak temporary objects constructed trying to initialize a std::initializer_list
object in the event that one of the elements of the list throws from its constructor. This is known to affect gcc as recently as the 8.x series, and the Sun CC compiler in C++11 mode. This would often reveal itself as a spurious memory leak in exception-safety tests for initializer_list
constructors, so rises to the level of a generally supported defect-detection macro.BSLS_COMPILERFEATURES_PP_LINE_IS_ON_FIRST
: BSLS_COMPILERFEATURES_PP_LINE_IS_ON_FIRST
macro is defined for implementations that implement WG14 N2322 (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2322.htm) "Recommended practice" on the substitution value for the __LINE__
(predefined) preprocessor macro when expanding a macro that uses __LINE__
in its body, and that macro invocation spans multiple source lines (logical or physical). When macro is defined __LINE__
is substituted with the line number of the first character of the macro name of the (multi-line) macro invocation. When this macro is not defined __LINE__
is replaced (as traditional on older C++ compilers) by the line number of the last character of the macro invocation that expands to a use of __LINE__
. See also Example 2: __LINE__
Macro Multi-line Value Differences Demonstration.BSLS_COMPILERFEATURES_SUPPORT_ALIAS_TEMPLATES
: BSLS_COMPILERFEATURES_SUPPORT_ALIGNAS
: alignas
alignment specifier is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_FALLTHROUGH
: [[fallthrough]]
attribute is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_MAYBE_UNUSED
: [[maybe_unused]]
attribute is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_NODISCARD
: [[nodiscard]]
attribute is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_ATTRIBUTE_NORETURN
: [[noreturn]]
attribute is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_CONSTEXPR
: constexpr
is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_CONSTEXPR_CPP14
: constexpr
with C++14 semantics is supported by the current compiler settings for this platform. In particular, this allows multiple statements in a constexpr
function; changing state of local variables within the function; and making non-'const' member functions constexpr
.BSLS_COMPILERFEATURES_SUPPORT_CONSTEXPR_CPP17
: constexpr
with C++17 semantics is supported by the current compiler settings for this platform. In particular, this allows lambda functions to be defined in a constexpr
function.BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE
: decltype
is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_DEFAULT_TEMPLATE_ARGS
: BSLS_COMPILERFEATURES_SUPPORT_DEFAULTED_FUNCTIONS
: = default
syntax).BSLS_COMPILERFEATURES_SUPPORT_DELETED_FUNCTIONS
: = delete
syntax).BSLS_COMPILERFEATURES_SUPPORT_ENUM_CLASS
: enum class
is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_EXTERN_TEMPLATE
: extern template
is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_FINAL
: final
is supported for classes and member functions by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS
: BSLS_COMPILERFEATURES_SUPPORT_HAS_INCLUDE
: __has_include
is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_INCLUDE_NEXT
: include_next
is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_INLINE_NAMESPACE
: inline
namespaces introduced in the C++11 Standard are supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_INLINE_VARIABLES
: inline
variables introduced in the C++17 Standard are supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT
: noexcept
keyword is supported by the current compiler settings for this platform, both for designating a function as not throwing and for testing if an expression may throw. The definition of this macro does not depend on whether the current compiler configuration has disabled support for exceptions.BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES
: noexcept
keyword is supported by the current compiler settings for this platform such that if noexcept
is used to designate a function as not throwing, that use of noexcept
is explicitly considered part of the type of the function (a feature introduced in C++17). The definition of this macro does not depend on whether the current compiler configuration has disabled support for exceptions.BSLS_COMPILERFEATURES_SUPPORT_NULLPTR
: nullptr
is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
: explicit
keyword applied to conversion operators is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_OVERRIDE
: override
keyword is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_RAW_STRINGS
: BSLS_COMPILERFEATURES_SUPPORT_REF_QUALIFIERS
: void myfunc(int) &&
) are supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES
: BSLS_COMPILERFEATURES_SUPPORT_STATIC_ASSERT
: static_assert
is supported by the current compiler settings for this platform.BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
: <=>
operator is supported by the current compiler settings for this platform. Including full library support as of C++20.BSLS_COMPILERFEATURES_SUPPORT_THROW_SPECIFICATIONS
: BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
: <type_traits>
header. Note that many standard library implementations provided partial support for a long time, and those libraries will be identified as providing the <type_traits>
header.BSLS_COMPILERFEATURES_SUPPORT_UNICODE_CHAR_TYPES
: char16_t
and char32_t
types and the related u and U prefixes for character- and string-literal values.BSLS_COMPILERFEATURES_SUPPORT_USER_DEFINED_LITERALS
: BSLS_COMPILERFEATURES_SUPPORT_UTF8_CHAR_TYPE
: char8_t
type.BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES
: BSLS_COMPILERFEATURES_SUPPORT_VARIABLE_TEMPLATES
: BSLS_COMPILERFEATURES_SUPPORT_CTAD
: bsl::basic_string
for a given character type, say, char
, on platforms that support extern template
. To accomplish this, we would do the following in the .h
and .cpp
files of the bslstl_string
component: // bslstl_string.h // ... #ifdef BSLS_COMPILERFEATURES_SUPPORT_EXTERN_TEMPLATE extern template class bsl::String_Imp<char, bsl::string::size_type>; extern template class bsl::basic_string<char>; #endif // ... // bslstl_string.cpp // ... #ifdef BSLS_COMPILERFEATURES_SUPPORT_EXTERN_TEMPLATE template class bsl::String_Imp<char, bsl::string::size_type>; template class bsl::basic_string<char>; #endif // ...
BSLS_COMPILERFEATURES_PP_LINE_IS_ON_FIRST
macro. __LINE__
macro), and how the presence (or absence) of the macro BSLS_COMPILERFEATURES_PP_LINE_IS_ON_FIRST
indicates which method the current compiler uses. First, we define a macro that uses __LINE__
in its replacement text: #define THATS_MY_LINE(dummy) __LINE__
const long A_LINE = __LINE__; const long LINE_FROM_MACRO = THATS_MY_LINE ( "dummy" ) . ;
A_LINE
without any intervening empty lines the line number of the first character of the macro invocation will be A_LINE + 1
, while the last falls on line A_LINE + 4
. BSLS_COMPILERFEATURES_PP_LINE_IS_ON_FIRST
indicates which one will occur: #ifdef BSLS_COMPILERFEATURES_PP_LINE_IS_ON_FIRST assert(A_LINE + 1 == LINE_FROM_MACRO); #else assert(A_LINE + 4 == LINE_FROM_MACRO); #endif
std::initializer_list
object in the event that one of the elements of the list throws from its constructor. Compilers affected:
__LINE__
macro in macro expansions with the line number of the first character of the macro invocation, which is the recommended practice for the C preprocessor (see WG14 N2322 at http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2322.htm). Note that all BDE supported compilers that do not define this macro use the line number of the last character of the macro invocation instead. Compilers that implement N2322 Recommended practice:
typedef
-name using alias-declaration syntax, declaring a name for a family of types. Compiler support:
alignas
alignment specifier. Compiler support:
[[noreturn]]
C++11 attribute syntax. MSVC supports the attribute with alternative syntax __declspec(noreturn), earlier versions of GCC and Clang support the alternative syntax __attribute__((noreturn))
, and xlC supports the alternative syntax _Noreturn
. This macro does not support alternative syntaxes. Compiler support:
[[nodiscard]]
C++17 attribute syntax. Compiler support:
[[fallthrough]]
C++17 attribute syntax. Compiler support:
[[maybe_unused]]
C++17 attribute syntax. Compiler support:
constexpr
reserved keyword. Compiler support:
constexpr
reserved keyword with C++14 semantics. Compiler support:
constexpr
reserved keyword with C++17 semantics. Compiler support:
decltype
reserved word. Compiler support:
Compiler support:
Compiler support:
Compiler support:
extern
keyword. Compiler support:
final
keyword after the class name as well as preventing further derived classes from overriding a virtual
function by using final
after its signature. Compiler support:
Compiler support:
__has_include
semantics as defined in the C++17 Standard (see also P006R1). Note that this preprocessor feature is often available in earlier language dialects. Compiler support:
Compiler support:
inline
namespaces introduced in the C++11 Standard. Compiler support:
inline
variables introduced in the C++17 Standard. Compiler support:
noexcept
reserved keyword. Compiler support:
nullptr
reserved word. Compiler support:
explicit
keyword to indicate that a conversion operator only available for explicit conversions. Compiler support:
override
keyword to indicate that a member function is meant to override a virtual
function (and cause a failure if that is not the case). Compiler support:
Compiler support:
void myfunc(int) &
) and rvalue reference qualifiers (e.g., void myFunc(int) &&
) are supported. Note that this macro implies that BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES
is also defined. Compiler support:
Compiler support:
static_assert
reserved word. Compiler support:
<=>
operator. Compiler support:
Compiler support:
Compiler support:
_MSVC_VER
(such as 19.32 and 1932) _MSVC_FULL_VER
(such as 193231329) _MSC_VER
entry on +-------------------+----------+---------+----------+---------------+ | Visual Studio name & version | Toolset | _MSC_VER | _MSC_FULL_VER | +===================+==========+=========+==========+===============+ | 2015 | 14.0 | 14.0 | 1900 | 190023026 | | 2015 Update 1 | 14.0 | 14.0 | 1900 | 190023506 | | 2015 Update 2 | 14.0 | 14.0 | 1900 | 190023918 | | 2015 Update 3 | 14.0 | 14.0 | 1900 | 190024210 | +-------------------+----------+---------+----------+---------------+ | 2017 | 15.0 | 14.10 | 1910 | 191025017 | | 2017 Update 1 | 15.1 | 14.10 | 1910 | 191025017 | | 2017 Update 2 | 15.2 | 14.10 | 1910 | 191025017 | | 2017 Update 3 | 15.3.3 | 14.11 | 1911 | 191125507 | | 2017 Update 4 | 15.4.4 | 14.11 | 1911 | 191125542 | | Update 4(*) | 15.4.5 | 14.11 | 1911 | 191125547 | | 2017 Update 5 | 15.5.2 | 14.12 | 1912 | 191225831 | | Update 5(*) | 15.5.3 | 14.12 | 1912 | 191225834 | | Update 5(*) | 15.5.4 | 14.12 | 1912 | 191225834 | | Update 5(*) | 15.5.6 | 14.12 | 1912 | 191225835 | | Update 5(*) | 15.5.7 | 14.12 | 1912 | 191225835 | | 2017 Update 6 | 15.6.0 | 14.13 | 1913 | 191326128 | | Update 6(*) | 15.6.1 | 14.13 | 1913 | 191326128 | | Update 6(*) | 15.6.2 | 14.13 | 1913 | 191326128 | | Update 6(*) | 15.6.3 | 14.13 | 1913 | 191326129 | | Update 6(*) | 15.6.4 | 14.13 | 1913 | 191326129 | | Update 6(*) | 15.6.6 | 14.13 | 1913 | 191326131 | | Update 6(*) | 15.6.7 | 14.13 | 1913 | 191326132 | | 2017 Update 7 | 15.7.1 | 14.14 | 1914 | 191426428 | | Update 7(*) | 15.7.2 | 14.14 | 1914 | 191426429 | | Update 7(*) | 15.7.3 | 14.14 | 1914 | 191426430 | | Update 7(*) | 15.7.5 | 14.14 | 1914 | 191426433 | | 2017 Update 8 | 15.8.0 | 14.15 | 1915 | ? | | 2017 Update 9 | 15.9.0 | 14.16 | 1916 | ? | | Update 9(*) | 15.9.1 | 14.16 | 1916 | 191627023 | | Update 9(*) | 15.9.4 | 14.16 | 1916 | 191627025 | | Update 9(*) | 15.9.5 | 14.16 | 1916 | 191627026 | | Update 9(*) | 15.9.7 | 14.16 | 1916 | 191627027 | | Update 9(*) | 15.9.11 | 14.16 | 1916 | 191627030 | +-------------------+----------+---------+----------+---------------+ | 2019 | 16.0 | 14.20 | 1920 | 192027508 | | 2019 Update 1 | 16.1.2 | 14.21 | 1921 | 192127702 | | 2019 Update 2 | 16.2.3 | 14.21 | 1922 | 192227905 | | 2019 Update 3 | 16.3.2 | 14.21 | 1923 | 192328105 | | 2019 Update 4 | 16.4.0 | 14.24 | 1924 | 192428314 | | 2019 Update 5 | 16.5.1 | 14.25 | 1925 | 192528611 | | 2019 Update 6 | 16.6.2 | 14.26 | 1926 | 192628806 | | 2019 Update 7 | 16.7 | 14.27 | 1927 | 192729112 | | 2019 Update 8 | 16.8.1 | 14.28 | 1928 | 192829333 | | Update 8(*) | 16.8.2 | 14.28 | 1928 | 192829334 | | 2019 Update 9 | 16.9.2 | 14.28 | 1928 | 192829913 | | 2019 Update 11 | 16.11.2 | 14.28 | 1929 | 192930133 | +-------------------+----------+---------+----------+---------------+ | 2020 | 17.0.1 | 14.30 | 1930 | 193030705 | | 2020(*) | 17.0.2 | 14.30 | 1930 | 193030706 | | 2020(*) | 17.2.2 | 14.30 | 1932 | 193231329 | | 2020(*) | 17.3.4 | 14.30 | 1933 | 193331630 | +-------------------+----------+---------+----------+---------------+