aboutsummaryrefslogtreecommitdiff
path: root/src/ast_render.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-01-12 03:15:06 -0500
committerAndrew Kelley <superjoe30@gmail.com>2017-01-12 03:15:06 -0500
commitd7847053531c3352db8355e21e54b102958cbb8a (patch)
treeb360eeecaa1b6624c268054bb2a7d79d4678d591 /src/ast_render.cpp
parent76b1cbc2ea50be928608b80bdd8ab25cd1b964f3 (diff)
downloadzig-d7847053531c3352db8355e21e54b102958cbb8a.tar.gz
zig-d7847053531c3352db8355e21e54b102958cbb8a.zip
IR: implement macro for function aliasing function pointer
Diffstat (limited to 'src/ast_render.cpp')
-rw-r--r--src/ast_render.cpp33
1 files changed, 19 insertions, 14 deletions
diff --git a/src/ast_render.cpp b/src/ast_render.cpp
index acec9d05c4..2b5eb7f890 100644
--- a/src/ast_render.cpp
+++ b/src/ast_render.cpp
@@ -908,7 +908,8 @@ static void ast_render_tld_fn(AstRender *ar, Buf *name, TldFn *tld_fn) {
if (param_info->is_noalias) {
fprintf(ar->f, "noalias ");
}
- fprintf(ar->f, "%s: %s", buf_ptr(tld_fn->fn_entry->param_names[i]), buf_ptr(&param_info->type->name));
+ Buf *param_name = tld_fn->fn_entry->param_names ? tld_fn->fn_entry->param_names[i] : buf_sprintf("arg%zu", i);
+ fprintf(ar->f, "%s: %s", buf_ptr(param_name), buf_ptr(&param_info->type->name));
}
if (fn_type_id->return_type->id == TypeTableEntryIdVoid) {
fprintf(ar->f, ");\n");
@@ -947,24 +948,28 @@ static void ast_render_tld_var(AstRender *ar, Buf *name, TldVar *tld_var) {
if (type_entry->id == TypeTableEntryIdStruct) {
const char *extern_str = extern_string(type_entry->data.structure.is_extern);
fprintf(ar->f, "%sstruct {\n", extern_str);
- for (size_t i = 0; i < type_entry->data.structure.src_field_count; i += 1) {
- TypeStructField *field = &type_entry->data.structure.fields[i];
- fprintf(ar->f, " ");
- print_symbol(ar, field->name);
- fprintf(ar->f, ": %s,\n", buf_ptr(&field->type_entry->name));
+ if (type_entry->data.structure.complete) {
+ for (size_t i = 0; i < type_entry->data.structure.src_field_count; i += 1) {
+ TypeStructField *field = &type_entry->data.structure.fields[i];
+ fprintf(ar->f, " ");
+ print_symbol(ar, field->name);
+ fprintf(ar->f, ": %s,\n", buf_ptr(&field->type_entry->name));
+ }
}
fprintf(ar->f, "}");
} else if (type_entry->id == TypeTableEntryIdEnum) {
const char *extern_str = extern_string(type_entry->data.enumeration.is_extern);
fprintf(ar->f, "%senum {\n", extern_str);
- for (size_t i = 0; i < type_entry->data.enumeration.src_field_count; i += 1) {
- TypeEnumField *field = &type_entry->data.enumeration.fields[i];
- fprintf(ar->f, " ");
- print_symbol(ar, field->name);
- if (field->type_entry->id == TypeTableEntryIdVoid) {
- fprintf(ar->f, ",\n");
- } else {
- fprintf(ar->f, ": %s,\n", buf_ptr(&field->type_entry->name));
+ if (type_entry->data.enumeration.complete) {
+ for (size_t i = 0; i < type_entry->data.enumeration.src_field_count; i += 1) {
+ TypeEnumField *field = &type_entry->data.enumeration.fields[i];
+ fprintf(ar->f, " ");
+ print_symbol(ar, field->name);
+ if (field->type_entry->id == TypeTableEntryIdVoid) {
+ fprintf(ar->f, ",\n");
+ } else {
+ fprintf(ar->f, ": %s,\n", buf_ptr(&field->type_entry->name));
+ }
}
}
fprintf(ar->f, "}");