Skip to content

Commit a8125b5

Browse files
committed
Partial fix for #1956
- Split redeclares into redeclare bit and modifier bit in SCodeUtil for easier error checking. - Fix modifier propagation in SCodeMod. git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@14428 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent b123152 commit a8125b5

File tree

7 files changed

+379
-131
lines changed

7 files changed

+379
-131
lines changed

Compiler/FrontEnd/NFSCodeAnalyseRedeclare.mo

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -431,11 +431,12 @@ algorithm
431431
IScope is;
432432
String str;
433433
list<tuple<Item, Env>> previousItem;
434+
Modifier orig_mod;
434435

435436
case (elem :: rest_el, exts, _, _, islist, _)
436437
equation
437-
(elem, env, previousItem) = NFSCodeInst.resolveRedeclaredElement(elem, inEnv);
438-
(islist, exts, ii) = analyseElement_dispatch(elem, exts, env, inPrefix, islist, inInstStack, previousItem);
438+
(elem, orig_mod, env, previousItem) = NFSCodeInst.resolveRedeclaredElement(elem, inEnv, inPrefix);
439+
(islist, exts, ii) = analyseElement_dispatch(elem, orig_mod, exts, env, inPrefix, islist, inInstStack, previousItem);
439440
(islist, ii) = analyseElementList(rest_el, exts, inEnv, inPrefix, islist, ii);
440441
then
441442
(islist, ii);
@@ -462,6 +463,7 @@ protected function analyseElement_dispatch
462463
"Helper function to analyseElementList.
463464
Dispatches the given element to the correct function for transformation."
464465
input tuple<Element, Modifier> inElement;
466+
input Modifier inOriginalMod;
465467
input list<NFSCodeEnv.Extends> inExtends;
466468
input Env inEnv;
467469
input Prefix inPrefix;
@@ -473,7 +475,7 @@ protected function analyseElement_dispatch
473475
output InstStack outInstStack;
474476
algorithm
475477
(outIScopes, outExtends, outInstStack) :=
476-
matchcontinue(inElement, inExtends, inEnv, inPrefix, inIScopesAcc, inInstStack, inPreviousItem)
478+
matchcontinue(inElement, inOriginalMod, inExtends, inEnv, inPrefix, inIScopesAcc, inInstStack, inPreviousItem)
477479
local
478480
Element elem;
479481
Modifier mod;
@@ -495,21 +497,21 @@ algorithm
495497
Integer i;
496498

497499
// A component
498-
case ((elem as SCode.COMPONENT(name = _), mod), _, _, _, _, _, _)
500+
case ((elem as SCode.COMPONENT(name = _), mod), _, _, _, _, _, _, _)
499501
equation
500-
(islist, ii) = analyseElement(elem, mod, inEnv, inPrefix, inIScopesAcc, inInstStack, inPreviousItem);
502+
(islist, ii) = analyseElement(elem, mod, inOriginalMod, inEnv, inPrefix, inIScopesAcc, inInstStack, inPreviousItem);
501503
then
502504
(islist, inExtends, ii);
503505

504506
// A class
505-
case ((elem as SCode.CLASS(name = _), mod), _, _, _, _, _, _)
507+
case ((elem as SCode.CLASS(name = _), mod), _, _, _, _, _, _, _)
506508
equation
507-
(islist, ii) = analyseElement(elem, mod, inEnv, inPrefix, inIScopesAcc, inInstStack, inPreviousItem);
509+
(islist, ii) = analyseElement(elem, mod, inOriginalMod, inEnv, inPrefix, inIScopesAcc, inInstStack, inPreviousItem);
508510
then
509511
(islist, inExtends, ii);
510512

