Home | History | Annotate | Line # | Download | only in lint1
d_c99_complex_split.c revision 1.7
      1  1.7    rillig /*	$NetBSD: d_c99_complex_split.c,v 1.7 2021/04/09 21:42:12 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.7    rillig 	return c | c;		/* expect: incompatible types */
     83  1.7    rillig }
     84