| /* 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; |
| } |