Home | History | Annotate | Line # | Download | only in lint1
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