diff --git a/Compiler/Codegen.mo b/Compiler/Codegen.mo index 060796f9e6e..8cd9cc61854 100644 --- a/Compiler/Codegen.mo +++ b/Compiler/Codegen.mo @@ -5312,8 +5312,8 @@ algorithm (outCFunction,outString,outInteger):= matchcontinue (inOperator,inExp,inInteger,inContext) local - CFunction cfn; - Lib var,var_1,s; + CFunction cfn, cfn1; + Lib var,var_1,s, stmt; Integer tnr_1,tnr; DAE.Exp e; Context context; @@ -5364,11 +5364,18 @@ algorithm (cfn,var,tnr_1) = generateExpression(e, tnr, context); then (cfn,var,tnr_1); + case (DAE.UMINUS_ARR(ty = DAE.ET_ARRAY(DAE.ET_REAL(), {NONE})), e, tnr, context) + equation + (cfn1, var, tnr_1) = generateExpression(e, tnr, context); + stmt = Util.stringAppendList({"usub_real_array(&", var, ");"}); + cfn = cAddStatements(cfn1, {stmt}); + then + (cfn, var, tnr_1); case (DAE.UMINUS_ARR(ty = _),_,_,_) equation - Debug.fprint("failtrace", "# unary minus for arrays not implemented\n"); + Debug.fprint("failtrace", "# unary minus for non-real arrays not implemented\n"); then - fail(); + fail(); case (DAE.UMINUS(ty = tp),_,_,_) equation true = RTOpts.debugFlag("failtrace"); diff --git a/c_runtime/real_array.c b/c_runtime/real_array.c index 8bda42d68de..5fb9d9a78bd 100644 --- a/c_runtime/real_array.c +++ b/c_runtime/real_array.c @@ -680,6 +680,17 @@ void add_alloc_real_array(real_array_t* a, real_array_t* b,real_array_t* dest) add_real_array(a,b,dest); } +void usub_real_array(real_array_t* a) +{ + size_t nr_of_elements, i; + + nr_of_elements = base_array_nr_of_elements(a); + for(i = 0; i < nr_of_elements; ++i) + { + real_set(a, i, -real_get(a, i)); + } +} + void sub_real_array(real_array_t* a, real_array_t* b, real_array_t* dest) { size_t nr_of_elements; diff --git a/c_runtime/real_array.h b/c_runtime/real_array.h index 1a707e1320b..f9df7c9e852 100644 --- a/c_runtime/real_array.h +++ b/c_runtime/real_array.h @@ -147,6 +147,8 @@ void range_real_array(m_real start,m_real stop, m_real inc,real_array_t* dest); void add_alloc_real_array(real_array_t* a, real_array_t* b,real_array_t* dest); void add_real_array(real_array_t* a, real_array_t* b, real_array_t* dest); +/* Unary subtraction */ +void usub_real_array(real_array_t* a); void sub_real_array(real_array_t* a, real_array_t* b, real_array_t* dest); void sub_alloc_real_array(real_array_t* a, real_array_t* b, real_array_t* dest);