Skip to content

Commit

Permalink
Protect from stack overflow in partialInstClassIn and instDerivedClasses
Browse files Browse the repository at this point in the history
 - Sadly, the error-messages are rolled back in most cases, but it is better than getting a stack overflow in OMEdit


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@15870 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Apr 21, 2013
1 parent 9bc4a51 commit 2ab07ad
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 48 deletions.
2 changes: 1 addition & 1 deletion Compiler/FrontEnd/Dependency.mo
Original file line number Diff line number Diff line change
Expand Up @@ -1394,7 +1394,7 @@ algorithm
env2 = Env.openScope(env_1, encflag, SOME(id), Env.restrictionToScopeType(restr));
ci_state = ClassInf.start(restr, Env.getEnvName(env2));
(cache,env_2,_,_) = Inst.partialInstClassIn(cache, env2, InnerOuter.emptyInstHierarchy,
DAE.NOMOD(), Prefix.NOPRE(), ci_state, cl, SCode.PUBLIC(), {});
DAE.NOMOD(), Prefix.NOPRE(), ci_state, cl, SCode.PUBLIC(), {}, 0);
then
env_2;

Expand Down
61 changes: 36 additions & 25 deletions Compiler/FrontEnd/Inst.mo
Original file line number Diff line number Diff line change
Expand Up @@ -1682,7 +1682,7 @@ algorithm
c as SCode.CLASS(restriction = SCode.R_PACKAGE(), partialPrefix = SCode.PARTIAL()),
vis,inst_dims,impl,_,graph,_,_)
equation
(cache,env,ih,ci_state) = partialInstClassIn(cache, env, ih, mods, pre, ci_state, c, vis, inst_dims);
(cache,env,ih,ci_state) = partialInstClassIn(cache, env, ih, mods, pre, ci_state, c, vis, inst_dims, 0);
then
(cache,env,ih,store,DAEUtil.emptyDae, inSets,ci_state,{},NONE(),NONE(),NONE(),graph);

Expand Down Expand Up @@ -2640,12 +2640,13 @@ public function partialInstClassIn
input SCode.Element inClass;
input SCode.Visibility inVisibility;
input InstDims inInstDims;
input Integer numIter;
output Env.Cache outCache;
output Env.Env outEnv;
output InstanceHierarchy outIH;
output ClassInf.State outState;
algorithm
(outCache,outEnv,outIH,outState) := matchcontinue (inCache,inEnv,inIH,inMod,inPrefix,inState,inClass,inVisibility,inInstDims)
(outCache,outEnv,outIH,outState) := matchcontinue (inCache,inEnv,inIH,inMod,inPrefix,inState,inClass,inVisibility,inInstDims,numIter)
local
list<Env.Frame> env;
DAE.Mod mods;
Expand Down Expand Up @@ -2675,7 +2676,7 @@ algorithm
Boolean partialInst;

// see if we find a partial class inst
case (cache,env,ih,mods,pre,ci_state,c as SCode.CLASS(name = className, restriction=r),vis,inst_dims)
case (cache,env,ih,mods,pre,ci_state,c as SCode.CLASS(name = className, restriction=r),vis,inst_dims,_)
equation
true = Flags.isSet(Flags.CACHE);
instHash = getGlobalRoot(Global.instHashIndex);
Expand All @@ -2696,7 +2697,7 @@ algorithm

/*/ adrpo: TODO! FIXME! see if we find a full instantiation!
// this fails for 2-3 examples, so disable it for now and check it later
case (cache,env,ih,mods,pre,csets,ci_state,c as SCode.CLASS(name = className, restriction=r),vis,inst_dims)
case (cache,env,ih,mods,pre,csets,ci_state,c as SCode.CLASS(name = className, restriction=r),vis,inst_dims,_)
local
tuple<Env.Cache, Env, InstanceHierarchy, UnitAbsyn.InstStore, DAE.Mod, Prefix.Prefix,
Connect.Sets, ClassInf.State, SCode.Element, Boolean, InstDims, Boolean,
Expand Down Expand Up @@ -2725,14 +2726,14 @@ algorithm
(inCache,env,ih,ci_state_1);*/

