1*da0073e9SAndroid Build Coastguard Worker #pragma once
2*da0073e9SAndroid Build Coastguard Worker
3*da0073e9SAndroid Build Coastguard Worker #include <c10/util/BFloat16.h>
4*da0073e9SAndroid Build Coastguard Worker #include <c10/util/Half.h>
5*da0073e9SAndroid Build Coastguard Worker
6*da0073e9SAndroid Build Coastguard Worker C10_CLANG_DIAGNOSTIC_PUSH()
7*da0073e9SAndroid Build Coastguard Worker #if C10_CLANG_HAS_WARNING("-Wimplicit-float-conversion")
8*da0073e9SAndroid Build Coastguard Worker C10_CLANG_DIAGNOSTIC_IGNORE("-Wimplicit-float-conversion")
9*da0073e9SAndroid Build Coastguard Worker #endif
10*da0073e9SAndroid Build Coastguard Worker
11*da0073e9SAndroid Build Coastguard Worker namespace std {
12*da0073e9SAndroid Build Coastguard Worker
13*da0073e9SAndroid Build Coastguard Worker template <typename T>
14*da0073e9SAndroid Build Coastguard Worker struct is_reduced_floating_point
15*da0073e9SAndroid Build Coastguard Worker : std::integral_constant<
16*da0073e9SAndroid Build Coastguard Worker bool,
17*da0073e9SAndroid Build Coastguard Worker std::is_same_v<T, c10::Half> || std::is_same_v<T, c10::BFloat16>> {};
18*da0073e9SAndroid Build Coastguard Worker
19*da0073e9SAndroid Build Coastguard Worker template <typename T>
20*da0073e9SAndroid Build Coastguard Worker constexpr bool is_reduced_floating_point_v =
21*da0073e9SAndroid Build Coastguard Worker is_reduced_floating_point<T>::value;
22*da0073e9SAndroid Build Coastguard Worker
23*da0073e9SAndroid Build Coastguard Worker template <
24*da0073e9SAndroid Build Coastguard Worker typename T,
25*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
acos(T a)26*da0073e9SAndroid Build Coastguard Worker inline T acos(T a) {
27*da0073e9SAndroid Build Coastguard Worker return std::acos(float(a));
28*da0073e9SAndroid Build Coastguard Worker }
29*da0073e9SAndroid Build Coastguard Worker template <
30*da0073e9SAndroid Build Coastguard Worker typename T,
31*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
asin(T a)32*da0073e9SAndroid Build Coastguard Worker inline T asin(T a) {
33*da0073e9SAndroid Build Coastguard Worker return std::asin(float(a));
34*da0073e9SAndroid Build Coastguard Worker }
35*da0073e9SAndroid Build Coastguard Worker template <
36*da0073e9SAndroid Build Coastguard Worker typename T,
37*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
atan(T a)38*da0073e9SAndroid Build Coastguard Worker inline T atan(T a) {
39*da0073e9SAndroid Build Coastguard Worker return std::atan(float(a));
40*da0073e9SAndroid Build Coastguard Worker }
41*da0073e9SAndroid Build Coastguard Worker template <
42*da0073e9SAndroid Build Coastguard Worker typename T,
43*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
atanh(T a)44*da0073e9SAndroid Build Coastguard Worker inline T atanh(T a) {
45*da0073e9SAndroid Build Coastguard Worker return std::atanh(float(a));
46*da0073e9SAndroid Build Coastguard Worker }
47*da0073e9SAndroid Build Coastguard Worker template <
48*da0073e9SAndroid Build Coastguard Worker typename T,
49*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
erf(T a)50*da0073e9SAndroid Build Coastguard Worker inline T erf(T a) {
51*da0073e9SAndroid Build Coastguard Worker return std::erf(float(a));
52*da0073e9SAndroid Build Coastguard Worker }
53*da0073e9SAndroid Build Coastguard Worker template <
54*da0073e9SAndroid Build Coastguard Worker typename T,
55*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
erfc(T a)56*da0073e9SAndroid Build Coastguard Worker inline T erfc(T a) {
57*da0073e9SAndroid Build Coastguard Worker return std::erfc(float(a));
58*da0073e9SAndroid Build Coastguard Worker }
59*da0073e9SAndroid Build Coastguard Worker template <
60*da0073e9SAndroid Build Coastguard Worker typename T,
61*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
exp(T a)62*da0073e9SAndroid Build Coastguard Worker inline T exp(T a) {
63*da0073e9SAndroid Build Coastguard Worker return std::exp(float(a));
64*da0073e9SAndroid Build Coastguard Worker }
65*da0073e9SAndroid Build Coastguard Worker template <
66*da0073e9SAndroid Build Coastguard Worker typename T,
67*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
expm1(T a)68*da0073e9SAndroid Build Coastguard Worker inline T expm1(T a) {
69*da0073e9SAndroid Build Coastguard Worker return std::expm1(float(a));
70*da0073e9SAndroid Build Coastguard Worker }
71*da0073e9SAndroid Build Coastguard Worker template <
72*da0073e9SAndroid Build Coastguard Worker typename T,
73*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
isfinite(T a)74*da0073e9SAndroid Build Coastguard Worker inline bool isfinite(T a) {
75*da0073e9SAndroid Build Coastguard Worker return std::isfinite(float(a));
76*da0073e9SAndroid Build Coastguard Worker }
77*da0073e9SAndroid Build Coastguard Worker template <
78*da0073e9SAndroid Build Coastguard Worker typename T,
79*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
log(T a)80*da0073e9SAndroid Build Coastguard Worker inline T log(T a) {
81*da0073e9SAndroid Build Coastguard Worker return std::log(float(a));
82*da0073e9SAndroid Build Coastguard Worker }
83*da0073e9SAndroid Build Coastguard Worker template <
84*da0073e9SAndroid Build Coastguard Worker typename T,
85*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
log10(T a)86*da0073e9SAndroid Build Coastguard Worker inline T log10(T a) {
87*da0073e9SAndroid Build Coastguard Worker return std::log10(float(a));
88*da0073e9SAndroid Build Coastguard Worker }
89*da0073e9SAndroid Build Coastguard Worker template <
90*da0073e9SAndroid Build Coastguard Worker typename T,
91*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
log1p(T a)92*da0073e9SAndroid Build Coastguard Worker inline T log1p(T a) {
93*da0073e9SAndroid Build Coastguard Worker return std::log1p(float(a));
94*da0073e9SAndroid Build Coastguard Worker }
95*da0073e9SAndroid Build Coastguard Worker template <
96*da0073e9SAndroid Build Coastguard Worker typename T,
97*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
log2(T a)98*da0073e9SAndroid Build Coastguard Worker inline T log2(T a) {
99*da0073e9SAndroid Build Coastguard Worker return std::log2(float(a));
100*da0073e9SAndroid Build Coastguard Worker }
101*da0073e9SAndroid Build Coastguard Worker template <
102*da0073e9SAndroid Build Coastguard Worker typename T,
103*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
ceil(T a)104*da0073e9SAndroid Build Coastguard Worker inline T ceil(T a) {
105*da0073e9SAndroid Build Coastguard Worker return std::ceil(float(a));
106*da0073e9SAndroid Build Coastguard Worker }
107*da0073e9SAndroid Build Coastguard Worker template <
108*da0073e9SAndroid Build Coastguard Worker typename T,
109*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
cos(T a)110*da0073e9SAndroid Build Coastguard Worker inline T cos(T a) {
111*da0073e9SAndroid Build Coastguard Worker return std::cos(float(a));
112*da0073e9SAndroid Build Coastguard Worker }
113*da0073e9SAndroid Build Coastguard Worker template <
114*da0073e9SAndroid Build Coastguard Worker typename T,
115*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
floor(T a)116*da0073e9SAndroid Build Coastguard Worker inline T floor(T a) {
117*da0073e9SAndroid Build Coastguard Worker return std::floor(float(a));
118*da0073e9SAndroid Build Coastguard Worker }
119*da0073e9SAndroid Build Coastguard Worker template <
120*da0073e9SAndroid Build Coastguard Worker typename T,
121*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
nearbyint(T a)122*da0073e9SAndroid Build Coastguard Worker inline T nearbyint(T a) {
123*da0073e9SAndroid Build Coastguard Worker return std::nearbyint(float(a));
124*da0073e9SAndroid Build Coastguard Worker }
125*da0073e9SAndroid Build Coastguard Worker template <
126*da0073e9SAndroid Build Coastguard Worker typename T,
127*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
sin(T a)128*da0073e9SAndroid Build Coastguard Worker inline T sin(T a) {
129*da0073e9SAndroid Build Coastguard Worker return std::sin(float(a));
130*da0073e9SAndroid Build Coastguard Worker }
131*da0073e9SAndroid Build Coastguard Worker template <
132*da0073e9SAndroid Build Coastguard Worker typename T,
133*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
tan(T a)134*da0073e9SAndroid Build Coastguard Worker inline T tan(T a) {
135*da0073e9SAndroid Build Coastguard Worker return std::tan(float(a));
136*da0073e9SAndroid Build Coastguard Worker }
137*da0073e9SAndroid Build Coastguard Worker template <
138*da0073e9SAndroid Build Coastguard Worker typename T,
139*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
sinh(T a)140*da0073e9SAndroid Build Coastguard Worker inline T sinh(T a) {
141*da0073e9SAndroid Build Coastguard Worker return std::sinh(float(a));
142*da0073e9SAndroid Build Coastguard Worker }
143*da0073e9SAndroid Build Coastguard Worker template <
144*da0073e9SAndroid Build Coastguard Worker typename T,
145*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
cosh(T a)146*da0073e9SAndroid Build Coastguard Worker inline T cosh(T a) {
147*da0073e9SAndroid Build Coastguard Worker return std::cosh(float(a));
148*da0073e9SAndroid Build Coastguard Worker }
149*da0073e9SAndroid Build Coastguard Worker template <
150*da0073e9SAndroid Build Coastguard Worker typename T,
151*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
tanh(T a)152*da0073e9SAndroid Build Coastguard Worker inline T tanh(T a) {
153*da0073e9SAndroid Build Coastguard Worker return std::tanh(float(a));
154*da0073e9SAndroid Build Coastguard Worker }
155*da0073e9SAndroid Build Coastguard Worker template <
156*da0073e9SAndroid Build Coastguard Worker typename T,
157*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
trunc(T a)158*da0073e9SAndroid Build Coastguard Worker inline T trunc(T a) {
159*da0073e9SAndroid Build Coastguard Worker return std::trunc(float(a));
160*da0073e9SAndroid Build Coastguard Worker }
161*da0073e9SAndroid Build Coastguard Worker template <
162*da0073e9SAndroid Build Coastguard Worker typename T,
163*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
lgamma(T a)164*da0073e9SAndroid Build Coastguard Worker inline T lgamma(T a) {
165*da0073e9SAndroid Build Coastguard Worker return std::lgamma(float(a));
166*da0073e9SAndroid Build Coastguard Worker }
167*da0073e9SAndroid Build Coastguard Worker template <
168*da0073e9SAndroid Build Coastguard Worker typename T,
169*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
sqrt(T a)170*da0073e9SAndroid Build Coastguard Worker inline T sqrt(T a) {
171*da0073e9SAndroid Build Coastguard Worker return std::sqrt(float(a));
172*da0073e9SAndroid Build Coastguard Worker }
173*da0073e9SAndroid Build Coastguard Worker template <
174*da0073e9SAndroid Build Coastguard Worker typename T,
175*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
rsqrt(T a)176*da0073e9SAndroid Build Coastguard Worker inline T rsqrt(T a) {
177*da0073e9SAndroid Build Coastguard Worker return 1.0 / std::sqrt(float(a));
178*da0073e9SAndroid Build Coastguard Worker }
179*da0073e9SAndroid Build Coastguard Worker template <
180*da0073e9SAndroid Build Coastguard Worker typename T,
181*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
abs(T a)182*da0073e9SAndroid Build Coastguard Worker inline T abs(T a) {
183*da0073e9SAndroid Build Coastguard Worker return std::abs(float(a));
184*da0073e9SAndroid Build Coastguard Worker }
185*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) && defined(__CUDACC__)
186*da0073e9SAndroid Build Coastguard Worker template <
187*da0073e9SAndroid Build Coastguard Worker typename T,
188*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
pow(T a,double b)189*da0073e9SAndroid Build Coastguard Worker inline T pow(T a, double b) {
190*da0073e9SAndroid Build Coastguard Worker return std::pow(float(a), float(b));
191*da0073e9SAndroid Build Coastguard Worker }
192*da0073e9SAndroid Build Coastguard Worker #else
193*da0073e9SAndroid Build Coastguard Worker template <
194*da0073e9SAndroid Build Coastguard Worker typename T,
195*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
pow(T a,double b)196*da0073e9SAndroid Build Coastguard Worker inline T pow(T a, double b) {
197*da0073e9SAndroid Build Coastguard Worker return std::pow(float(a), b);
198*da0073e9SAndroid Build Coastguard Worker }
199*da0073e9SAndroid Build Coastguard Worker #endif
200*da0073e9SAndroid Build Coastguard Worker template <
201*da0073e9SAndroid Build Coastguard Worker typename T,
202*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
pow(T a,T b)203*da0073e9SAndroid Build Coastguard Worker inline T pow(T a, T b) {
204*da0073e9SAndroid Build Coastguard Worker return std::pow(float(a), float(b));
205*da0073e9SAndroid Build Coastguard Worker }
206*da0073e9SAndroid Build Coastguard Worker template <
207*da0073e9SAndroid Build Coastguard Worker typename T,
208*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
fmod(T a,T b)209*da0073e9SAndroid Build Coastguard Worker inline T fmod(T a, T b) {
210*da0073e9SAndroid Build Coastguard Worker return std::fmod(float(a), float(b));
211*da0073e9SAndroid Build Coastguard Worker }
212*da0073e9SAndroid Build Coastguard Worker
213*da0073e9SAndroid Build Coastguard Worker /*
214*da0073e9SAndroid Build Coastguard Worker The following function is inspired from the implementation in `musl`
215*da0073e9SAndroid Build Coastguard Worker Link to License: https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT
216*da0073e9SAndroid Build Coastguard Worker ----------------------------------------------------------------------
217*da0073e9SAndroid Build Coastguard Worker Copyright © 2005-2020 Rich Felker, et al.
218*da0073e9SAndroid Build Coastguard Worker
219*da0073e9SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining
220*da0073e9SAndroid Build Coastguard Worker a copy of this software and associated documentation files (the
221*da0073e9SAndroid Build Coastguard Worker "Software"), to deal in the Software without restriction, including
222*da0073e9SAndroid Build Coastguard Worker without limitation the rights to use, copy, modify, merge, publish,
223*da0073e9SAndroid Build Coastguard Worker distribute, sublicense, and/or sell copies of the Software, and to
224*da0073e9SAndroid Build Coastguard Worker permit persons to whom the Software is furnished to do so, subject to
225*da0073e9SAndroid Build Coastguard Worker the following conditions:
226*da0073e9SAndroid Build Coastguard Worker
227*da0073e9SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be
228*da0073e9SAndroid Build Coastguard Worker included in all copies or substantial portions of the Software.
229*da0073e9SAndroid Build Coastguard Worker
230*da0073e9SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
231*da0073e9SAndroid Build Coastguard Worker EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
232*da0073e9SAndroid Build Coastguard Worker MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
233*da0073e9SAndroid Build Coastguard Worker IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
234*da0073e9SAndroid Build Coastguard Worker CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
235*da0073e9SAndroid Build Coastguard Worker TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
236*da0073e9SAndroid Build Coastguard Worker SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
237*da0073e9SAndroid Build Coastguard Worker ----------------------------------------------------------------------
238*da0073e9SAndroid Build Coastguard Worker */
239*da0073e9SAndroid Build Coastguard Worker template <
240*da0073e9SAndroid Build Coastguard Worker typename T,
241*da0073e9SAndroid Build Coastguard Worker typename std::enable_if_t<is_reduced_floating_point_v<T>, int> = 0>
nextafter(T from,T to)242*da0073e9SAndroid Build Coastguard Worker C10_HOST_DEVICE inline T nextafter(T from, T to) {
243*da0073e9SAndroid Build Coastguard Worker // Reference:
244*da0073e9SAndroid Build Coastguard Worker // https://git.musl-libc.org/cgit/musl/tree/src/math/nextafter.c
245*da0073e9SAndroid Build Coastguard Worker using int_repr_t = uint16_t;
246*da0073e9SAndroid Build Coastguard Worker constexpr uint8_t bits = 16;
247*da0073e9SAndroid Build Coastguard Worker union {
248*da0073e9SAndroid Build Coastguard Worker T f;
249*da0073e9SAndroid Build Coastguard Worker int_repr_t i;
250*da0073e9SAndroid Build Coastguard Worker } ufrom = {from}, uto = {to};
251*da0073e9SAndroid Build Coastguard Worker
252*da0073e9SAndroid Build Coastguard Worker // get a mask to get the sign bit i.e. MSB
253*da0073e9SAndroid Build Coastguard Worker int_repr_t sign_mask = int_repr_t{1} << (bits - 1);
254*da0073e9SAndroid Build Coastguard Worker
255*da0073e9SAndroid Build Coastguard Worker // short-circuit: if either is NaN, return NaN
256*da0073e9SAndroid Build Coastguard Worker if (from != from || to != to) {
257*da0073e9SAndroid Build Coastguard Worker return from + to;
258*da0073e9SAndroid Build Coastguard Worker }
259*da0073e9SAndroid Build Coastguard Worker
260*da0073e9SAndroid Build Coastguard Worker // short-circuit: if they are exactly the same.
261*da0073e9SAndroid Build Coastguard Worker if (ufrom.i == uto.i) {
262*da0073e9SAndroid Build Coastguard Worker return from;
263*da0073e9SAndroid Build Coastguard Worker }
264*da0073e9SAndroid Build Coastguard Worker
265*da0073e9SAndroid Build Coastguard Worker // mask the sign-bit to zero i.e. positive
266*da0073e9SAndroid Build Coastguard Worker // equivalent to abs(x)
267*da0073e9SAndroid Build Coastguard Worker int_repr_t abs_from = ufrom.i & ~sign_mask;
268*da0073e9SAndroid Build Coastguard Worker int_repr_t abs_to = uto.i & ~sign_mask;
269*da0073e9SAndroid Build Coastguard Worker if (abs_from == 0) {
270*da0073e9SAndroid Build Coastguard Worker // if both are zero but with different sign,
271*da0073e9SAndroid Build Coastguard Worker // preserve the sign of `to`.
272*da0073e9SAndroid Build Coastguard Worker if (abs_to == 0) {
273*da0073e9SAndroid Build Coastguard Worker return to;
274*da0073e9SAndroid Build Coastguard Worker }
275*da0073e9SAndroid Build Coastguard Worker // smallest subnormal with sign of `to`.
276*da0073e9SAndroid Build Coastguard Worker ufrom.i = (uto.i & sign_mask) | int_repr_t{1};
277*da0073e9SAndroid Build Coastguard Worker return ufrom.f;
278*da0073e9SAndroid Build Coastguard Worker }
279*da0073e9SAndroid Build Coastguard Worker
280*da0073e9SAndroid Build Coastguard Worker // if abs(from) > abs(to) or sign(from) != sign(to)
281*da0073e9SAndroid Build Coastguard Worker if (abs_from > abs_to || ((ufrom.i ^ uto.i) & sign_mask)) {
282*da0073e9SAndroid Build Coastguard Worker ufrom.i--;
283*da0073e9SAndroid Build Coastguard Worker } else {
284*da0073e9SAndroid Build Coastguard Worker ufrom.i++;
285*da0073e9SAndroid Build Coastguard Worker }
286*da0073e9SAndroid Build Coastguard Worker
287*da0073e9SAndroid Build Coastguard Worker return ufrom.f;
288*da0073e9SAndroid Build Coastguard Worker }
289*da0073e9SAndroid Build Coastguard Worker
290*da0073e9SAndroid Build Coastguard Worker } // namespace std
291*da0073e9SAndroid Build Coastguard Worker
292*da0073e9SAndroid Build Coastguard Worker C10_CLANG_DIAGNOSTIC_POP()
293