[Libreoffice-commits] core.git: include/com
Stephan Bergmann (via logerrit)
logerrit at kemper.freedesktop.org
Thu Apr 23 19:50:58 UTC 2020
include/com/sun/star/uno/Reference.h | 16 +++++-----------
include/com/sun/star/uno/Reference.hxx | 2 +-
2 files changed, 6 insertions(+), 12 deletions(-)
New commits:
commit 39a1edd6fec902ef378acce8af42c4d7fba280d0
Author: Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Thu Apr 23 20:21:20 2020 +0200
Commit: Stephan Bergmann <sbergman at redhat.com>
CommitDate: Thu Apr 23 21:50:20 2020 +0200
Make css::uno::Reference upcast ctor LIBO_INTERNAL_ONLY
It looks like an oversight that 904b3d1fceee5827076758ed2a81f80cb73493ca "Up-
cast conversion constructor for css::uno::Reference" added it also for external
code. Making it LIBO_INTERNAL_ONLY allows to remove workarounds for old MSVC,
and may allow to simplify the code further in the future. (Though using
std::is_base_of, as suggested in the comment, is not easily possible, as it
would cause errors like
> include/c++/v1/type_traits:1726:59: error: incomplete type 'com::sun::star::lang::XMultiServiceFactory' used in type trait expression
> : public integral_constant<bool, __is_base_of(_Bp, _Dp)> {};
> ^
> include/c++/v1/type_traits:1731:7: note: in instantiation of template class 'std::__1::is_base_of<com::sun::star::beans::XPropertySet, com::sun::star::lang::XMultiServiceFactory>' requested here
> = is_base_of<_Bp, _Dp>::value;
> ^
> include/com/sun/star/uno/Reference.h:277:18: note: in instantiation of variable template specialization 'std::__1::is_base_of_v<com::sun::star::beans::XPropertySet, com::sun::star::lang::XMultiServiceFactory>' requested here
> std::is_base_of_v<interface_type, derived_type>
> ^
> ucbhelper/source/provider/getcomponentcontext.cxx:34:9: note: while substituting deduced template arguments into function template 'Reference' [with derived_type = com::sun::star::lang::XMultiServiceFactory]
> css::uno::Reference< css::beans::XPropertySet >(
> ^
> include/ucbhelper/getcomponentcontext.hxx:29:28: note: forward declaration of 'com::sun::star::lang::XMultiServiceFactory'
> namespace lang { class XMultiServiceFactory; }
> ^
with incomplete types.)
Change-Id: I6da3395df904797cec83c1f6ab24b386527d4cea
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92802
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
diff --git a/include/com/sun/star/uno/Reference.h b/include/com/sun/star/uno/Reference.h
index 50afd26a83b4..951902b356bd 100644
--- a/include/com/sun/star/uno/Reference.h
+++ b/include/com/sun/star/uno/Reference.h
@@ -167,6 +167,7 @@ enum UnoReference_SetThrow
UNO_SET_THROW
};
+#if defined LIBO_INTERNAL_ONLY
/// @cond INTERNAL
namespace detail {
@@ -179,7 +180,8 @@ namespace detail {
// selm=df893da6.0301280859.522081f7%40posting.google.com> "SuperSubclass
// (is_base_and_derived) complete implementation!" by Rani Sharoni and cites
// Aleksey Gurtovoy for the workaround for MSVC), to avoid including Boost
-// headers in URE headers (could ultimately be based on C++11 std::is_base_of):
+// headers in URE headers (basing on C++11 std::is_base_of does not work when the types are
+// incomplete):
template< typename T1, typename T2 > struct UpCast {
private:
@@ -191,21 +193,12 @@ private:
struct S { char c[2]; };
-#if defined _MSC_VER && _MSC_VER < 1800
- static char f(T2 *, long);
- static S f(T1 * const &, int);
-#else
template< typename U > static char f(T2 *, U);
static S f(T1 *, int);
-#endif
struct H {
H(); // avoid C2514 "class has no constructors" from MSVC
-#if defined _MSC_VER && _MSC_VER < 1800
- operator T1 * const & () const;
-#else
operator T1 * () const;
-#endif
operator T2 * ();
};
@@ -217,6 +210,7 @@ template< typename T2 > struct UpCast< XInterface, T2 > {};
}
/// @endcond
+#endif
/** Template reference class for interface type derived from BaseReference.
A special constructor given the UNO_QUERY identifier queries interfaces
@@ -308,7 +302,6 @@ public:
@param rRef another reference
*/
inline Reference( Reference< interface_type > && rRef ) noexcept;
-#endif
/** Up-casting conversion constructor: Copies interface reference.
@@ -322,6 +315,7 @@ public:
inline Reference(
const Reference< derived_type > & rRef,
typename detail::UpCast< interface_type, derived_type >::t = 0 );
+#endif
/** Constructor: Sets given interface pointer.
diff --git a/include/com/sun/star/uno/Reference.hxx b/include/com/sun/star/uno/Reference.hxx
index 9edbd70d0f88..b3c01aaa2391 100644
--- a/include/com/sun/star/uno/Reference.hxx
+++ b/include/com/sun/star/uno/Reference.hxx
@@ -131,7 +131,6 @@ inline Reference< interface_type >::Reference( Reference< interface_type > && rR
_pInterface = rRef._pInterface;
rRef._pInterface = nullptr;
}
-#endif
template< class interface_type > template< class derived_type >
inline Reference< interface_type >::Reference(
@@ -143,6 +142,7 @@ inline Reference< interface_type >::Reference(
if (_pInterface)
_pInterface->acquire();
}
+#endif
template< class interface_type >
inline Reference< interface_type >::Reference( interface_type * pInterface )
More information about the Libreoffice-commits
mailing list