From 15816c5760cd6752d9d74759773044c638096422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Mon, 30 Jan 2017 11:56:29 +0100 Subject: [PATCH] Revert "use sizeof(expr) for unevaluated syntax check" Using sizeof(expr) can trigger a compile-time error, "lambda expressions are not allowed in an unevaluated context", when passing expression containing lambda, like a std algorithm. This error is considered a standard defect, as it is meant to prevent lambdas in decltype or templates, but not in sizeof. This reverts commit 227598af47e4d46f06cfcc879f206eb34e681275. --- include/internal/catch_capture.hpp | 3 ++- include/internal/catch_common.h | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/internal/catch_capture.hpp b/include/internal/catch_capture.hpp index eaf3074e..5d6a97ae 100644 --- a/include/internal/catch_capture.hpp +++ b/include/internal/catch_capture.hpp @@ -40,7 +40,8 @@ __catchResult.useActiveException( resultDisposition ); \ } \ INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse( sizeof(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look + } while( Catch::isTrue( false && static_cast( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look + // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ diff --git a/include/internal/catch_common.h b/include/internal/catch_common.h index 8d1a86a0..43f46a98 100644 --- a/include/internal/catch_common.h +++ b/include/internal/catch_common.h @@ -119,8 +119,9 @@ namespace Catch { std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); // This is just here to avoid compiler warnings with macro constants and boolean literals - inline bool alwaysTrue( std::size_t = 0 ) { return true; } - inline bool alwaysFalse( std::size_t = 0 ) { return false; } + inline bool isTrue( bool value ){ return value; } + inline bool alwaysTrue() { return true; } + inline bool alwaysFalse() { return false; } void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo );