Blame gnulib-tests/test-stdalign.c

Packit Service fdd496
/* Test of <stdalign.h>.
Packit Service fdd496
   Copyright 2009-2017 Free Software Foundation, Inc.
Packit Service fdd496
Packit Service fdd496
   This program is free software: you can redistribute it and/or modify
Packit Service fdd496
   it under the terms of the GNU General Public License as published by
Packit Service fdd496
   the Free Software Foundation; either version 3 of the License, or
Packit Service fdd496
   (at your option) any later version.
Packit Service fdd496
Packit Service fdd496
   This program is distributed in the hope that it will be useful,
Packit Service fdd496
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fdd496
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service fdd496
   GNU General Public License for more details.
Packit Service fdd496
Packit Service fdd496
   You should have received a copy of the GNU General Public License
Packit Service fdd496
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service fdd496
Packit Service fdd496
/* Written by Paul Eggert, inspired by Bruno Haible's test-alignof.c.  */
Packit Service fdd496
Packit Service fdd496
#include <config.h>
Packit Service fdd496
Packit Service fdd496
#include <stdalign.h>
Packit Service fdd496
Packit Service fdd496
#include <stddef.h>
Packit Service fdd496
#include <stdint.h>
Packit Service fdd496
Packit Service fdd496
#include "verify.h"
Packit Service fdd496
Packit Service fdd496
#include "macros.h"
Packit Service fdd496
Packit Service fdd496
typedef long double longdouble;
Packit Service fdd496
typedef struct { char a[1]; } struct1;
Packit Service fdd496
typedef struct { char a[2]; } struct2;
Packit Service fdd496
typedef struct { char a[3]; } struct3;
Packit Service fdd496
typedef struct { char a[4]; } struct4;
Packit Service fdd496
Packit Service fdd496
verify (__alignof_is_defined == 1);
Packit Service fdd496
#ifndef alignof
Packit Service fdd496
# error "alignof is not a macro"
Packit Service fdd496
#endif
Packit Service fdd496
Packit Service fdd496
#if __alignas_is_defined
Packit Service fdd496
verify (__alignas_is_defined == 1);
Packit Service fdd496
# ifndef alignas
Packit Service fdd496
#  error "alignas is not a macro"
Packit Service fdd496
# endif
Packit Service fdd496
/* mingw can go up only to 8.  8 is all that GNU Emacs needs, so let's
Packit Service fdd496
   limit the test to 8 for now.  */
Packit Service fdd496
# define TEST_ALIGNMENT 8
Packit Service fdd496
#else
Packit Service fdd496
# define _Alignas(alignment)
Packit Service fdd496
# define alignas(alignment)
Packit Service fdd496
# define TEST_ALIGNMENT 1
Packit Service fdd496
#endif
Packit Service fdd496
Packit Service fdd496
#define CHECK_STATIC(type) \
Packit Service fdd496
  typedef struct { char slot1; type slot2; } type##_helper; \
Packit Service fdd496
  verify (alignof (type) == offsetof (type##_helper, slot2)); \
Packit Service fdd496
  verify (_Alignof (type) == alignof (type)); \
Packit Service fdd496
  const int type##_alignment = alignof (type); \
Packit Service fdd496
  type alignas (TEST_ALIGNMENT) static_##type##_alignas; \
Packit Service fdd496
  type _Alignas (TEST_ALIGNMENT) static_##type##_Alignas
Packit Service fdd496
Packit Service fdd496
#define CHECK_ALIGNED(var) ASSERT ((uintptr_t) &(var) % TEST_ALIGNMENT == 0)
Packit Service fdd496
Packit Service fdd496
CHECK_STATIC (char);
Packit Service fdd496
CHECK_STATIC (short);
Packit Service fdd496
CHECK_STATIC (int);
Packit Service fdd496
CHECK_STATIC (long);
Packit Service fdd496
#ifdef INT64_MAX
Packit Service fdd496
CHECK_STATIC (int64_t);
Packit Service fdd496
#endif
Packit Service fdd496
CHECK_STATIC (float);
Packit Service fdd496
CHECK_STATIC (double);
Packit Service fdd496
/* CHECK_STATIC (longdouble); */
Packit Service fdd496
CHECK_STATIC (struct1);
Packit Service fdd496
CHECK_STATIC (struct2);
Packit Service fdd496
CHECK_STATIC (struct3);
Packit Service fdd496
CHECK_STATIC (struct4);
Packit Service fdd496
Packit Service fdd496
int
Packit Service fdd496
main ()
Packit Service fdd496
{
Packit Service fdd496
#if defined __SUNPRO_C
Packit Service fdd496
  /* Avoid a test failure due to Sun Studio Developer Bug Report #2125432.  */
Packit Service fdd496
  fputs ("Skipping test: known Sun C compiler bug\n", stderr);
Packit Service fdd496
  return 77;
Packit Service fdd496
#elif defined __HP_cc && __ia64
Packit Service fdd496
  /* Avoid a test failure due to HP-UX Itanium cc bug; see:
Packit Service fdd496
     http://lists.gnu.org/archive/html/bug-gnulib/2017-03/msg00078.html  */
Packit Service fdd496
  fputs ("Skipping test: known HP-UX Itanium cc compiler bug\n", stderr);
Packit Service fdd496
  return 77;
Packit Service fdd496
#else
Packit Service fdd496
  CHECK_ALIGNED (static_char_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_char_Alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_short_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_short_Alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_int_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_int_Alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_long_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_long_Alignas);
Packit Service fdd496
# ifdef INT64_MAX
Packit Service fdd496
  CHECK_ALIGNED (static_int64_t_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_int64_t_Alignas);
Packit Service fdd496
# endif
Packit Service fdd496
  CHECK_ALIGNED (static_float_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_float_Alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_double_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_double_Alignas);
Packit Service fdd496
  /* CHECK_ALIGNED (static_longdouble_alignas); */
Packit Service fdd496
  /* CHECK_ALIGNED (static_longdouble_Alignas); */
Packit Service fdd496
  CHECK_ALIGNED (static_struct1_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_struct1_Alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_struct2_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_struct2_Alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_struct3_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_struct3_Alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_struct4_alignas);
Packit Service fdd496
  CHECK_ALIGNED (static_struct4_Alignas);
Packit Service fdd496
  return 0;
Packit Service fdd496
#endif
Packit Service fdd496
}