511513
// An extends clause. Transform it it together with the next Extends element from the environment.
512-
case ((elem as SCode.EXTENDS(baseClassPath = _), mod),
514+
case ((elem as SCode.EXTENDS(baseClassPath = _), mod), _,
513515
NFSCodeEnv.EXTENDS(redeclareModifiers = redecls) :: rest_exts, _, _, _, _, _)
514516
equation
515517
(islist, ii) = analyseExtends(elem, mod, redecls, inEnv, inPrefix, inIScopesAcc, inInstStack);
@@ -519,7 +521,7 @@ algorithm
519521
// We should have one Extends element for each extends clause in the class.
520522
// If we get an extends clause but don't have any Extends elements left,
521523
// something has gone very wrong.
522-
case ((SCode.EXTENDS(baseClassPath = _), _), _, {}, _, _, _, _)
524+
case ((SCode.EXTENDS(baseClassPath = _), _), _, _, {}, _, _, _, _)
523525
equation
524526
Error.addMessage(Error.INTERNAL_ERROR, {"NFSCodeAnalyseRedeclare.analyseElement_dispatch ran out of extends!."});
525527
then
@@ -542,6 +544,7 @@ end analyseElement_dispatch;
542544
protected function analyseElement
543545
input Element inElement;
544546
input Modifier inClassMod;
547+
input Modifier inOriginalMod;
545548
input Env inEnv;
546549
input Prefix inPrefix;
547550
input IScopes inIScopesAcc;
@@ -551,7 +554,7 @@ protected function analyseElement
551554
output InstStack outInstStack;
552555
algorithm
553556
(outIScopes, outInstStack) :=
554-
matchcontinue(inElement, inClassMod, inEnv, inPrefix, inIScopesAcc, inInstStack, inPreviousItem)
557+
matchcontinue(inElement, inClassMod, inOriginalMod, inEnv, inPrefix, inIScopesAcc, inInstStack, inPreviousItem)
555558
local
556559
Absyn.Info info;
557560
Absyn.Path path, tpath, newpath;
@@ -593,7 +596,7 @@ algorithm
593596
name = name,
594597
typeSpec = Absyn.TPATH(tpath, ad),
595598
modifications = smod,
596-
info = info), _, _, _, _, _, _)
599+
info = info), _, _, _, _, _, _, _)
597600
equation
598601
// Look up the class of the component.
599602
// print("Looking up: " +& Absyn.pathString(tpath) +& " for component: " +& name +& "\n");
@@ -613,6 +616,7 @@ algorithm
613616

614617
// Merge the class modifications with this element's modifications.
615618
mod = NFSCodeMod.translateMod(smod, name, 0, inPrefix, inEnv);
619+
mod = NFSCodeMod.mergeMod(inOriginalMod, mod);
616620
mod = NFSCodeMod.mergeMod(inClassMod, mod);
617621

618622
// Apply redeclarations to the class definition and instantiate it.
@@ -639,7 +643,7 @@ algorithm
639643
name = name,
640644
info = info,
641645
classDef = SCode.CLASS_EXTENDS(baseClassName = _)
642-
), _, _, _, _, _, _)
646+
), _, _, _, _, _, _, _)
643647
equation
644648
then
645649
(inIScopesAcc,inInstStack);
@@ -648,7 +652,7 @@ algorithm
648652
case (SCode.CLASS(
649653
name = name,
650654
info = info,
651-
prefixes = SCode.PREFIXES(replaceablePrefix = _ /*SCode.REPLACEABLE(_)*/)), _, _, _, _, _, _)
655+
prefixes = SCode.PREFIXES(replaceablePrefix = _ /*SCode.REPLACEABLE(_)*/)), _, _, _, _, _, _, _)
652656
equation
653657
fullName = NFSCodeEnv.mergePathWithEnvPath(Absyn.IDENT(name), inEnv);
654658
// print("Looking up CLASS: " +& Absyn.pathString(fullName) +& "\n");
@@ -674,7 +678,7 @@ algorithm
674678
(islist, ii);
675679

676680
// for debugging
677-
case (_, _, _, _, _, _, _)
681+
case (_, _, _, _, _, _, _, _)
678682
equation
679683
true = Flags.isSet(Flags.FAILTRACE);
680684
Debug.traceln("NFSCodeAnalyseRedeclare.instElement ignored element:" +& SCodeDump.unparseElementStr(inElement) +& "\n");

