Skip to content

Commit fa8f716

Browse files
committed
[C2y] Claim conformance to WG14 N3460
This moves some Annex G requirements for complex numbers into the main body of the standard.
1 parent 5af5fb0 commit fa8f716

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

clang/test/C/C2y/n3460.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// RUN: %clang_cc1 -verify -std=c2y -Wall %s
2+
3+
/* WG14 N3460: Clang 12
4+
* Complex operators
5+
*
6+
* This moves some Annex G requirements into the main body of the standard.
7+
*/
8+
9+
// CMPLX(0.0, inf) * 2.0, the result should be CMPLX(0.0, inf), not CMPLX(nan, inf)
10+
static_assert(__builtin_complex(0.0, __builtin_inf()) * 2.0 ==
11+
__builtin_complex(0.0, __builtin_inf()));
12+
13+
// CMPLX(0.0, 1.0) * -0.0 is CMPLX(-0.0, -0.0), not CMPLX(-0.0, +0.0)
14+
static_assert(__builtin_complex(0.0, 1.0) * -0.0 ==
15+
__builtin_complex(-0.0, -0.0));
16+
17+
// Testing for -0.0 is a pain because -0.0 == +0.0, so forcefully generate a
18+
// diagnostic and check the note.
19+
static_assert(__builtin_complex(0.0, 1.0) * -0.0 == 1); /* expected-error {{static assertion failed due to requirement '__builtin_complex(0., 1.) * -0. == 1'}} \
20+
expected-note {{expression evaluates to '(-0 + -0i) == 1'}}
21+
*/
22+
23+
// CMPLX(0.0, inf) / 2.0, the result should be CMPLX(0.0, inf),
24+
// not CMPLX(nan, inf)
25+
static_assert(__builtin_complex(0.0, __builtin_inf()) / 2.0 ==
26+
__builtin_complex(0.0, __builtin_inf()));
27+
28+
// CMPLX(2.0, 3.0) * 2.0, the result should be CMPLX(4.0, 6.0)
29+
static_assert(__builtin_complex(2.0, 3.0) * 2.0 ==
30+
__builtin_complex(4.0, 6.0));
31+
32+
// CMPLX(2.0, 4.0) / 2.0, the result should be CMPLX(1.0, 2.0)
33+
static_assert(__builtin_complex(2.0, 4.0) / 2.0 ==
34+
__builtin_complex(1.0, 2.0));
35+
36+
// CMPLX(2.0, 3.0) * CMPLX(4.0, 5.0), the result should be
37+
// CMPLX(8.0 - 15.0, 12.0 + 10.0)
38+
static_assert(__builtin_complex(2.0, 3.0) * __builtin_complex(4.0, 5.0) ==
39+
__builtin_complex(-7.0, 22.0));
40+
41+
// CMPLX(2.0, 3.0) / CMPLX(4.0, 5.0), the result should be
42+
// CMPLX((8.0 + 15.0)/(4.0^2 + 5.0^2), (12.0 - 10.0)/(4.0^2 + 5.0^2))
43+
static_assert(__builtin_complex(2.0, 3.0) / __builtin_complex(4.0, 5.0) ==
44+
__builtin_complex(23.0 / 41.0, 2.0 / 41.0));
45+
46+
47+
// 2.0 / CMPLX(2.0, 4.0), the result should be
48+
// CMPLX(4.0 /(2.0^2 + 4.0^2), -8.0/(2.0^2 + 4.0^2))
49+
static_assert(2.0 / __builtin_complex(2.0, 4.0) ==
50+
__builtin_complex(4.0 / 20.0, -8.0 / 20.0));
51+

clang/www/c_status.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ <h2 id="c2y">C2y implementation status</h2>
318318
<tr>
319319
<td>Complex operators</td>
320320
<td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3460.pdf">N3460</a></td>
321-
<td class="unknown" align="center">Unknown</td>
321+
<td class="full" align="center">Clang 12</td>
322322
</tr>
323323
</table>
324324
</details>

0 commit comments

Comments
 (0)