connectivity/source/commontools/BlobHelper.cxx | 13 ++- connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx | 36 ++++------ connectivity/source/sdbcx/VUser.cxx | 10 +- include/sal/types.h | 28 +++++++ scaddins/source/analysis/analysishelper.cxx | 10 +- scaddins/source/analysis/financial.cxx | 31 +++----- svx/source/form/fmdmod.cxx | 8 ++ ucbhelper/source/client/content.cxx | 7 + 8 files changed, 88 insertions(+), 55 deletions(-)
New commits: commit d868e2d2e38ee8f0a1427dd2de5c0fc547b28506 Author: Tor Lillqvist <t...@collabora.com> Date: Wed Sep 4 14:59:02 2013 +0300 WaE: Unreachable code: Use SAL_WNOUNREACHABLE_CODE_PUSH/POP Cleaner than my first attempt. This reverts commit 9c0ba0ba41cb3b814cc8bf7a33abf1245d4b241e. Change-Id: Iec9da427ab2a92cb0765f73af14d83a37f765290 diff --git a/ucbhelper/source/client/content.cxx b/ucbhelper/source/client/content.cxx index 850f56e..e36207b 100644 --- a/ucbhelper/source/client/content.cxx +++ b/ucbhelper/source/client/content.cxx @@ -1057,6 +1057,9 @@ sal_Bool Content::isFolder() } //========================================================================= + +SAL_WNOUNREACHABLE_CODE_PUSH + sal_Bool Content::isDocument() throw( CommandAbortedException, RuntimeException, Exception ) { @@ -1072,13 +1075,13 @@ sal_Bool Content::isDocument() get() ) ), m_xImpl->getEnvironment() ); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) // Unreachable - cancelCommandExecution always throws an exception, // But some compilers complain... return sal_False; -#endif } +SAL_WNOUNREACHABLE_CODE_POP + //========================================================================= //========================================================================= // commit 5326020f85b67faab34bca5c605b6070c6c4bef0 Author: Tor Lillqvist <t...@collabora.com> Date: Wed Sep 4 14:39:05 2013 +0300 WaE: Unreachable code: Use SAL_WNOUNREACHABLE_CODE_PUSH/POP Cleaner than my first attempt. This reverts commit aa4868de78b3a3893722f7a079f4d05e18abd8db. Change-Id: I9c92be72e69292731983a53fc2de29ba333071c9 diff --git a/connectivity/source/commontools/BlobHelper.cxx b/connectivity/source/commontools/BlobHelper.cxx index 5135072..fff3e09 100644 --- a/connectivity/source/commontools/BlobHelper.cxx +++ b/connectivity/source/commontools/BlobHelper.cxx @@ -46,20 +46,25 @@ BlobHelper::BlobHelper(const ::com::sun::star::uno::Sequence< sal_Int8 >& _val) return new ::comphelper::SequenceInputStream(m_aValue); } // ----------------------------------------------------------------------------- + +// The "return" after a call to throwFeatureNotImplementedException() +// (which always throws) will be detected as unreachable when doing +// global inlining. + +SAL_WNOUNREACHABLE_CODE_PUSH + ::sal_Int64 SAL_CALL BlobHelper::position( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& /*pattern*/, ::sal_Int64 /*start*/ ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) { ::dbtools::throwFeatureNotImplementedException( "XBlob::position", *this ); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return 0; -#endif } // ----------------------------------------------------------------------------- ::sal_Int64 SAL_CALL BlobHelper::positionOfBlob( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob >& /*pattern*/, ::sal_Int64 /*start*/ ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) { ::dbtools::throwFeatureNotImplementedException( "XBlob::positionOfBlob", *this ); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return 0; -#endif } +SAL_WNOUNREACHABLE_CODE_POP + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx b/connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx index 7ebd380..6217626 100644 --- a/connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx +++ b/connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx @@ -323,21 +323,23 @@ sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isAfterLast( ) throw(SQLException return m_bEOF; } // ------------------------------------------------------------------------- + +SAL_WNOUNREACHABLE_CODE_PUSH + sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isFirst( ) throw(SQLException, RuntimeException) { ::dbtools::throwFunctionSequenceException(*this); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return sal_False; -#endif } // ------------------------------------------------------------------------- sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isLast( ) throw(SQLException, RuntimeException) { ::dbtools::throwFunctionSequenceException(*this); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return sal_False; -#endif } + +SAL_WNOUNREACHABLE_CODE_POP + // ------------------------------------------------------------------------- void SAL_CALL ODatabaseMetaDataResultSet::beforeFirst( ) throw(SQLException, RuntimeException) { @@ -361,46 +363,41 @@ void SAL_CALL ODatabaseMetaDataResultSet::close( ) throw(SQLException, RuntimeE } // ------------------------------------------------------------------------- +SAL_WNOUNREACHABLE_CODE_PUSH + sal_Bool SAL_CALL ODatabaseMetaDataResultSet::first( ) throw(SQLException, RuntimeException) { ::dbtools::throwFunctionSequenceException(*this); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return sal_False; -#endif } // ------------------------------------------------------------------------- sal_Bool SAL_CALL ODatabaseMetaDataResultSet::last( ) throw(SQLException, RuntimeException) { ::dbtools::throwFunctionSequenceException(*this); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return sal_False; -#endif } // ------------------------------------------------------------------------- sal_Bool SAL_CALL ODatabaseMetaDataResultSet::absolute( sal_Int32 /*row*/ ) throw(SQLException, RuntimeException) { ::dbtools::throwFunctionSequenceException(*this); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return sal_False; -#endif } // ------------------------------------------------------------------------- sal_Bool SAL_CALL ODatabaseMetaDataResultSet::relative( sal_Int32 /*row*/ ) throw(SQLException, RuntimeException) { ::dbtools::throwFunctionSequenceException(*this); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return sal_False; -#endif } // ------------------------------------------------------------------------- sal_Bool SAL_CALL ODatabaseMetaDataResultSet::previous( ) throw(SQLException, RuntimeException) { ::dbtools::throwFunctionSequenceException(*this); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return sal_False; -#endif } + +SAL_WNOUNREACHABLE_CODE_POP + // ------------------------------------------------------------------------- Reference< XInterface > SAL_CALL ODatabaseMetaDataResultSet::getStatement( ) throw(SQLException, RuntimeException) { @@ -408,29 +405,28 @@ Reference< XInterface > SAL_CALL ODatabaseMetaDataResultSet::getStatement( ) th } // ------------------------------------------------------------------------- +SAL_WNOUNREACHABLE_CODE_PUSH + sal_Bool SAL_CALL ODatabaseMetaDataResultSet::rowDeleted( ) throw(SQLException, RuntimeException) { ::dbtools::throwFunctionSequenceException(*this); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return sal_False; -#endif } // ------------------------------------------------------------------------- sal_Bool SAL_CALL ODatabaseMetaDataResultSet::rowInserted( ) throw(SQLException, RuntimeException) { ::dbtools::throwFunctionSequenceException(*this); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return sal_False; -#endif } // ------------------------------------------------------------------------- sal_Bool SAL_CALL ODatabaseMetaDataResultSet::rowUpdated( ) throw(SQLException, RuntimeException) { ::dbtools::throwFunctionSequenceException(*this); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return sal_False; -#endif } + +SAL_WNOUNREACHABLE_CODE_POP + // ------------------------------------------------------------------------- sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isBeforeFirst( ) throw(SQLException, RuntimeException) diff --git a/connectivity/source/sdbcx/VUser.cxx b/connectivity/source/sdbcx/VUser.cxx index ad088aa..f7f8176 100644 --- a/connectivity/source/sdbcx/VUser.cxx +++ b/connectivity/source/sdbcx/VUser.cxx @@ -121,16 +121,15 @@ Reference< XNameAccess > SAL_CALL OUser::getGroups( ) throw(RuntimeException) return const_cast<OUser*>(this)->m_pGroups; } // ------------------------------------------------------------------------- -// ------------------------------------------------------------------------- + +SAL_WNOUNREACHABLE_CODE_PUSH sal_Int32 SAL_CALL OUser::getPrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) { ::osl::MutexGuard aGuard(m_aMutex); checkDisposed(OUser_BASE::rBHelper.bDisposed); ::dbtools::throwFeatureNotImplementedException( "XAuthorizable::changePassword", *this ); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return 0; -#endif } // ------------------------------------------------------------------------- sal_Int32 SAL_CALL OUser::getGrantablePrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) @@ -138,10 +137,11 @@ sal_Int32 SAL_CALL OUser::getGrantablePrivileges( const OUString& /*objName*/, s ::osl::MutexGuard aGuard(m_aMutex); checkDisposed(OUser_BASE::rBHelper.bDisposed); ::dbtools::throwFeatureNotImplementedException( "XAuthorizable::getGrantablePrivileges", *this ); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) return 0; -#endif } + +SAL_WNOUNREACHABLE_CODE_POP + // ------------------------------------------------------------------------- void SAL_CALL OUser::grantPrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/, sal_Int32 /*objPrivileges*/ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) { commit 543937297a7e936718a7e37a6ebe30dfc418e567 Author: Tor Lillqvist <t...@collabora.com> Date: Wed Sep 4 14:27:25 2013 +0300 WaE: Unreachable code: Use SAL_WNOUNREACHABLE_CODE_PUSH/POP Cleaner than my first attempt. This reverts commit 853167931600777e7bf44a35e051628a1169bcfc. Change-Id: Ib25b72a1f18d8adef5fa8d2960f233e0a7c29844 diff --git a/scaddins/source/analysis/analysishelper.cxx b/scaddins/source/analysis/analysishelper.cxx index 0012231..85eff90 100644 --- a/scaddins/source/analysis/analysishelper.cxx +++ b/scaddins/source/analysis/analysishelper.cxx @@ -1068,8 +1068,9 @@ double GetOddfprice( sal_Int32 /*nNullDate*/, sal_Int32 /*nSettle*/, sal_Int32 / sal_Int32 /*nFirstCoup*/, double /*fRate*/, double /*fYield*/, double /*fRedemp*/, sal_Int32 /*nFreq*/, sal_Int32 /*nBase*/ ) throw( uno::RuntimeException, lang::IllegalArgumentException ) { - // If you ever change this to not unconditionally throw, adapt - // getOddfprice() (note lower-case 'g') in financial.cxx. + // If you change this to not unconditionally throw, the + // SAL_WNOUNREACHABLE_CODE_PUSH/POP around the caller in + // financial.cxx can be removed. throw uno::RuntimeException(); // #87380# } @@ -1153,8 +1154,9 @@ double GetOddfyield( sal_Int32 /*nNullDate*/, sal_Int32 /*nSettle*/, sal_Int32 / sal_Int32 /*nFirstCoup*/, double /*fRate*/, double /*fPrice*/, double /*fRedemp*/, sal_Int32 /*nFreq*/, sal_Int32 /*nBase*/ ) throw( uno::RuntimeException, lang::IllegalArgumentException ) { - // Ditto here, if you change this to not throw unconditionally, - // adapt getOddfyield() in financial.cxx. + // If you change this to not unconditionally throw, the + // SAL_WNOUNREACHABLE_CODE_PUSH/POP around the caller in + // financial.cxx can be removed. throw uno::RuntimeException(); // #87380# } diff --git a/scaddins/source/analysis/financial.cxx b/scaddins/source/analysis/financial.cxx index a34591a..bfaec15 100644 --- a/scaddins/source/analysis/financial.cxx +++ b/scaddins/source/analysis/financial.cxx @@ -395,6 +395,10 @@ double SAL_CALL AnalysisAddIn::getTbillyield( const css::uno::Reference< css::be RETURN_FINITE( fRet ); } +// Encapsulation violation: We *know* that GetOddfprice() always +// throws. + +SAL_WNOUNREACHABLE_CODE_PUSH double SAL_CALL AnalysisAddIn::getOddfprice( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nIssue, sal_Int32 nFirstCoup, @@ -403,22 +407,16 @@ double SAL_CALL AnalysisAddIn::getOddfprice( const css::uno::Reference< css::bea if( fRate < 0.0 || fYield < 0.0 || CHK_Freq || nMat <= nFirstCoup || nFirstCoup <= nSettle || nSettle <= nIssue ) throw css::lang::IllegalArgumentException(); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) double fRet = GetOddfprice( GetNullDate( xOpt ), nSettle, nMat, nIssue, nFirstCoup, fRate, fYield, fRedemp, nFreq, getDateMode( xOpt, rOB ) ); RETURN_FINITE( fRet ); -#else - // During link-time optimization the compiler inlines the above - // call to GetOddfprice() (note upper-case 'G') (from - // analysishelper.cxx), and notices that GetOddfprice() always - // throws, so the assignment and return are unreachable. Avoid - // that warning by throwing directly here. - (void) rOB; - (void) fRedemp; - (void) xOpt; - throw css::uno::RuntimeException(); -#endif } +SAL_WNOUNREACHABLE_CODE_POP + +// Encapsulation violation: We *know* that Getoddfyield() always +// throws. + +SAL_WNOUNREACHABLE_CODE_PUSH double SAL_CALL AnalysisAddIn::getOddfyield( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nIssue, sal_Int32 nFirstCoup, @@ -427,19 +425,12 @@ double SAL_CALL AnalysisAddIn::getOddfyield( const css::uno::Reference< css::bea if( fRate < 0.0 || fPrice <= 0.0 || CHK_Freq || nMat <= nFirstCoup || nFirstCoup <= nSettle || nSettle <= nIssue ) throw css::lang::IllegalArgumentException(); -#if !(defined(_MSC_VER) && defined(ENABLE_LTO)) double fRet = GetOddfyield( GetNullDate( xOpt ), nSettle, nMat, nIssue, nFirstCoup, fRate, fPrice, fRedemp, nFreq, getDateMode( xOpt, rOB ) ); RETURN_FINITE( fRet ); -#else - // Same story here, see comment in getOddfprice() - (void) rOB; - (void) fRedemp; - (void) xOpt; - throw css::uno::RuntimeException(); -#endif } +SAL_WNOUNREACHABLE_CODE_POP double SAL_CALL AnalysisAddIn::getOddlprice( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nLastInterest, commit 849f7d1484167111f34e2da931fc7b6e57eb1b25 Author: Tor Lillqvist <t...@collabora.com> Date: Wed Sep 4 14:25:23 2013 +0300 WaE: unreachable code Change-Id: I65158d7f8f632fb153adc1a4560de25ed1be0810 diff --git a/svx/source/form/fmdmod.cxx b/svx/source/form/fmdmod.cxx index e5092eb..6012e9c 100644 --- a/svx/source/form/fmdmod.cxx +++ b/svx/source/form/fmdmod.cxx @@ -47,11 +47,19 @@ using namespace ::svxform; } //----------------------------------------------------------------------------- + +// Encapsulation violation: We *know* that +// SvxUnoDrawMSFactory::createInstanceWithArguments() always throws. + +SAL_WNOUNREACHABLE_CODE_PUSH + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SvxFmMSFactory::createInstanceWithArguments(const OUString& ServiceSpecifier, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& Arguments) throw( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ) { return SvxUnoDrawMSFactory::createInstanceWithArguments(ServiceSpecifier, Arguments ); } +SAL_WNOUNREACHABLE_CODE_POP + //----------------------------------------------------------------------------- ::com::sun::star::uno::Sequence< OUString > SAL_CALL SvxFmMSFactory::getAvailableServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ) { commit 78d09575da61ac681f708ee76fc239111aa7186e Author: Tor Lillqvist <t...@collabora.com> Date: Wed Sep 4 14:22:20 2013 +0300 Add SAL_WNOUNREACHABLE_CODE_PUSH and _POP macros To be used around code where some compiler, in some circumstances, generates bogus warnings about unreachable code, that it would be much uglier to work around otherwise. Specifically, I will at first now use this to get rid of MSVC warnings about unreachable code when calling a function defined in another source file (but going into the same library) that always throws. The compiler notices this when one uses link-time code generation and it thus can do global inlining of code from all compilation units that go into a library (or executable). For MSVC, the __pragma that the SAL_WNOUNREACHABLE_CODE_PUSH macro expands to needs to be in force at the start curly brace of a function, so place the PUSH macro before the function definition. For clarity, I guess it is best that the corresponding POP macro comes after the end of the function. Change-Id: Icef5259c5360b9facdc136fec1f207665ce79d90 diff --git a/include/sal/types.h b/include/sal/types.h index 145d47e..c7a61bd 100644 --- a/include/sal/types.h +++ b/include/sal/types.h @@ -512,6 +512,34 @@ template< typename T1, typename T2 > inline T1 static_int_cast(T2 n) { # define SAL_WNODEPRECATED_DECLARATIONS_POP #endif +/** + Use as follows: + + SAL_WNOUNREACHABLE_CODE_PUSH + + function definition + + SAL_WNOUNREACHABLE_CODE_POP + + Useful in cases where the compiler is "too clever" like when doing + link-time code generation, and noticing that a called function + always throws, and fixing the problem cleanly so that it produceds + no warnings in normal non-LTO compilations either is not easy. + +*/ + +#ifdef _MSC_VER +#define SAL_WNOUNREACHABLE_CODE_PUSH \ + __pragma(warning(push)) \ + __pragma(warning(disable:4702)) +#define SAL_WNOUNREACHABLE_CODE_POP \ + __pragma(warning(pop)) +#else +/* Add definitions for GCC and Clang if needed */ +#define SAL_WNOUNREACHABLE_CODE_PUSH +#define SAL_WNOUNREACHABLE_CODE_POP +#endif + /** Annotate unused but required C++ function parameters. An unused parameter is required if the function needs to adhere to a given _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits