From e2d5d7e55f5e19fdad40dacd3cfd787c8d38abab Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 29 Oct 2025 06:57:20 +0000 Subject: [PATCH] asserts with line info :) Signed-off-by: lizzie --- .../dynarmic/backend/arm64/address_space.cpp | 2 +- .../src/dynarmic/backend/arm64/emit_arm64.cpp | 6 ++-- .../backend/arm64/emit_arm64_cryptography.cpp | 2 +- .../arm64/emit_arm64_floating_point.cpp | 36 +++++++++---------- .../backend/arm64/emit_arm64_memory.cpp | 8 ++--- .../backend/arm64/emit_arm64_saturation.cpp | 36 +++++++++---------- .../backend/arm64/emit_arm64_vector.cpp | 20 +++++------ .../emit_arm64_vector_floating_point.cpp | 22 ++++++------ .../backend/exception_handler_posix.cpp | 2 +- .../backend/riscv64/a32_address_space.cpp | 2 +- .../backend/riscv64/a32_interface.cpp | 2 +- .../dynarmic/backend/x64/emit_x64_memory.h | 8 ++--- src/dynarmic/src/dynarmic/common/assert.h | 4 +-- 13 files changed, 74 insertions(+), 76 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp index 2975702040..6aa5fe0820 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp @@ -258,7 +258,7 @@ void AddressSpace::Link(EmittedBlockInfo& block_info) { c.BL(prelude_info.get_ticks_remaining); break; default: - ASSERT(false && "Invalid relocation target"); + UNREACHABLE(); } } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64.cpp index fb48e73bc6..0a65cd5aa8 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64.cpp @@ -112,8 +112,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& break; } default: - ASSERT(false && "Invalid type for GetNZCVFromOp"); - break; + UNREACHABLE(); } } @@ -143,8 +142,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& c break; } default: - ASSERT(false && "Invalid type for GetNZFromOp"); - break; + UNREACHABLE(); } } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_cryptography.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_cryptography.cpp index 4638d4ceaf..5b6ee36d0c 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_cryptography.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_cryptography.cpp @@ -117,7 +117,7 @@ void EmitIR(oaknut::CodeGenerator& code, E (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_floating_point.cpp index 98c345291b..560deb929c 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_floating_point.cpp @@ -123,7 +123,7 @@ static void EmitToFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* code.FCVTAS(Rto, Vfrom); break; case FP::RoundingMode::ToOdd: - ASSERT(false && "Unimplemented"); + UNREACHABLE(); break; default: ASSERT(false && "Invalid RoundingMode"); @@ -147,7 +147,7 @@ static void EmitToFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* code.FCVTAU(Rto, Vfrom); break; case FP::RoundingMode::ToOdd: - ASSERT(false && "Unimplemented"); + UNREACHABLE(); break; default: ASSERT(false && "Invalid RoundingMode"); @@ -188,7 +188,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& ctx, (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -315,7 +315,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& ct (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -333,7 +333,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& ct (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -361,7 +361,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& ctx, (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -379,7 +379,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitCont (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -397,7 +397,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitCont (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -415,7 +415,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitCon (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -433,7 +433,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -515,7 +515,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitCont (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -533,7 +533,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitCon (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -647,7 +647,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitConte (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -655,7 +655,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitConte (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -663,7 +663,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitConte (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -671,7 +671,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitConte (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -679,7 +679,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitConte (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -687,7 +687,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitConte (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp index 5c8bec863d..773bf054a2 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp @@ -315,7 +315,7 @@ CodePtr EmitMemoryLdr(oaknut::CodeGenerator& code, int value_idx, oaknut::XReg X code.DMB(oaknut::BarrierOp::ISH); break; default: - ASSERT(false && "Invalid bitsize"); + UNREACHABLE(); } } else { fastmem_location = code.xptr(); @@ -337,7 +337,7 @@ CodePtr EmitMemoryLdr(oaknut::CodeGenerator& code, int value_idx, oaknut::XReg X code.LDR(oaknut::QReg{value_idx}, Xbase, Roffset, index_ext); break; default: - ASSERT(false && "Invalid bitsize"); + UNREACHABLE(); } } @@ -376,7 +376,7 @@ CodePtr EmitMemoryStr(oaknut::CodeGenerator& code, int value_idx, oaknut::XReg X code.DMB(oaknut::BarrierOp::ISH); break; default: - ASSERT(false && "Invalid bitsize"); + UNREACHABLE(); } } else { fastmem_location = code.xptr(); @@ -398,7 +398,7 @@ CodePtr EmitMemoryStr(oaknut::CodeGenerator& code, int value_idx, oaknut::XReg X code.STR(oaknut::QReg{value_idx}, Xbase, Roffset, index_ext); break; default: - ASSERT(false && "Invalid bitsize"); + UNREACHABLE(); } } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_saturation.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_saturation.cpp index 50aaa30324..b0d0a86586 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_saturation.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_saturation.cpp @@ -131,7 +131,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitCo (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -139,7 +139,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitC (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -147,7 +147,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitC (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -155,7 +155,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitC (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -163,7 +163,7 @@ void EmitIR(oaknut::Cod (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -171,7 +171,7 @@ void EmitIR(oaknut::Cod (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -179,7 +179,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitCo (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -187,7 +187,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitC (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -195,7 +195,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitC (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -203,7 +203,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitC (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -211,7 +211,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emit (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -219,7 +219,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emi (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -227,7 +227,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emi (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -235,7 +235,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emi (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -243,7 +243,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emit (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -251,7 +251,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emi (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -259,7 +259,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emi (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -267,7 +267,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emi (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } } // namespace Dynarmic::Backend::Arm64 diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector.cpp index 95f4a3a72f..6668b2b866 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector.cpp @@ -638,7 +638,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -867,7 +867,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -890,7 +890,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -913,7 +913,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -936,7 +936,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -1383,7 +1383,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitCon (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -1406,7 +1406,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emi (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -1414,7 +1414,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emi (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -1778,7 +1778,7 @@ void EmitIR(oaknut::CodeGenerator& code, E (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -1786,7 +1786,7 @@ void EmitIR(oaknut::CodeGenerator& code, E (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp index 2ca3b74ef6..2ac54150f3 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp @@ -227,7 +227,7 @@ void EmitToFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) code.FCVTAS(Vto, Vfrom); break; case FP::RoundingMode::ToOdd: - ASSERT(false && "Unimplemented"); + UNREACHABLE(); break; default: ASSERT(false && "Invalid RoundingMode"); @@ -251,7 +251,7 @@ void EmitToFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) code.FCVTAU(Vto, Vfrom); break; case FP::RoundingMode::ToOdd: - ASSERT(false && "Unimplemented"); + UNREACHABLE(); break; default: ASSERT(false && "Invalid RoundingMode"); @@ -340,7 +340,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContex (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -465,7 +465,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitConte (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -493,7 +493,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -538,7 +538,7 @@ void EmitIR(oaknut::CodeGenerator& code, Em (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -556,7 +556,7 @@ void EmitIR(oaknut::CodeGenerator& code, E (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -699,7 +699,7 @@ void EmitIR(oaknut::CodeGenerator& code, Em (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -717,7 +717,7 @@ void EmitIR(oaknut::CodeGenerator& code, E (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -772,7 +772,7 @@ void EmitIR(oaknut::CodeGenerator& code, Em (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> @@ -790,7 +790,7 @@ void EmitIR(oaknut::CodeGenerator& code, (void)code; (void)ctx; (void)inst; - ASSERT(false && "Unimplemented"); + UNREACHABLE(); } template<> diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp index 3882404aae..b1fb3b784f 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp @@ -139,7 +139,7 @@ void SigHandler::SigAction(int sig, siginfo_t* info, void* raw_context) { } fmt::print(stderr, "Unhandled {} at pc {:#018x}\n", sig == SIGSEGV ? "SIGSEGV" : "SIGBUS", CTX_PC); #elif defined(ARCHITECTURE_riscv64) - ASSERT(false && "Unimplemented"); + UNREACHABLE(); #else # error "Invalid architecture" #endif diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp index 3d763e1f46..8cde0049d8 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp @@ -128,7 +128,7 @@ void A32AddressSpace::Link(EmittedBlockInfo& block_info) { break; } default: - ASSERT(false && "Invalid relocation target"); + UNREACHABLE(); } } } diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp index 19a84c1729..c0f65a49ed 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp @@ -121,7 +121,7 @@ struct Jit::Impl final { private: void RequestCacheInvalidation() { - // ASSERT(false && "Unimplemented"); + // UNREACHABLE(); invalidate_entire_cache = false; invalid_cache_ranges.clear(); diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h index 3c3576c0d1..93fa592a26 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h @@ -243,7 +243,7 @@ const void* EmitReadMemoryMov(BlockOfCode& code, int value_idx, const Xbyak::Reg } break; default: - ASSERT(false && "Invalid bitsize"); + UNREACHABLE(); } return fastmem_location; } else { @@ -265,7 +265,7 @@ const void* EmitReadMemoryMov(BlockOfCode& code, int value_idx, const Xbyak::Reg code.movups(Xbyak::Xmm(value_idx), xword[addr]); break; default: - ASSERT(false && "Invalid bitsize"); + UNREACHABLE(); } return fastmem_location; } @@ -311,7 +311,7 @@ const void* EmitWriteMemoryMov(BlockOfCode& code, const Xbyak::RegExp& addr, int break; } default: - ASSERT(false && "Invalid bitsize"); + UNREACHABLE(); } return fastmem_location; } else { @@ -333,7 +333,7 @@ const void* EmitWriteMemoryMov(BlockOfCode& code, const Xbyak::RegExp& addr, int code.movups(xword[addr], Xbyak::Xmm(value_idx)); break; default: - ASSERT(false && "Invalid bitsize"); + UNREACHABLE(); } return fastmem_location; } diff --git a/src/dynarmic/src/dynarmic/common/assert.h b/src/dynarmic/src/dynarmic/common/assert.h index ee9bbeba16..3a7842937f 100644 --- a/src/dynarmic/src/dynarmic/common/assert.h +++ b/src/dynarmic/src/dynarmic/common/assert.h @@ -8,11 +8,11 @@ [[noreturn]] void assert_terminate_impl(const char* s); #ifndef ASSERT -# define ASSERT(expr) do if(!(expr)) [[unlikely]] assert_terminate_impl(#expr); while(0) +# define ASSERT(expr) do if(!(expr)) [[unlikely]] assert_terminate_impl(__FILE__ ":" #__LINE__ ": " #expr); while(0) #endif #ifndef UNREACHABLE # ifdef _MSC_VER -# define UNREACHABLE() ASSERT_FALSE("unreachable") +# define UNREACHABLE() ASSERT(false && __FILE__ ":" #__LINE__ ": unreachable") # else # define UNREACHABLE() __builtin_unreachable(); # endif