mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-03 21:49:32 +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:
		
				
					committed by
					
						
						Martin Hořeňovský
					
				
			
			
				
	
			
			
			
						parent
						
							e7fce90b49
						
					
				
				
					commit
					b3faceede2
				
			@@ -10,6 +10,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "catch_tostring.h"
 | 
					#include "catch_tostring.h"
 | 
				
			||||||
#include "catch_stringref.h"
 | 
					#include "catch_stringref.h"
 | 
				
			||||||
 | 
					#include "catch_meta.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <iosfwd>
 | 
					#include <iosfwd>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -143,6 +144,20 @@ namespace Catch {
 | 
				
			|||||||
            return { static_cast<bool>(m_lhs <= rhs), m_lhs, "<=", rhs };
 | 
					            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> {
 | 
					        auto makeUnaryExpr() const -> UnaryExpr<LhsT> {
 | 
				
			||||||
            return UnaryExpr<LhsT>{ m_lhs };
 | 
					            return UnaryExpr<LhsT>{ m_lhs };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,8 @@
 | 
				
			|||||||
#ifndef TWOBLUECUBES_CATCH_META_HPP_INCLUDED
 | 
					#ifndef TWOBLUECUBES_CATCH_META_HPP_INCLUDED
 | 
				
			||||||
#define TWOBLUECUBES_CATCH_META_HPP_INCLUDED
 | 
					#define TWOBLUECUBES_CATCH_META_HPP_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <type_traits>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template< typename... >
 | 
					template< typename... >
 | 
				
			||||||
struct TypeList{};
 | 
					struct TypeList{};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -73,4 +75,7 @@ struct combine
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					struct always_false : std::false_type {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED
 | 
					#endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user