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);
}
|