]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUILD: atomic: fix peers build regression on gcc < 4.7 after recent changes
authorWilly Tarreau <w@1wt.eu>
Thu, 11 Apr 2024 14:34:03 +0000 (16:34 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 11 Apr 2024 14:41:08 +0000 (16:41 +0200)
Recent commit 4c1480f13b ("MINOR: stick-tables: mark the seen stksess
with a flag "seen"") introduced a build regression on older versions of
gcc before 4.7. This is in the old __sync_ API, the HA_ATOMIC_LOAD()
implementation uses an intermediary return value called "ret" that is
of the same name as the variable passed in argument to the macro in the
aforementioned commit. As such, the compiler complains with a cryptic
error:
  src/peers.c: In function 'peer_teach_process_stksess_lookup':
  src/peers.c:1502: error: invalid type argument of '->' (have 'int')

The solution is to avoid referencing the argument in the expression and
using an intermediary variable for the pointer as done elsewhere in the
code. It seems there's no other place affected with this. It probably
does not need to be backported since this code is antique and very rarely
used nowadays.

include/haproxy/atomic.h

index 93b143c94dc17d5fc0b19d2d2ca1fcae51c1452f..146f2ad77e43b2d28cdb0a1c0526bff15ad706b3 100644 (file)
 
 #define HA_ATOMIC_LOAD(val)                                                  \
         ({                                                                   \
-               typeof(*(val)) ret =                                          \
-                   ({ __sync_synchronize(); *(volatile typeof(val))val; });  \
+               typeof((val)) __val_load = (val);                             \
+               typeof(*(val)) __ret_val =                                    \
+                       ({ __sync_synchronize(); *(volatile typeof(__val_load))__val_load; }); \
                __sync_synchronize();                                         \
-               ret;                                                          \
+               __ret_val;                                                    \
        })
 
 #define HA_ATOMIC_STORE(val, new)                                      \