compiler: enforce reserved keywords replacement
* compiler: Enforce reserved keywords replacement on empty value initialization * compiler: Add test for reserved keywords enforcement A new struct has been introduced in the tests that contains all C reserved keywords that are not reserved in V. Some read and write are tested too.pull/2148/head
							parent
							
								
									fd2d9c214c
								
							
						
					
					
						commit
						5c79c0e743
					
				|  | @ -3029,9 +3029,10 @@ fn (p mut Parser) struct_init(typ string) string { | ||||||
| 		} | 		} | ||||||
| 		// Zero values: init all fields (ints to 0, strings to '' etc)
 | 		// Zero values: init all fields (ints to 0, strings to '' etc)
 | ||||||
| 		for i, field in t.fields { | 		for i, field in t.fields { | ||||||
|  | 			sanitized_name := if typ != 'Option' { p.table.var_cgen_name( field.name ) } else { field.name } | ||||||
| 			// println('### field.name')
 | 			// println('### field.name')
 | ||||||
| 			// Skip if this field has already been assigned to
 | 			// Skip if this field has already been assigned to
 | ||||||
| 			if field.name in inited_fields { | 			if sanitized_name in inited_fields { | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
| 			field_typ := field.typ | 			field_typ := field.typ | ||||||
|  | @ -3040,9 +3041,9 @@ fn (p mut Parser) struct_init(typ string) string { | ||||||
| 			} | 			} | ||||||
| 			// init map fields
 | 			// init map fields
 | ||||||
| 			if field_typ.starts_with('map_') { | 			if field_typ.starts_with('map_') { | ||||||
| 				p.gen_struct_field_init(field.name) | 				p.gen_struct_field_init(sanitized_name) | ||||||
| 				p.gen_empty_map(field_typ.right(4)) | 				p.gen_empty_map(field_typ.right(4)) | ||||||
| 				inited_fields << field.name | 				inited_fields << sanitized_name | ||||||
| 				if i != t.fields.len - 1 { | 				if i != t.fields.len - 1 { | ||||||
| 					p.gen(',') | 					p.gen(',') | ||||||
| 				} | 				} | ||||||
|  | @ -3051,7 +3052,7 @@ fn (p mut Parser) struct_init(typ string) string { | ||||||
| 			} | 			} | ||||||
| 			def_val := type_default(field_typ) | 			def_val := type_default(field_typ) | ||||||
| 			if def_val != '' && def_val != '{0}' { | 			if def_val != '' && def_val != '{0}' { | ||||||
| 				p.gen_struct_field_init(field.name) | 				p.gen_struct_field_init(sanitized_name) | ||||||
| 				p.gen(def_val) | 				p.gen(def_val) | ||||||
| 				if i != t.fields.len - 1 { | 				if i != t.fields.len - 1 { | ||||||
| 					p.gen(',') | 					p.gen(',') | ||||||
|  |  | ||||||
|  | @ -26,6 +26,35 @@ struct Foo { | ||||||
| 	@type string | 	@type string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | //We need to make sure that this compiles with all the reserved names.
 | ||||||
|  | struct ReservedKeywords { | ||||||
|  | 	delete   int | ||||||
|  | 	exit     int | ||||||
|  | 	unix     int | ||||||
|  | 	error    int | ||||||
|  | 	malloc   int | ||||||
|  | 	calloc   int | ||||||
|  | 	free     int | ||||||
|  | 	panic    int | ||||||
|  | 	auto     int | ||||||
|  | 	char     int | ||||||
|  | 	do       int | ||||||
|  | 	double   int | ||||||
|  | 	extern   int | ||||||
|  | 	float    int | ||||||
|  | 	inline   int | ||||||
|  | 	long     int | ||||||
|  | 	register int | ||||||
|  | 	restrict int | ||||||
|  | 	short    int | ||||||
|  | 	signed   int | ||||||
|  | 	typedef  int | ||||||
|  | 	unsigned int | ||||||
|  | 	void     int | ||||||
|  | 	volatile int | ||||||
|  | 	while    int | ||||||
|  | } | ||||||
|  | 
 | ||||||
| fn test_struct_levels() { | fn test_struct_levels() { | ||||||
| 	mut c := C{} | 	mut c := C{} | ||||||
| 	assert c.nums.len == 0 | 	assert c.nums.len == 0 | ||||||
|  | @ -63,3 +92,18 @@ fn test_at() { | ||||||
| 	foo := Foo{ @type: 'test' } | 	foo := Foo{ @type: 'test' } | ||||||
| 	println(foo.@type) | 	println(foo.@type) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fn test_reserved_keywords() { | ||||||
|  | 	//Make sure we can initialize them correctly using full syntax.
 | ||||||
|  | 	rk_holder := ReservedKeywords{0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3} | ||||||
|  | 	//Test a few as it'll take too long to test all. If it's initialized
 | ||||||
|  | 	//correctly, other fields are also probably valid.
 | ||||||
|  | 	assert rk_holder.unix == 5 | ||||||
|  | 	assert rk_holder.while == 3 | ||||||
|  | 
 | ||||||
|  | 	rk_holder2 := ReservedKeywords{inline: 9, volatile: 11} | ||||||
|  | 	//Make sure partial initialization works too.
 | ||||||
|  | 	assert rk_holder2.inline == 9 | ||||||
|  | 	assert rk_holder2.volatile == 11 | ||||||
|  | 	assert rk_holder2.while == 0 //Zero value as not specified.
 | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue