diff --git a/rclcpp/src/rclcpp/duration.cpp b/rclcpp/src/rclcpp/duration.cpp index eed5e8a..afbc293 100644 --- a/rclcpp/src/rclcpp/duration.cpp +++ b/rclcpp/src/rclcpp/duration.cpp @@ -88,9 +88,6 @@ Duration::operator=(const Duration & rhs) Duration & Duration::operator=(const builtin_interfaces::msg::Duration & duration_msg) { - if (duration_msg.sec < 0) { - throw std::runtime_error("cannot store a negative duration point in rclcpp::Duration"); - } rcl_duration_.nanoseconds = RCL_S_TO_NS(static_cast(duration_msg.sec)); rcl_duration_.nanoseconds += duration_msg.nanosec; return *this; diff --git a/rclcpp/test/test_duration.cpp b/rclcpp/test/test_duration.cpp index b654212..a6d099f 100644 --- a/rclcpp/test/test_duration.cpp +++ b/rclcpp/test/test_duration.cpp @@ -97,3 +97,26 @@ TEST(TestDuration, overflows) { EXPECT_THROW(base_d_neg * (-4), std::overflow_error); EXPECT_THROW(base_d_neg * 4, std::underflow_error); } + +TEST(TestDuration, negative_duration) { + rclcpp::Duration assignable_duration = rclcpp::Duration(0) - rclcpp::Duration(5, 0); + + { + // avoid windows converting a literal number less than -INT_MAX to unsigned int C4146 + int64_t expected_value = -5000; + expected_value *= 1000 * 1000; + EXPECT_EQ(expected_value, assignable_duration.nanoseconds()); + } + + { + builtin_interfaces::msg::Duration duration_msg; + duration_msg.sec = -4; + duration_msg.nanosec = 250000000; + + assignable_duration = duration_msg; + // avoid windows converting a literal number less than -INT_MAX to unsigned int C4146 + int64_t expected_value = -3750; + expected_value *= 1000 * 1000; + EXPECT_EQ(expected_value, assignable_duration.nanoseconds()); + } +}