summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/torture/builtin-cproj-2.c
blob: 39331651f193f37d387797397f605531881788b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/* Copyright (C) 2010  Free Software Foundation.

   Verify that folding of built-in cproj is correctly performed by the
   compiler.  With -ffinite-math-only all cproj calls should be
   eliminated regardless of what the argument is, or what is known
   about it.

   Origin: Kaveh R. Ghazi,  April 9, 2010.  */

/* { dg-do link } */
/* { dg-options "-ffinite-math-only" } */

/* All references to link_error should go away at compile-time.  The
   argument is the __LINE__ number.  It appears in the tree dump file
   and aids in debugging should any of the tests fail.  */
extern void link_error(int);

#define CPROJ(X) __builtin_cproj(X)
#define CPROJF(X) __builtin_cprojf(X)
#define CPROJL(X) __builtin_cprojl(X)

/* Test that the supplied expressions eliminte the cproj call.  */
#define TEST_EXPRS(LD_EXPR, D_EXPR, F_EXPR) do { \
  if (CPROJF(F_EXPR) != (F_EXPR)) \
    link_error (__LINE__); \
  if (CPROJ(D_EXPR) != (D_EXPR)) \
    link_error (__LINE__); \
  if (CPROJL(LD_EXPR) != (LD_EXPR)) \
    link_error (__LINE__); \
} while (0)

void foo (_Complex long double cld, _Complex double cd, _Complex float cf)
{
#ifdef __OPTIMIZE__
  TEST_EXPRS (cld, cd, cf);
  TEST_EXPRS (cld*2, cd*2, cf*2);
  TEST_EXPRS (cld*cld, cd*cd, cf*cf);
#endif

  return;
}

int main (void)
{
  return 0;
}