+/*@access constraint, exprNode @*/
+
+static bool rangeCheck (arithType ar1, /*@observer@*/ constraintExpr expr1, arithType ar2, /*@observer@*/ constraintExpr expr2);
+
+static constraint inequalitySubstituteUnsound (/*@returned@*/ constraint c, constraintList p);
+
+static constraint constraint_searchandreplace (/*@returned@*/ constraint c, constraintExpr old, constraintExpr new);
+
+
+static constraint constraint_addOr (/*@returned@*/ constraint orig, /*@observer@*/ constraint or);
+
+static bool resolveOr (/*@observer@*/ constraint c, /*@observer@*/ constraintList list);
+
+static /*@only@*/ constraintList reflectChangesEnsuresFree1 (/*@only@*/ constraintList pre2, constraintList post1);
+
+/*********************************************/
+
+
+
+
+/*@only@*/ constraintList constraintList_mergeEnsuresFreeFirst (constraintList list1, constraintList list2)
+{
+ constraintList ret;
+
+ ret = constraintList_mergeEnsures (list1, list2);
+
+ constraintList_free(list1);
+ return ret;
+}
+
+/*@only@*/ constraintList constraintList_mergeEnsures (constraintList list1, constraintList list2)
+{
+ constraintList ret;
+ constraintList temp;
+
+ //ret = constraintList_makeNew();
+
+ llassert(constraintList_isDefined(list1) );
+ llassert(constraintList_isDefined(list2) );
+
+ DPRINTF(( message ("constraintList_mergeEnsures: list1 %s list2 %s",
+ constraintList_print(list1), constraintList_print(list2)
+ )));
+
+ ret = constraintList_fixConflicts (list1, list2);
+ ret = reflectChangesEnsuresFree1 (ret, list2);
+ temp = constraintList_subsumeEnsures (ret, list2);
+ constraintList_free(ret);
+ ret = temp;
+
+ temp = constraintList_subsumeEnsures (list2, ret);
+
+ temp = constraintList_addList (temp, ret);
+ constraintList_free(ret);
+
+ DPRINTF(( message ("constraintList_mergeEnsures: returning %s ",
+ constraintList_print(temp) )
+ ));
+
+
+ return temp;
+ //ret = constraintList_addList (ret, list2);
+ //return ret;
+}
+
+
+/*@only@*/ constraintList constraintList_mergeRequiresFreeFirst (/*@only@*/ constraintList list1, constraintList list2)
+{
+ constraintList ret;
+
+ ret = constraintList_mergeRequires(list1, list2);
+
+ constraintList_free(list1);
+
+ return ret;
+}
+
+/*@only@*/ constraintList constraintList_mergeRequires (constraintList list1, constraintList list2)
+{
+ constraintList ret;
+ constraintList temp;
+
+ DPRINTF((message ("constraintList_mergeRequires: merging %s and %s ", constraintList_print (list1), constraintList_print(list2) ) ) );
+
+ /* get constraints in list1 not satified by list2 */
+ temp = reflectChanges (list1, list2);
+ DPRINTF((message ("constraintList_mergeRequires: temp = %s", constraintList_print(temp) ) ) );
+
+/*get constraints in list2 not satified by temp*/
+ ret = reflectChanges (list2, temp);
+
+ DPRINTF((message ("constraintList_mergeRequires: ret = %s", constraintList_print(ret) ) ) );
+
+ ret = constraintList_addListFree (ret, temp);
+
+ DPRINTF((message ("constraintList_mergeRequires: returning %s", constraintList_print(ret) ) ) );
+
+ return ret;
+}
+
+void checkArgumentList (/*@out@*/ exprNode temp, exprNodeList arglist, fileloc sequencePoint)