Compiler/FrontEnd/NFSCodeFlattenRedeclare.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,7 @@ algorithm
704704
end match;
705705
end propagateItemPrefixes;
706706

707-
protected function propagateAttributesVar
707+
public function propagateAttributesVar
708708
input SCode.Element inOriginalVar;
709709
input SCode.Element inNewVar;
710710
output SCode.Element outNewVar;

Compiler/FrontEnd/NFSCodeInst.mo

Lines changed: 67 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -603,12 +603,13 @@ algorithm
603603
list<NFSCodeEnv.Extends> exts;
604604
Globals globals;
605605
Env env;
606+
Modifier orig_mod;
606607

607608
case (elem :: rest_el, _, exts, _, _, _, accum_el, cse, globals)
608609
equation
609-
(elem, env, _) = resolveRedeclaredElement(elem, inEnv);
610-
(accum_el, exts, cse, globals) = instElement_dispatch(elem, inPrefixes, exts,
611-
env, inPrefix, inInstPolicy, accum_el, cse, globals);
610+
(elem, orig_mod, env, _) = resolveRedeclaredElement(elem, inEnv, inPrefix);
611+
(accum_el, exts, cse, globals) = instElement_dispatch(elem, orig_mod,
612+
inPrefixes, exts, env, inPrefix, inInstPolicy, accum_el, cse, globals);
612613
(accum_el, cse, globals) = instElementList2(rest_el, inPrefixes, exts,
613614
inEnv, inPrefix, inInstPolicy, accum_el, cse, globals);
614615
then
@@ -638,43 +639,75 @@ public function resolveRedeclaredElement
638639
be instantiated is returned, otherwise the old environment."
639640
input tuple<SCode.Element, Modifier> inElement;
640641
input Env inEnv;
642+
input Prefix inPrefix;
641643
output tuple<SCode.Element, Modifier> outElement;
644+
output Modifier outOriginalMod;
642645
output Env outEnv;
643646
output list<tuple<NFSCodeEnv.Item, Env>> outPreviousItem;
644647
algorithm
645-
(outElement, outEnv, outPreviousItem) := match(inElement, inEnv)
648+
(outElement, outOriginalMod, outEnv, outPreviousItem) := match(inElement, inEnv, inPrefix)
646649
local
647-
Modifier mod;
650+
Modifier mod, omod;
648651
String name;
649652
Item item;
650-
SCode.Element el;
653+
SCode.Element orig_el, new_el;
651654
Env env;
652655
Boolean b;
653656
list<tuple<NFSCodeEnv.Item, Env>> previousItem;
654657

655658
// Only components which are actually replaceable needs to be looked up,
656659
// since non-replaceable components can't have been replaced.
657-
case ((SCode.COMPONENT(name = name, prefixes =
658-
SCode.PREFIXES(replaceablePrefix = SCode.REPLACEABLE(_))), mod), _)
660+
case ((orig_el as SCode.COMPONENT(name = name, prefixes =
661+
SCode.PREFIXES(replaceablePrefix = SCode.REPLACEABLE(_))), mod), _, _)
659662
equation
660663
(item, _) = NFSCodeLookup.lookupInClass(name, inEnv);
661-
(NFSCodeEnv.VAR(var = el), env, previousItem) = NFSCodeEnv.resolveRedeclaredItem(item, inEnv);
664+
(NFSCodeEnv.VAR(var = new_el), env, previousItem) = NFSCodeEnv.resolveRedeclaredItem(item, inEnv);
665+
omod = getOriginalMod(orig_el, inEnv, inPrefix);
662666
then
663-
((el, mod), env, previousItem);
667+
((new_el, mod), omod, env, previousItem);
664668

665669
// Other elements doesn't need to be looked up. Extends may not be
666670
// replaceable, and classes are looked up in the environment anyway. The
667671
// exception is packages with constants, but those are handled in
668672
// instPackageConstants.
669-
else (inElement, inEnv, {});
673+
else (inElement, NFInstTypes.NOMOD(), inEnv, {});
670674