/* call the function and then add it in the cache */
case (cache,env,ih,mods,pre,ci_state,c,vis,inst_dims)
case (cache,env,ih,mods,pre,ci_state,c,vis,inst_dims,_)
equation

true = numIter < 40;
partialInst = System.getPartialInstantiation();
System.setPartialInstantiation(true);

(cache,env,ih,ci_state) =
partialInstClassIn_dispatch(inCache,inEnv,inIH,inMod,inPrefix,inState,inClass,vis,inInstDims,partialInst);
partialInstClassIn_dispatch(inCache,inEnv,inIH,inMod,inPrefix,inState,inClass,vis,inInstDims,partialInst,numIter+1);

envPathOpt = Env.getEnvPath(inEnv);
className = SCode.className(c);
Expand All @@ -2749,7 +2750,15 @@ algorithm
then
(cache,env,ih,ci_state);

case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = n,restriction = r,classDef = d)),vis,inst_dims)
case (cache,env,ih,mods,pre,ci_state,c,vis,inst_dims,_)
equation
false = numIter < 40;
n = Env.printEnvPathStr(env);
// print("partialInstClassIn recursion depth... " +& n +& "\n");
Error.addSourceMessage(Error.RECURSION_DEPTH_REACHED,{n},SCode.elementInfo(c));
then fail();

case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = n,restriction = r,classDef = d)),vis,inst_dims,_)
equation
true = Flags.isSet(Flags.FAILTRACE);
Debug.traceln("- Inst.partialInstClassIn failed on class:" +&
Expand All @@ -2774,12 +2783,13 @@ protected function partialInstClassIn_dispatch
input SCode.Visibility inVisibility;
input InstDims inInstDims;
input Boolean partialInst;
input Integer numIter;
output Env.Cache outCache;
output Env.Env outEnv;
output InstanceHierarchy outIH;
output ClassInf.State outState;
algorithm
(outCache,outEnv,outIH,outState) := matchcontinue (inCache,inEnv,inIH,inMod,inPrefix,inState,inClass,inVisibility,inInstDims,partialInst)
(outCache,outEnv,outIH,outState) := matchcontinue (inCache,inEnv,inIH,inMod,inPrefix,inState,inClass,inVisibility,inInstDims,partialInst,numIter)
local
list<Env.Frame> env,env_1;
DAE.Mod mods;
Expand All @@ -2796,30 +2806,30 @@ algorithm
InstanceHierarchy ih;
Absyn.Info info;

case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = "Real")),_,_,_)
case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = "Real")),_,_,_,_)
equation
System.setPartialInstantiation(partialInst);
then (cache,env,ih,ci_state);

case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = "Integer")),_,_,_)
case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = "Integer")),_,_,_,_)
equation
System.setPartialInstantiation(partialInst);
then (cache,env,ih,ci_state);

case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = "String")),_,_,_)
case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = "String")),_,_,_,_)
equation
System.setPartialInstantiation(partialInst);
then (cache,env,ih,ci_state);

case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = "Boolean")),_,_,_)
case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = "Boolean")),_,_,_,_)
equation
System.setPartialInstantiation(partialInst);
then (cache,env,ih,ci_state);

case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = n,restriction = r,partialPrefix=partialPrefix,classDef = d, info = info)),vis,inst_dims,_)
case (cache,env,ih,mods,pre,ci_state,(c as SCode.CLASS(name = n,restriction = r,partialPrefix=partialPrefix,classDef = d, info = info)),vis,inst_dims,_,_)
equation
// t1 = clock();
(cache,env_1,ih,ci_state_1) = partialInstClassdef(cache,env,ih, mods, pre, ci_state, d, r, partialPrefix, vis, inst_dims, n, info);
(cache,env_1,ih,ci_state_1) = partialInstClassdef(cache,env,ih, mods, pre, ci_state, d, r, partialPrefix, vis, inst_dims, n, info,numIter);

System.setPartialInstantiation(partialInst);

Expand All @@ -2838,7 +2848,7 @@ algorithm
then
(cache,env_1,ih,ci_state_1);

