Home | History | Annotate | Line # | Download | only in lint1
d_c99_complex_split.c revision 1.10
      1  1.10    rillig /*	$NetBSD: d_c99_complex_split.c,v 1.10 2022/06/19 12:14: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.4    rillig int
     10   1.4    rillig b(double a)
     11   1.4    rillig {
     12   1.2  christos 	return a == 0;
     13   1.2  christos }
     14   1.4    rillig 
     15   1.4    rillig void
     16   1.4    rillig a(void)
     17   1.4    rillig {
     18   1.4    rillig 	double _Complex z = 0;
     19   1.4    rillig 	if (b(__real__ z) && b(__imag__ z))
     20   1.4    rillig 		return;
     21   1.1  christos }
     22   1.6    rillig 
     23   1.6    rillig void sink(double _Complex);
     24   1.6    rillig 
     25   1.7    rillig /*
     26   1.7    rillig  * Before tree.c 1.275 from 2021-04-09, lint wrongly warned that when
     27   1.7    rillig  * '__real__ c' was assigned, 'c may be used before set'.
     28   1.7    rillig  *
     29   1.7    rillig  * As of 2021-04-09, support for _Complex is still very incomplete, see
     30   1.7    rillig  * build_real_imag for details.  For example, lint does not know that after
     31   1.7    rillig  * the assignment to '__real__ c', the variable is partially initialized.
     32   1.7    rillig  */
     33   1.6    rillig void
     34   1.6    rillig set_complex_complete(double re, double im)
     35   1.6    rillig {
     36   1.6    rillig 	double _Complex c;
     37   1.6    rillig 
     38   1.7    rillig 	__real__ c = re;
     39   1.6    rillig 	__imag__ c = im;
     40   1.6    rillig 	sink(c);
     41   1.6    rillig }
     42   1.6    rillig 
     43   1.7    rillig /*
     44   1.7    rillig  * Before tree.c 1.275 from 2021-04-09, lint wrongly warned that when
     45   1.7    rillig  * '__real__ c' was assigned, 'c may be used before set'.
     46   1.7    rillig  *
     47   1.7    rillig  * As of 2021-04-09, support for _Complex is still very incomplete, see
     48   1.7    rillig  * build_real_imag for details.
     49   1.7    rillig  */
     50   1.6    rillig void
     51   1.6    rillig set_complex_only_real(double re)
     52   1.6    rillig {
     53   1.6    rillig 	double _Complex c;
     54   1.6    rillig 
     55   1.7    rillig 	__real__ c = re;
     56   1.6    rillig 	/* __imag__ c is left uninitialized */
     57   1.6    rillig 	sink(c);		/* XXX: may be used before set */
     58   1.6    rillig }
     59   1.6    rillig 
     60   1.7    rillig /*
     61   1.7    rillig  * Before tree.c 1.275 from 2021-04-09, lint wrongly warned that when
     62   1.7    rillig  * '__imag__ c' was assigned, 'c may be used before set'.
     63   1.7    rillig  *
     64   1.7    rillig  * As of 2021-04-09, support for _Complex is still very incomplete, see
     65   1.7    rillig  * build_real_imag for details.
     66   1.7    rillig  */
     67   1.6    rillig void
     68   1.6    rillig set_complex_only_imag(double im)
     69   1.6    rillig {
     70   1.6    rillig 	double _Complex c;
     71   1.6    rillig 
     72   1.6    rillig 	/* __real__ c is left uninitialized */
     73   1.7    rillig 	__imag__ c = im;
     74   1.6    rillig 	sink(c);		/* XXX: may be used before set */
     75   1.6    rillig }
     76   1.7    rillig 
     77   1.7    rillig /* Just to keep the .exp file alive. */
     78   1.7    rillig void
     79   1.7    rillig trigger_warning(double _Complex c)
     80   1.7    rillig {
     81   1.7    rillig 	c += 1.0;
     82  1.10    rillig 	/* expect+1: error: operands of '|' have incompatible types 'double _Complex' and 'double _Complex' [107] */
     83   1.9    rillig 	return c | c;
     84   1.7    rillig }
     85   1.8    rillig 
     86   1.8    rillig void
     87   1.8    rillig precedence_cast_expression(void)
     88   1.8    rillig {
     89   1.8    rillig 	double _Complex z = 0;
     90   1.8    rillig 	if (b(__real__(double _Complex)z) && b(__imag__(double _Complex)z))
     91   1.8    rillig 		return;
     92   1.8    rillig 	if (b(__real__(z)) && b(__imag__(z)))
     93   1.8    rillig 		return;
     94   1.8    rillig }
     95