@@ -589,26 +589,31 @@ uniontype Call
589589 protected
590590 Function func ;
591591 list< Expression > args;
592- list< Type > arg_ty;
593- list< Variability > arg_var;
594592 CallAttributes ca;
595593 list< TypedArg > typed_args;
596594 MatchedFunction matchedFunc;
597595 InstNode scope;
598- Variability var ;
596+ Variability var , arg_var ;
599597 Type ty;
598+ Expression arg_exp;
600599 algorithm
601600 ARG_TYPED_CALL (call_scope = scope) := call;
602601 matchedFunc := checkMatchingFunctions(call,info);
603602
604603 func := matchedFunc. func ;
604+ // Don't evaluate structural parameters for external functions, the code generation can't handle it in
605+ // some cases (see bug #4904). For constants we'll get issues no matter if we evaluate them or not,
606+ // but evaluating them will probably cause the last amount of issues.
605607 typed_args := matchedFunc. args;
606- args := list(Util . tuple31(a) for a in typed_args);
607608
609+ args := {};
608610 var := Variability . CONSTANT ;
609611 for a in typed_args loop
610- var := Prefixes . variabilityMax(var , Util . tuple33(a));
612+ (arg_exp, _, arg_var) := a;
613+ args := arg_exp :: args;
614+ var := Prefixes . variabilityMax(var , arg_var);
611615 end for ;
616+ args := listReverseInPlace(args);
612617
613618 ty := Function . returnType(func );
614619
@@ -845,7 +850,7 @@ uniontype Call
845850 algorithm
846851 typedArgs := {};
847852 for arg in call. arguments loop
848- (arg, arg_ty, arg_var) := Typing . typeExp(arg, origin, info);
853+ (arg, arg_ty, arg_var) := Typing . typeExp(arg, origin, info, replaceConstants = false );
849854 typedArgs := (arg, arg_ty, arg_var) :: typedArgs;
850855 end for ;
851856
@@ -854,7 +859,7 @@ uniontype Call
854859 typedNamedArgs := {};
855860 for narg in call. named_args loop
856861 (name,arg) := narg;
857- (arg, arg_ty, arg_var) := Typing . typeExp(arg, origin, info);
862+ (arg, arg_ty, arg_var) := Typing . typeExp(arg, origin, info, replaceConstants = false );
858863 typedNamedArgs := (name, arg, arg_ty, arg_var) :: typedNamedArgs;
859864 end for ;
860865
@@ -1521,8 +1526,7 @@ protected
15211526 list< TypedArg > args;
15221527 TypedArg start,interval;
15231528 algorithm
1524- argtycall := typeNormalCall(call, origin, info);
1525- argtycall := matchTypedNormalCall(argtycall, origin, info);
1529+ argtycall := typeMatchNormalCall(call, origin, info);
15261530 ty := getType(argtycall);
15271531 callExp := Expression . CALL (unboxArgs(argtycall));
15281532 end typeDiscreteCall;
@@ -1762,8 +1766,7 @@ protected
17621766 protected
17631767 Call argtycall;
17641768 algorithm
1765- argtycall := typeNormalCall(call, origin, info);
1766- argtycall := matchTypedNormalCall(argtycall, origin, info);
1769+ argtycall := typeMatchNormalCall(call, origin, info);
17671770 argtycall := unboxArgs(argtycall);
17681771 ty := getType(argtycall);
17691772 var := variability(argtycall);
@@ -1784,8 +1787,7 @@ protected
17841787 Call argtycall;
17851788 algorithm
17861789 // TODO: Rewrite this whole thing.
1787- argtycall := typeNormalCall(call, origin, info);
1788- argtycall := matchTypedNormalCall(argtycall, origin, info);
1790+ argtycall := typeMatchNormalCall(call, origin, info);
17891791 argtycall := unboxArgs(argtycall);
17901792 ty := getType(argtycall);
17911793 var := variability(argtycall);
@@ -2289,8 +2291,7 @@ protected
22892291 protected
22902292 Call argtycall;
22912293 algorithm
2292- argtycall := typeNormalCall(call, origin, info);
2293- argtycall := matchTypedNormalCall(argtycall, origin, info);
2294+ argtycall := typeMatchNormalCall(call, origin, info);
22942295
22952296 ty := getType(argtycall);
22962297 var := variability(argtycall);
0 commit comments