Fix dangling else warnings at all wx(V)LogXXX calls
Earlier this was fixed for some but not all variants of wx(V)LogXXX. See #11829.
This commit is contained in:
parent
1e7c2c8254
commit
32ead5a0ff
@ -1241,11 +1241,14 @@ WXDLLIMPEXP_BASE wxString wxSysErrorMsgStr(unsigned long nErrCode = 0);
|
||||
|
||||
// this macro generates the expression which logs whatever follows it in
|
||||
// parentheses at the level specified as argument
|
||||
#define wxDO_LOG(level) wxMAKE_LOGGER(level).Log
|
||||
#define wxDO_LOG_WITH_FUNC(level, func) wxMAKE_LOGGER(level).func
|
||||
#define wxDO_LOG(level) wxDO_LOG_WITH_FUNC(level, Log)
|
||||
|
||||
// this is the non-vararg equivalent
|
||||
#define wxDO_LOGV(level, format, argptr) \
|
||||
wxMAKE_LOGGER(level).LogV(format, argptr)
|
||||
#define wxDO_LOGV_WITH_FUNC(level, format, argptr, func) \
|
||||
wxMAKE_LOGGER(level).func(format, argptr)
|
||||
|
||||
// this macro declares wxLog<level>() macro which logs whatever follows it if
|
||||
// logging at specified level is enabled (notice that if it is false, the
|
||||
@ -1264,14 +1267,51 @@ WXDLLIMPEXP_BASE wxString wxSysErrorMsgStr(unsigned long nErrCode = 0);
|
||||
//
|
||||
// See also #11829 for the problems with other simpler approaches,
|
||||
// notably the need for two macros due to buggy __LINE__ in MSVC.
|
||||
#define wxDO_LOG_IF_ENABLED_HELPER(level, loopvar) \
|
||||
#define wxDO_LOG_IF_ENABLED_HELPER(level, loopvar, extraCond, func) \
|
||||
for ( bool loopvar = false; \
|
||||
!loopvar && wxLog::IsLevelEnabled(wxLOG_##level, wxLOG_COMPONENT); \
|
||||
!loopvar && wxLog::IsLevelEnabled(wxLOG_##level, wxLOG_COMPONENT) &&\
|
||||
extraCond ; \
|
||||
loopvar = true ) \
|
||||
wxDO_LOG(level)
|
||||
wxDO_LOG_WITH_FUNC(level, func)
|
||||
|
||||
#define wxDO_LOGV_IF_ENABLED_HELPER(level, format, argptr, loopvar, extraCond)\
|
||||
for ( bool loopvar = false; \
|
||||
!loopvar && wxLog::IsLevelEnabled(wxLOG_##level, wxLOG_COMPONENT) &&\
|
||||
extraCond ; \
|
||||
loopvar = true ) \
|
||||
wxDO_LOGV(level, format, argptr)
|
||||
|
||||
#define wxDO_LOGV_IF_ENABLED_HELPER_WITH_FUNC(level, format, argptr, loopvar, \
|
||||
extraCond, func) \
|
||||
for ( bool loopvar = false; \
|
||||
!loopvar && wxLog::IsLevelEnabled(wxLOG_##level, wxLOG_COMPONENT) &&\
|
||||
extraCond ; \
|
||||
loopvar = true ) \
|
||||
wxDO_LOGV_WITH_FUNC(level, format, argptr, func)
|
||||
|
||||
#define wxDO_LOG_IF_ENABLED_WITH_FUNC(level, func) \
|
||||
wxDO_LOG_IF_ENABLED_HELPER(level, wxMAKE_UNIQUE_NAME(wxlogcheck), true, \
|
||||
func)
|
||||
|
||||
#define wxDO_LOG_IF_ENABLED(level) \
|
||||
wxDO_LOG_IF_ENABLED_HELPER(level, wxMAKE_UNIQUE_NAME(wxlogcheck))
|
||||
wxDO_LOG_IF_ENABLED_HELPER(level, wxMAKE_UNIQUE_NAME(wxlogcheck), true, \
|
||||
Log)
|
||||
|
||||
#define wxDO_LOGV_IF_ENABLED_WITH_FUNC(level, func) \
|
||||
wxDO_LOGV_IF_ENABLED_HELPER_WITH_FUNC(level, \
|
||||
wxMAKE_UNIQUE_NAME(wxlogcheck), true, func)
|
||||
|
||||
#define wxDO_LOGV_IF_ENABLED(level, format, argptr) \
|
||||
wxDO_LOGV_IF_ENABLED_HELPER_WITH_FUNC(level, format, argptr, \
|
||||
wxMAKE_UNIQUE_NAME(wxlogcheck), true, LogV)
|
||||
|
||||
#define wxDO_LOG_IF_ENABLED_WITH_COND(level, extraCond) \
|
||||
wxDO_LOG_IF_ENABLED_HELPER(level, wxMAKE_UNIQUE_NAME(wxlogcheck), \
|
||||
extraCond, Log)
|
||||
|
||||
#define wxDO_LOGV_IF_ENABLED_WITH_COND(level, format, argptr, extraCond) \
|
||||
wxDO_LOGV_IF_ENABLED_HELPER(level, format, argptr, \
|
||||
wxMAKE_UNIQUE_NAME(wxlogcheck), extraCond)
|
||||
|
||||
// wxLogFatalError() is special as it can't be disabled
|
||||
#define wxLogFatalError wxDO_LOG(FatalError)
|
||||
@ -1291,18 +1331,9 @@ WXDLLIMPEXP_BASE wxString wxSysErrorMsgStr(unsigned long nErrCode = 0);
|
||||
|
||||
|
||||
// this one is special as it only logs if we're in verbose mode
|
||||
#define wxLogVerbose \
|
||||
if ( !(wxLog::IsLevelEnabled(wxLOG_Info, wxLOG_COMPONENT) && \
|
||||
wxLog::GetVerbose()) ) \
|
||||
{} \
|
||||
else \
|
||||
wxDO_LOG(Info)
|
||||
#define wxLogVerbose wxDO_LOG_IF_ENABLED_WITH_COND(Info, wxLog::GetVerbose())
|
||||
#define wxVLogVerbose(format, argptr) \
|
||||
if ( !(wxLog::IsLevelEnabled(wxLOG_Info, wxLOG_COMPONENT) && \
|
||||
wxLog::GetVerbose()) ) \
|
||||
{} \
|
||||
else \
|
||||
wxDO_LOGV(Info, format, argptr)
|
||||
wxDO_LOGV_IF_ENABLED_WITH_COND(Info, format, argptr, wxLog::GetVerbose())
|
||||
|
||||
// another special case: the level is passed as first argument of the function
|
||||
// and so is not available to the macro
|
||||
@ -1311,10 +1342,7 @@ WXDLLIMPEXP_BASE wxString wxSysErrorMsgStr(unsigned long nErrCode = 0);
|
||||
// always evaluated, unlike for the other log functions
|
||||
#define wxLogGeneric wxMAKE_LOGGER(Max).LogAtLevel
|
||||
#define wxVLogGeneric(level, format, argptr) \
|
||||
if ( !wxLog::IsLevelEnabled(wxLOG_##level, wxLOG_COMPONENT) ) \
|
||||
{} \
|
||||
else \
|
||||
wxDO_LOGV(level, format, argptr)
|
||||
wxDO_LOGV_IF_ENABLED(level, format, argptr)
|
||||
|
||||
|
||||
// wxLogSysError() needs to stash the error code value in the log record info
|
||||
@ -1331,12 +1359,8 @@ WXDLLIMPEXP_BASE wxString wxSysErrorMsgStr(unsigned long nErrCode = 0);
|
||||
// change even much sooner)
|
||||
#define wxLOG_KEY_SYS_ERROR_CODE "wx.sys_error"
|
||||
|
||||
#define wxLogSysError \
|
||||
if ( !wxLog::IsLevelEnabled(wxLOG_Error, wxLOG_COMPONENT) ) \
|
||||
{} \
|
||||
else \
|
||||
wxMAKE_LOGGER(Error).MaybeStore(wxLOG_KEY_SYS_ERROR_CODE, \
|
||||
wxSysErrorCode()).Log
|
||||
#define wxLogSysError wxDO_LOG_IF_ENABLED_WITH_FUNC(Error, \
|
||||
MaybeStore(wxLOG_KEY_SYS_ERROR_CODE, wxSysErrorCode()).Log)
|
||||
|
||||
// unfortunately we can't have overloaded macros so we can't define versions
|
||||
// both with and without error code argument and have to rely on LogV()
|
||||
@ -1350,11 +1374,8 @@ WXDLLIMPEXP_BASE wxString wxSysErrorMsgStr(unsigned long nErrCode = 0);
|
||||
// specify the frame to which the message should go
|
||||
#define wxLOG_KEY_FRAME "wx.frame"
|
||||
|
||||
#define wxLogStatus \
|
||||
if ( !wxLog::IsLevelEnabled(wxLOG_Status, wxLOG_COMPONENT) ) \
|
||||
{} \
|
||||
else \
|
||||
wxMAKE_LOGGER(Status).MaybeStore(wxLOG_KEY_FRAME).Log
|
||||
#define wxLogStatus wxDO_LOG_IF_ENABLED_WITH_FUNC(Status, \
|
||||
MaybeStore(wxLOG_KEY_FRAME).Log)
|
||||
|
||||
#define wxVLogStatus \
|
||||
wxMAKE_LOGGER(Status).MaybeStore(wxLOG_KEY_FRAME).LogV
|
||||
@ -1451,16 +1472,8 @@ public:
|
||||
#endif // wxUSE_LOG_DEBUG/!wxUSE_LOG_DEBUG
|
||||
|
||||
#if wxUSE_LOG_TRACE
|
||||
#define wxLogTrace \
|
||||
if ( !wxLog::IsLevelEnabled(wxLOG_Trace, wxLOG_COMPONENT) ) \
|
||||
{} \
|
||||
else \
|
||||
wxMAKE_LOGGER(Trace).LogTrace
|
||||
#define wxVLogTrace \
|
||||
if ( !wxLog::IsLevelEnabled(wxLOG_Trace, wxLOG_COMPONENT) ) \
|
||||
{} \
|
||||
else \
|
||||
wxMAKE_LOGGER(Trace).LogVTrace
|
||||
#define wxLogTrace wxDO_LOG_IF_ENABLED_WITH_FUNC(Trace, LogTrace)
|
||||
#define wxVLogTrace wxDO_LOG_IF_ENABLED_WITH_FUNC(Trace, LogVTrace)
|
||||
#else // !wxUSE_LOG_TRACE
|
||||
#define wxVLogTrace(mask, fmt, valist) wxLogNop()
|
||||
|
||||
|
@ -394,4 +394,66 @@ void LogTestCase::NoWarnings()
|
||||
CPPUNIT_ASSERT_EQUAL( "If", m_log->GetLog(wxLOG_Error) );
|
||||
}
|
||||
|
||||
// The following two functions (v, macroCompilabilityTest) are not run by
|
||||
// any test, and their purpose is merely to guarantee that the wx(V)LogXXX
|
||||
// macros compile without 'dangling else' warnings.
|
||||
#pragma GCC diagnostic error "-Wdangling-else"
|
||||
|
||||
static void v(int x, ...) {
|
||||
va_list list;
|
||||
va_start(list, x);
|
||||
|
||||
if (true)
|
||||
wxVLogGeneric(Info, "vhello generic %d", list);
|
||||
if (true)
|
||||
wxVLogTrace(wxTRACE_Messages, "vhello trace %d", list);
|
||||
if (true)
|
||||
wxVLogError("vhello error %d", list);
|
||||
if (true)
|
||||
wxVLogMessage("vhello message %d", list);
|
||||
if (true)
|
||||
wxVLogVerbose("vhello verbose %d", list);
|
||||
if (true)
|
||||
wxVLogWarning("vhello warning %d", list);
|
||||
if (true)
|
||||
wxVLogFatalError("vhello fatal %d", list);
|
||||
if (true)
|
||||
wxVLogSysError("vhello syserror %d", list);
|
||||
#if wxUSE_GUI
|
||||
if (true)
|
||||
wxVLogStatus("vhello status %d", list);
|
||||
#endif
|
||||
if (true)
|
||||
wxVLogDebug("vhello debug %d", list);
|
||||
|
||||
va_end(list);
|
||||
}
|
||||
|
||||
void macroCompilabilityTest()
|
||||
{
|
||||
v(123, 456);
|
||||
if (true)
|
||||
wxLogGeneric(wxLOG_Info, "hello generic %d", 42);
|
||||
if (true)
|
||||
wxLogTrace(wxTRACE_Messages, "hello trace %d", 42);
|
||||
if (true)
|
||||
wxLogError("hello error %d", 42);
|
||||
if (true)
|
||||
wxLogMessage("hello message %d", 42);
|
||||
if (true)
|
||||
wxLogVerbose("hello verbose %d", 42);
|
||||
if (true)
|
||||
wxLogWarning("hello warning %d", 42);
|
||||
if (true)
|
||||
wxLogFatalError("hello fatal %d", 42);
|
||||
if (true)
|
||||
wxLogSysError("hello syserror %d", 42);
|
||||
#if wxUSE_GUI
|
||||
if (true)
|
||||
wxLogStatus("hello status %d", 42);
|
||||
#endif
|
||||
if (true)
|
||||
wxLogDebug("hello debug %d", 42);
|
||||
}
|
||||
|
||||
#endif // wxUSE_LOG
|
||||
|
Loading…
Reference in New Issue
Block a user