Blame gnulib/tests/test-stdalign.c

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