2 bug fixes to getRequiredConstraints
[repair.git] / Repair / RepairCompiler / MCC / IR / SemanticChecker.java
index 108a88379b46e48f20e31bdcb3351b849073004a..62c12be2180cbd8cf087761474c84a0b62048a78 100755 (executable)
@@ -3,6 +3,7 @@ package MCC.IR;
 import java.util.*;
 import java.math.BigInteger;
 import MCC.State;
 import java.util.*;
 import java.math.BigInteger;
 import MCC.State;
+import MCC.Compiler;
 
 public class SemanticChecker {
 
 
 public class SemanticChecker {
 
@@ -527,6 +528,7 @@ public class SemanticChecker {
                 return null;
             }
 
                 return null;
             }
 
+            rd.addUsage(RelationDescriptor.IMAGE);
             rq.setRelation(rd);
             vd1.setType(rd.getDomain().getType());
            vd1.setSet(rd.getDomain());
             rq.setRelation(rd);
             vd1.setType(rd.getDomain().getType());
            vd1.setSet(rd.getDomain());
@@ -994,6 +996,10 @@ public class SemanticChecker {
                                 public IRErrorReporter getErrorReporter() { return er; }
                                 public SymbolTable getSymbolTable() { return stGlobals; }
                             });
                                 public IRErrorReporter getErrorReporter() { return er; }
                                 public SymbolTable getSymbolTable() { return stGlobals; }
                             });
+                        if (Compiler.REJECTLENGTH) {
+                            analyze_length(indexbound);
+                        }
+
 
                         if (indextype == null) {
                             ok = false;
 
                         if (indextype == null) {
                             ok = false;
@@ -1034,6 +1040,20 @@ public class SemanticChecker {
         return ok;
     }
 
         return ok;
     }
 
+    private void analyze_length(Expr indexbound) {
+        Set descriptors=indexbound.getRequiredDescriptors();
+        for(Iterator it=descriptors.iterator();it.hasNext();) {
+            Descriptor d=(Descriptor)it.next();
+            if (d instanceof FieldDescriptor) {
+                state.noupdate.add(d);
+            } else if (d instanceof ArrayDescriptor) {
+                state.noupdate.add(d);
+            } else if (d instanceof VarDescriptor) {
+                state.noupdate.add(d);
+            }
+        }
+    }
+
     private boolean parse_global(ParseNode pn) {
         if (!precheck(pn, "global")) {
             return false;
     private boolean parse_global(ParseNode pn) {
         if (!precheck(pn, "global")) {
             return false;
@@ -1099,7 +1119,7 @@ public class SemanticChecker {
         dCurrentType = type;
 
         // parse the labels and fields
         dCurrentType = type;
 
         // parse the labels and fields
-        if (!parse_labelsandfields(pn.getChild("lf"))) {
+        if (pn.getChild("lf")!=null && !parse_labelsandfields(pn.getChild("lf"))) {
             ok = false;
         }
 
             ok = false;
         }