QObject: treat T* -> bool conversions as narrowing
Following wg21.link/LWG3228, it was found that a proper variant fix requires that T* -> bool conversions be treated as narrowing conversions in subclause wg21.link/dcl.init.lst. wg21.link/P1957R2 was accepted in Prague 2020 as a DR and retroactively applies to older C++ standards. Since we hard-code the algorithm of [dcl.init.lst], we can and must add this manually. [ChangeLog][QtCore][QObject] For the purposes of QT_NO_NARROWING_CONVERSIONS_IN_CONNECT, pointer (incl. pointer-to-member) to bool conversions are now considered narrowing. This matches the resolution of a defect report in C++ itself. Change-Id: Ifa9a3724c9c8ccd3dd6614928dbbe37477591dc1 Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>bb10
parent
3c4078ca02
commit
e5acaa12e3
|
|
@ -285,11 +285,15 @@ namespace QtPrivate {
|
|||
{
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
using is_bool = std::is_same<bool, typename std::decay<T>::type>;
|
||||
|
||||
template<typename From, typename To>
|
||||
struct AreArgumentsNarrowedBase<From, To, typename std::enable_if<sizeof(From) && sizeof(To)>::type>
|
||||
: std::integral_constant<bool,
|
||||
(std::is_floating_point<From>::value && std::is_integral<To>::value) ||
|
||||
(std::is_floating_point<From>::value && std::is_floating_point<To>::value && sizeof(From) > sizeof(To)) ||
|
||||
((std::is_pointer<From>::value || std::is_member_pointer<From>::value) && QtPrivate::is_bool<To>::value) ||
|
||||
((std::is_integral<From>::value || std::is_enum<From>::value) && std::is_floating_point<To>::value) ||
|
||||
(std::is_integral<From>::value && std::is_integral<To>::value
|
||||
&& (sizeof(From) > sizeof(To)
|
||||
|
|
|
|||
|
|
@ -7462,6 +7462,12 @@ void tst_QObject::checkArgumentsForNarrowing()
|
|||
FITS(bool, const QObject *&);
|
||||
FITS(int (*)(bool), void (QObject::*)());
|
||||
|
||||
{
|
||||
// wg21.link/P1957
|
||||
NARROWS(char*, bool);
|
||||
NARROWS(void (QObject::*)(), bool);
|
||||
}
|
||||
|
||||
#undef IS_UNSCOPED_ENUM_SIGNED
|
||||
|
||||
#undef NARROWS_IF
|
||||
|
|
|
|||
Loading…
Reference in New Issue