UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AssertionMacros.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
6#include "HAL/Platform.h"
7#include "HAL/PlatformMisc.h"
9#include "Misc/VarArgs.h"
11#include "Templates/EnableIf.h"
15
16#include <atomic>
17
18#ifndef UE_DEBUG_SECTION
19#if (DO_CHECK || DO_GUARD_SLOW || DO_ENSURE) && !PLATFORM_CPU_ARM_FAMILY
20 // We'll put all assert implementation code into a separate section in the linked
21 // executable. This code should never execute so using a separate section keeps
22 // it well off the hot path and hopefully out of the instruction cache. It also
23 // facilitates reasoning about the makeup of a compiled/linked binary.
24 // Also see UE_COLD.
25 #define UE_DEBUG_SECTION PLATFORM_CODE_SECTION(".uedbg")
26#else
27 // On ARM we can't do this because the executable will require jumps larger
28 // than the branch instruction can handle. Clang will only generate
29 // the trampolines in the .text segment of the binary. If the uedbg segment
30 // is present it will generate code that it cannot link.
31 // Consider using UE_COLD instead.
32 #define UE_DEBUG_SECTION
33#endif // DO_CHECK || DO_GUARD_SLOW
34#endif
35
36namespace ELogVerbosity
37{
38 enum Type : uint8;
39}
44extern "C" CORE_API void PrintScriptCallstack();
45
46
52
53template <typename FuncType> class TFunction;
54
62
68struct FDebug
69{
71 static CORE_API void VARARGS AssertFailed(const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, const TCHAR* Format = TEXT(""), ...);
72 static CORE_API void AssertFailedV(const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, const TCHAR* Format, va_list Args);
73
75 static CORE_API void ProcessFatalError(void* ProgramCounter);
76
77 // returns true if an assert has occurred
78 static CORE_API bool HasAsserted();
79
80 // returns true if an ensure is currently in progress (e.g. the RenderThread is ensuring)
81 static CORE_API bool IsEnsuring();
82
83 // returns the number of times an ensure has failed in this instance.
85
87 static CORE_API void DumpStackTraceToLog(const ELogVerbosity::Type LogVerbosity);
88
90 static CORE_API void DumpStackTraceToLog(const TCHAR* Heading, const ELogVerbosity::Type LogVerbosity);
91
92#if DO_CHECK || DO_GUARD_SLOW || DO_ENSURE
93public:
94 static CORE_API bool VARARGS CheckVerifyFailedImpl(const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, void* ProgramCounter, const TCHAR* Format, ...);
95 static CORE_API bool VARARGS CheckVerifyFailedImpl2(const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, const TCHAR* Format, ...);
96private:
97 static CORE_API void VARARGS LogAssertFailedMessageImpl(const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, void* ProgramCounter, const TCHAR* Fmt, ...);
98 static CORE_API void LogAssertFailedMessageImplV(const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, void* ProgramCounter, const TCHAR* Fmt, va_list Args);
99 static CORE_API bool CheckVerifyFailedImpl2V(const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, const TCHAR* Format, va_list Args);
100
101public:
102// /**
103// * Called when a 'check/verify' assertion fails.
104// */
105// template <typename FmtType, typename... Types>
106// static void UE_DEBUG_SECTION CheckVerifyFailed(const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, void* ProgramCounter, const FmtType& Format, Types... Args);
107
119 static CORE_API void EnsureFailed( const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, void* ProgramCounter, const TCHAR* Msg );
120
121private:
122 static CORE_API bool VARARGS OptionallyLogFormattedEnsureMessageReturningFalseImpl(bool bLog, const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, void* ProgramCounter, const TCHAR* FormattedMsg, ...);
123 static CORE_API bool OptionallyLogFormattedEnsureMessageReturningFalseImpl(bool bLog, const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, void* ProgramCounter, const TCHAR* FormattedMsg, va_list Args);
124
125public:
141 template <typename FmtType, typename... Types>
142 static FORCEINLINE bool OptionallyLogFormattedEnsureMessageReturningFalse(bool bLog, const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, void* ProgramCounter, const FmtType& FormattedMsg, Types... Args)
143 {
144 static_assert(TIsArrayOrRefOfTypeByPredicate<FmtType, TIsCharEncodingCompatibleWithTCHAR>::Value, "Formatting string must be a TCHAR array.");
145 static_assert((TIsValidVariadicFunctionArg<Types>::Value && ...), "Invalid argument(s) passed to ensureMsgf");
146
147 return OptionallyLogFormattedEnsureMessageReturningFalseImpl(bLog, Expr, File, Line, ProgramCounter, (const TCHAR*)FormattedMsg, Args...);
148 }
149
150 static FORCEINLINE bool OptionallyLogFormattedEnsureMessageReturningFalse(bool bLog, const ANSICHAR* Expr, const ANSICHAR* File, int32 Line, void* ProgramCounter, const TCHAR* FormattedMsg, va_list Args)
151 {
153 }
154
155#endif // DO_CHECK || DO_GUARD_SLOW
156
168 static CORE_API void LogFormattedMessageWithCallstack(const FName& LogName, const ANSICHAR* File, int32 Line, const TCHAR* Heading, const TCHAR* Message, ELogVerbosity::Type Verbosity);
169};
170
171/*----------------------------------------------------------------------------
172 Check, verify, etc macros
173----------------------------------------------------------------------------*/
174
175//
176// "check" expressions are only evaluated if enabled.
177// "verify" expressions are always evaluated, but only cause an error if enabled.
178//
179
180//#if DO_CHECK || DO_GUARD_SLOW || DO_ENSURE
181// template <typename FmtType, typename... Types>
182// void FORCENOINLINE UE_DEBUG_SECTION FDebug::CheckVerifyFailed(
183// const ANSICHAR* Expr,
184// const ANSICHAR* File,
185// int32 Line,
186// void* ProgramCounter,
187// const FmtType& Format,
188// Types... Args)
189// {
190// static_assert(TIsArrayOrRefOfTypeByPredicate<FmtType, TIsCharEncodingCompatibleWithTCHAR>::Value, "Formatting string must be a TCHAR array.");
191// static_assert(TIsValidVariadicFunctionArg<Types>::Value && ...), "Invalid argument(s) passed to CheckVerifyFailed()");
192// return CheckVerifyFailedImpl(Expr, File, Line, ProgramCounter, (const TCHAR*)Format, Args...);
193// }
194//#endif
195
196// MSVC (v19.00.24215.1 at time of writing) ignores no-inline attributes on
197// lambdas. This can be worked around by calling the lambda from inside this
198// templated (and correctly non-inlined) function.
199template <typename RetType=void, class InnerType, typename... ArgTypes>
201{
202 return Inner(Args...);
203}
204
205#if !UE_BUILD_SHIPPING
206#define UE_DEBUG_BREAK_AND_PROMPT_FOR_REMOTE() \
207 if (!FPlatformMisc::IsDebuggerPresent()) { FPlatformMisc::PromptForRemoteDebugging(false); } UE_DEBUG_BREAK();
208#else
209 #define UE_DEBUG_BREAK_AND_PROMPT_FOR_REMOTE()
210#endif // !UE_BUILD_SHIPPING
211
212#define _DebugBreakAndPromptForRemote() \
213 UE_DEPRECATED_MACRO(5.1, "Use UE_DEBUG_BREAK_AND_PROMPT_FOR_REMOTE.")
214
215#if !UE_BUILD_SHIPPING
216 extern CORE_API bool GIgnoreDebugger;
217 // This is named with PLATFORM_ prefix because UE_DEBUG_BREAK* are conditional on a debugger being detected, and PLATFORM_BREAK isn't
218 #define PLATFORM_BREAK_IF_DESIRED() if (LIKELY(!GIgnoreDebugger)) { PLATFORM_BREAK(); }
219#else
220 #define PLATFORM_BREAK_IF_DESIRED() PLATFORM_BREAK();
221#endif // !UE_BUILD_SHIPPING
222
223
224#if DO_CHECK
225#ifndef checkCode
226 #define checkCode( Code ) do { Code; } while ( false );
227#endif
228#ifndef verify
229 #define verify(expr) UE_CHECK_IMPL(expr)
230#endif
231#ifndef check
232 #define check(expr) UE_CHECK_IMPL(expr)
233#endif
234
235 // Technically we could use just the _F version (lambda-based) for asserts
236 // both with and without formatted messages. However MSVC emits extra
237 // unnecessary instructions when using a lambda; hence the Exec() impl.
238 #define UE_CHECK_IMPL(expr) \
239 { \
240 if(UNLIKELY(!(expr))) \
241 { \
242 if (FDebug::CheckVerifyFailedImpl2(#expr, __FILE__, __LINE__, TEXT(""))) \
243 { \
244 PLATFORM_BREAK(); \
245 } \
246 CA_ASSUME(false); \
247 } \
248 }
249
254#ifndef verifyf
255 #define verifyf(expr, format, ...) UE_CHECK_F_IMPL(expr, format, ##__VA_ARGS__)
256#endif
257#ifndef checkf
258 #define checkf(expr, format, ...) UE_CHECK_F_IMPL(expr, format, ##__VA_ARGS__)
259#endif
260
261 #define UE_CHECK_F_IMPL(expr, format, ...) \
262 { \
263 if(UNLIKELY(!(expr))) \
264 { \
265 UE_VALIDATE_FORMAT_STRING(format, ##__VA_ARGS__); \
266 if (FDebug::CheckVerifyFailedImpl2(#expr, __FILE__, __LINE__, format, ##__VA_ARGS__)) \
267 { \
268 PLATFORM_BREAK(); \
269 } \
270 CA_ASSUME(false); \
271 } \
272 }
273
277#ifndef checkNoEntry
278 #define checkNoEntry() check(!"Enclosing block should never be called")
279#endif
280
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; }
288#endif
289
291 {
292 public:
293 FRecursionScopeMarker(uint16 &InCounter) : Counter( InCounter ) { ++Counter; }
294 ~FRecursionScopeMarker() { --Counter; }
295 private:
296 uint16& Counter;
297 };
298
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__ )
306#endif
307
308#ifndef unimplemented
309 #define unimplemented() check(!"Unimplemented function called")
310#endif
311
312#else // DO_CHECK
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); }
322#endif // DO_CHECK
323
324//
325// Check for development only.
326//
327#if DO_GUARD_SLOW
328 #define checkSlow(expr) check(expr)
329 #define checkfSlow(expr, format, ...) checkf(expr, format, ##__VA_ARGS__)
330 #define verifySlow(expr) check(expr)
331#else
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); } }
335#endif
336
363#if DO_ENSURE && !USING_CODE_ANALYSIS // The Visual Studio 2013 analyzer doesn't understand these complex conditionals
364 namespace UE::Assert::Private
365 {
366
369 {
370 const TCHAR* Format = nullptr;
371 const ANSICHAR* Expression = nullptr;
372 const ANSICHAR* File = nullptr;
373 int32 Line = 0;
374 bool bAlways = false;
375
376 // Workaround for https://developercommunity.visualstudio.com/t/Incorrect-warning-C4700-with-unrelated-s/10285950
377 constexpr FStaticEnsureRecord(
378 const TCHAR* InFormat,
379 const ANSICHAR* InExpression,
380 const ANSICHAR* InFile,
382 bool bInAlways)
384 , Expression(InExpression)
385 , File(InFile)
386 , Line(InLine)
388 {
389 }
390 };
391
392 CORE_API bool UE_COLD UE_DEBUG_SECTION VARARGS CheckEnsureFailed(bool bAlways, const std::atomic<uint8>& bExecuted);
394 CORE_API bool UE_COLD UE_DEBUG_SECTION ExecCheckImplInternal(std::atomic<uint8>& bExecuted, bool bAlways, const ANSICHAR* File, int32 Line, const ANSICHAR* Expr);
395
396 } // UE::Assert::Private
397
398 template <uint64 Uid>
399 std::atomic<uint8> bGEnsureHasExecuted = false;
400
401 UE_NODEBUG constexpr uint64 FileLineHashForEnsure(const char* Filename, uint32 Line)
402 {
403 // Based on djb2
404 uint32 Result = 5381;
405 while (char Ch = *Filename++)
406 {
407 Result = ((Result << 5) + Result) + Ch;
408 }
409 return ((uint64)Result << 32) | (uint64)Line;
410 }
411
412// UE_BREAK_AND_RETURN_FALSE() - an expression which breaks into the debugger and returns false.
413#if PLATFORM_BREAK_IS_EXPRESSION
414 // If PLATFORM_BREAK is also an expression, it can be used directly.
415 #define UE_BREAK_AND_RETURN_FALSE() (PLATFORM_BREAK(), false)
416#elif defined(__clang__) || defined(__GNUC__)
417 // Clang and GCC support 'statement expressions' which allows the expansion of statements in an
418 // expression context.
419 #define UE_BREAK_AND_RETURN_FALSE() ({ PLATFORM_BREAK(); false; })
420#else
421 // Fallback to using a lambda if there is no other choice, which generates more debug information.
422 #define UE_BREAK_AND_RETURN_FALSE() [](){ PLATFORM_BREAK(); return false; }()
423#endif
424
425 #define UE_ENSURE_IMPL(Always, InExpression) \
426 ( \
427 LIKELY(!!(InExpression)) || \
428 ( \
429 ::UE::Assert::Private::ExecCheckImplInternal( \
430 ::bGEnsureHasExecuted<FileLineHashForEnsure(__FILE__, __LINE__)>, \
431 Always, \
432 __FILE__, \
433 __LINE__, \
434 #InExpression \
435 ) && \
436 UE_BREAK_AND_RETURN_FALSE() \
437 ) \
438 )
439
440 #define UE_ENSURE_IMPL2(Always, InExpression, InFormat, ...) \
441 ( \
442 LIKELY(!!(InExpression)) || \
443 [&]() UE_COLD UE_DEBUG_SECTION \
444 { \
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__)) \
449 { \
450 PLATFORM_BREAK(); \
451 } \
452 return false; \
453 }() \
454 )
455
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__)
460
461
462#else // DO_ENSURE && !USING_CODE_ANALYSIS
463
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)))
468
469#endif // DO_ENSURE && !USING_CODE_ANALYSIS
470
471namespace UEAsserts_Private
472{
473 // A junk function to allow us to use sizeof on a member variable which is potentially a bitfield
474 template <typename T>
476 template <typename T>
477 bool GetMemberNameCheckedJunk(const volatile T&);
478 template <typename R, typename ...Args>
479 bool GetMemberNameCheckedJunk(R(*)(Args...));
480}
481
482// Returns FName(TEXTVIEW("EnumeratorName")), while statically verifying that the enumerator exists in the enum
483#define GET_ENUMERATOR_NAME_CHECKED(EnumName, EnumeratorName) \
484 (FName(GET_ENUMERATOR_NAME_STRING_VIEW_CHECKED(EnumName, EnumeratorName)))
485
486#define GET_ENUMERATOR_NAME_STRING_CHECKED(EnumName, EnumeratorName) \
487 ((void)sizeof(UEAsserts_Private::GetMemberNameCheckedJunk(EnumName::EnumeratorName)), TEXT(#EnumeratorName))
488
489#define GET_ENUMERATOR_NAME_STRING_VIEW_CHECKED(EnumName, EnumeratorName) \
490 ((void)sizeof(UEAsserts_Private::GetMemberNameCheckedJunk(EnumName::EnumeratorName)), TEXTVIEW(#EnumeratorName))
491
492// Returns FName(TEXTVIEW("MemberName")), while statically verifying that the member exists in ClassName
493#define GET_MEMBER_NAME_CHECKED(ClassName, MemberName) \
494 (FName(GET_MEMBER_NAME_STRING_VIEW_CHECKED(ClassName, MemberName)))
495
496#define GET_MEMBER_NAME_STRING_CHECKED(ClassName, MemberName) \
497 ((void)sizeof(UEAsserts_Private::GetMemberNameCheckedJunk(((ClassName*)0)->MemberName)), TEXT(#MemberName))
498
499#define GET_MEMBER_NAME_STRING_VIEW_CHECKED(ClassName, MemberName) \
500 ((void)sizeof(UEAsserts_Private::GetMemberNameCheckedJunk(((ClassName*)0)->MemberName)), TEXTVIEW(#MemberName))
501
502// Returns FName(TEXTVIEW("FunctionName")), while statically verifying that the function exists in ClassName
503#define GET_FUNCTION_NAME_CHECKED(ClassName, FunctionName) \
504 (FName(GET_FUNCTION_NAME_STRING_VIEW_CHECKED(ClassName, FunctionName)))
505
506#define GET_FUNCTION_NAME_STRING_CHECKED(ClassName, FunctionName) \
507 ((void)sizeof(&ClassName::FunctionName), TEXT(#FunctionName))
508
509#define GET_FUNCTION_NAME_STRING_VIEW_CHECKED(ClassName, FunctionName) \
510 ((void)sizeof(&ClassName::FunctionName), TEXTVIEW(#FunctionName))
511
512// Returns FName(TEXT("FunctionName")), while statically verifying that the function exists in ClassName
513// Handles overloaded functions by specifying the argument of the overload to use
514#define GET_FUNCTION_NAME_CHECKED_OneParam(ClassName, FunctionName, ArgType) \
515 (FName(GET_FUNCTION_NAME_STRING_CHECKED_OneParam(ClassName, FunctionName, ArgType)))
516
517#define GET_FUNCTION_NAME_CHECKED_TwoParams(ClassName, FunctionName, ArgType1, ArgType2) \
518 (FName(GET_FUNCTION_NAME_STRING_CHECKED_TwoParams(ClassName, FunctionName, ArgType1, ArgType2)))
519
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)))
522
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)))
525
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))
528
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))
531
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))
534
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))
537
538/*----------------------------------------------------------------------------
539 Low level error macros
540----------------------------------------------------------------------------*/
541
543{
545} // UE::Assert::Private
546
547template <typename... ArgTypes>
548UE_DEPRECATED(5.7, "Use LowLevelFatalError.")
553
554#define LowLevelFatalError(Format, ...) \
555 { \
556 UE_VALIDATE_FORMAT_STRING(Format, ##__VA_ARGS__); \
557 ::UE::Assert::Private::ProcessLowLevelFatalError(__FILE__, __LINE__, Format, ##__VA_ARGS__); \
558 }
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define VARARGS
Definition AndroidPlatform.h:134
#define FORCEINLINE
Definition AndroidPlatform.h:140
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
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
#define UE_NODEBUG
Definition Platform.h:817
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_COLD
Definition Platform.h:976
FPlatformTypes::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
#define UE_REWRITE
Definition Platform.h:747
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
const bool
Definition NetworkReplayStreaming.h:178
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
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