671675
end match;
672676
end resolveRedeclaredElement;
673677

678+
protected function getOriginalMod
679+
input SCode.Element inOriginalElement;
680+
input Env inEnv;
681+
input Prefix inPrefix;
682+
output Modifier outModifier;
683+
algorithm
684+
outModifier := match(inOriginalElement, inEnv, inPrefix)
685+
local
686+
SCode.Ident name;
687+
Absyn.ArrayDim ad;
688+
Integer dim_count;
689+
SCode.Mod smod;
690+
Modifier mod;
691+
692+
case (SCode.COMPONENT(modifications = SCode.NOMOD()), _, _)
693+
then NFInstTypes.NOMOD();
694+
695+
case (SCode.COMPONENT(name = name, attributes = SCode.ATTR(arrayDims = ad),
696+
modifications = smod), _, _)
697+
equation
698+
dim_count = listLength(ad);
699+
mod = NFSCodeMod.translateMod(smod, name, dim_count, inPrefix, inEnv);
700+
then
701+
mod;
702+
703+
end match;
704+
end getOriginalMod;
705+
674706
protected function instElement_dispatch
675707
"Helper function to instElementList2. Dispatches the given element to the
676708
correct function for instantiation."
677709
input tuple<SCode.Element, Modifier> inElement;
710+
input Modifier inOriginalMod;
678711
input Prefixes inPrefixes;
679712
input list<NFSCodeEnv.Extends> inExtends;
680713
input Env inEnv;
@@ -689,8 +722,8 @@ protected function instElement_dispatch
689722
output Globals outGlobals;
690723
algorithm
691724
(outElements, outExtends, outContainsSpecialExtends, outGlobals) :=
692-
match(inElement, inPrefixes, inExtends, inEnv, inPrefix, inInstPolicy,
693-
inAccumEl, inContainsSpecialExtends, inGlobals)
725+
match(inElement, inOriginalMod, inPrefixes, inExtends, inEnv, inPrefix,
726+
inInstPolicy, inAccumEl, inContainsSpecialExtends, inGlobals)
694727
local
695728
SCode.Element elem;
696729
Modifier mod;
@@ -709,23 +742,25 @@ algorithm
709742
Item item;
710743

711744
// A component when we're in 'instantiate everything'-mode.
712-
case ((elem as SCode.COMPONENT(name = _), mod), _, _, _, _, INST_ALL(), _, cse, globals)
745+
case ((elem as SCode.COMPONENT(name = _), mod), _, _, _, _, _, INST_ALL(), _, cse, globals)
713746
equation
714-
(res, globals) = instElement(elem, mod, inPrefixes, inEnv, inPrefix, inInstPolicy, globals);
747+
(res, globals) = instElement(elem, mod, inOriginalMod, inPrefixes,
748+
inEnv, inPrefix, inInstPolicy, globals);
715749
then
716750
(res :: inAccumEl, inExtends, cse, globals);
717751

718752
// A constant when we're on 'instantiate only constants'-mode.
719753
case ((elem as SCode.COMPONENT(attributes = SCode.ATTR(variability =
720-
SCode.CONST())), mod), _, _, _, _, INST_ONLY_CONST(), _, cse, globals)
754+
SCode.CONST())), mod), _, _, _, _, _, INST_ONLY_CONST(), _, cse, globals)
721755
equation
722-
(res, globals) = instElement(elem, mod, inPrefixes, inEnv, inPrefix, inInstPolicy, globals);
756+
(res, globals) = instElement(elem, mod, inOriginalMod, inPrefixes,
757+
inEnv, inPrefix, inInstPolicy, globals);
723758
then
724759
(res :: inAccumEl, inExtends, cse, globals);
725760

