cgen: fix compiling call expressions with no varargs (tcc bug)
							parent
							
								
									4dfb7dbffa
								
							
						
					
					
						commit
						36dcace0a7
					
				| 
						 | 
					@ -3,10 +3,9 @@ module gen
 | 
				
			||||||
// NB: @@@ here serve as placeholders.
 | 
					// NB: @@@ here serve as placeholders.
 | 
				
			||||||
// They will be replaced with correct strings
 | 
					// They will be replaced with correct strings
 | 
				
			||||||
// for each constant, during C code generation.
 | 
					// for each constant, during C code generation.
 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	// V_COMMIT_HASH is generated by cmd/tools/gen_vc.v .
 | 
						// V_COMMIT_HASH is generated by cmd/tools/gen_vc.v .
 | 
				
			||||||
	c_commit_hash_default = '
 | 
						c_commit_hash_default         = '
 | 
				
			||||||
#ifndef V_COMMIT_HASH
 | 
					#ifndef V_COMMIT_HASH
 | 
				
			||||||
	#define V_COMMIT_HASH "@@@"
 | 
						#define V_COMMIT_HASH "@@@"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -17,8 +16,8 @@ const (
 | 
				
			||||||
	#define V_CURRENT_COMMIT_HASH "@@@"
 | 
						#define V_CURRENT_COMMIT_HASH "@@@"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
'
 | 
					'
 | 
				
			||||||
 | 
						c_common_macros               = '
 | 
				
			||||||
	c_common_macros = '
 | 
					#define EMPTY_VARG_INITIALIZATION 0
 | 
				
			||||||
#define EMPTY_STRUCT_DECLARATION
 | 
					#define EMPTY_STRUCT_DECLARATION
 | 
				
			||||||
#define EMPTY_STRUCT_INITIALIZATION 0
 | 
					#define EMPTY_STRUCT_INITIALIZATION 0
 | 
				
			||||||
// Due to a tcc bug, the length of an array needs to be specified, but GCC crashes if it is...
 | 
					// Due to a tcc bug, the length of an array needs to be specified, but GCC crashes if it is...
 | 
				
			||||||
| 
						 | 
					@ -53,8 +52,10 @@ const (
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __TINYC__
 | 
					#ifdef __TINYC__
 | 
				
			||||||
 | 
						#undef EMPTY_VARG_INITIALIZATION
 | 
				
			||||||
	#undef EMPTY_STRUCT_DECLARATION
 | 
						#undef EMPTY_STRUCT_DECLARATION
 | 
				
			||||||
	#undef EMPTY_STRUCT_INITIALIZATION
 | 
						#undef EMPTY_STRUCT_INITIALIZATION
 | 
				
			||||||
 | 
						#define EMPTY_VARG_INITIALIZATION
 | 
				
			||||||
	#define EMPTY_STRUCT_DECLARATION char _dummy
 | 
						#define EMPTY_STRUCT_DECLARATION char _dummy
 | 
				
			||||||
	#define EMPTY_STRUCT_INITIALIZATION 0
 | 
						#define EMPTY_STRUCT_INITIALIZATION 0
 | 
				
			||||||
	#undef EMPTY_ARRAY_OF_ELEMS
 | 
						#undef EMPTY_ARRAY_OF_ELEMS
 | 
				
			||||||
| 
						 | 
					@ -75,8 +76,7 @@ const (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// for __offset_of
 | 
					// for __offset_of
 | 
				
			||||||
#ifndef __offsetof
 | 
					#ifndef __offsetof
 | 
				
			||||||
	#define __offsetof(s,memb) \\
 | 
						#define __offsetof(s,memb) ((size_t)((char *)&((s *)0)->memb - (char *)0))
 | 
				
			||||||
	((size_t)((char *)&((s *)0)->memb - (char *)0))
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OPTION_CAST(x) (x)
 | 
					#define OPTION_CAST(x) (x)
 | 
				
			||||||
| 
						 | 
					@ -93,7 +93,7 @@ const (
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
'
 | 
					'
 | 
				
			||||||
	c_headers = '
 | 
						c_headers                     = '
 | 
				
			||||||
// c_headers
 | 
					// c_headers
 | 
				
			||||||
typedef int (*qsort_callback_func)(const void*, const void*);
 | 
					typedef int (*qsort_callback_func)(const void*, const void*);
 | 
				
			||||||
#include <stdio.h>  // TODO remove all these includes, define all function signatures and types manually
 | 
					#include <stdio.h>  // TODO remove all these includes, define all function signatures and types manually
 | 
				
			||||||
| 
						 | 
					@ -429,7 +429,7 @@ static voidptr memfreedup(voidptr ptr, voidptr src, int sz) {
 | 
				
			||||||
	return memdup(src, sz);
 | 
						return memdup(src, sz);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
'
 | 
					'
 | 
				
			||||||
	c_builtin_types = '
 | 
						c_builtin_types               = '
 | 
				
			||||||
//================================== builtin types ================================*/
 | 
					//================================== builtin types ================================*/
 | 
				
			||||||
typedef int64_t i64;
 | 
					typedef int64_t i64;
 | 
				
			||||||
typedef int16_t i16;
 | 
					typedef int16_t i16;
 | 
				
			||||||
| 
						 | 
					@ -458,7 +458,7 @@ typedef struct sync__Channel* chan;
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
'
 | 
					'
 | 
				
			||||||
	bare_c_headers = '
 | 
						bare_c_headers                = '
 | 
				
			||||||
$c_common_macros
 | 
					$c_common_macros
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef exit
 | 
					#ifndef exit
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -836,7 +836,8 @@ fn (mut g Gen) call_args(node ast.CallExpr) {
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			g.write('0')
 | 
								// NB: tcc can not handle 0 here, while msvc needs it
 | 
				
			||||||
 | 
								g.write('EMPTY_VARG_INITIALIZATION')
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		g.write('}}')
 | 
							g.write('}}')
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					struct Config {
 | 
				
			||||||
 | 
						token string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Client {
 | 
				
			||||||
 | 
						x u64
 | 
				
			||||||
 | 
						y u64
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn new(config Config, shard_count ...int) ?&Client {
 | 
				
			||||||
 | 
						return &Client{1, 2}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_can_compile_an_empty_var_arg() {
 | 
				
			||||||
 | 
						x := new(Config{
 | 
				
			||||||
 | 
							token: 'xyz'
 | 
				
			||||||
 | 
						}) or { panic(err) }
 | 
				
			||||||
 | 
						assert x.x == 1
 | 
				
			||||||
 | 
						assert x.y == 2
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue