/* PSPP - a program for statistical analysis.
- Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+ Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
"valgrind --leak-check=yes --show-reachable=yes" should give a
clean report. */
+/* GCC 4.3 miscompiles some of the tests below, so we do not run
+ these tests on GCC 4.3. This is a bug in GCC 4.3 triggered by
+ the test program, not a bug in the library under test. GCC
+ 4.2 or earlier and GCC 4.4 or later do not have this bug.
+
+ Here is a minimal test program that demonstrates the same or a
+ similar bug in GCC 4.3:
+
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ struct node
+ {
+ struct node *next;
+ unsigned int data1;
+ int data2;
+ };
+ struct list
+ {
+ struct node *head;
+ int dummy;
+ };
+
+ static void *
+ xmalloc (int n)
+ {
+ return malloc (n);
+ }
+
+ static void
+ check_list (struct list *list)
+ {
+ int i __attribute__((unused));
+ struct node *e;
+ for (e = list->head; e != NULL; e = e->next)
+ if (e->data1 != e->data2)
+ abort ();
+ }
+
+ int
+ main (void)
+ {
+ #define MAX_ELEMS 2
+ struct node *elements = xmalloc (MAX_ELEMS * sizeof *elements);
+ int *values = xmalloc (MAX_ELEMS * sizeof *values);
+ struct list list;
+ int i;
+
+ list.head = NULL;
+ for (i = 0; i < MAX_ELEMS; i++)
+ {
+ values[i] = elements[i].data2 = i;
+ elements[i].data1 = elements[i].data2;
+ elements[i].next = list.head;
+ list.head = &elements[i];
+ }
+ check_list (&list);
+ return 0;
+ }
+*/
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
exit (EXIT_FAILURE);
}
+static void *xmalloc (size_t n) MALLOC_LIKE;
+static void *xnmalloc (size_t n, size_t m) MALLOC_LIKE;
+static void *xmemdup (const void *p, size_t n) MALLOC_LIKE;
+
/* Allocates and returns N bytes of memory. */
static void *
xmalloc (size_t n)
struct hmap hmap;
int i, j;
+#if __GNUC__ == 4 && __GNUC_MINOR__ == 3
+ return;
+#endif /* GCC 4.3 */
+
hmap_init (&hmap);
e[0] = xnmalloc (max_elems, sizeof *e[0]);
e[1] = xnmalloc (max_elems, sizeof *e[1]);
struct hmap *working, *empty;
int i;
+#if __GNUC__ == 4 && __GNUC_MINOR__ == 3
+ return;
+#endif /* GCC 4.3 */
+
hmap_init (&a);
hmap_init (&b);
working = &a;
putchar ('\n');
+#if __GNUC__ == 4 && __GNUC_MINOR__ == 3
+ /* We skipped some of the tests, so return a value that
+ Automake will interpret as "skipped", instead of one that
+ means success. */
+ return 77;
+#else
return 0;
+#endif
}