mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Add nice error messages for unsupported && and ||
As explained in issue #1273, `operator&&` and `operator||` should give a proper compile time error on use instead of the compiler complaining about them not being defined. This commit adds an `always_false` type in `catch_meta.hpp` used for implementing a nice `static_assert` for both of the abovementioned operators. Closes #1273
This commit is contained in:
		 BiCapitalization
					BiCapitalization
				
			
				
					committed by
					
						 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
			
				
	
			
			
			 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
						parent
						
							e7fce90b49
						
					
				
				
					commit
					b3faceede2
				
			| @@ -10,6 +10,7 @@ | ||||
|  | ||||
| #include "catch_tostring.h" | ||||
| #include "catch_stringref.h" | ||||
| #include "catch_meta.hpp" | ||||
|  | ||||
| #include <iosfwd> | ||||
|  | ||||
| @@ -143,6 +144,20 @@ namespace Catch { | ||||
|             return { static_cast<bool>(m_lhs <= rhs), m_lhs, "<=", rhs }; | ||||
|         } | ||||
|  | ||||
|         template<typename RhsT> | ||||
|         auto operator && ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const { | ||||
|             static_assert(always_false<RhsT>::value, | ||||
|             "operator&& is not supported inside assertions, " | ||||
|             "wrap the expression inside parentheses, or decompose it"); | ||||
|         } | ||||
|  | ||||
|         template<typename RhsT> | ||||
|         auto operator || ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const { | ||||
|             static_assert(always_false<RhsT>::value, | ||||
|             "operator|| is not supported inside assertions, " | ||||
|             "wrap the expression inside parentheses, or decompose it"); | ||||
|         } | ||||
|  | ||||
|         auto makeUnaryExpr() const -> UnaryExpr<LhsT> { | ||||
|             return UnaryExpr<LhsT>{ m_lhs }; | ||||
|         } | ||||
|   | ||||
| @@ -9,6 +9,8 @@ | ||||
| #ifndef TWOBLUECUBES_CATCH_META_HPP_INCLUDED | ||||
| #define TWOBLUECUBES_CATCH_META_HPP_INCLUDED | ||||
|  | ||||
| #include <type_traits> | ||||
|  | ||||
| template< typename... > | ||||
| struct TypeList{}; | ||||
|  | ||||
| @@ -73,4 +75,7 @@ struct combine | ||||
|     }; | ||||
| }; | ||||
|  | ||||
| template<typename T> | ||||
| struct always_false : std::false_type {}; | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED | ||||
|   | ||||
		Reference in New Issue
	
	Block a user