From 8a9fcb406a0dcea86a8834d3de9ffec87ea57107 Mon Sep 17 00:00:00 2001 From: Wes McKinney Date: Tue, 28 Mar 2017 10:36:10 -0400 Subject: [PATCH 1/3] Add compatibility macros for exported extern templates, also to reduce compiler warnings in MSVC Change-Id: Ib5ca26cbf76c90ae8ae51aeca24e715b77dbf65d --- cpp/src/arrow/array.h | 43 ++++++++++++--------------------- cpp/src/arrow/tensor.h | 33 +++++++++---------------- cpp/src/arrow/util/visibility.h | 9 +++++++ 3 files changed, 36 insertions(+), 49 deletions(-) diff --git a/cpp/src/arrow/array.h b/cpp/src/arrow/array.h index c0ec571e459..643fbc31c05 100644 --- a/cpp/src/arrow/array.h +++ b/cpp/src/arrow/array.h @@ -483,34 +483,23 @@ class ARROW_EXPORT DictionaryArray : public Array { // ---------------------------------------------------------------------- // extern templates and other details -// gcc and clang disagree about how to handle template visibility when you have -// explicit specializations https://llvm.org/bugs/show_bug.cgi?id=24815 -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wattributes" -#endif - // Only instantiate these templates once -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic pop -#endif +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; +EXTERN_TEMPLATE_CLASS NumericArray; } // namespace arrow diff --git a/cpp/src/arrow/tensor.h b/cpp/src/arrow/tensor.h index 0059368f7b2..ac7c9b22046 100644 --- a/cpp/src/arrow/tensor.h +++ b/cpp/src/arrow/tensor.h @@ -129,29 +129,18 @@ class ARROW_EXPORT NumericTensor : public Tensor { // ---------------------------------------------------------------------- // extern templates and other details -// gcc and clang disagree about how to handle template visibility when you have -// explicit specializations https://llvm.org/bugs/show_bug.cgi?id=24815 -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wattributes" -#endif - // Only instantiate these templates once -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic pop -#endif +EXTERN_TEMPLATE_CLASS NumericTensor; +EXTERN_TEMPLATE_CLASS NumericTensor; +EXTERN_TEMPLATE_CLASS NumericTensor; +EXTERN_TEMPLATE_CLASS NumericTensor; +EXTERN_TEMPLATE_CLASS NumericTensor; +EXTERN_TEMPLATE_CLASS NumericTensor; +EXTERN_TEMPLATE_CLASS NumericTensor; +EXTERN_TEMPLATE_CLASS NumericTensor; +EXTERN_TEMPLATE_CLASS NumericTensor; +EXTERN_TEMPLATE_CLASS NumericTensor; +EXTERN_TEMPLATE_CLASS NumericTensor; } // namespace arrow diff --git a/cpp/src/arrow/util/visibility.h b/cpp/src/arrow/util/visibility.h index 4819a0061e7..7be6b02f166 100644 --- a/cpp/src/arrow/util/visibility.h +++ b/cpp/src/arrow/util/visibility.h @@ -35,4 +35,13 @@ #endif #endif // Non-Windows +// gcc and clang disagree about how to handle template visibility when you have +// explicit specializations https://llvm.org/bugs/show_bug.cgi?id=24815 + +#if defined(__clang__) + #define EXTERN_TEMPLATE_CLASS extern template class ARROW_EXPORT +#else + #define EXTERN_TEMPLATE_CLASS extern template class +#endif + #endif // ARROW_UTIL_VISIBILITY_H From b53a4002619ba9502146ac9819fb2372443b7e2f Mon Sep 17 00:00:00 2001 From: Wes McKinney Date: Tue, 28 Mar 2017 15:16:47 -0400 Subject: [PATCH 2/3] MSVC needs export annotation when instantiating templates --- cpp/src/arrow/array.cc | 32 ++++++++++++++++---------------- cpp/src/arrow/array.h | 32 ++++++++++++++++---------------- cpp/src/arrow/tensor.cc | 22 +++++++++++----------- cpp/src/arrow/tensor.h | 22 +++++++++++----------- cpp/src/arrow/type.h | 4 ++-- cpp/src/arrow/util/visibility.h | 12 ++++++++++-- 6 files changed, 66 insertions(+), 58 deletions(-) diff --git a/cpp/src/arrow/array.cc b/cpp/src/arrow/array.cc index 3ea033376fc..b25411a1c59 100644 --- a/cpp/src/arrow/array.cc +++ b/cpp/src/arrow/array.cc @@ -445,21 +445,21 @@ Status Array::Accept(ArrayVisitor* visitor) const { // ---------------------------------------------------------------------- // Instantiate templates -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; } // namespace arrow diff --git a/cpp/src/arrow/array.h b/cpp/src/arrow/array.h index 643fbc31c05..53b640853d5 100644 --- a/cpp/src/arrow/array.h +++ b/cpp/src/arrow/array.h @@ -484,22 +484,22 @@ class ARROW_EXPORT DictionaryArray : public Array { // extern templates and other details // Only instantiate these templates once -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; -EXTERN_TEMPLATE_CLASS NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; } // namespace arrow diff --git a/cpp/src/arrow/tensor.cc b/cpp/src/arrow/tensor.cc index 6489cd01d4c..7c4593fc40e 100644 --- a/cpp/src/arrow/tensor.cc +++ b/cpp/src/arrow/tensor.cc @@ -100,16 +100,16 @@ NumericTensor::NumericTensor(const std::shared_ptr& data, const std::vector& shape, const std::vector& strides) : NumericTensor(data, shape, strides, {}) {} -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; } // namespace arrow diff --git a/cpp/src/arrow/tensor.h b/cpp/src/arrow/tensor.h index ac7c9b22046..7bee867a9b3 100644 --- a/cpp/src/arrow/tensor.h +++ b/cpp/src/arrow/tensor.h @@ -130,17 +130,17 @@ class ARROW_EXPORT NumericTensor : public Tensor { // extern templates and other details // Only instantiate these templates once -EXTERN_TEMPLATE_CLASS NumericTensor; -EXTERN_TEMPLATE_CLASS NumericTensor; -EXTERN_TEMPLATE_CLASS NumericTensor; -EXTERN_TEMPLATE_CLASS NumericTensor; -EXTERN_TEMPLATE_CLASS NumericTensor; -EXTERN_TEMPLATE_CLASS NumericTensor; -EXTERN_TEMPLATE_CLASS NumericTensor; -EXTERN_TEMPLATE_CLASS NumericTensor; -EXTERN_TEMPLATE_CLASS NumericTensor; -EXTERN_TEMPLATE_CLASS NumericTensor; -EXTERN_TEMPLATE_CLASS NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; } // namespace arrow diff --git a/cpp/src/arrow/type.h b/cpp/src/arrow/type.h index dc50ecd669c..2a73f6be934 100644 --- a/cpp/src/arrow/type.h +++ b/cpp/src/arrow/type.h @@ -439,7 +439,7 @@ struct ARROW_EXPORT UnionType : public NestedType { enum class DateUnit : char { DAY = 0, MILLI = 1 }; -struct DateType : public FixedWidthType { +struct ARROW_EXPORT DateType : public FixedWidthType { public: DateUnit unit; @@ -496,7 +496,7 @@ static inline std::ostream& operator<<(std::ostream& os, TimeUnit unit) { return os; } -struct TimeType : public FixedWidthType { +struct ARROW_EXPORT TimeType : public FixedWidthType { public: TimeUnit unit; diff --git a/cpp/src/arrow/util/visibility.h b/cpp/src/arrow/util/visibility.h index 7be6b02f166..6db63d56abc 100644 --- a/cpp/src/arrow/util/visibility.h +++ b/cpp/src/arrow/util/visibility.h @@ -39,9 +39,17 @@ // explicit specializations https://llvm.org/bugs/show_bug.cgi?id=24815 #if defined(__clang__) - #define EXTERN_TEMPLATE_CLASS extern template class ARROW_EXPORT + #define ARROW_EXTERN_TEMPLATE extern template class ARROW_EXPORT #else - #define EXTERN_TEMPLATE_CLASS extern template class + #define ARROW_EXTERN_TEMPLATE extern template class +#endif + +// This is a complicated topic, some reading on it: +// http://www.codesynthesis.com/~boris/blog/2010/01/18/dll-export-cxx-templates/ +#if defined(MSVC) + #define ARROW_TEMPLATE_EXPORT ARROW_EXPORT +#else + #define ARROW_TEMPLATE_EXPORT #endif #endif // ARROW_UTIL_VISIBILITY_H From 3f6277df6cce3ef70d72d9b316fecd78f022fd15 Mon Sep 17 00:00:00 2001 From: Wes McKinney Date: Wed, 29 Mar 2017 08:40:51 -0400 Subject: [PATCH 3/3] Wrong define for msvc Change-Id: I461d658667c063bdb6822c517ffd5f6b9ec1032a --- cpp/src/arrow/util/visibility.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/src/arrow/util/visibility.h b/cpp/src/arrow/util/visibility.h index 6db63d56abc..6382f7f6318 100644 --- a/cpp/src/arrow/util/visibility.h +++ b/cpp/src/arrow/util/visibility.h @@ -46,7 +46,7 @@ // This is a complicated topic, some reading on it: // http://www.codesynthesis.com/~boris/blog/2010/01/18/dll-export-cxx-templates/ -#if defined(MSVC) +#if defined(_MSC_VER) #define ARROW_TEMPLATE_EXPORT ARROW_EXPORT #else #define ARROW_TEMPLATE_EXPORT