case (cache,env,ih,mods,pre,ci_state,c,vis,inst_dims,_)
case (cache,env,ih,mods,pre,ci_state,c,vis,inst_dims,_,_)
equation
System.setPartialInstantiation(partialInst);
then
Expand Down Expand Up @@ -4882,13 +4892,14 @@ protected function partialInstClassdef
input InstDims inInstDims;
input String inClassName "the class name that contains the elements we are instanting";
input Absyn.Info info;
input Integer numIter;
output Env.Cache outCache;
output Env.Env outEnv;
output InstanceHierarchy outIH;
output ClassInf.State outState;
algorithm
(outCache,outEnv,outIH,outState):=
matchcontinue (inCache,inEnv,inIH,inMod,inPrefix,inState,inClassDef,inRestriction,inPartialPrefix,inVisibility,inInstDims,inClassName,info)
matchcontinue (inCache,inEnv,inIH,inMod,inPrefix,inState,inClassDef,inRestriction,inPartialPrefix,inVisibility,inInstDims,inClassName,info,numIter)
local
ClassInf.State ci_state1,ci_state,new_ci_state,new_ci_state_1,ci_state2;
list<SCode.Element> cdefelts,extendselts,els,cdefelts2,classextendselts;
Expand Down Expand Up @@ -4921,7 +4932,7 @@ algorithm
SCode.PARTS(elementLst = els,
normalEquationLst = eqs, initialEquationLst = initeqs,
normalAlgorithmLst = alg, initialAlgorithmLst = initalg),
re,partialPrefix,vis,inst_dims,className,_)
re,partialPrefix,vis,inst_dims,className,_,_)
equation
isPartialInst = true;
// Debug.traceln(" Partialinstclassdef for: " +& PrefixUtil.printPrefixStr(pre) +& "." +& className +& " mods: " +& Mod.printModStr(mods));
Expand Down Expand Up @@ -4970,7 +4981,7 @@ algorithm
// Short class definition, derived from basic types!
case (cache,env,ih,mods,pre,ci_state,
SCode.DERIVED(Absyn.TPATH(path = cn, arrayDim = ad),modifications = mod),
re,partialPrefix,vis,inst_dims,className,_)
re,partialPrefix,vis,inst_dims,className,_,_)
equation
(cache,(c as SCode.CLASS(name=cn2,encapsulatedPrefix=enc2,restriction=r)),cenv) = Lookup.lookupClass(cache, env, cn, true);

Expand All @@ -4988,14 +4999,14 @@ algorithm
(cache,mod_1) = Mod.elabMod(cache, parentEnv, ih, pre, mod, false, info);
mods_1 = Mod.merge(mods, mod_1, parentEnv, pre);

(cache,env_2,ih,new_ci_state_1) = partialInstClassIn(cache, cenv_2, ih, mods_1, pre, new_ci_state, c, vis, inst_dims);
(cache,env_2,ih,new_ci_state_1) = partialInstClassIn(cache, cenv_2, ih, mods_1, pre, new_ci_state, c, vis, inst_dims, numIter);
then
(cache,env_2,ih,new_ci_state_1);

// Short class definition, not derived from basic types!, empty array dims
case (cache,env,ih,mods,pre,ci_state,
SCode.DERIVED(Absyn.TPATH(path = cn, arrayDim = ad),modifications = mod,comment = cmt),
re,partialPrefix,vis,inst_dims,className,_)
re,partialPrefix,vis,inst_dims,className,_,_)
equation
// no meta-modelica
// false = Config.acceptMetaModelicaGrammar();
Expand Down Expand Up @@ -5025,14 +5036,14 @@ algorithm
(cache, env, ih, ci_state) =
partialInstClassdef(cache, env, ih, mods_1, pre, ci_state,
SCode.PARTS({SCode.EXTENDS(cn, vis, SCode.NOMOD(), NONE(), info)},{},{},{},{},{},{},NONE(),{}, cmt),
re, partialPrefix, vis, inst_dims, className, info);
re, partialPrefix, vis, inst_dims, className, info, numIter);
then
(cache, env, ih, ci_state);

