diff options
author | Scott Murray <scott.murray@konsulko.com> | 2021-07-12 15:51:18 -0400 |
---|---|---|
committer | Scott Murray <scott.murray@konsulko.com> | 2021-07-12 20:48:08 +0000 |
commit | c5c15f86d2eaaa5ac72f0ac00634a978326daae9 (patch) | |
tree | dd23637a7c453c663e3070f67bcfbf1bfd8cdfc8 | |
parent | 9a8aea1b682f522d7b278312b9bd85ed12fab820 (diff) |
gcc 11.x fixesneedlefish_13.93.0needlefish/13.93.0marlin_12.93.0marlin_12.92.0marlin_12.91.0marlin_12.90.1marlin/12.93.0marlin/12.92.0marlin/12.91.0marlin/12.90.113.93.012.93.012.92.012.91.012.90.1
Changes for compiling with gcc 11.x:
- g++ now seems to instantiate duplicate entries for the set member
function in the contextclass template class in binding-wrap.hpp.
The use of a closure as a default argument value seems to be the
culprit, as it seems there are longstanding issues with respect to
using closures like that and resulting symbol names (i.e. the use
of a closure isn't necessarily recognized as generating unique
instantiations). In theory, C++17 should explicitly allow this
when the closure has no captures, but bumping up to -std=gnu++17
did not fix the issue. To avoid it, replace the closure usage
with a private static member function.
- In afb-hook.c, tweaked the ignoring of the writev return code to
make the stricter checking in gcc 11 happy.
- In decode_base64 in wrap-json.c, initialize u16 as gcc now seems
to miss that it will be initialized on the first loop iteration.
Bug-AGL: SPEC-3819
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Change-Id: I8876db196b46cc35ecd2798e20d5ec3425df865e
-rw-r--r-- | include/afb/c++/binding-wrap.hpp | 3 | ||||
-rw-r--r-- | src/afb-hook.c | 2 | ||||
-rw-r--r-- | src/wrap-json.c | 2 |
3 files changed, 4 insertions, 3 deletions
diff --git a/include/afb/c++/binding-wrap.hpp b/include/afb/c++/binding-wrap.hpp index f94d1bc5..b798cf11 100644 --- a/include/afb/c++/binding-wrap.hpp +++ b/include/afb/c++/binding-wrap.hpp @@ -300,6 +300,7 @@ public: friend class req; afb_req_t req_; contextclass(afb_req_t r) : req_(r) {} + static void default_destroyer(T*t) { delete t; } public: inline operator T *() const { return get(); } @@ -312,7 +313,7 @@ public: nullptr)); } - inline void set(T *value, void (*destroyer)(T*) = [](T*t){delete t;}) const { + inline void set(T *value, void (*destroyer)(T*) = default_destroyer) const { afb_req_context(req_, 1, nullptr, reinterpret_cast<void(*)(void*)>(destroyer), diff --git a/src/afb-hook.c b/src/afb-hook.c index d2ea0b66..9bd480b6 100644 --- a/src/afb-hook.c +++ b/src/afb-hook.c @@ -201,7 +201,7 @@ static void _hook_(const char *fmt1, const char *fmt2, va_list arg2, ...) iov[4].iov_base = (void*)&chars[9]; iov[4].iov_len = 1; - (void)writev(2, iov, 5); + (void)!writev(2, iov, 5); free(mem1); free(mem2); diff --git a/src/wrap-json.c b/src/wrap-json.c index 6fce73b2..3a764828 100644 --- a/src/wrap-json.c +++ b/src/wrap-json.c @@ -200,7 +200,7 @@ static int decode_base64( size_t *decodedlen, int url) { - uint16_t u16; + uint16_t u16 = 0; uint8_t u8, *result; size_t in, out, iin; char c; |