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