// Short class definition, not derived from basic types!, non-empty array dims
case (cache,env,ih,mods,pre,ci_state,
SCode.DERIVED(Absyn.TPATH(path = cn, arrayDim = ad),modifications = mod),
re,partialPrefix,vis,inst_dims,className,_)
re,partialPrefix,vis,inst_dims,className,_,_)
equation
(cache,(c as SCode.CLASS(name=cn2,encapsulatedPrefix=enc2,restriction=r)),cenv) = Lookup.lookupClass(cache, env, cn, true);

Expand Down Expand Up @@ -5073,7 +5084,7 @@ algorithm
inst_dims2 = instDimExpLst(dims, false);
inst_dims_1 = List.appendLastList(inst_dims, inst_dims2);

(cache,env_2,ih,new_ci_state_1) = partialInstClassIn(cache, cenv_2, ih, mods_1, pre, new_ci_state, c, vis, inst_dims_1);
(cache,env_2,ih,new_ci_state_1) = partialInstClassIn(cache, cenv_2, ih, mods_1, pre, new_ci_state, c, vis, inst_dims_1, numIter);
then
(cache,env_2,ih,new_ci_state_1);

Expand All @@ -5082,7 +5093,7 @@ algorithm
*/
case (cache,env,ih,mods,pre,ci_state,
SCode.DERIVED(Absyn.TPATH(path = cn, arrayDim = ad),modifications = mod),
re,partialPrefix,vis,inst_dims,className,_)
re,partialPrefix,vis,inst_dims,className,_,_)
equation
failure((_,_,_) = Lookup.lookupClass(cache,env, cn, false));
cns = Absyn.pathString(cn);
Expand Down
55 changes: 47 additions & 8 deletions Compiler/FrontEnd/InstExtends.mo
Original file line number Diff line number Diff line change
Expand Up @@ -525,9 +525,39 @@ public function instDerivedClasses
output list<SCode.Equation> outSCodeEquationLst4;
output list<SCode.AlgorithmSection> outSCodeAlgorithmLst5;
output list<SCode.AlgorithmSection> outSCodeAlgorithmLst6;
algorithm
(outCache,outEnv1,outIH,outSCodeElementLst2,outSCodeEquationLst3,outSCodeEquationLst4,outSCodeAlgorithmLst5,outSCodeAlgorithmLst6) :=
instDerivedClassesWork(inCache,inEnv,inIH,inMod,inPrefix,inClass,inBoolean,inInfo,false,0);
end instDerivedClasses;

protected function instDerivedClassesWork
"function: instDerivedClasses
author: PA
This function takes a class definition and returns the
elements and equations and algorithms of the class.
If the class is derived, the class is looked up and the
derived class parts are fetched."
input Env.Cache inCache;
input Env.Env inEnv;
input InstanceHierarchy inIH;
input DAE.Mod inMod;
input Prefix.Prefix inPrefix;
input SCode.Element inClass;
input Boolean inBoolean;
input Absyn.Info inInfo "File information of the extends element";
input Boolean overflow;
input Integer numIter;
output Env.Cache outCache;
output Env.Env outEnv1;
output InstanceHierarchy outIH;
output list<SCode.Element> outSCodeElementLst2;
output list<SCode.Equation> outSCodeEquationLst3;
output list<SCode.Equation> outSCodeEquationLst4;
output list<SCode.AlgorithmSection> outSCodeAlgorithmLst5;
output list<SCode.AlgorithmSection> outSCodeAlgorithmLst6;
algorithm
(outCache,outEnv1,outIH,outSCodeElementLst2,outSCodeEquationLst3,outSCodeEquationLst4,outSCodeAlgorithmLst5,outSCodeAlgorithmLst6):=
matchcontinue (inCache,inEnv,inIH,inMod,inPrefix,inClass,inBoolean,inInfo)
matchcontinue (inCache,inEnv,inIH,inMod,inPrefix,inClass,inBoolean,inInfo,overflow,numIter)
local
list<SCode.Element> elt;
list<Env.Frame> env,cenv;
Expand All @@ -542,7 +572,7 @@ algorithm
InstanceHierarchy ih;
Option<SCode.Comment> cmt;
list<SCode.Enum> enumLst;
String n,name;
String n,name,str1,str2;
Option<SCode.ExternalDecl> extdecl;
Prefix.Prefix pre;
Absyn.Info info;
Expand All @@ -551,40 +581,49 @@ algorithm
SCode.PARTS(elementLst = elt,
normalEquationLst = eq,initialEquationLst = ieq,
normalAlgorithmLst = alg,initialAlgorithmLst = ialg,
externalDecl = extdecl)),_,info)
externalDecl = extdecl)),_,info,_,_)
equation
/* elt_1 = noImportElements(elt); */
Error.assertionOrAddSourceMessage(Util.isNone(extdecl), Error.EXTENDS_EXTERNAL, {name}, info);
then
(cache,env,ih,elt,eq,ieq,alg,ialg);

