From 2756f97c802d6c461cab2a865a98a09504410083 Mon Sep 17 00:00:00 2001
From: q66 <daniel@octaforge.org>
Date: Sun, 5 Sep 2021 15:21:39 +0200
Subject: [PATCH] Fix various broken macros when using GCC extension vectors

Commit 8e5c25109898fa4894df810a546b26c387eaae93 introduced
some pragmas, however those unintentionally change the types
of the macros, as the diagnostic pop pragma becomes the last
statement and the type of the expression becomes void.

Work around this by using a temporary and evaluating to that
before popping.
---
 include/graphene-simd4f.h | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/include/graphene-simd4f.h b/include/graphene-simd4f.h
index f95fe04..ea29ba3 100644
--- a/include/graphene-simd4f.h
+++ b/include/graphene-simd4f.h
@@ -858,13 +858,14 @@ typedef int graphene_simd4i_t __attribute__((vector_size (16)));
   (__extension__ ({ \
     _Pragma ("GCC diagnostic push") \
     _Pragma ("GCC diagnostic ignored \"-Wfloat-equal\"") \
-    (graphene_simd4f_t) { \
+    const graphene_simd4f_t __val = (graphene_simd4f_t) { \
       (v)[0] != 0.f ? 1.f / (v)[0] : 0.f, \
       (v)[1] != 0.f ? 1.f / (v)[1] : 0.f, \
       (v)[2] != 0.f ? 1.f / (v)[2] : 0.f, \
       (v)[3] != 0.f ? 1.f / (v)[3] : 0.f, \
     }; \
     _Pragma ("GCC diagnostic pop") \
+    __val; \
   }))
 
 # define graphene_simd4f_sqrt(v) \
@@ -881,13 +882,14 @@ typedef int graphene_simd4i_t __attribute__((vector_size (16)));
   (__extension__ ({ \
     _Pragma ("GCC diagnostic push") \
     _Pragma ("GCC diagnostic ignored \"-Wfloat-equal\"") \
-    (graphene_simd4f_t) { \
+    const graphene_simd4f_t __val = (graphene_simd4f_t) { \
       (v)[0] != 0.f ? 1.f / sqrtf ((v)[0]) : 0.f, \
       (v)[1] != 0.f ? 1.f / sqrtf ((v)[1]) : 0.f, \
       (v)[2] != 0.f ? 1.f / sqrtf ((v)[2]) : 0.f, \
       (v)[3] != 0.f ? 1.f / sqrtf ((v)[3]) : 0.f, \
     }; \
     _Pragma ("GCC diagnostic pop") \
+    __val; \
   }))
 
 # define graphene_simd4f_add(a,b)       (__extension__ ({ (graphene_simd4f_t) ((a) + (b)); }))
@@ -1003,11 +1005,12 @@ typedef int graphene_simd4i_t __attribute__((vector_size (16)));
     _Pragma ("GCC diagnostic push") \
     _Pragma ("GCC diagnostic ignored \"-Wfloat-equal\"") \
     const graphene_simd4i_t __res = (a) == (b); \
-    (bool) (__res[0] != 0 && \
+    const bool __val = (bool) (__res[0] != 0 && \
             __res[1] != 0 && \
             __res[2] != 0 && \
             __res[3] != 0); \
     _Pragma ("GCC diagnostic pop") \
+    __val; \
   }))
 
 # define graphene_simd4f_cmp_neq(a,b) (!graphene_simd4f_cmp_eq (a,b))
@@ -1017,11 +1020,12 @@ typedef int graphene_simd4i_t __attribute__((vector_size (16)));
     _Pragma ("GCC diagnostic push") \
     _Pragma ("GCC diagnostic ignored \"-Wfloat-equal\"") \
     const graphene_simd4i_t __res = (a) < (b); \
-    (bool) (__res[0] != 0 && \
+    const bool __val = (bool) (__res[0] != 0 && \
             __res[1] != 0 && \
             __res[2] != 0 && \
             __res[3] != 0); \
     _Pragma ("GCC diagnostic pop") \
+    __val; \
   }))
 
 # define graphene_simd4f_cmp_le(a,b) \
@@ -1029,11 +1033,12 @@ typedef int graphene_simd4i_t __attribute__((vector_size (16)));
     _Pragma ("GCC diagnostic push") \
     _Pragma ("GCC diagnostic ignored \"-Wfloat-equal\"") \
     const graphene_simd4i_t __res = (a) <= (b); \
-    (bool) (__res[0] != 0 && \
+    const bool __val = (bool) (__res[0] != 0 && \
             __res[1] != 0 && \
             __res[2] != 0 && \
             __res[3] != 0); \
     _Pragma ("GCC diagnostic pop") \
+    __val; \
   }))
 
 # define graphene_simd4f_cmp_ge(a,b) \
@@ -1041,11 +1046,12 @@ typedef int graphene_simd4i_t __attribute__((vector_size (16)));
     _Pragma ("GCC diagnostic push") \
     _Pragma ("GCC diagnostic ignored \"-Wfloat-equal\"") \
     const graphene_simd4i_t __res = (a) >= (b); \
-    (bool) (__res[0] != 0 && \
+    const bool __val = (bool) (__res[0] != 0 && \
             __res[1] != 0 && \
             __res[2] != 0 && \
             __res[3] != 0); \
     _Pragma ("GCC diagnostic pop") \
+    __val; \
   }))
 
 # define graphene_simd4f_cmp_gt(a,b) \
@@ -1053,11 +1059,12 @@ typedef int graphene_simd4i_t __attribute__((vector_size (16)));
     _Pragma ("GCC diagnostic push") \
     _Pragma ("GCC diagnostic ignored \"-Wfloat-equal\"") \
     const graphene_simd4i_t __res = (a) > (b); \
-    (bool) (__res[0] != 0 && \
+    const bool __val = (bool) (__res[0] != 0 && \
             __res[1] != 0 && \
             __res[2] != 0 && \
             __res[3] != 0); \
     _Pragma ("GCC diagnostic pop") \
+    __val; \
   }))
 
 # define graphene_simd4f_neg(s) \
-- 
2.32.0

