[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