726761
// An extends clause. Instantiate it together with the next Extends element
727762
// from the environment.
728-
case ((elem as SCode.EXTENDS(baseClassPath = _), mod), _,
763+
case ((elem as SCode.EXTENDS(baseClassPath = _), mod), _, _,
729764
NFSCodeEnv.EXTENDS(redeclareModifiers = redecls) :: rest_exts, _, _, ip, _, _, globals)
730765
equation
731766
(res, cse, globals) = instExtends(elem, mod, inPrefixes, redecls,
@@ -736,7 +771,7 @@ algorithm
736771

737772
// A package, instantiate only the constants.
738773
case ((elem as SCode.CLASS(name = name, restriction = SCode.R_PACKAGE()),
739-
mod), _, _, _, _, ip, _, cse, globals)
774+
mod), _, _, _, _, _, ip, _, cse, globals)
740775
equation
741776
(ores, globals) = instPackageConstants(elem, mod, inEnv, inPrefix, globals);
742777
accum_el = List.consOption(ores, inAccumEl);
@@ -746,7 +781,7 @@ algorithm
746781
// We should have one Extends element for each extends clause in the class.
747782
// If we get an extends clause but don't have any Extends elements left,
748783
// something has gone very wrong.
749-
case ((SCode.EXTENDS(baseClassPath = _), _), _, {}, _, _, _, _, _, _)
784+
case ((SCode.EXTENDS(baseClassPath = _), _), _, _, {}, _, _, _, _, _, _)
750785
equation
751786
Error.addMessage(Error.INTERNAL_ERROR,
752787
{"NFSCodeInst.instElement_dispatch ran out of extends!."});
@@ -762,6 +797,7 @@ end instElement_dispatch;
762797
protected function instElement
763798
input SCode.Element inElement;
764799
input Modifier inClassMod;
800+
input Modifier inOriginalMod;
765801
input Prefixes inPrefixes;
766802
input Env inEnv;
767803
input Prefix inPrefix;
@@ -770,8 +806,8 @@ protected function instElement
770806
output Element outElement;
771807
output Globals outGlobals;
772808
algorithm
773-
(outElement,outGlobals) :=
774-
match(inElement, inClassMod, inPrefixes, inEnv, inPrefix, inInstPolicy, inGlobals)
809+
(outElement, outGlobals) := match(inElement, inClassMod, inOriginalMod,
810+
inPrefixes, inEnv, inPrefix, inInstPolicy, inGlobals)
775811
local
776812
Absyn.ArrayDim ad;
777813
Absyn.Info info;
@@ -800,7 +836,7 @@ algorithm
800836
// an outer component
801837
case (SCode.COMPONENT(name = name,
802838
typeSpec = Absyn.TPATH(path = tpath),
803-
prefixes = SCode.PREFIXES(innerOuter = Absyn.OUTER())), _, _, _, _, _, globals)
839+
prefixes = SCode.PREFIXES(innerOuter = Absyn.OUTER())), _, _, _, _, _, _, globals)
804840
equation
805841
prefix = NFInstUtil.addPrefix(name, {}, inPrefix);
806842
path = NFInstUtil.prefixToPath(prefix);
@@ -810,7 +846,7 @@ algorithm
810846

811847
case (SCode.COMPONENT(name = name, typeSpec = Absyn.TPATH(path =
812848
Absyn.QUALIFIED(name = "$EnumType", path = tpath)), info = info),
813-
_, _, _, _, ip, globals)
849+
_, _, _, _, _, ip, globals)
814850
equation
815851
Absyn.QUALIFIED(name = enum_idx_str, path = tpath) = tpath;
816852
enum_idx = stringInt(enum_idx_str);
@@ -829,7 +865,7 @@ algorithm
829865
// A component, look up it's type and instantiate that class.
830866
case (SCode.COMPONENT(name = name, attributes = SCode.ATTR(arrayDims = ad),
831867
typeSpec = Absyn.TPATH(path = tpath), modifications = smod,
832-
condition = NONE(), info = info), _, _, _, _, ip, globals)
868+
condition = NONE(), info = info), _, _, _, _, _, ip, globals)
833869
equation
834870
// Look up the class of the component.
835871
(item, _, env) = NFSCodeLookup.lookupClassName(tpath, inEnv, info);
@@ -846,6 +882,7 @@ algorithm
846882
// Merge the class modifications with this element's modifications.
847883
dim_count = listLength(ad);
848884
mod = NFSCodeMod.translateMod(smod, name, dim_count, inPrefix, inEnv);
885+
mod = NFSCodeMod.mergeMod(inOriginalMod, mod);
849886
cmod = NFSCodeMod.propagateMod(inClassMod, dim_count);
850887
mod = NFSCodeMod.mergeMod(cmod, mod);
851888

