Home | History | Annotate | Line # | Download | only in lint1
      1  1.14  rillig /*	$NetBSD: d_gcc_compound_statements1.c,v 1.14 2023/07/02 22:56:13 rillig Exp $	*/
      2   1.2  rillig # 3 "d_gcc_compound_statements1.c"
      3   1.2  rillig 
      4   1.4  rillig /* GCC compound statement with expression */
      5   1.1  jruoho 
      6  1.12  rillig /* lint1-extra-flags: -X 351 */
      7  1.12  rillig 
      8  1.10  rillig /*
      9  1.10  rillig  * Compound statements are only allowed in functions, not at file scope.
     10  1.10  rillig  *
     11  1.11  rillig  * Before decl.c 1.283 from 2022-05-31, lint crashed with a segmentation
     12  1.10  rillig  * fault due to the unused label.
     13  1.10  rillig  */
     14  1.10  rillig int invalid_gcc_statement_expression = ({
     15  1.10  rillig unused_label:
     16  1.10  rillig 	3;
     17  1.10  rillig /* expect+2: error: syntax error 'labels are only valid inside a function' [249] */
     18  1.10  rillig /* expect+1: error: cannot initialize 'int' from 'void' [185] */
     19  1.10  rillig });
     20  1.10  rillig 
     21   1.9  rillig void foo(unsigned long z)
     22   1.1  jruoho {
     23   1.3  rillig 	z = ({
     24   1.3  rillig 		unsigned long tmp;
     25   1.3  rillig 		tmp = 1;
     26   1.3  rillig 		tmp;
     27   1.3  rillig 	});
     28   1.1  jruoho 	foo(z);
     29   1.1  jruoho }
     30   1.5  rillig 
     31   1.5  rillig /*
     32   1.5  rillig  * Compound statements are only allowed in functions, not at file scope.
     33   1.5  rillig  *
     34   1.5  rillig  * Before decl.c 1.186 from 2021-06-19, lint crashed with a segmentation
     35   1.5  rillig  * fault.
     36   1.5  rillig  */
     37   1.5  rillig int c = ({
     38   1.7  rillig 	/* expect+1: error: syntax error 'return outside function' [249] */
     39   1.7  rillig 	return 3;
     40   1.7  rillig });
     41   1.7  rillig /* expect-1: error: cannot initialize 'int' from 'void' [185] */
     42   1.6  rillig 
     43   1.6  rillig void
     44   1.6  rillig function(void)
     45   1.6  rillig {
     46   1.6  rillig 	/*
     47   1.6  rillig 	 * Before cgram.y 1.229 from 2021-06-20, lint crashed due to the
     48   1.6  rillig 	 * syntax error, which made an expression NULL.
     49   1.6  rillig 	 */
     50   1.6  rillig 	({
     51   1.7  rillig 		/* expect+1: error: type 'int' does not have member 'e' [101] */
     52   1.7  rillig 		0->e;
     53   1.6  rillig 	});
     54   1.6  rillig }
     55   1.8  rillig 
     56   1.8  rillig void
     57   1.8  rillig crash(void)
     58   1.8  rillig {
     59   1.8  rillig 	/*
     60   1.8  rillig 	 * Before tree.c 1.418 from 2022-04-03, lint dereferenced a null
     61   1.8  rillig 	 * pointer in do_statement_expr.
     62   1.8  rillig 	 */
     63   1.8  rillig 	({
     64   1.8  rillig 		;
     65   1.8  rillig 	});
     66   1.8  rillig }
     67  1.13  rillig 
     68  1.13  rillig /*
     69  1.14  rillig  * Before cgram.y 1.445 from 2023-07-03, lint did not accept empty statements
     70  1.14  rillig  * in GCC statement expressions.  These empty statements can be generated by a
     71  1.14  rillig  * disabled 'assert' macro.
     72  1.13  rillig  */
     73  1.13  rillig unsigned int
     74  1.13  rillig empty_statement(void)
     75  1.13  rillig {
     76  1.13  rillig 	return ({
     77  1.13  rillig 		unsigned int mega = 1 << 20;
     78  1.13  rillig 		;
     79  1.13  rillig 		mega;
     80  1.13  rillig 	});
     81  1.13  rillig }
     82