mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-03 21:49:32 +01:00 
			
		
		
		
	Changed rhs expression capture from universal ref to const ref.
- addresses #1027
This commit is contained in:
		@@ -77,7 +77,7 @@ namespace Catch {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int)
 | 
					    // Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int)
 | 
				
			||||||
    template<typename LhsT, typename RhsT>
 | 
					    template<typename LhsT, typename RhsT>
 | 
				
			||||||
    auto compareEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return lhs == rhs; };
 | 
					    auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return lhs == rhs; };
 | 
				
			||||||
    template<typename T>
 | 
					    template<typename T>
 | 
				
			||||||
    auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); }
 | 
					    auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); }
 | 
				
			||||||
    template<typename T>
 | 
					    template<typename T>
 | 
				
			||||||
@@ -106,36 +106,36 @@ namespace Catch {
 | 
				
			|||||||
        ExprLhs( LhsT lhs ) : m_lhs( lhs ) {}
 | 
					        ExprLhs( LhsT lhs ) : m_lhs( lhs ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        template<typename RhsT>
 | 
					        template<typename RhsT>
 | 
				
			||||||
        auto operator == ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const {
 | 
					        auto operator == ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
 | 
				
			||||||
            return BinaryExpr<LhsT, RhsT&>( compareEqual( m_lhs, rhs ), m_lhs, "==", rhs );
 | 
					            return BinaryExpr<LhsT, RhsT const&>( compareEqual( m_lhs, rhs ), m_lhs, "==", rhs );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        auto operator == ( bool rhs ) -> BinaryExpr<LhsT, bool> const {
 | 
					        auto operator == ( bool rhs ) -> BinaryExpr<LhsT, bool> const {
 | 
				
			||||||
            return BinaryExpr<LhsT, bool>( m_lhs == rhs, m_lhs, "==", rhs );
 | 
					            return BinaryExpr<LhsT, bool>( m_lhs == rhs, m_lhs, "==", rhs );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        template<typename RhsT>
 | 
					        template<typename RhsT>
 | 
				
			||||||
        auto operator != ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const {
 | 
					        auto operator != ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
 | 
				
			||||||
            return BinaryExpr<LhsT, RhsT&>( compareNotEqual( m_lhs, rhs ), m_lhs, "!=", rhs );
 | 
					            return BinaryExpr<LhsT, RhsT const&>( compareNotEqual( m_lhs, rhs ), m_lhs, "!=", rhs );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        auto operator != ( bool rhs ) -> BinaryExpr<LhsT, bool> const {
 | 
					        auto operator != ( bool rhs ) -> BinaryExpr<LhsT, bool> const {
 | 
				
			||||||
            return BinaryExpr<LhsT, bool>( m_lhs != rhs, m_lhs, "!=", rhs );
 | 
					            return BinaryExpr<LhsT, bool>( m_lhs != rhs, m_lhs, "!=", rhs );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        template<typename RhsT>
 | 
					        template<typename RhsT>
 | 
				
			||||||
        auto operator > ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const {
 | 
					        auto operator > ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
 | 
				
			||||||
            return BinaryExpr<LhsT, RhsT&>( m_lhs > rhs, m_lhs, ">", rhs );
 | 
					            return BinaryExpr<LhsT, RhsT const&>( m_lhs > rhs, m_lhs, ">", rhs );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        template<typename RhsT>
 | 
					        template<typename RhsT>
 | 
				
			||||||
        auto operator < ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const {
 | 
					        auto operator < ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
 | 
				
			||||||
            return BinaryExpr<LhsT, RhsT&>( m_lhs < rhs, m_lhs, "<", rhs );
 | 
					            return BinaryExpr<LhsT, RhsT const&>( m_lhs < rhs, m_lhs, "<", rhs );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        template<typename RhsT>
 | 
					        template<typename RhsT>
 | 
				
			||||||
        auto operator >= ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const {
 | 
					        auto operator >= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
 | 
				
			||||||
            return BinaryExpr<LhsT, RhsT&>( m_lhs >= rhs, m_lhs, ">=", rhs );
 | 
					            return BinaryExpr<LhsT, RhsT const&>( m_lhs >= rhs, m_lhs, ">=", rhs );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        template<typename RhsT>
 | 
					        template<typename RhsT>
 | 
				
			||||||
        auto operator <= ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const {
 | 
					        auto operator <= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
 | 
				
			||||||
            return BinaryExpr<LhsT, RhsT&>( m_lhs <= rhs, m_lhs, "<=", rhs );
 | 
					            return BinaryExpr<LhsT, RhsT const&>( m_lhs <= rhs, m_lhs, "<=", rhs );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        auto makeUnaryExpr() const -> UnaryExpr<LhsT> {
 | 
					        auto makeUnaryExpr() const -> UnaryExpr<LhsT> {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1003,6 +1003,6 @@ with expansion:
 | 
				
			|||||||
  "{?}" == "1"
 | 
					  "{?}" == "1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
===============================================================================
 | 
					===============================================================================
 | 
				
			||||||
test cases: 179 | 128 passed | 47 failed |  4 failed as expected
 | 
					test cases: 180 | 129 passed | 47 failed |  4 failed as expected
 | 
				
			||||||
assertions: 884 | 767 passed | 96 failed | 21 failed as expected
 | 
					assertions: 886 | 769 passed | 96 failed | 21 failed as expected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -738,6 +738,24 @@ PASSED:
 | 
				
			|||||||
with expansion:
 | 
					with expansion:
 | 
				
			||||||
  true
 | 
					  true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					Bitfields can be captured (#1027)
 | 
				
			||||||
 | 
					-------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					TrickyTests.cpp:<line number>
 | 
				
			||||||
 | 
					...............................................................................
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TrickyTests.cpp:<line number>:
 | 
				
			||||||
 | 
					PASSED:
 | 
				
			||||||
 | 
					  REQUIRE( y.v == 0 )
 | 
				
			||||||
 | 
					with expansion:
 | 
				
			||||||
 | 
					  0 == 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TrickyTests.cpp:<line number>:
 | 
				
			||||||
 | 
					PASSED:
 | 
				
			||||||
 | 
					  REQUIRE( 0 == y.v )
 | 
				
			||||||
 | 
					with expansion:
 | 
				
			||||||
 | 
					  0 == 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-------------------------------------------------------------------------------
 | 
					-------------------------------------------------------------------------------
 | 
				
			||||||
Capture and info messages
 | 
					Capture and info messages
 | 
				
			||||||
  Capture should stringify like assertions
 | 
					  Capture should stringify like assertions
 | 
				
			||||||
@@ -7490,6 +7508,6 @@ MiscTests.cpp:<line number>:
 | 
				
			|||||||
PASSED:
 | 
					PASSED:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
===============================================================================
 | 
					===============================================================================
 | 
				
			||||||
test cases: 179 | 126 passed | 49 failed |  4 failed as expected
 | 
					test cases: 180 | 127 passed | 49 failed |  4 failed as expected
 | 
				
			||||||
assertions: 883 | 763 passed | 99 failed | 21 failed as expected
 | 
					assertions: 885 | 765 passed | 99 failed | 21 failed as expected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
<testsuitesloose text artifact
 | 
					<testsuitesloose text artifact
 | 
				
			||||||
>
 | 
					>
 | 
				
			||||||
  <testsuite name="<exe-name>" errors="15" failures="85" tests="884" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
 | 
					  <testsuite name="<exe-name>" errors="15" failures="85" tests="886" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="#748 - captures with unexpected exceptions/outside assertions" time="{duration}">
 | 
					    <testcase classname="<exe-name>.global" name="#748 - captures with unexpected exceptions/outside assertions" time="{duration}">
 | 
				
			||||||
@@ -109,6 +109,7 @@ ExceptionTests.cpp:<line number>
 | 
				
			|||||||
    <testcase classname="<exe-name>.global" name="Assertions then sections/A section" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="Assertions then sections/A section" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="Assertions then sections/A section/Another section" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="Assertions then sections/A section/Another section" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="Assertions then sections/A section/Another other section" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="Assertions then sections/A section/Another other section" time="{duration}"/>
 | 
				
			||||||
 | 
					    <testcase classname="<exe-name>.global" name="Bitfields can be captured (#1027)" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="Capture and info messages/Capture should stringify like assertions" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="Capture and info messages/Capture should stringify like assertions" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="Capture and info messages/Info should NOT stringify the way assertions do" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="Capture and info messages/Info should NOT stringify the way assertions do" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="Character pretty printing/Specifically escaped" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="Character pretty printing/Specifically escaped" time="{duration}"/>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -750,6 +750,25 @@
 | 
				
			|||||||
      </Section>
 | 
					      </Section>
 | 
				
			||||||
      <OverallResult success="true"/>
 | 
					      <OverallResult success="true"/>
 | 
				
			||||||
    </TestCase>
 | 
					    </TestCase>
 | 
				
			||||||
 | 
					    <TestCase name="Bitfields can be captured (#1027)" filename="projects/<exe-name>/TrickyTests.cpp" >
 | 
				
			||||||
 | 
					      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/TrickyTests.cpp" >
 | 
				
			||||||
 | 
					        <Original>
 | 
				
			||||||
 | 
					          y.v == 0
 | 
				
			||||||
 | 
					        </Original>
 | 
				
			||||||
 | 
					        <Expanded>
 | 
				
			||||||
 | 
					          0 == 0
 | 
				
			||||||
 | 
					        </Expanded>
 | 
				
			||||||
 | 
					      </Expression>
 | 
				
			||||||
 | 
					      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/TrickyTests.cpp" >
 | 
				
			||||||
 | 
					        <Original>
 | 
				
			||||||
 | 
					          0 == y.v
 | 
				
			||||||
 | 
					        </Original>
 | 
				
			||||||
 | 
					        <Expanded>
 | 
				
			||||||
 | 
					          0 == 0
 | 
				
			||||||
 | 
					        </Expanded>
 | 
				
			||||||
 | 
					      </Expression>
 | 
				
			||||||
 | 
					      <OverallResult success="true"/>
 | 
				
			||||||
 | 
					    </TestCase>
 | 
				
			||||||
    <TestCase name="Capture and info messages" filename="projects/<exe-name>/ToStringGeneralTests.cpp" >
 | 
					    <TestCase name="Capture and info messages" filename="projects/<exe-name>/ToStringGeneralTests.cpp" >
 | 
				
			||||||
      <Section name="Capture should stringify like assertions" filename="projects/<exe-name>/ToStringGeneralTests.cpp" >
 | 
					      <Section name="Capture should stringify like assertions" filename="projects/<exe-name>/ToStringGeneralTests.cpp" >
 | 
				
			||||||
        <Info>
 | 
					        <Info>
 | 
				
			||||||
@@ -8268,7 +8287,7 @@ loose text artifact
 | 
				
			|||||||
      </Section>
 | 
					      </Section>
 | 
				
			||||||
      <OverallResult success="true"/>
 | 
					      <OverallResult success="true"/>
 | 
				
			||||||
    </TestCase>
 | 
					    </TestCase>
 | 
				
			||||||
    <OverallResults successes="763" failures="100" expectedFailures="21"/>
 | 
					    <OverallResults successes="765" failures="100" expectedFailures="21"/>
 | 
				
			||||||
  </Group>
 | 
					  </Group>
 | 
				
			||||||
  <OverallResults successes="763" failures="99" expectedFailures="21"/>
 | 
					  <OverallResults successes="765" failures="99" expectedFailures="21"/>
 | 
				
			||||||
</Catch>
 | 
					</Catch>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -168,7 +168,7 @@ namespace ObjectWithConversions
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    struct Object
 | 
					    struct Object
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        operator unsigned int() {return 0xc0000000;}
 | 
					        operator unsigned int() const {return 0xc0000000;}
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
					    ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
@@ -436,3 +436,12 @@ TEST_CASE("#925: comparing function pointer to function address failed to compil
 | 
				
			|||||||
    TestClass test;
 | 
					    TestClass test;
 | 
				
			||||||
    REQUIRE(utility::synchronizing_callback != test.testMethod_uponComplete_arg);
 | 
					    REQUIRE(utility::synchronizing_callback != test.testMethod_uponComplete_arg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST_CASE( "Bitfields can be captured (#1027)" ) {
 | 
				
			||||||
 | 
					    struct Y {
 | 
				
			||||||
 | 
					        uint32_t v : 1;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    Y y{ 0 };
 | 
				
			||||||
 | 
					    REQUIRE( y.v == 0 );
 | 
				
			||||||
 | 
					    REQUIRE( 0 == y.v );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user