@@ -879,7 +916,7 @@ algorithm
879916

880917
// A conditional component, save it for later.
881918
case (SCode.COMPONENT(name = name, condition = SOME(cond_exp), info = info),
882-
_, _, _, _, _, globals)
919+
_, _, _, _, _, _, globals)
883920
equation
884921
path = NFInstUtil.prefixPath(Absyn.IDENT(name), inPrefix);
885922
(inst_exp, globals) = instExp(cond_exp, inEnv, inPrefix, info, globals);
@@ -2297,7 +2334,7 @@ algorithm
22972334
(NFSCodeEnv.VAR(var = selem), env, _) = NFSCodeEnv.resolveRedeclaredItem(item, env);
22982335

22992336
prefix = NFInstUtil.restPrefix(NFInstUtil.pathPrefix(inName));
2300-
(elem, (consts, funcs)) = instElement(selem, NFInstTypes.NOMOD(),
2337+
(elem, (consts, funcs)) = instElement(selem, NFInstTypes.NOMOD(), NFInstTypes.NOMOD(),
23012338
NFInstTypes.NO_PREFIXES(), env, prefix, INST_ALL(), inGlobals);
23022339

23032340
consts = NFInstSymbolTable.addElement(elem, consts);
@@ -2413,7 +2450,7 @@ algorithm
24132450
case (_, NFSCodeEnv.VAR(var = selem as SCode.COMPONENT(typeSpec =
24142451
Absyn.TPATH(path = Absyn.QUALIFIED(name = "$EnumType")))), env, _, _)
24152452
equation
2416-
(elem, (consts, funcs)) = instElement(selem, NFInstTypes.NOMOD(),
2453+
(elem, (consts, funcs)) = instElement(selem, NFInstTypes.NOMOD(), NFInstTypes.NOMOD(),
24172454
NFInstTypes.NO_PREFIXES(), env, inPrefix, INST_ALL(), inGlobals);
24182455
consts = NFInstSymbolTable.addElement(elem, consts);
24192456
then
@@ -2422,7 +2459,7 @@ algorithm
24222459
// A normal package constant.
24232460
case (_, NFSCodeEnv.VAR(var = selem), env, _, _)
24242461
equation
2425-
(elem, (consts, funcs)) = instElement(selem, NFInstTypes.NOMOD(),
2462+
(elem, (consts, funcs)) = instElement(selem, NFInstTypes.NOMOD(), NFInstTypes.NOMOD(),
24262463
NFInstTypes.NO_PREFIXES(), env, inPrefix, INST_ALL(), inGlobals);
24272464

24282465
NFInstTypes.ELEMENT(component = comp) = elem;
@@ -3944,7 +3981,7 @@ algorithm
39443981
// instElement will just add it as a conditional component again.
39453982
sel = SCode.removeComponentCondition(inElement);
39463983
// Instantiate the element and update the symbol table.
3947-
(el, globals) = instElement(sel, inMod, inPrefixes, inEnv, inPrefix, INST_ALL(), globals);
3984+
(el, globals) = instElement(sel, inMod, NFInstTypes.NOMOD(), inPrefixes, inEnv, inPrefix, INST_ALL(), globals);
39483985
(st, added) = NFInstSymbolTable.addInstCondElement(el, st);
39493986
// Recursively instantiate any conditional components in this element.
39503987
(oel, st, globals) = instConditionalElementOnTrue(added, el, st, globals);

0 commit comments

Comments
 (0)