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