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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
// RUN: %clang_cc1 -fsyntax-only -verify %s -triple i686-linux-gnu -target-feature -x87
// RUN: %clang_cc1 -fsyntax-only -verify %s -triple i686-linux-gnu -DNOERROR
#ifdef NOERROR
// expected-no-diagnostics
#endif
typedef long double long_double;
// Declaration is fine, unless it is called or defined.
double decl(long_double x, long_double y);
template <typename T>
T decl_ld_del(T);
// No code is generated for deleted functions
long_double decl_ld_del(long_double) = delete;
double decl_ld_del(double) = delete;
float decl_ld_del(float) = delete;
#ifndef NOERROR
// expected-error@+4{{'def' requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
// expected-note@+3{{'def' defined here}}
// expected-note@+2{{'x' defined here}}
#endif
int def(long_double x) {
#ifndef NOERROR
// expected-error@+2{{'x' requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
#endif
return (int)x;
}
#ifndef NOERROR
// expected-note@+3{{'ld_args' defined here}}
// expected-note@+2{{'ld_args' defined here}}
#endif
int ld_args(long_double x, long_double y);
int call1(float x, float y) {
#ifndef NOERROR
// expected-error@+2 2{{'ld_args' requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
#endif
return ld_args(x, y);
}
#ifndef NOERROR
// expected-note@+2{{'ld_ret' defined here}}
#endif
long_double ld_ret(double x, double y);
int call2(float x, float y) {
#ifndef NOERROR
// expected-error@+2{{'ld_ret' requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
#endif
return (int)ld_ret(x, y);
}
int binop(double x, double y) {
#ifndef NOERROR
// expected-error@+2 2{{expression requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
#endif
double z = (long_double)x * (long_double)y;
return (int)z;
}
void assign1(long_double *ret, double x) {
#ifndef NOERROR
// expected-error@+2{{expression requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
#endif
*ret = x;
}
struct st_long_double1 {
#ifndef NOERROR
// expected-note@+2{{'ld' defined here}}
#endif
long_double ld;
};
struct st_long_double2 {
#ifndef NOERROR
// expected-note@+2{{'ld' defined here}}
#endif
long_double ld;
};
struct st_long_double3 {
#ifndef NOERROR
// expected-note@+2{{'ld' defined here}}
#endif
long_double ld;
};
void assign2() {
struct st_long_double1 st;
#ifndef NOERROR
// expected-error@+3{{expression requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
// expected-error@+2{{'ld' requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
#endif
st.ld = 0.42;
}
void assign3() {
struct st_long_double2 st;
#ifndef NOERROR
// expected-error@+3{{expression requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
// expected-error@+2{{'ld' requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
#endif
st.ld = 42;
}
void assign4(double d) {
struct st_long_double3 st;
#ifndef NOERROR
// expected-error@+3{{expression requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
// expected-error@+2{{'ld' requires 'long_double' (aka 'long double') type support, but target 'i686-unknown-linux-gnu' does not support it}}
#endif
st.ld = d;
}
void assign5() {
// unused variable declaration is fine
long_double ld = 0.42;
}
double d_ret1(float x) {
return 0.0;
}
double d_ret2(float x);
int d_ret3(float x) {
return (int)d_ret2(x);
}
float f_ret1(float x) {
return 0.0f;
}
float f_ret2(float x);
int f_ret3(float x) {
return (int)f_ret2(x);
}
|