This is an automated email from the ASF dual-hosted git repository.

apitrou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new 5256e43493 ARROW-17803: [C++] Use [[nodiscard]] (#14193)
5256e43493 is described below

commit 5256e434935f90f02023e6dfce3b5c1ed056a1c9
Author: Antoine Pitrou <[email protected]>
AuthorDate: Thu Sep 22 16:59:10 2022 +0200

    ARROW-17803: [C++] Use [[nodiscard]] (#14193)
    
    C++17 supports the standard attribute `[[nodiscard]]`, use that instead of 
the clang-specific `__attribute__((warn_unused_result))`.
    
    Authored-by: Antoine Pitrou <[email protected]>
    Signed-off-by: Antoine Pitrou <[email protected]>
---
 cpp/src/arrow/array/array_base.h        |  2 +-
 cpp/src/arrow/compare.h                 | 22 +++++++--------
 cpp/src/arrow/compute/exec.h            |  4 +--
 cpp/src/arrow/compute/exec/expression.h |  6 ++--
 cpp/src/arrow/datum.h                   |  4 +--
 cpp/src/arrow/device.h                  |  2 +-
 cpp/src/arrow/filesystem/mockfs.h       |  4 +--
 cpp/src/arrow/io/hdfs.h                 |  2 +-
 cpp/src/arrow/io/hdfs_internal.h        |  2 +-
 cpp/src/arrow/result.h                  |  2 +-
 cpp/src/arrow/scalar.h                  |  4 +--
 cpp/src/arrow/status.h                  |  4 +--
 cpp/src/arrow/type.h                    | 12 ++++----
 cpp/src/arrow/type_fwd.h                | 44 ++++++++++++++---------------
 cpp/src/arrow/util/byte_size.h          | 22 +++++++--------
 cpp/src/arrow/util/decimal.h            |  8 +++---
 cpp/src/arrow/util/future.h             |  2 +-
 cpp/src/arrow/util/int_util.cc          |  4 +--
 cpp/src/arrow/util/key_value_metadata.h |  8 +++---
 cpp/src/arrow/util/macros.h             | 15 ----------
 cpp/src/arrow/util/thread_pool.h        |  2 +-
 cpp/src/arrow/util/visibility.h         | 50 +++++++++++++++++++++++++++++----
 22 files changed, 124 insertions(+), 101 deletions(-)

diff --git a/cpp/src/arrow/array/array_base.h b/cpp/src/arrow/array/array_base.h
index b1892e1f2c..2333a0c06f 100644
--- a/cpp/src/arrow/array/array_base.h
+++ b/cpp/src/arrow/array/array_base.h
@@ -207,7 +207,7 @@ class ARROW_EXPORT Array {
  private:
   ARROW_DISALLOW_COPY_AND_ASSIGN(Array);
 
-  ARROW_EXPORT friend void PrintTo(const Array& x, std::ostream* os);
+  ARROW_FRIEND_EXPORT friend void PrintTo(const Array& x, std::ostream* os);
 };
 
 static inline std::ostream& operator<<(std::ostream& os, const Array& x) {
diff --git a/cpp/src/arrow/compare.h b/cpp/src/arrow/compare.h
index 1317995232..6dbacfa86a 100644
--- a/cpp/src/arrow/compare.h
+++ b/cpp/src/arrow/compare.h
@@ -92,31 +92,31 @@ class EqualOptions {
 };
 
 /// Returns true if the arrays are exactly equal
-bool ARROW_EXPORT ArrayEquals(const Array& left, const Array& right,
+ARROW_EXPORT bool ArrayEquals(const Array& left, const Array& right,
                               const EqualOptions& = EqualOptions::Defaults());
 
 /// Returns true if the arrays are approximately equal. For non-floating point
 /// types, this is equivalent to ArrayEquals(left, right)
-bool ARROW_EXPORT ArrayApproxEquals(const Array& left, const Array& right,
+ARROW_EXPORT bool ArrayApproxEquals(const Array& left, const Array& right,
                                     const EqualOptions& = 
EqualOptions::Defaults());
 
 /// Returns true if indicated equal-length segment of arrays are exactly equal
-bool ARROW_EXPORT ArrayRangeEquals(const Array& left, const Array& right,
+ARROW_EXPORT bool ArrayRangeEquals(const Array& left, const Array& right,
                                    int64_t start_idx, int64_t end_idx,
                                    int64_t other_start_idx,
                                    const EqualOptions& = 
EqualOptions::Defaults());
 
 /// Returns true if indicated equal-length segment of arrays are approximately 
equal
-bool ARROW_EXPORT ArrayRangeApproxEquals(const Array& left, const Array& right,
+ARROW_EXPORT bool ArrayRangeApproxEquals(const Array& left, const Array& right,
                                          int64_t start_idx, int64_t end_idx,
                                          int64_t other_start_idx,
                                          const EqualOptions& = 
EqualOptions::Defaults());
 
-bool ARROW_EXPORT TensorEquals(const Tensor& left, const Tensor& right,
+ARROW_EXPORT bool TensorEquals(const Tensor& left, const Tensor& right,
                                const EqualOptions& = EqualOptions::Defaults());
 
 /// EXPERIMENTAL: Returns true if the given sparse tensors are exactly equal
-bool ARROW_EXPORT SparseTensorEquals(const SparseTensor& left, const 
SparseTensor& right,
+ARROW_EXPORT bool SparseTensorEquals(const SparseTensor& left, const 
SparseTensor& right,
                                      const EqualOptions& = 
EqualOptions::Defaults());
 
 /// Returns true if the type metadata are exactly equal
@@ -124,22 +124,22 @@ bool ARROW_EXPORT SparseTensorEquals(const SparseTensor& 
left, const SparseTenso
 /// \param[in] right a DataType
 /// \param[in] check_metadata whether to compare KeyValueMetadata for child
 /// fields
-bool ARROW_EXPORT TypeEquals(const DataType& left, const DataType& right,
+ARROW_EXPORT bool TypeEquals(const DataType& left, const DataType& right,
                              bool check_metadata = true);
 
 /// Returns true if scalars are equal
 /// \param[in] left a Scalar
 /// \param[in] right a Scalar
 /// \param[in] options comparison options
-bool ARROW_EXPORT ScalarEquals(const Scalar& left, const Scalar& right,
+ARROW_EXPORT bool ScalarEquals(const Scalar& left, const Scalar& right,
                                const EqualOptions& options = 
EqualOptions::Defaults());
 
 /// Returns true if scalars are approximately equal
 /// \param[in] left a Scalar
 /// \param[in] right a Scalar
 /// \param[in] options comparison options
-bool ARROW_EXPORT
-ScalarApproxEquals(const Scalar& left, const Scalar& right,
-                   const EqualOptions& options = EqualOptions::Defaults());
+ARROW_EXPORT bool ScalarApproxEquals(
+    const Scalar& left, const Scalar& right,
+    const EqualOptions& options = EqualOptions::Defaults());
 
 }  // namespace arrow
diff --git a/cpp/src/arrow/compute/exec.h b/cpp/src/arrow/compute/exec.h
index 2731c39aba..b759859388 100644
--- a/cpp/src/arrow/compute/exec.h
+++ b/cpp/src/arrow/compute/exec.h
@@ -246,13 +246,13 @@ struct ARROW_EXPORT ExecBatch {
   }
 
   std::string ToString() const;
-
-  ARROW_EXPORT friend void PrintTo(const ExecBatch&, std::ostream*);
 };
 
 inline bool operator==(const ExecBatch& l, const ExecBatch& r) { return 
l.Equals(r); }
 inline bool operator!=(const ExecBatch& l, const ExecBatch& r) { return 
!l.Equals(r); }
 
+ARROW_EXPORT void PrintTo(const ExecBatch&, std::ostream*);
+
 struct ExecValue {
   ArraySpan array = {};
   const Scalar* scalar = NULLPTR;
diff --git a/cpp/src/arrow/compute/exec/expression.h 
b/cpp/src/arrow/compute/exec/expression.h
index d49fe5c893..51f67cb63f 100644
--- a/cpp/src/arrow/compute/exec/expression.h
+++ b/cpp/src/arrow/compute/exec/expression.h
@@ -130,14 +130,14 @@ class ARROW_EXPORT Expression {
   using Impl = std::variant<Datum, Parameter, Call>;
   std::shared_ptr<Impl> impl_;
 
-  ARROW_EXPORT friend bool Identical(const Expression& l, const Expression& r);
-
-  ARROW_EXPORT friend void PrintTo(const Expression&, std::ostream*);
+  ARROW_FRIEND_EXPORT friend bool Identical(const Expression& l, const 
Expression& r);
 };
 
 inline bool operator==(const Expression& l, const Expression& r) { return 
l.Equals(r); }
 inline bool operator!=(const Expression& l, const Expression& r) { return 
!l.Equals(r); }
 
+ARROW_EXPORT void PrintTo(const Expression&, std::ostream*);
+
 // Factories
 
 ARROW_EXPORT
diff --git a/cpp/src/arrow/datum.h b/cpp/src/arrow/datum.h
index ffea7800ec..2d846a5eea 100644
--- a/cpp/src/arrow/datum.h
+++ b/cpp/src/arrow/datum.h
@@ -215,10 +215,10 @@ struct ARROW_EXPORT Datum {
   bool operator!=(const Datum& other) const { return !Equals(other); }
 
   std::string ToString() const;
-
-  ARROW_EXPORT friend void PrintTo(const Datum&, std::ostream*);
 };
 
+ARROW_EXPORT void PrintTo(const Datum&, std::ostream*);
+
 ARROW_EXPORT std::string ToString(Datum::Kind kind);
 
 }  // namespace arrow
diff --git a/cpp/src/arrow/device.h b/cpp/src/arrow/device.h
index c22665ef8e..67c62a5181 100644
--- a/cpp/src/arrow/device.h
+++ b/cpp/src/arrow/device.h
@@ -226,7 +226,7 @@ class ARROW_EXPORT CPUMemoryManager : public MemoryManager {
   MemoryPool* pool_;
 
   friend std::shared_ptr<MemoryManager> CPUDevice::memory_manager(MemoryPool* 
pool);
-  friend ARROW_EXPORT std::shared_ptr<MemoryManager> 
default_cpu_memory_manager();
+  ARROW_FRIEND_EXPORT friend std::shared_ptr<MemoryManager> 
default_cpu_memory_manager();
 };
 
 /// \brief Return the default CPU MemoryManager instance
diff --git a/cpp/src/arrow/filesystem/mockfs.h 
b/cpp/src/arrow/filesystem/mockfs.h
index fe86e19be4..e12408f52c 100644
--- a/cpp/src/arrow/filesystem/mockfs.h
+++ b/cpp/src/arrow/filesystem/mockfs.h
@@ -38,7 +38,7 @@ struct MockDirInfo {
     return mtime == other.mtime && full_path == other.full_path;
   }
 
-  friend ARROW_EXPORT std::ostream& operator<<(std::ostream&, const 
MockDirInfo&);
+  ARROW_FRIEND_EXPORT friend std::ostream& operator<<(std::ostream&, const 
MockDirInfo&);
 };
 
 struct MockFileInfo {
@@ -50,7 +50,7 @@ struct MockFileInfo {
     return mtime == other.mtime && full_path == other.full_path && data == 
other.data;
   }
 
-  friend ARROW_EXPORT std::ostream& operator<<(std::ostream&, const 
MockFileInfo&);
+  ARROW_FRIEND_EXPORT friend std::ostream& operator<<(std::ostream&, const 
MockFileInfo&);
 };
 
 /// A mock FileSystem implementation that holds its contents in memory.
diff --git a/cpp/src/arrow/io/hdfs.h b/cpp/src/arrow/io/hdfs.h
index 5244eb0524..46038070ae 100644
--- a/cpp/src/arrow/io/hdfs.h
+++ b/cpp/src/arrow/io/hdfs.h
@@ -278,7 +278,7 @@ class ARROW_EXPORT HdfsOutputStream : public OutputStream {
   ARROW_DISALLOW_COPY_AND_ASSIGN(HdfsOutputStream);
 };
 
-Status ARROW_EXPORT HaveLibHdfs();
+ARROW_EXPORT Status HaveLibHdfs();
 
 }  // namespace io
 }  // namespace arrow
diff --git a/cpp/src/arrow/io/hdfs_internal.h b/cpp/src/arrow/io/hdfs_internal.h
index 624938231d..590e3a4835 100644
--- a/cpp/src/arrow/io/hdfs_internal.h
+++ b/cpp/src/arrow/io/hdfs_internal.h
@@ -215,7 +215,7 @@ struct LibHdfsShim {
 };
 
 // TODO(wesm): Remove these exports when we are linking statically
-Status ARROW_EXPORT ConnectLibHdfs(LibHdfsShim** driver);
+ARROW_EXPORT Status ConnectLibHdfs(LibHdfsShim** driver);
 
 }  // namespace internal
 }  // namespace io
diff --git a/cpp/src/arrow/result.h b/cpp/src/arrow/result.h
index 7fdbeea4b7..eaf1dea97a 100644
--- a/cpp/src/arrow/result.h
+++ b/cpp/src/arrow/result.h
@@ -94,7 +94,7 @@ ARROW_EXPORT void InvalidValueOrDie(const Status& st);
 ///   arrow::Result<int> CalculateFoo();
 /// ```
 template <class T>
-class ARROW_MUST_USE_TYPE Result : public util::EqualityComparable<Result<T>> {
+class [[nodiscard]] Result : public util::EqualityComparable<Result<T>> {
   template <typename U>
   friend class Result;
 
diff --git a/cpp/src/arrow/scalar.h b/cpp/src/arrow/scalar.h
index 66e1863133..d6ceace35c 100644
--- a/cpp/src/arrow/scalar.h
+++ b/cpp/src/arrow/scalar.h
@@ -100,8 +100,6 @@ struct ARROW_EXPORT Scalar : public 
std::enable_shared_from_this<Scalar>,
   // TODO(bkietz) add compute::CastOptions
   Result<std::shared_ptr<Scalar>> CastTo(std::shared_ptr<DataType> to) const;
 
-  ARROW_EXPORT friend void PrintTo(const Scalar& scalar, std::ostream* os);
-
   /// \brief Apply the ScalarVisitor::Visit() method specialized to the scalar 
type
   Status Accept(ScalarVisitor* visitor) const;
 
@@ -116,6 +114,8 @@ struct ARROW_EXPORT Scalar : public 
std::enable_shared_from_this<Scalar>,
       : type(std::move(type)), is_valid(is_valid) {}
 };
 
+ARROW_EXPORT void PrintTo(const Scalar& scalar, std::ostream* os);
+
 /// \defgroup concrete-scalar-classes Concrete Scalar subclasses
 ///
 /// @{
diff --git a/cpp/src/arrow/status.h b/cpp/src/arrow/status.h
index 3bf6ca8b37..31f5a129e0 100644
--- a/cpp/src/arrow/status.h
+++ b/cpp/src/arrow/status.h
@@ -129,8 +129,8 @@ class ARROW_EXPORT StatusDetail {
 ///
 /// Additionally, if an error occurred, a specific error message is generally
 /// attached.
-class ARROW_MUST_USE_TYPE ARROW_EXPORT Status : public 
util::EqualityComparable<Status>,
-                                                public 
util::ToStringOstreamable<Status> {
+class ARROW_EXPORT [[nodiscard]] Status : public 
util::EqualityComparable<Status>,
+                                          public 
util::ToStringOstreamable<Status> {
  public:
   // Create a success status.
   Status() noexcept : state_(NULLPTR) {}
diff --git a/cpp/src/arrow/type.h b/cpp/src/arrow/type.h
index 663c476512..2bdfdec84c 100644
--- a/cpp/src/arrow/type.h
+++ b/cpp/src/arrow/type.h
@@ -438,8 +438,6 @@ class ARROW_EXPORT Field : public detail::Fingerprintable,
   std::string ComputeFingerprint() const override;
   std::string ComputeMetadataFingerprint() const override;
 
-  ARROW_EXPORT friend void PrintTo(const Field& field, std::ostream* os);
-
   // Field name
   std::string name_;
 
@@ -455,6 +453,8 @@ class ARROW_EXPORT Field : public detail::Fingerprintable,
   ARROW_DISALLOW_COPY_AND_ASSIGN(Field);
 };
 
+ARROW_EXPORT void PrintTo(const Field& field, std::ostream* os);
+
 namespace detail {
 
 template <typename DERIVED, typename BASE, Type::type TYPE_ID, typename C_TYPE>
@@ -1844,10 +1844,10 @@ class ARROW_EXPORT FieldRef : public 
util::EqualityComparable<FieldRef> {
   void Flatten(std::vector<FieldRef> children);
 
   std::variant<FieldPath, std::string, std::vector<FieldRef>> impl_;
-
-  ARROW_EXPORT friend void PrintTo(const FieldRef& ref, std::ostream* os);
 };
 
+ARROW_EXPORT void PrintTo(const FieldRef& ref, std::ostream* os);
+
 // ----------------------------------------------------------------------
 // Schema
 
@@ -1955,12 +1955,12 @@ class ARROW_EXPORT Schema : public 
detail::Fingerprintable,
   std::string ComputeMetadataFingerprint() const override;
 
  private:
-  ARROW_EXPORT friend void PrintTo(const Schema& s, std::ostream* os);
-
   class Impl;
   std::unique_ptr<Impl> impl_;
 };
 
+ARROW_EXPORT void PrintTo(const Schema& s, std::ostream* os);
+
 ARROW_EXPORT
 std::string EndiannessToString(Endianness endianness);
 
diff --git a/cpp/src/arrow/type_fwd.h b/cpp/src/arrow/type_fwd.h
index 84a50a12eb..5c6a1cac65 100644
--- a/cpp/src/arrow/type_fwd.h
+++ b/cpp/src/arrow/type_fwd.h
@@ -514,16 +514,16 @@ std::shared_ptr<DataType> fixed_size_list(const 
std::shared_ptr<DataType>& value
                                           int32_t list_size);
 /// \brief Return a Duration instance (naming use _type to avoid namespace 
conflict with
 /// built in time classes).
-std::shared_ptr<DataType> ARROW_EXPORT duration(TimeUnit::type unit);
+ARROW_EXPORT std::shared_ptr<DataType> duration(TimeUnit::type unit);
 
 /// \brief Return a DayTimeIntervalType instance
-std::shared_ptr<DataType> ARROW_EXPORT day_time_interval();
+ARROW_EXPORT std::shared_ptr<DataType> day_time_interval();
 
 /// \brief Return a MonthIntervalType instance
-std::shared_ptr<DataType> ARROW_EXPORT month_interval();
+ARROW_EXPORT std::shared_ptr<DataType> month_interval();
 
 /// \brief Return a MonthDayNanoIntervalType instance
-std::shared_ptr<DataType> ARROW_EXPORT month_day_nano_interval();
+ARROW_EXPORT std::shared_ptr<DataType> month_day_nano_interval();
 
 /// \brief Create a TimestampType instance from its unit
 ARROW_EXPORT
@@ -536,32 +536,32 @@ std::shared_ptr<DataType> timestamp(TimeUnit::type unit, 
const std::string& time
 /// \brief Create a 32-bit time type instance
 ///
 /// Unit can be either SECOND or MILLI
-std::shared_ptr<DataType> ARROW_EXPORT time32(TimeUnit::type unit);
+ARROW_EXPORT std::shared_ptr<DataType> time32(TimeUnit::type unit);
 
 /// \brief Create a 64-bit time type instance
 ///
 /// Unit can be either MICRO or NANO
-std::shared_ptr<DataType> ARROW_EXPORT time64(TimeUnit::type unit);
+ARROW_EXPORT std::shared_ptr<DataType> time64(TimeUnit::type unit);
 
 /// \brief Create a StructType instance
-std::shared_ptr<DataType> ARROW_EXPORT
-struct_(const std::vector<std::shared_ptr<Field>>& fields);
+ARROW_EXPORT std::shared_ptr<DataType> struct_(
+    const std::vector<std::shared_ptr<Field>>& fields);
 
 /// \brief Create a SparseUnionType instance
-std::shared_ptr<DataType> ARROW_EXPORT sparse_union(FieldVector child_fields,
+ARROW_EXPORT std::shared_ptr<DataType> sparse_union(FieldVector child_fields,
                                                     std::vector<int8_t> 
type_codes = {});
 /// \brief Create a SparseUnionType instance
-std::shared_ptr<DataType> ARROW_EXPORT
-sparse_union(const ArrayVector& children, std::vector<std::string> field_names 
= {},
-             std::vector<int8_t> type_codes = {});
+ARROW_EXPORT std::shared_ptr<DataType> sparse_union(
+    const ArrayVector& children, std::vector<std::string> field_names = {},
+    std::vector<int8_t> type_codes = {});
 
 /// \brief Create a DenseUnionType instance
-std::shared_ptr<DataType> ARROW_EXPORT dense_union(FieldVector child_fields,
+ARROW_EXPORT std::shared_ptr<DataType> dense_union(FieldVector child_fields,
                                                    std::vector<int8_t> 
type_codes = {});
 /// \brief Create a DenseUnionType instance
-std::shared_ptr<DataType> ARROW_EXPORT
-dense_union(const ArrayVector& children, std::vector<std::string> field_names 
= {},
-            std::vector<int8_t> type_codes = {});
+ARROW_EXPORT std::shared_ptr<DataType> dense_union(
+    const ArrayVector& children, std::vector<std::string> field_names = {},
+    std::vector<int8_t> type_codes = {});
 
 /// \brief Create a DictionaryType instance
 /// \param[in] index_type the type of the dictionary indices (must be
@@ -587,9 +587,9 @@ std::shared_ptr<DataType> dictionary(const 
std::shared_ptr<DataType>& index_type
 /// \param type the field value type
 /// \param nullable whether the values are nullable, default true
 /// \param metadata any custom key-value metadata, default null
-std::shared_ptr<Field> ARROW_EXPORT
-field(std::string name, std::shared_ptr<DataType> type, bool nullable = true,
-      std::shared_ptr<const KeyValueMetadata> metadata = NULLPTR);
+ARROW_EXPORT std::shared_ptr<Field> field(
+    std::string name, std::shared_ptr<DataType> type, bool nullable = true,
+    std::shared_ptr<const KeyValueMetadata> metadata = NULLPTR);
 
 /// \brief Create a Field instance with metadata
 ///
@@ -598,9 +598,9 @@ field(std::string name, std::shared_ptr<DataType> type, 
bool nullable = true,
 /// \param name the field name
 /// \param type the field value type
 /// \param metadata any custom key-value metadata
-std::shared_ptr<Field> ARROW_EXPORT
-field(std::string name, std::shared_ptr<DataType> type,
-      std::shared_ptr<const KeyValueMetadata> metadata);
+ARROW_EXPORT std::shared_ptr<Field> field(
+    std::string name, std::shared_ptr<DataType> type,
+    std::shared_ptr<const KeyValueMetadata> metadata);
 
 /// \brief Create a Schema instance
 ///
diff --git a/cpp/src/arrow/util/byte_size.h b/cpp/src/arrow/util/byte_size.h
index ca59bf6176..214c7551b6 100644
--- a/cpp/src/arrow/util/byte_size.h
+++ b/cpp/src/arrow/util/byte_size.h
@@ -32,19 +32,19 @@ namespace util {
 ///       byte size of the entire buffer.
 /// Note: If a buffer is referenced multiple times then it will
 ///       only be counted once.
-int64_t ARROW_EXPORT TotalBufferSize(const ArrayData& array_data);
+ARROW_EXPORT int64_t TotalBufferSize(const ArrayData& array_data);
 /// \brief The sum of bytes in each buffer referenced by the array
 /// \see TotalBufferSize(const ArrayData& array_data) for details
-int64_t ARROW_EXPORT TotalBufferSize(const Array& array);
+ARROW_EXPORT int64_t TotalBufferSize(const Array& array);
 /// \brief The sum of bytes in each buffer referenced by the array
 /// \see TotalBufferSize(const ArrayData& array_data) for details
-int64_t ARROW_EXPORT TotalBufferSize(const ChunkedArray& chunked_array);
+ARROW_EXPORT int64_t TotalBufferSize(const ChunkedArray& chunked_array);
 /// \brief The sum of bytes in each buffer referenced by the batch
 /// \see TotalBufferSize(const ArrayData& array_data) for details
-int64_t ARROW_EXPORT TotalBufferSize(const RecordBatch& record_batch);
+ARROW_EXPORT int64_t TotalBufferSize(const RecordBatch& record_batch);
 /// \brief The sum of bytes in each buffer referenced by the table
 /// \see TotalBufferSize(const ArrayData& array_data) for details
-int64_t ARROW_EXPORT TotalBufferSize(const Table& table);
+ARROW_EXPORT int64_t TotalBufferSize(const Table& table);
 
 /// \brief Calculate the buffer ranges referenced by the array
 ///
@@ -57,7 +57,7 @@ int64_t ARROW_EXPORT TotalBufferSize(const Table& table);
 /// The return value will be a struct array corresponding to the schema:
 /// schema({field("start", uint64()), field("offset", uint64()), 
field("length",
 /// uint64()))
-Result<std::shared_ptr<Array>> ARROW_EXPORT ReferencedRanges(const ArrayData& 
array_data);
+ARROW_EXPORT Result<std::shared_ptr<Array>> ReferencedRanges(const ArrayData& 
array_data);
 
 /// \brief Returns the sum of bytes from all buffer ranges referenced
 ///
@@ -69,19 +69,19 @@ Result<std::shared_ptr<Array>> ARROW_EXPORT 
ReferencedRanges(const ArrayData& ar
 ///
 /// Dictionary arrays will always be counted in their entirety
 /// even if the array only references a portion of the dictionary.
-Result<int64_t> ARROW_EXPORT ReferencedBufferSize(const ArrayData& array_data);
+ARROW_EXPORT Result<int64_t> ReferencedBufferSize(const ArrayData& array_data);
 /// \brief Returns the sum of bytes from all buffer ranges referenced
 /// \see ReferencedBufferSize(const ArrayData& array_data) for details
-Result<int64_t> ARROW_EXPORT ReferencedBufferSize(const Array& array_data);
+ARROW_EXPORT Result<int64_t> ReferencedBufferSize(const Array& array_data);
 /// \brief Returns the sum of bytes from all buffer ranges referenced
 /// \see ReferencedBufferSize(const ArrayData& array_data) for details
-Result<int64_t> ARROW_EXPORT ReferencedBufferSize(const ChunkedArray& 
array_data);
+ARROW_EXPORT Result<int64_t> ReferencedBufferSize(const ChunkedArray& 
array_data);
 /// \brief Returns the sum of bytes from all buffer ranges referenced
 /// \see ReferencedBufferSize(const ArrayData& array_data) for details
-Result<int64_t> ARROW_EXPORT ReferencedBufferSize(const RecordBatch& 
array_data);
+ARROW_EXPORT Result<int64_t> ReferencedBufferSize(const RecordBatch& 
array_data);
 /// \brief Returns the sum of bytes from all buffer ranges referenced
 /// \see ReferencedBufferSize(const ArrayData& array_data) for details
-Result<int64_t> ARROW_EXPORT ReferencedBufferSize(const Table& array_data);
+ARROW_EXPORT Result<int64_t> ReferencedBufferSize(const Table& array_data);
 
 }  // namespace util
 
diff --git a/cpp/src/arrow/util/decimal.h b/cpp/src/arrow/util/decimal.h
index 1b5a81d728..6527790b62 100644
--- a/cpp/src/arrow/util/decimal.h
+++ b/cpp/src/arrow/util/decimal.h
@@ -151,8 +151,8 @@ class ARROW_EXPORT Decimal128 : public BasicDecimal128 {
     return ToRealConversion<T>::ToReal(*this, scale);
   }
 
-  friend ARROW_EXPORT std::ostream& operator<<(std::ostream& os,
-                                               const Decimal128& decimal);
+  ARROW_FRIEND_EXPORT friend std::ostream& operator<<(std::ostream& os,
+                                                      const Decimal128& 
decimal);
 
  private:
   /// Converts internal error code to Status
@@ -267,8 +267,8 @@ class ARROW_EXPORT Decimal256 : public BasicDecimal256 {
     return ToRealConversion<T>::ToReal(*this, scale);
   }
 
-  friend ARROW_EXPORT std::ostream& operator<<(std::ostream& os,
-                                               const Decimal256& decimal);
+  ARROW_FRIEND_EXPORT friend std::ostream& operator<<(std::ostream& os,
+                                                      const Decimal256& 
decimal);
 
  private:
   /// Converts internal error code to Status
diff --git a/cpp/src/arrow/util/future.h b/cpp/src/arrow/util/future.h
index 7fc0d5063f..196587f647 100644
--- a/cpp/src/arrow/util/future.h
+++ b/cpp/src/arrow/util/future.h
@@ -315,7 +315,7 @@ class ARROW_EXPORT FutureImpl : public 
std::enable_shared_from_this<FutureImpl>
 /// The consumer API allows querying a Future's current state, wait for it
 /// to complete, and composing futures with callbacks.
 template <typename T>
-class ARROW_MUST_USE_TYPE Future {
+class [[nodiscard]] Future {
  public:
   using ValueType = T;
   using SyncType = typename detail::SyncType<T>::type;
diff --git a/cpp/src/arrow/util/int_util.cc b/cpp/src/arrow/util/int_util.cc
index 1a48c7a3ec..dec07cf3a1 100644
--- a/cpp/src/arrow/util/int_util.cc
+++ b/cpp/src/arrow/util/int_util.cc
@@ -436,8 +436,8 @@ void TransposeInts(const InputInt* src, OutputInt* dest, 
int64_t length,
   }
 }
 
-#define INSTANTIATE(SRC, DEST)              \
-  template ARROW_EXPORT void TransposeInts( \
+#define INSTANTIATE(SRC, DEST)                       \
+  template ARROW_TEMPLATE_EXPORT void TransposeInts( \
       const SRC* source, DEST* dest, int64_t length, const int32_t* 
transpose_map);
 
 #define INSTANTIATE_ALL_DEST(DEST) \
diff --git a/cpp/src/arrow/util/key_value_metadata.h 
b/cpp/src/arrow/util/key_value_metadata.h
index ba70ffe887..8702ce73a6 100644
--- a/cpp/src/arrow/util/key_value_metadata.h
+++ b/cpp/src/arrow/util/key_value_metadata.h
@@ -85,14 +85,14 @@ class ARROW_EXPORT KeyValueMetadata {
 /// \brief Create a KeyValueMetadata instance
 ///
 /// \param pairs key-value mapping
-std::shared_ptr<KeyValueMetadata> ARROW_EXPORT
-key_value_metadata(const std::unordered_map<std::string, std::string>& pairs);
+ARROW_EXPORT std::shared_ptr<KeyValueMetadata> key_value_metadata(
+    const std::unordered_map<std::string, std::string>& pairs);
 
 /// \brief Create a KeyValueMetadata instance
 ///
 /// \param keys sequence of metadata keys
 /// \param values sequence of corresponding metadata values
-std::shared_ptr<KeyValueMetadata> ARROW_EXPORT
-key_value_metadata(std::vector<std::string> keys, std::vector<std::string> 
values);
+ARROW_EXPORT std::shared_ptr<KeyValueMetadata> key_value_metadata(
+    std::vector<std::string> keys, std::vector<std::string> values);
 
 }  // namespace arrow
diff --git a/cpp/src/arrow/util/macros.h b/cpp/src/arrow/util/macros.h
index 2fb383e1d1..6d20d0e3be 100644
--- a/cpp/src/arrow/util/macros.h
+++ b/cpp/src/arrow/util/macros.h
@@ -63,21 +63,6 @@
 #define ARROW_PREFETCH(addr)
 #endif
 
-#if (defined(__GNUC__) || defined(__APPLE__))
-#define ARROW_MUST_USE_RESULT __attribute__((warn_unused_result))
-#elif defined(_MSC_VER)
-#define ARROW_MUST_USE_RESULT
-#else
-#define ARROW_MUST_USE_RESULT
-#endif
-
-#if defined(__clang__)
-// Only clang supports warn_unused_result as a type annotation.
-#define ARROW_MUST_USE_TYPE ARROW_MUST_USE_RESULT
-#else
-#define ARROW_MUST_USE_TYPE
-#endif
-
 #if defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER)
 #define ARROW_RESTRICT __restrict
 #else
diff --git a/cpp/src/arrow/util/thread_pool.h b/cpp/src/arrow/util/thread_pool.h
index cb23b22fcb..b2dd706444 100644
--- a/cpp/src/arrow/util/thread_pool.h
+++ b/cpp/src/arrow/util/thread_pool.h
@@ -462,7 +462,7 @@ class ARROW_EXPORT ThreadPool : public Executor {
  protected:
   FRIEND_TEST(TestThreadPool, SetCapacity);
   FRIEND_TEST(TestGlobalThreadPool, Capacity);
-  friend ARROW_EXPORT ThreadPool* GetCpuThreadPool();
+  ARROW_FRIEND_EXPORT friend ThreadPool* GetCpuThreadPool();
 
   ThreadPool();
 
diff --git a/cpp/src/arrow/util/visibility.h b/cpp/src/arrow/util/visibility.h
index dd9ac45e9b..6ab5290ef3 100644
--- a/cpp/src/arrow/util/visibility.h
+++ b/cpp/src/arrow/util/visibility.h
@@ -18,28 +18,66 @@
 #pragma once
 
 #if defined(_WIN32) || defined(__CYGWIN__)
+// Windows
+
 #if defined(_MSC_VER)
 #pragma warning(disable : 4251)
 #else
 #pragma GCC diagnostic ignored "-Wattributes"
 #endif
 
+#if defined(__cplusplus) && (defined(__GNUC__) || defined(__clang__))
+// Use C++ attribute syntax where possible to avoid GCC parser bug
+// 
(https://stackoverflow.com/questions/57993818/gcc-how-to-combine-attribute-dllexport-and-nodiscard-in-a-struct-de)
+#define ARROW_DLLEXPORT [[gnu::dllexport]]
+#define ARROW_DLLIMPORT [[gnu::dllimport]]
+#else
+#define ARROW_DLLEXPORT __declspec(dllexport)
+#define ARROW_DLLIMPORT __declspec(dllimport)
+#endif
+
 #ifdef ARROW_STATIC
 #define ARROW_EXPORT
+#define ARROW_FRIEND_EXPORT
+#define ARROW_TEMPLATE_EXPORT
 #elif defined(ARROW_EXPORTING)
-#define ARROW_EXPORT __declspec(dllexport)
+#define ARROW_EXPORT ARROW_DLLEXPORT
+// For some reason [[gnu::dllexport]] doesn't work well with friend 
declarations
+#define ARROW_FRIEND_EXPORT __declspec(dllexport)
+#define ARROW_TEMPLATE_EXPORT ARROW_DLLEXPORT
 #else
-#define ARROW_EXPORT __declspec(dllimport)
+#define ARROW_EXPORT ARROW_DLLIMPORT
+#define ARROW_FRIEND_EXPORT __declspec(dllimport)
+#define ARROW_TEMPLATE_EXPORT ARROW_DLLIMPORT
 #endif
 
 #define ARROW_NO_EXPORT
 #define ARROW_FORCE_INLINE __forceinline
-#else  // Not Windows
+
+#else
+
+// Non-Windows
+
+#define ARROW_FORCE_INLINE
+
+#if defined(__cplusplus) && (defined(__GNUC__) || defined(__clang__))
 #ifndef ARROW_EXPORT
-#define ARROW_EXPORT __attribute__((visibility("default")))
+#define ARROW_EXPORT [[gnu::visibility("default")]]
 #endif
 #ifndef ARROW_NO_EXPORT
-#define ARROW_NO_EXPORT __attribute__((visibility("hidden")))
-#define ARROW_FORCE_INLINE
+#define ARROW_NO_EXPORT [[gnu::visibility("hidden")]]
 #endif
+#else
+// Not C++, or not gcc/clang
+#ifndef ARROW_EXPORT
+#define ARROW_EXPORT
+#endif
+#ifndef ARROW_NO_EXPORT
+#define ARROW_NO_EXPORT
+#endif
+#endif
+
+#define ARROW_FRIEND_EXPORT
+#define ARROW_TEMPLATE_EXPORT
+
 #endif  // Non-Windows

Reply via email to