1*67e74705SXin Li // RUN: %clang_cc1 %s -O1 -emit-llvm -o - | FileCheck %s 2*67e74705SXin Li // rdar://8315199 3*67e74705SXin Li 4*67e74705SXin Li /* Test for builtin conj, creal, cimag. */ 5*67e74705SXin Li /* Origin: Joseph Myers <[email protected]> */ 6*67e74705SXin Li 7*67e74705SXin Li extern float _Complex conjf (float _Complex); 8*67e74705SXin Li extern double _Complex conj (double _Complex); 9*67e74705SXin Li extern long double _Complex conjl (long double _Complex); 10*67e74705SXin Li 11*67e74705SXin Li extern float crealf (float _Complex); 12*67e74705SXin Li extern double creal (double _Complex); 13*67e74705SXin Li extern long double creall (long double _Complex); 14*67e74705SXin Li 15*67e74705SXin Li extern float cimagf (float _Complex); 16*67e74705SXin Li extern double cimag (double _Complex); 17*67e74705SXin Li extern long double cimagl (long double _Complex); 18*67e74705SXin Li 19*67e74705SXin Li extern void abort (void); 20*67e74705SXin Li extern void link_error (void); 21*67e74705SXin Li 22*67e74705SXin Li int main()23*67e74705SXin Limain () 24*67e74705SXin Li { 25*67e74705SXin Li /* For each type, test both runtime and compile time (constant folding) 26*67e74705SXin Li optimization. */ 27*67e74705SXin Li volatile float _Complex fc = 1.0F + 2.0iF; 28*67e74705SXin Li volatile double _Complex dc = 1.0 + 2.0i; 29*67e74705SXin Li volatile long double _Complex ldc = 1.0L + 2.0iL; 30*67e74705SXin Li /* Test floats. */ 31*67e74705SXin Li if (__builtin_conjf (fc) != 1.0F - 2.0iF) 32*67e74705SXin Li abort (); 33*67e74705SXin Li if (__builtin_conjf (1.0F + 2.0iF) != 1.0F - 2.0iF) 34*67e74705SXin Li link_error (); 35*67e74705SXin Li if (__builtin_crealf (fc) != 1.0F) 36*67e74705SXin Li abort (); 37*67e74705SXin Li if (__builtin_crealf (1.0F + 2.0iF) != 1.0F) 38*67e74705SXin Li link_error (); 39*67e74705SXin Li if (__builtin_cimagf (fc) != 2.0F) 40*67e74705SXin Li abort (); 41*67e74705SXin Li if (__builtin_cimagf (1.0F + 2.0iF) != 2.0F) 42*67e74705SXin Li link_error (); 43*67e74705SXin Li /* Test doubles. */ 44*67e74705SXin Li if (__builtin_conj (dc) != 1.0 - 2.0i) 45*67e74705SXin Li abort (); 46*67e74705SXin Li if (__builtin_conj (1.0 + 2.0i) != 1.0 - 2.0i) 47*67e74705SXin Li link_error (); 48*67e74705SXin Li if (__builtin_creal (dc) != 1.0) 49*67e74705SXin Li abort (); 50*67e74705SXin Li if (__builtin_creal (1.0 + 2.0i) != 1.0) 51*67e74705SXin Li link_error (); 52*67e74705SXin Li if (__builtin_cimag (dc) != 2.0) 53*67e74705SXin Li abort (); 54*67e74705SXin Li if (__builtin_cimag (1.0 + 2.0i) != 2.0) 55*67e74705SXin Li link_error (); 56*67e74705SXin Li /* Test long doubles. */ 57*67e74705SXin Li if (__builtin_conjl (ldc) != 1.0L - 2.0iL) 58*67e74705SXin Li abort (); 59*67e74705SXin Li if (__builtin_conjl (1.0L + 2.0iL) != 1.0L - 2.0iL) 60*67e74705SXin Li link_error (); 61*67e74705SXin Li if (__builtin_creall (ldc) != 1.0L) 62*67e74705SXin Li abort (); 63*67e74705SXin Li if (__builtin_creall (1.0L + 2.0iL) != 1.0L) 64*67e74705SXin Li link_error (); 65*67e74705SXin Li if (__builtin_cimagl (ldc) != 2.0L) 66*67e74705SXin Li abort (); 67*67e74705SXin Li if (__builtin_cimagl (1.0L + 2.0iL) != 2.0L) 68*67e74705SXin Li link_error (); 69*67e74705SXin Li } 70*67e74705SXin Li 71*67e74705SXin Li // CHECK-NOT: link_error 72