[PPL-devel] [GIT] ppl/ppl(master): For increased portability, use zero-length arrays ( when available), not flexible arrays.
Roberto Bagnara
bagnara at cs.unipr.it
Tue Mar 15 12:08:40 CET 2011
Module: ppl/ppl
Branch: master
Commit: 12f97bbef1ad3223c630d10474851eb5d67611db
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=12f97bbef1ad3223c630d10474851eb5d67611db
Author: Roberto Bagnara <bagnara at cs.unipr.it>
Date: Tue Mar 15 12:06:59 2011 +0100
For increased portability, use zero-length arrays (when available), not flexible arrays.
---
configure.ac | 4 +-
m4/Makefile.am | 2 +-
...ible_arrays.m4 => ac_cxx_zero_length_arrays.m4} | 22 ++++++++++----------
src/DB_Row.defs.hh | 4 ++-
src/DB_Row.inlines.hh | 8 +++---
src/DB_Row.templates.hh | 20 +++++++++---------
6 files changed, 31 insertions(+), 29 deletions(-)
diff --git a/configure.ac b/configure.ac
index 117e8b1..bccdcbe 100644
--- a/configure.ac
+++ b/configure.ac
@@ -703,8 +703,8 @@ AC_CXX_LONG_DOUBLE_BINARY_FORMAT
# long doubles.
#AC_CXX_LONG_DOUBLE_EXACT_OUTPUT
-# Check whether the C++ compiler supports flexible arrays.
-AC_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+# Check whether the C++ compiler supports zero-length arrays.
+AC_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
# Check whether the IEEE inexact flag is supported in C++.
AC_CXX_SUPPORTS_IEEE_INEXACT_FLAG
diff --git a/m4/Makefile.am b/m4/Makefile.am
index 313d28a..651d019 100644
--- a/m4/Makefile.am
+++ b/m4/Makefile.am
@@ -39,7 +39,7 @@ ac_check_xsb_prolog.m4 \
ac_cxx_attribute_weak.m4 \
ac_cxx_double_binary_format.m4 \
ac_cxx_double_exact_output.m4 \
-ac_cxx_flexible_arrays.m4 \
+ac_cxx_zero_length_arrays.m4 \
ac_cxx_float_binary_format.m4 \
ac_cxx_float_exact_output.m4 \
ac_cxx_ieee_inexact_flag.m4 \
diff --git a/m4/ac_cxx_flexible_arrays.m4 b/m4/ac_cxx_zero_length_arrays.m4
similarity index 81%
rename from m4/ac_cxx_flexible_arrays.m4
rename to m4/ac_cxx_zero_length_arrays.m4
index 5ad6b33..2ba7491 100644
--- a/m4/ac_cxx_flexible_arrays.m4
+++ b/m4/ac_cxx_zero_length_arrays.m4
@@ -1,4 +1,4 @@
-dnl A function to check whether the C++ compiler supports flexible arrays.
+dnl A function to check whether the C++ compiler supports zero-length arrays.
dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
dnl Copyright (C) 2010-2011 BUGSENG srl (http://bugseng.com)
dnl
@@ -21,13 +21,13 @@ dnl
dnl For the most up-to-date information see the Parma Polyhedra Library
dnl site: http://www.cs.unipr.it/ppl/ .
-AC_DEFUN([AC_CXX_SUPPORTS_FLEXIBLE_ARRAYS],
+AC_DEFUN([AC_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS],
[
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LIBS="$LIBS"
AC_LANG_PUSH(C++)
-AC_MSG_CHECKING([whether the C++ compiler supports flexible arrays])
+AC_MSG_CHECKING([whether the C++ compiler supports zero-length arrays])
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <new>
#include <cstddef>
@@ -74,9 +74,9 @@ main() {
}
]])],
AC_MSG_RESULT(yes)
- ac_cxx_supports_flexible_arrays=yes,
+ ac_cxx_supports_zero_length_arrays=yes,
AC_MSG_RESULT(no)
- ac_cxx_supports_flexible_arrays=no,
+ ac_cxx_supports_zero_length_arrays=no,
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#include <new>
#include <cstddef>
@@ -95,7 +95,7 @@ public:
class B {
private:
int capacity;
- A vec[];
+ A vec[0];
public:
void* operator new(size_t fixed_size, int c) {
@@ -123,18 +123,18 @@ main() {
}
]])],
AC_MSG_RESULT(yes)
- ac_cxx_supports_flexible_arrays=yes,
+ ac_cxx_supports_zero_length_arrays=yes,
AC_MSG_RESULT(no)
- ac_cxx_supports_flexible_arrays=no))
+ ac_cxx_supports_zero_length_arrays=no))
-if test x"$ac_cxx_supports_flexible_arrays" = xyes
+if test x"$ac_cxx_supports_zero_length_arrays" = xyes
then
value=1
else
value=0
fi
-AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS, $value,
- [Not zero if the C++ compiler supports flexible arrays.])
+AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS, $value,
+ [Not zero if the C++ compiler supports zero_length arrays.])
AC_LANG_POP(C++)
CPPFLAGS="$ac_save_CPPFLAGS"
diff --git a/src/DB_Row.defs.hh b/src/DB_Row.defs.hh
index 071738c..90a322b 100644
--- a/src/DB_Row.defs.hh
+++ b/src/DB_Row.defs.hh
@@ -432,7 +432,9 @@ private:
//! The vector of coefficients.
T vec_[
-#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ 0
+#else
1
#endif
];
diff --git a/src/DB_Row.inlines.hh b/src/DB_Row.inlines.hh
index 7db5f22..66423ac 100644
--- a/src/DB_Row.inlines.hh
+++ b/src/DB_Row.inlines.hh
@@ -37,7 +37,7 @@ template <typename T>
inline void*
DB_Row_Impl_Handler<T>::Impl::operator new(const size_t fixed_size,
const dimension_type capacity) {
-#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
return ::operator new(fixed_size + capacity*sizeof(T));
#else
PPL_ASSERT(capacity >= 1);
@@ -64,7 +64,7 @@ DB_Row_Impl_Handler<T>::Impl
return
sizeof(*this)
+ capacity*sizeof(T)
-#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
- 1*sizeof(T)
#endif
+ external_memory_in_bytes();
@@ -172,13 +172,13 @@ DB_Row<T>::DB_Row()
template <typename T>
inline void
DB_Row<T>::allocate(
-#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
const
#endif
dimension_type capacity) {
DB_Row<T>& x = *this;
PPL_ASSERT(capacity <= max_size());
-#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
if (capacity == 0)
++capacity;
#endif
diff --git a/src/DB_Row.templates.hh b/src/DB_Row.templates.hh
index 590ff43..ea6f54d 100644
--- a/src/DB_Row.templates.hh
+++ b/src/DB_Row.templates.hh
@@ -33,13 +33,13 @@ template <typename U>
void
DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
const dimension_type y_size = y.size();
-#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
// Construct in direct order: will destroy in reverse order.
for (dimension_type i = 0; i < y_size; ++i) {
construct(vec_[i], y[i], ROUND_UP);
bump_size();
}
-#else // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#else // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
if (y_size > 0) {
assign_r(vec_[0], y[0], ROUND_UP);
bump_size();
@@ -49,7 +49,7 @@ DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
bump_size();
}
}
-#endif // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#endif // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
}
template <typename T>
@@ -57,7 +57,7 @@ void
DB_Row_Impl_Handler<T>::
Impl::expand_within_capacity(const dimension_type new_size) {
PPL_ASSERT(size() <= new_size && new_size <= max_size());
-#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
if (size() == 0 && new_size > 0) {
// vec_[0] is already constructed: we just need to assign +infinity.
assign_r(vec_[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
@@ -78,7 +78,7 @@ DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
PPL_ASSERT(new_size <= old_size);
// Since ~T() does not throw exceptions, nothing here does.
set_size(new_size);
-#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
// Make sure we do not try to destroy vec_[0].
if (new_size == 0)
++new_size;
@@ -93,13 +93,13 @@ template <typename T>
void
DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
const dimension_type y_size = y.size();
-#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
// Construct in direct order: will destroy in reverse order.
for (dimension_type i = 0; i < y_size; ++i) {
new (&vec_[i]) T(y.vec_[i]);
bump_size();
}
-#else // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#else // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
if (y_size > 0) {
vec_[0] = y.vec_[0];
bump_size();
@@ -109,7 +109,7 @@ DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
bump_size();
}
}
-#endif // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#endif // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
}
template <typename T>
@@ -138,7 +138,7 @@ DB_Row<T>::OK(const dimension_type row_size,
bool is_broken = false;
#if PPL_DB_ROW_EXTRA_DEBUG
-# if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+# if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
if (x.capacity_ == 0) {
cerr << "Illegal row capacity: is 0, should be at least 1"
<< endl;
@@ -148,7 +148,7 @@ DB_Row<T>::OK(const dimension_type row_size,
// This is fine.
;
else
-# endif // !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+# endif // !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
if (x.capacity_ != row_capacity) {
cerr << "DB_Row capacity mismatch: is " << x.capacity_
<< ", should be " << row_capacity << "."
More information about the PPL-devel
mailing list