From 8cc112d196a2a4318e2334382900a930cb1466a6 Mon Sep 17 00:00:00 2001 From: Tyler Veness Date: Fri, 14 Jan 2022 23:53:12 -0800 Subject: [PATCH] [wpiutil] Fix wpi::array for move-only types (#3917) Fixes #3916. --- wpiutil/src/main/native/include/wpi/array.h | 6 ++--- wpiutil/src/test/native/cpp/ArrayTest.cpp | 30 +++++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 wpiutil/src/test/native/cpp/ArrayTest.cpp diff --git a/wpiutil/src/main/native/include/wpi/array.h b/wpiutil/src/main/native/include/wpi/array.h index 5a0337179c..f2604eced5 100644 --- a/wpiutil/src/main/native/include/wpi/array.h +++ b/wpiutil/src/main/native/include/wpi/array.h @@ -18,8 +18,8 @@ constexpr empty_array_t empty_array; * This class is a wrapper around std::array that does compile time size * checking. * - * std::array's implicit constructor can lead result in uninitialized elements - * if the number of arguments doesn't match the std::array size. + * std::array's implicit constructor can result in uninitialized elements if the + * number of arguments doesn't match the std::array size. */ template class array : public std::array { @@ -28,7 +28,7 @@ class array : public std::array { template array(T arg, Ts&&... args) // NOLINT - : std::array{arg, std::forward(args)...} { + : std::array{std::forward(arg), std::forward(args)...} { static_assert(1 + sizeof...(args) == N, "Dimension mismatch"); } diff --git a/wpiutil/src/test/native/cpp/ArrayTest.cpp b/wpiutil/src/test/native/cpp/ArrayTest.cpp new file mode 100644 index 0000000000..15e192801a --- /dev/null +++ b/wpiutil/src/test/native/cpp/ArrayTest.cpp @@ -0,0 +1,30 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +#include "gtest/gtest.h" +#include "wpi/array.h" + +namespace { +class MoveOnlyType { + public: + MoveOnlyType() = default; + MoveOnlyType(MoveOnlyType&&) = default; + MoveOnlyType& operator=(MoveOnlyType&&) = default; +}; +} // namespace + +TEST(ArrayTest, CopyableTypeCompiles) { + wpi::array arr1{1, 2, 3}; + + // Test deduction guide + wpi::array ar2{1, 2, 3}; +} + +TEST(ArrayTest, MoveOnlyTypeCompiles) { + wpi::array arr1{MoveOnlyType{}, MoveOnlyType{}, + MoveOnlyType{}}; + + // Test deduction guide + wpi::array arr2{MoveOnlyType{}, MoveOnlyType{}, MoveOnlyType{}}; +}