d_c99_complex_split.c revision 1.13 1 1.13 rillig /* $NetBSD: d_c99_complex_split.c,v 1.13 2023/03/28 14:44:34 rillig Exp $ */
2 1.3 rillig # 3 "d_c99_complex_split.c"
3 1.3 rillig
4 1.5 rillig /*
5 1.5 rillig * Checks that the real and imaginary parts of a complex number can be
6 1.5 rillig * accessed (since C99).
7 1.5 rillig */
8 1.5 rillig
9 1.13 rillig /* lint1-extra-flags: -X 351 */
10 1.13 rillig
11 1.4 rillig int
12 1.4 rillig b(double a)
13 1.4 rillig {
14 1.2 christos return a == 0;
15 1.2 christos }
16 1.4 rillig
17 1.4 rillig void
18 1.4 rillig a(void)
19 1.4 rillig {
20 1.4 rillig double _Complex z = 0;
21 1.4 rillig if (b(__real__ z) && b(__imag__ z))
22 1.4 rillig return;
23 1.1 christos }
24 1.6 rillig
25 1.6 rillig void sink(double _Complex);
26 1.6 rillig
27 1.7 rillig /*
28 1.7 rillig * Before tree.c 1.275 from 2021-04-09, lint wrongly warned that when
29 1.7 rillig * '__real__ c' was assigned, 'c may be used before set'.
30 1.7 rillig *
31 1.7 rillig * As of 2021-04-09, support for _Complex is still very incomplete, see
32 1.7 rillig * build_real_imag for details. For example, lint does not know that after
33 1.7 rillig * the assignment to '__real__ c', the variable is partially initialized.
34 1.7 rillig */
35 1.6 rillig void
36 1.6 rillig set_complex_complete(double re, double im)
37 1.6 rillig {
38 1.6 rillig double _Complex c;
39 1.6 rillig
40 1.7 rillig __real__ c = re;
41 1.6 rillig __imag__ c = im;
42 1.6 rillig sink(c);
43 1.6 rillig }
44 1.6 rillig
45 1.7 rillig /*
46 1.7 rillig * Before tree.c 1.275 from 2021-04-09, lint wrongly warned that when
47 1.11 rillig * '__real__ c' was assigned, 'c may be used before set [158]'.
48 1.7 rillig *
49 1.7 rillig * As of 2021-04-09, support for _Complex is still very incomplete, see
50 1.7 rillig * build_real_imag for details.
51 1.7 rillig */
52 1.6 rillig void
53 1.6 rillig set_complex_only_real(double re)
54 1.6 rillig {
55 1.6 rillig double _Complex c;
56 1.6 rillig
57 1.7 rillig __real__ c = re;
58 1.6 rillig /* __imag__ c is left uninitialized */
59 1.6 rillig sink(c); /* XXX: may be used before set */
60 1.6 rillig }
61 1.6 rillig
62 1.7 rillig /*
63 1.7 rillig * Before tree.c 1.275 from 2021-04-09, lint wrongly warned that when
64 1.11 rillig * '__imag__ c' was assigned, 'c may be used before set [158]'.
65 1.7 rillig *
66 1.7 rillig * As of 2021-04-09, support for _Complex is still very incomplete, see
67 1.7 rillig * build_real_imag for details.
68 1.7 rillig */
69 1.6 rillig void
70 1.6 rillig set_complex_only_imag(double im)
71 1.6 rillig {
72 1.6 rillig double _Complex c;
73 1.6 rillig
74 1.6 rillig /* __real__ c is left uninitialized */
75 1.7 rillig __imag__ c = im;
76 1.6 rillig sink(c); /* XXX: may be used before set */
77 1.6 rillig }
78 1.7 rillig
79 1.8 rillig void
80 1.8 rillig precedence_cast_expression(void)
81 1.8 rillig {
82 1.8 rillig double _Complex z = 0;
83 1.8 rillig if (b(__real__(double _Complex)z) && b(__imag__(double _Complex)z))
84 1.8 rillig return;
85 1.8 rillig if (b(__real__(z)) && b(__imag__(z)))
86 1.8 rillig return;
87 1.8 rillig }
88