/* Copyright (C) 2003 Free Software Foundation.

   Check that built-in cabs, cabsf and cabsl functions don't
   break anything and produces the expected results.

   Written by Roger Sayle, 1st June 2003.  */

/* { dg-do link } */
/* { dg-options "-O2 -ffast-math" } */
/* APPLE LOCAL begin mainline 2005-09-01 3449986 */
/* { dg-options "-O2 -ffast-math -mmacosx-version-min=10.3" { target powerpc-*-darwin* } } */

/* APPLE LOCAL end mainline 2005-09-01 3449986 */
#include "builtins-config.h"

extern void link_error(void);

extern float cabsf (float _Complex);
extern double cabs (double _Complex);
extern long double cabsl (long double _Complex);

int
main (void)
{
  /* For each type, test both runtime and compile time (constant folding)
     optimization.  */
  float _Complex fc = 3.0F + 4.0iF;
  double _Complex dc = 3.0 + 4.0i;
  long double _Complex ldc = 3.0L + 4.0iL;

#ifdef HAVE_C99_RUNTIME
  /* Test floats.  */
  if (cabsf (fc) != 5.0F)
    link_error ();
  if (__builtin_cabsf (fc) != 5.0F)
    link_error ();
  if (cabsf (3.0F + 4.0iF) != 5.0F)
    link_failure ();
  if (__builtin_cabsf (3.0F + 4.0iF) != 5.0F)
    link_failure ();
#endif

  /* Test doubles.  */
  if (cabs (dc) != 5.0)
    link_error ();
  if (__builtin_cabs (dc) != 5.0)
    link_error ();
  if (cabs (3.0 + 4.0i) != 5.0)
    link_failure ();
  if (__builtin_cabs (3.0 + 4.0i) != 5.0)
    link_failure ();

#ifdef HAVE_C99_RUNTIME
  /* Test long doubles.  */
  if (cabsl (ldc) != 5.0L)
    link_error ();
  if (__builtin_cabsl (ldc) != 5.0L)
    link_error ();
  if (cabsl (3.0L + 4.0iL) != 5.0L)
    link_failure ();
  if (__builtin_cabsl (3.0L + 4.0iL) != 5.0L)
    link_failure ();
#endif

  return 0;
}

