aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-11-24 14:26:45 +0000
committergingerBill <bill@gingerbill.org>2022-11-24 14:26:45 +0000
commit615eccb6d193e9eb2575cfb28b1366c648296c31 (patch)
tree8aacb3c6a692c892c7b5cbd4c2da76b7ca617a84 /src
parentd3c65b6ba534b23be92333a2f7cec8a56e26e5c2 (diff)
Correct return ptr semantics for split returns
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend_proc.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index a518e501f..f14fc8a8c 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -511,7 +511,14 @@ void lb_begin_procedure_body(lbProcedure *p) {
}
}
- Type *ptr_type = alloc_type_pointer(reduce_tuple_to_single_type(p->type->Proc.results));
+ Type *return_ptr_type = reduce_tuple_to_single_type(p->type->Proc.results);
+ bool split_returns = ft->multiple_return_original_type != nullptr;
+ if (split_returns) {
+ GB_ASSERT(is_type_tuple(return_ptr_type));
+ auto const &variables = return_ptr_type->Tuple.variables;
+ return_ptr_type = variables[variables.count-1]->type;
+ }
+ Type *ptr_type = alloc_type_pointer(return_ptr_type);
Entity *e = alloc_entity_param(nullptr, make_token_ident(name), ptr_type, false, false);
e->flags |= EntityFlag_NoAlias;