case (cache,env,ih,mod,pre,SCode.CLASS(info = info, classDef = SCode.DERIVED(typeSpec = Absyn.TPATH(tp, _),modifications = dmod)),impl, _)
case (cache,env,ih,mod,pre,SCode.CLASS(info = info, classDef = SCode.DERIVED(typeSpec = Absyn.TPATH(tp, _),modifications = dmod)),impl, _, false, _)
equation
// Debug.fprintln(Flags.INST_TRACE, "DERIVED: " +& Env.printEnvPathStr(env) +& " el: " +& SCodeDump.unparseElementStr(inClass) +& " mods: " +& Mod.printModStr(mod));
(cache, c, cenv) = Lookup.lookupClass(cache, env, tp, true);
// false = Absyn.pathEqual(Env.getEnvName(env),Env.getEnvName(cenv)) and SCode.elementEqual(c,inClass);
// modifiers should be evaluated in the current scope for derived!
//(cache,daeDMOD) = Mod.elabMod(cache, env, ih, pre, dmod, impl, info);
// merge in the class env
//mod = Mod.merge(mod, daeDMOD, cenv, pre);
(cache,env,ih,elt,eq,ieq,alg,ialg) = instDerivedClasses(cache, cenv, ih, mod, pre, c, impl, info)
(cache,env,ih,elt,eq,ieq,alg,ialg) = instDerivedClassesWork(cache, cenv, ih, mod, pre, c, impl, info, numIter >= 40, numIter+1)
"Mod.lookup_modification_p(mod, c) => innermod & We have to merge and apply modifications as well!" ;
then
(cache,env,ih,elt,eq,ieq,alg,ialg);

case (cache,env,ih,mod,pre,SCode.CLASS(name=n, classDef = SCode.ENUMERATION(enumLst,cmt), info = info),impl,_)
case (cache,env,ih,mod,pre,SCode.CLASS(name=n, classDef = SCode.ENUMERATION(enumLst,cmt), info = info),impl,_,false,_)
equation
c = Inst.instEnumeration(n, enumLst, cmt, info);
(cache,env,ih,elt,eq,ieq,alg,ialg) = instDerivedClasses(cache, env, ih, mod, pre, c, impl,info);
(cache,env,ih,elt,eq,ieq,alg,ialg) = instDerivedClassesWork(cache, env, ih, mod, pre, c, impl,info, numIter >= 40, numIter+1);
then
(cache,env,ih,elt,eq,ieq,alg,ialg);

case (_,_,_,_,_,_,_,_,true,_)
equation
str1 = SCodeDump.printElementStr(inClass);
str2 = Env.printEnvPathStr(inEnv);
// print("instDerivedClassesWork recursion depth... " +& str1 +& " " +& str2 +& "\n");
Error.addSourceMessage(Error.RECURSION_DEPTH_DERIVED,{str1,str2},inInfo);
then fail();

else
equation
Debug.fprint(Flags.FAILTRACE, "- Inst.instDerivedClasses failed\n");
then
fail();
end matchcontinue;
end instDerivedClasses;
end instDerivedClassesWork;

