File graphviz-aliasing-fixes.patch of Package graphviz

--- lib/agraph/edge.c
+++ lib/agraph/edge.c
@@ -149,28 +149,29 @@
 
 void agedgesetop(Agraph_t * g, Agedge_t * e, int ins)
 {
-    Dtlink_t **seq_set, **id_set;
+    union {
+	Dtlink_t **dtlink;
+	Agedge_t **agedge;
+    } seq_set;
+    Dtlink_t **id_set;
     Agnode_t *n;		/* node where <e> is referenced */
-    Agedge_t **tmp;		
 
     if (AGTYPE(e) == AGOUTEDGE) {
 	n = AGOUT2IN(e)->node;
-	tmp = &(n->out); /* avoiding - "dereferencing type-punned pointer will break strict-aliasing rules" */
-	seq_set = (Dtlink_t **)tmp;
+	seq_set.agedge = &(n->out);
 	id_set = &(n->outid);
     } else {
 	n = AGIN2OUT(e)->node;
-	tmp = &(n->in);  
-	seq_set = (Dtlink_t **)tmp;
+	seq_set.agedge = &(n->in);
 	id_set = &(n->inid);
     }
 
-    dtrestore(g->e_seq, *seq_set);
+    dtrestore(g->e_seq, *seq_set.dtlink);
     if (ins)
 	dtinsert(g->e_seq, e);
     else
 	dtdelete(g->e_seq, e);
-    *seq_set = dtextract(g->e_seq);
+    *seq_set.dtlink = dtextract(g->e_seq);
 
     dtrestore(g->e_id, *id_set);
     if (ins)
--- lib/agraph/flatten.c
+++ lib/agraph/flatten.c
@@ -26,13 +26,17 @@
 
 void agflatten_edges(Agraph_t * g, Agnode_t * n)
 {
-    Agedge_t **tmp;
 
-    tmp = &(n->out); /* avoiding - "dereferencing type-punned pointer will break strict-aliasing rules" */
+    union {
+    	Dtlink_t **dtlink;
+    	Agedge_t **agedge;
+	} out, in;
+
+    out.agedge = & (n->out);
+    in.agedge = & (n->in);
+    agflatten_elist(g->e_seq, out.dtlink);
+    agflatten_elist(g->e_seq, in.dtlink);
 
-    agflatten_elist(g->e_seq, (Dtlink_t **) tmp);
-    tmp = &(n->in);
-    agflatten_elist(g->e_seq, (Dtlink_t **) tmp);
 }
 
 void agflatten(Agraph_t * g, int flag)
--- lib/gd/fontwheeltest.c
+++ lib/gd/fontwheeltest.c
@@ -21,8 +21,10 @@
 dowheel (gdImagePtr im, int color, char *fontfile, int fontsize,
 	double angle, int x, int y, int offset, char *string)
 {
-  int brect[8];
-  gdPoint points[4];
+  union {
+    int coords[8];
+    gdPoint points[4];
+  } brect;
   int i;
   FILE *err;
   double curangrads, curang, x0, y0;
@@ -42,24 +44,16 @@
 
       /* The case of newlines is taken care of in the gdImageStringTTF call */
 #if defined(OLDER_GD)
-      cp = gdImageStringTTF (im, brect, color, fontfile, fontsize,
+      cp = gdImageStringTTF (im, brect.coords, color, fontfile, fontsize,
 			  curangrads, x0, y0, string);
 #else
-      cp = gdImageStringFT (im, brect, color, fontfile, fontsize,
+      cp = gdImageStringFT (im, brect.coords, color, fontfile, fontsize,
 			 curangrads, x0, y0, string);
 #endif
       if (cp)
 	doerr (err, cp);
 
-      /* FIXME - this is silly, but if we try to cast int[] to gdPointPtr
-       * we get a "warning: dereferencing type-punned pointer will break strict -aliasing rules" from gcc
-       * The proper fix probably requires an API change to use gdPoint[] in gdImageString*
-       */
-      for (i = 0; i < 4; i++) {
-	points[i].x = brect[2*i];
-	points[i].y = brect[2*i + 1];
-      }
-      gdImagePolygon (im, points, 4, color);
+      gdImagePolygon (im, brect.points, 4, color);
     }
 
   fclose (err);
openSUSE Build Service is sponsored by