summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYi-Hung Wei <yihung.wei@gmail.com>2017-11-01 14:40:27 -0700
committerBen Pfaff <blp@ovn.org>2017-11-02 11:23:38 -0700
commit274cd1f188de5d751ed014169dae54ed64e5c916 (patch)
treea1312a85d1bff6fde5e27635e241fdb19eff05f4 /lib
parent36e6714054534b552413ba3b8e7eab49f965dc29 (diff)
downloadopenvswitch-274cd1f188de5d751ed014169dae54ed64e5c916.tar.gz
packets: Fix C++ compilation issues when include packets.h
This patch fixes three C++ compilation errors when it includes "lib/packets.h". 1) Fix in "include/openvswitch/util.h" is to avoid duplicated named_member__ in struct pkt_metadata. 2) Fix in "lib/packets.h" is because designated initializers are not implemented in GNU C++ [1]. 3) Fix in "lib/util.h" is because __builtin_types_compatible_p and __builtin_choose_expr are only supported in GCC. I use one solution for C++ that is type-safe and works at compile time from [2]. [1]: https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html [2]: https://goo.gl/xNe48A Signed-off-by: Yi-Hung Wei <yihung.wei@gmail.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/packets.h4
-rw-r--r--lib/util.h15
2 files changed, 17 insertions, 2 deletions
diff --git a/lib/packets.h b/lib/packets.h
index c5915a0f8..461f488a8 100644
--- a/lib/packets.h
+++ b/lib/packets.h
@@ -1107,7 +1107,9 @@ static inline bool ipv6_addr_is_multicast(const struct in6_addr *ip) {
static inline struct in6_addr
in6_addr_mapped_ipv4(ovs_be32 ip4)
{
- struct in6_addr ip6 = { .s6_addr = { [10] = 0xff, [11] = 0xff } };
+ struct in6_addr ip6;
+ memset(&ip6, 0, sizeof(ip6));
+ ip6.s6_addr[10] = 0xff, ip6.s6_addr[11] = 0xff;
memcpy(&ip6.s6_addr[12], &ip4, 4);
return ip6;
}
diff --git a/lib/util.h b/lib/util.h
index 764e0a08a..3c43c2c35 100644
--- a/lib/util.h
+++ b/lib/util.h
@@ -31,7 +31,7 @@
extern char *program_name;
#define __ARRAY_SIZE_NOCHECK(ARRAY) (sizeof(ARRAY) / sizeof((ARRAY)[0]))
-#ifdef __GNUC__
+#if __GNUC__ && !defined(__cplusplus)
/* return 0 for array types, 1 otherwise */
#define __ARRAY_CHECK(ARRAY) \
!__builtin_types_compatible_p(typeof(ARRAY), typeof(&ARRAY[0]))
@@ -41,6 +41,19 @@ extern char *program_name;
#define __ARRAY_SIZE(ARRAY) \
__builtin_choose_expr(__ARRAY_CHECK(ARRAY), \
__ARRAY_SIZE_NOCHECK(ARRAY), __ARRAY_FAIL(ARRAY))
+#elif defined(__cplusplus)
+#define __ARRAY_SIZE(ARRAY) ( \
+ 0 * sizeof(reinterpret_cast<const ::Bad_arg_to_ARRAY_SIZE *>(ARRAY)) + \
+ 0 * sizeof(::Bad_arg_to_ARRAY_SIZE::check_type((ARRAY), &(ARRAY))) + \
+ sizeof(ARRAY) / sizeof((ARRAY)[0]) )
+
+struct Bad_arg_to_ARRAY_SIZE {
+ class Is_pointer;
+ class Is_array {};
+ template <typename T>
+ static Is_pointer check_type(const T *, const T * const *);
+ static Is_array check_type(const void *, const void *);
+};
#else
#define __ARRAY_SIZE(ARRAY) __ARRAY_SIZE_NOCHECK(ARRAY)
#endif