// Simple program that uses C99 restrict qualifier.
// Once GCC is fixed to output DW_TAG_restrict_type in the debuginfo
// valgrind --read-var-info=yes would get a serious error reading the
// debuginfo. This tests makes sure that a fixed GCC and a fixed valgrind
// work well together.
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59051
// https://bugs.kde.org/show_bug.cgi?id=336619
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "memcheck/memcheck.h"
/* Cause memcheck to complain about the address "a" and so to print
its best guess as to what "a" actually is. a must be addressible. */
void croak (void *aV )
{
char* a = (char*)aV;
char* undefp = malloc(1);
char saved = *a;
assert(undefp);
*a = *undefp;
(void) VALGRIND_CHECK_MEM_IS_DEFINED(a, 1);
*a = saved;
free(undefp);
}
void
bad_restrict_ptr (void * restrict bad_ptr)
{
croak ((void *) &bad_ptr);
}
char *
cpy (char * restrict s1, const char * restrict s2, size_t n)
{
char *t1 = s1;
const char *t2 = s2;
while(n-- > 0)
*t1++ = *t2++;
return s1;
}
int
main (int argc, char **argv)
{
const char *hello = "World";
size_t l = strlen (hello) + 1;
char *earth = malloc (l);
fprintf (stderr, "Hello %s\n", cpy (earth, hello, l));
free (earth);
void *bad = malloc (16);
bad_restrict_ptr (bad);
free (bad);
return 0;
}