aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authordimenus <ryan.saunderson88@gmail.com>2017-11-10 09:49:45 -0600
committerdimenus <ryan.saunderson88@gmail.com>2017-11-10 09:49:45 -0600
commite9d7623e1f0300b1b652373f2e0e7b605eaf13d1 (patch)
tree65470f2c68466ddc9f1663dc1b91f89324ebb2bd /src/ir.cpp
parent3a600297ca3f99ee57630c44900eec1fe7c92804 (diff)
parent336d81894da2c34a77cffd1bf903ad9e4dcaa7aa (diff)
downloadzig-e9d7623e1f0300b1b652373f2e0e7b605eaf13d1.tar.gz
zig-e9d7623e1f0300b1b652373f2e0e7b605eaf13d1.zip
Merge remote-tracking branch 'origin/master' into llvm6
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index ae48c1d369..901ba47b76 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -10311,8 +10311,17 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
{
FnTypeId *fn_type_id = &fn_type->data.fn.fn_type_id;
size_t first_arg_1_or_0 = first_arg_ptr ? 1 : 0;
- size_t var_args_1_or_0 = fn_type_id->is_var_args ? 1 : 0;
+
+ // for extern functions, the var args argument is not counted.
+ // for zig functions, it is.
+ size_t var_args_1_or_0;
+ if (fn_type_id->cc == CallingConventionUnspecified) {
+ var_args_1_or_0 = fn_type_id->is_var_args ? 1 : 0;
+ } else {
+ var_args_1_or_0 = 0;
+ }
size_t src_param_count = fn_type_id->param_count - var_args_1_or_0;
+
size_t call_param_count = call_instruction->arg_count + first_arg_1_or_0;
AstNode *source_node = call_instruction->base.source_node;
@@ -12823,6 +12832,7 @@ static TypeTableEntry *ir_analyze_instruction_switch_target(IrAnalyze *ira,
case TypeTableEntryIdEnum:
{
TypeTableEntry *tag_type = target_type->data.enumeration.tag_type;
+ assert(tag_type != nullptr);
if (pointee_val) {
ConstExprValue *out_val = ir_build_const_from(ira, &switch_target_instruction->base);
bigint_init_unsigned(&out_val->data.x_bigint, pointee_val->data.x_enum.tag);