From ca147d71c25281cfc9a0a4ad59fc8cfa9a62afcc Mon Sep 17 00:00:00 2001 From: Adrian Pop Date: Mon, 19 Dec 2016 06:09:05 +0100 Subject: [PATCH] handle if expressions --- Compiler/NFFrontEnd/NFTypeCheck.mo | 46 ++++++++++++++++++++++++++++++ Compiler/NFFrontEnd/NFTyping.mo | 16 +++++++++-- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/Compiler/NFFrontEnd/NFTypeCheck.mo b/Compiler/NFFrontEnd/NFTypeCheck.mo index e12965a98ee..6bcaeb5c9a1 100644 --- a/Compiler/NFFrontEnd/NFTypeCheck.mo +++ b/Compiler/NFFrontEnd/NFTypeCheck.mo @@ -2302,5 +2302,51 @@ algorithm end match; end getBooleanRangeType; +function checkIfExpression + input DAE.Exp condExp; + input DAE.Type condType; + input DAE.Const condVar; + input DAE.Exp thenExp; + input DAE.Type thenType; + input DAE.Const thenVar; + input DAE.Exp elseExp; + input DAE.Type elseType; + input DAE.Const elseVar; + input SourceInfo info; + output DAE.Exp outExp; + output DAE.Type outType; + output DAE.Const outVar; +protected + DAE.Exp ec, e1, e2; + String s1, s2, s3, s4; + Boolean tyMatch; +algorithm + (ec, _, tyMatch) := Types.matchTypeNoFail(condExp, condType, DAE.T_BOOL_DEFAULT); + + // if the condtion is not boolean that's bad :) + if not tyMatch then + s1 := ExpressionDump.printExpStr(condExp); + s2 := Types.unparseType(condType); + Error.addSourceMessageAndFail(Error.IF_CONDITION_TYPE_ERROR , {s1, s2}, info); + end if; + + (e1, e2, outType, tyMatch) := + Types.checkTypeCompat(thenExp, thenType, elseExp, elseType); + + // if the types are not matching, print an error and fail. + if not tyMatch then + s1 := ExpressionDump.printExpStr(thenExp); + s2 := ExpressionDump.printExpStr(elseExp); + s3 := Types.unparseTypeNoAttr(thenType); + s4 := Types.unparseTypeNoAttr(elseType); + Error.addSourceMessageAndFail(Error.TYPE_MISMATCH_IF_EXP, + {"", s1, s3, s2, s4}, info); + end if; + + outExp := DAE.IFEXP(ec, e1, e2); + outType := thenType; + outVar := Types.constAnd(thenVar, elseVar); +end checkIfExpression; + annotation(__OpenModelica_Interface="frontend"); end NFTypeCheck; diff --git a/Compiler/NFFrontEnd/NFTyping.mo b/Compiler/NFFrontEnd/NFTyping.mo index 70ac4ec0cb6..0e74fd76804 100644 --- a/Compiler/NFFrontEnd/NFTyping.mo +++ b/Compiler/NFFrontEnd/NFTyping.mo @@ -670,9 +670,9 @@ algorithm (typedExp, ty, variability) := match untypedExp local DAE.ComponentRef cref; - DAE.Exp e1, e2; - DAE.Type ty1, ty2; - DAE.Const var1, var2; + DAE.Exp e1, e2, e3; + DAE.Type ty1, ty2, ty3; + DAE.Const var1, var2, var3; DAE.Operator op; case Absyn.Exp.INTEGER() @@ -748,6 +748,16 @@ algorithm then (typedExp, ty, Types.constAnd(var1, var2)); + case Absyn.Exp.IFEXP() + algorithm + (e1, ty1, var1) := typeExp(untypedExp.ifExp, scope, info); + (e2, ty2, var2) := typeExp(untypedExp.trueBranch, scope, info); + (e3, ty3, var3) := typeExp(untypedExp.elseBranch, scope, info); + + (typedExp, ty, variability) := TypeCheck.checkIfExpression(e1, ty1, var1, e2, ty2, var2, e3, ty3, var3, info); + then + (typedExp, ty, variability); + case Absyn.Exp.CALL() algorithm (typedExp, ty, variability) := Func.typeFunctionCall(untypedExp.function_, untypedExp.functionArgs, scope, info);