18#ifndef UE_DEBUG_SECTION
19#if (DO_CHECK || DO_GUARD_SLOW || DO_ENSURE) && !PLATFORM_CPU_ARM_FAMILY
25 #define UE_DEBUG_SECTION PLATFORM_CODE_SECTION(".uedbg")
32 #define UE_DEBUG_SECTION
53template <
typename FuncType>
class TFunction;
92#if DO_CHECK || DO_GUARD_SLOW || DO_ENSURE
141 template <
typename FmtType,
typename... Types>
202 return Inner(Args...);
205#if !UE_BUILD_SHIPPING
206#define UE_DEBUG_BREAK_AND_PROMPT_FOR_REMOTE() \
207 if (!FPlatformMisc::IsDebuggerPresent()) { FPlatformMisc::PromptForRemoteDebugging(false); } UE_DEBUG_BREAK();
209 #define UE_DEBUG_BREAK_AND_PROMPT_FOR_REMOTE()
212#define _DebugBreakAndPromptForRemote() \
213 UE_DEPRECATED_MACRO(5.1, "Use UE_DEBUG_BREAK_AND_PROMPT_FOR_REMOTE.")
215#if !UE_BUILD_SHIPPING
218 #define PLATFORM_BREAK_IF_DESIRED() if (LIKELY(!GIgnoreDebugger)) { PLATFORM_BREAK(); }
220 #define PLATFORM_BREAK_IF_DESIRED() PLATFORM_BREAK();
226 #define checkCode( Code ) do { Code; } while ( false );
229 #define verify(expr) UE_CHECK_IMPL(expr)
232 #define check(expr) UE_CHECK_IMPL(expr)
238 #define UE_CHECK_IMPL(expr) \
240 if(UNLIKELY(!(expr))) \
242 if (FDebug::CheckVerifyFailedImpl2(#expr, __FILE__, __LINE__, TEXT(""))) \
255 #define verifyf(expr, format, ...) UE_CHECK_F_IMPL(expr, format, ##__VA_ARGS__)
258 #define checkf(expr, format, ...) UE_CHECK_F_IMPL(expr, format, ##__VA_ARGS__)
261 #define UE_CHECK_F_IMPL(expr, format, ...) \
263 if(UNLIKELY(!(expr))) \
265 UE_VALIDATE_FORMAT_STRING(format, ##__VA_ARGS__); \
266 if (FDebug::CheckVerifyFailedImpl2(#expr, __FILE__, __LINE__, format, ##__VA_ARGS__)) \
278 #define checkNoEntry() check(!"Enclosing block should never be called")
284#ifndef checkNoReentry
285 #define checkNoReentry() { static bool s_beenHere##__LINE__ = false; \
286 check( !"Enclosing block was called more than once" || !s_beenHere##__LINE__ ); \
287 s_beenHere##__LINE__ = true; }
302#ifndef checkNoRecursion
303 #define checkNoRecursion() static uint16 RecursionCounter##__LINE__ = 0; \
304 check( !"Enclosing block was entered recursively" || RecursionCounter##__LINE__ == 0 ); \
305 const FRecursionScopeMarker ScopeMarker##__LINE__( RecursionCounter##__LINE__ )
309 #define unimplemented() check(!"Unimplemented function called")
313 #define checkCode(...)
314 #define check(expr) { CA_ASSUME(expr); }
315 #define checkf(expr, format, ...) { CA_ASSUME(expr); }
316 #define checkNoEntry()
317 #define checkNoReentry()
318 #define checkNoRecursion()
319 #define verify(expr) { if(UNLIKELY(!(expr))){ CA_ASSUME(false); } }
320 #define verifyf(expr, format, ...) { if(UNLIKELY(!(expr))){ CA_ASSUME(false); } }
321 #define unimplemented() { CA_ASSUME(false); }
328 #define checkSlow(expr) check(expr)
329 #define checkfSlow(expr, format, ...) checkf(expr, format, ##__VA_ARGS__)
330 #define verifySlow(expr) check(expr)
332 #define checkSlow(expr) { CA_ASSUME(expr); }
333 #define checkfSlow(expr, format, ...) { CA_ASSUME(expr); }
334 #define verifySlow(expr) { if(UNLIKELY(!(expr))) { CA_ASSUME(false); } }
363#if DO_ENSURE && !USING_CODE_ANALYSIS
371 const ANSICHAR* Expression =
nullptr;
398 template <u
int64 U
id>
405 while (
char Ch = *Filename++)
413#if PLATFORM_BREAK_IS_EXPRESSION
415 #define UE_BREAK_AND_RETURN_FALSE() (PLATFORM_BREAK(), false)
416#elif defined(__clang__) || defined(__GNUC__)
419 #define UE_BREAK_AND_RETURN_FALSE() ({ PLATFORM_BREAK(); false; })
422 #define UE_BREAK_AND_RETURN_FALSE() [](){ PLATFORM_BREAK(); return false; }()
425 #define UE_ENSURE_IMPL(Always, InExpression) \
427 LIKELY(!!(InExpression)) || \
429 ::UE::Assert::Private::ExecCheckImplInternal( \
430 ::bGEnsureHasExecuted<FileLineHashForEnsure(__FILE__, __LINE__)>, \
436 UE_BREAK_AND_RETURN_FALSE() \
440 #define UE_ENSURE_IMPL2(Always, InExpression, InFormat, ...) \
442 LIKELY(!!(InExpression)) || \
443 [&]() UE_COLD UE_DEBUG_SECTION \
445 UE_VALIDATE_FORMAT_STRING(InFormat, ##__VA_ARGS__); \
446 std::atomic<uint8>& bEnsureHasExecuted = ::bGEnsureHasExecuted < FileLineHashForEnsure(__FILE__, __LINE__) >; \
447 static constexpr ::UE::Assert::Private::FStaticEnsureRecord ENSURE_Static(InFormat, #InExpression, __builtin_FILE(), __builtin_LINE(), Always); \
448 if (::UE::Assert::Private::CheckEnsureFailed(Always, bEnsureHasExecuted) && ::UE::Assert::Private::EnsureFailed(bEnsureHasExecuted, &ENSURE_Static, ##__VA_ARGS__)) \
456 #define ensure( InExpression ) UE_ENSURE_IMPL (false, InExpression)
457 #define ensureMsgf( InExpression, InFormat, ... ) UE_ENSURE_IMPL2(false, InExpression, InFormat, ##__VA_ARGS__)
458 #define ensureAlways( InExpression ) UE_ENSURE_IMPL (true, InExpression)
459 #define ensureAlwaysMsgf( InExpression, InFormat, ... ) UE_ENSURE_IMPL2(true, InExpression, InFormat, ##__VA_ARGS__)
464 #define ensure( InExpression ) (LIKELY(!!(InExpression)))
465 #define ensureMsgf( InExpression, InFormat, ... ) (LIKELY(!!(InExpression)))
466 #define ensureAlways( InExpression ) (LIKELY(!!(InExpression)))
467#define ensureAlwaysMsgf( InExpression, InFormat, ... ) (LIKELY(!!(InExpression)))
474 template <
typename T>
476 template <
typename T>
478 template <
typename R,
typename ...Args>
483#define GET_ENUMERATOR_NAME_CHECKED(EnumName, EnumeratorName) \
484 (FName(GET_ENUMERATOR_NAME_STRING_VIEW_CHECKED(EnumName, EnumeratorName)))
486#define GET_ENUMERATOR_NAME_STRING_CHECKED(EnumName, EnumeratorName) \
487 ((void)sizeof(UEAsserts_Private::GetMemberNameCheckedJunk(EnumName::EnumeratorName)), TEXT(#EnumeratorName))
489#define GET_ENUMERATOR_NAME_STRING_VIEW_CHECKED(EnumName, EnumeratorName) \
490 ((void)sizeof(UEAsserts_Private::GetMemberNameCheckedJunk(EnumName::EnumeratorName)), TEXTVIEW(#EnumeratorName))
493#define GET_MEMBER_NAME_CHECKED(ClassName, MemberName) \
494 (FName(GET_MEMBER_NAME_STRING_VIEW_CHECKED(ClassName, MemberName)))
496#define GET_MEMBER_NAME_STRING_CHECKED(ClassName, MemberName) \
497 ((void)sizeof(UEAsserts_Private::GetMemberNameCheckedJunk(((ClassName*)0)->MemberName)), TEXT(#MemberName))
499#define GET_MEMBER_NAME_STRING_VIEW_CHECKED(ClassName, MemberName) \
500 ((void)sizeof(UEAsserts_Private::GetMemberNameCheckedJunk(((ClassName*)0)->MemberName)), TEXTVIEW(#MemberName))
503#define GET_FUNCTION_NAME_CHECKED(ClassName, FunctionName) \
504 (FName(GET_FUNCTION_NAME_STRING_VIEW_CHECKED(ClassName, FunctionName)))
506#define GET_FUNCTION_NAME_STRING_CHECKED(ClassName, FunctionName) \
507 ((void)sizeof(&ClassName::FunctionName), TEXT(#FunctionName))
509#define GET_FUNCTION_NAME_STRING_VIEW_CHECKED(ClassName, FunctionName) \
510 ((void)sizeof(&ClassName::FunctionName), TEXTVIEW(#FunctionName))
514#define GET_FUNCTION_NAME_CHECKED_OneParam(ClassName, FunctionName, ArgType) \
515 (FName(GET_FUNCTION_NAME_STRING_CHECKED_OneParam(ClassName, FunctionName, ArgType)))
517#define GET_FUNCTION_NAME_CHECKED_TwoParams(ClassName, FunctionName, ArgType1, ArgType2) \
518 (FName(GET_FUNCTION_NAME_STRING_CHECKED_TwoParams(ClassName, FunctionName, ArgType1, ArgType2)))
520#define GET_FUNCTION_NAME_CHECKED_ThreeParams(ClassName, FunctionName, ArgType1, ArgType2, ArgType3) \
521 (FName(GET_FUNCTION_NAME_STRING_CHECKED_ThreeParams(ClassName, FunctionName, ArgType1, ArgType2, ArgType3)))
523#define GET_FUNCTION_NAME_CHECKED_FourParams(ClassName, FunctionName, ArgType1, ArgType2, ArgType3, ArgType4) \
524 (FName(GET_FUNCTION_NAME_STRING_CHECKED_FourParams(ClassName, FunctionName, ArgType1, ArgType2, ArgType3, ArgType4)))
526#define GET_FUNCTION_NAME_STRING_CHECKED_OneParam(ClassName, FunctionName, ArgType) \
527 ((void)sizeof((std::declval<ClassName&>().FunctionName(std::declval<PREPROCESSOR_REMOVE_OPTIONAL_PARENS(ArgType)>()), (int)0)), TEXT(#FunctionName))
529#define GET_FUNCTION_NAME_STRING_CHECKED_TwoParams(ClassName, FunctionName, ArgType1, ArgType2) \
530 ((void)sizeof((std::declval<ClassName&>().FunctionName(std::declval<PREPROCESSOR_REMOVE_OPTIONAL_PARENS(ArgType1)>(), std::declval<PREPROCESSOR_REMOVE_OPTIONAL_PARENS(ArgType2)>()), (int)0)), TEXT(#FunctionName))
532#define GET_FUNCTION_NAME_STRING_CHECKED_ThreeParams(ClassName, FunctionName, ArgType1, ArgType2, ArgType3) \
533 ((void)sizeof((std::declval<ClassName&>().FunctionName(std::declval<PREPROCESSOR_REMOVE_OPTIONAL_PARENS(ArgType1)>(), std::declval<PREPROCESSOR_REMOVE_OPTIONAL_PARENS(ArgType2)>(), std::declval<PREPROCESSOR_REMOVE_OPTIONAL_PARENS(ArgType3)>()), (int)0)), TEXT(#FunctionName))
535#define GET_FUNCTION_NAME_STRING_CHECKED_FourParams(ClassName, FunctionName, ArgType1, ArgType2, ArgType3, ArgType4) \
536 ((void)sizeof((std::declval<ClassName&>().FunctionName(std::declval<PREPROCESSOR_REMOVE_OPTIONAL_PARENS(ArgType1)>(), std::declval<PREPROCESSOR_REMOVE_OPTIONAL_PARENS(ArgType2)>(), std::declval<PREPROCESSOR_REMOVE_OPTIONAL_PARENS(ArgType3)>(), std::declval<PREPROCESSOR_REMOVE_OPTIONAL_PARENS(ArgType4)>()), (int)0)), TEXT(#FunctionName))
554#define LowLevelFatalError(Format, ...) \
556 UE_VALIDATE_FORMAT_STRING(Format, ##__VA_ARGS__); \
557 ::UE::Assert::Private::ProcessLowLevelFatalError(__FILE__, __LINE__, Format, ##__VA_ARGS__); \
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
CORE_API bool GIgnoreDebugger
Definition CoreGlobals.cpp:487
CORE_API TFunction< bool(const FEnsureHandlerArgs &Args)> GetEnsureHandler()
#define UE_DEBUG_SECTION
Definition AssertionMacros.h:32
RetType UE_COLD UE_DEBUG_SECTION DispatchCheckVerify(InnerType &&Inner, ArgTypes const &... Args)
Definition AssertionMacros.h:200
CORE_API void PrintScriptCallstack()
Definition AssertionMacros.cpp:152
CORE_API TFunction< bool(const FEnsureHandlerArgs &Args)> SetEnsureHandler(TFunction< bool(const FEnsureHandlerArgs &Args)> EnsureHandler)
UE_REWRITE void LowLevelFatalErrorHandler(const ANSICHAR *File, int32 Line, const TCHAR *Format=TEXT(""), ArgTypes... Args)
Definition AssertionMacros.h:549
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
const bool
Definition NetworkReplayStreaming.h:178
Definition NameTypes.h:617
Definition AndroidPlatformMisc.h:14
Definition GenericPlatformFile.h:25
Type
Definition LogVerbosity.h:17
Definition LogMacros.h:234
bool GetMemberNameCheckedJunk(const T &)
Definition AssertionMacros.h:543
CORE_API void UE_COLD UE_DEBUG_SECTION VARARGS ProcessLowLevelFatalError(const ANSICHAR *File, int32 Line, const TCHAR *Format,...)
Definition AssertionMacros.cpp:805
UE_STRING_CLASS Result(Forward< LhsType >(Lhs), RhsLen)
Definition String.cpp.inl:732
Definition AssertionMacros.h:69
static CORE_API void AssertFailedV(const ANSICHAR *Expr, const ANSICHAR *File, int32 Line, const TCHAR *Format, va_list Args)
Definition AssertionMacros.cpp:757
static CORE_API void VARARGS AssertFailed(const ANSICHAR *Expr, const ANSICHAR *File, int32 Line, const TCHAR *Format=TEXT(""),...)
Definition AssertionMacros.cpp:749
static CORE_API SIZE_T GetNumEnsureFailures()
Definition AssertionMacros.cpp:332
static CORE_API bool HasAsserted()
track thread asserts
Definition AssertionMacros.cpp:322
static CORE_API void ProcessFatalError(void *ProgramCounter)
Definition AssertionMacros.cpp:762
static CORE_API bool IsEnsuring()
Definition AssertionMacros.cpp:328
static CORE_API void DumpStackTraceToLog(const ELogVerbosity::Type LogVerbosity)
Definition AssertionMacros.cpp:817
static CORE_API void LogFormattedMessageWithCallstack(const FName &LogName, const ANSICHAR *File, int32 Line, const TCHAR *Heading, const TCHAR *Message, ELogVerbosity::Type Verbosity)
Definition AssertionMacros.cpp:337
Definition AssertionMacros.h:48
const TCHAR * Message
Definition AssertionMacros.h:50
const ANSICHAR * Expression
Definition AssertionMacros.h:49
Definition IsArrayOrRefOfTypeByPredicate.h:13
Definition IsValidVariadicFunctionArg.h:14