protected function noImportElements
"function: noImportElements
Expand Down
14 changes: 6 additions & 8 deletions Compiler/FrontEnd/Lookup.mo
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,7 @@ algorithm
Inst.partialInstClassIn(
cache,env,InnerOuter.emptyInstHierarchy,
DAE.NOMOD(), Prefix.NOPRE(),
ci_state, inC, SCode.PUBLIC(), {});
ci_state, inC, SCode.PUBLIC(), {}, 0);
// Was 2 cases for package/non-package - all they did was fail or succeed on this
// If we comment it out, we get faster code, and less of it to maintain
// ClassInf.valid(cistate1, SCode.R_PACKAGE());
Expand Down Expand Up @@ -839,10 +839,8 @@ algorithm
env2 = Env.openScope(env_1, encflag, SOME(id), Env.restrictionToScopeType(restr));
ci_state = ClassInf.start(restr, Env.getEnvName(env2));
// Debug.fprintln(Flags.INST_TRACE, "LOOKUP MORE UNQUALIFIED IMPORTED ICD: " +& Env.printEnvPathStr(env) +& "." +& ident);
(cache,(f :: _),_,_) = Inst.partialInstClassIn(cache, env2,
InnerOuter.emptyInstHierarchy, DAE.NOMOD(), Prefix.NOPRE(), ci_state,
c, SCode.PUBLIC(), {}); (cache,_,_) = lookupClass(cache,{f},
Absyn.IDENT(ident), false);
(cache,(f :: _),_,_) = Inst.partialInstClassIn(cache, env2, InnerOuter.emptyInstHierarchy, DAE.NOMOD(), Prefix.NOPRE(), ci_state, c, SCode.PUBLIC(), {}, 0);
(cache,_,_) = lookupClass(cache,{f}, Absyn.IDENT(ident), false);
then
(cache, true);

Expand Down Expand Up @@ -905,7 +903,7 @@ algorithm
// Debug.fprintln(Flags.INST_TRACE, "LOOKUP UNQUALIFIED IMPORTED ICD: " +& Env.printEnvPathStr(env) +& "." +& ident);
(cache,env2,_,cistate1) =
Inst.partialInstClassIn(cache, env2, InnerOuter.emptyInstHierarchy,
DAE.NOMOD(), Prefix.NOPRE(), ci_state, c, SCode.PUBLIC(), {});
DAE.NOMOD(), Prefix.NOPRE(), ci_state, c, SCode.PUBLIC(), {}, 0);
// Restrict import to the imported scope only, not its parents, thus {f} below
(cache,c_1,env2,prevFrames) = lookupClass2(cache,env2,Absyn.IDENT(ident),prevFrames,Util.makeStatefulBoolean(true),false) "Restrict import to the imported scope only, not its parents..." ;
(cache,more) = moreLookupUnqualifiedImportedClassInFrame(cache, rest, env, ident);
Expand Down Expand Up @@ -1486,7 +1484,7 @@ algorithm
// Debug.fprintln(Flags.INST_TRACE, "LOOKUP AND INST ICD: " +& Env.printEnvPathStr(cenv) +& "." +& cn2);
(cache,classEnv,_,_) =
Inst.partialInstClassIn(cache, cenv_2, InnerOuter.emptyInstHierarchy,
dmod, Prefix.NOPRE(), new_ci_state, c, SCode.PUBLIC(), {});
dmod, Prefix.NOPRE(), new_ci_state, c, SCode.PUBLIC(), {}, 0);
then
(cache,classEnv);

Expand Down Expand Up @@ -1715,7 +1713,7 @@ algorithm
Inst.partialInstClassIn(
cache, env2, InnerOuter.emptyInstHierarchy,
DAE.NOMOD(), Prefix.NOPRE(),
ci_state, c, SCode.PUBLIC(), {});
ci_state, c, SCode.PUBLIC(), {}, 0);
(cache,res) = lookupFunctionsInEnv2(cache, env_2, path, true, info);
then
(cache,res);
Expand Down
2 changes: 1 addition & 1 deletion Compiler/FrontEnd/SCode.mo
Original file line number Diff line number Diff line change
Expand Up @@ -834,7 +834,7 @@ algorithm
case(CLASS(info = i)) then i;
case(EXTENDS(info = i)) then i;
case(IMPORT(info = i)) then i;
case(DEFINEUNIT(name = _)) then fail();
else Absyn.dummyInfo;

end match;
end elementInfo;
Expand Down

0 comments on commit 2ab07ad

Please sign in to comment.