]> andersk Git - splint.git/blobdiff - src/clabstract.c
Fixed bug in makefile causing unnecessary remaking of cgrammar.c.
[splint.git] / src / clabstract.c
index e83e20fb5bc3a89019e82aff57786a264d33924f..a47ca848dd0d73ad9e5a39f7f747ffe189efd142 100644 (file)
 # include "splintMacros.nf"
 # include "llbasic.h"
 # include "cgrammar.h"
-
-# ifndef NOLCL
 # include "usymtab_interface.h"
-# endif
 
 # include "structNames.h"
 # include "nameChecks.h"
@@ -498,7 +495,12 @@ static /*@dependent@*/ uentryList currentParamList;
 /*drl added 3-28-2002*/
 /* this function takes a list of paramentar and generates a list
    of constraints.
-   Currently the only constraints gnerated are MaxSet(p) >= 0 for all pointers
+*/
+
+/* drl modified 10/23/2002
+
+The current semantics are generated constraints of the form MaxSet(p) >= 0 and MaxRead(p) >= 0 for all pointers
+unless the @out@ annotation has been applied to a parameter, then we only want to generate maxSet(p) > = 0
 */
 
 void  setImplictfcnConstraints (void)
@@ -527,13 +529,24 @@ void  setImplictfcnConstraints (void)
          DPRINTF((message ("%s is NOT a pointer", sRef_unparse(s) ) ));
        }
       /*drl 4/26/01
-       chagned this is MaxSet(s) == 0 to MaxSet(s) >= 0 */
-      
+       chagned this from MaxSet(s) == 0 to MaxSet(s) >= 0 */
       c = constraint_makeSRefWriteSafeInt (s, 0);
-      /* constraint_makeSRefSetBufferSize (s, 0); */
+      
       implicitFcnConstraints = constraintList_add(implicitFcnConstraints , c);
+
+      /*drl 10/23/2002 added support for out*/
+      if (!uentry_isOut(el) )
+       {
+         c = constraint_makeSRefReadSafeInt (s, 0);
+      
+         implicitFcnConstraints = constraintList_add(implicitFcnConstraints , c);
+       }
+       
+      
     }
   end_uentryList_elements;
+  DPRINTF((message("implicitFcnConstraints has been set to %s\n",
+                  constraintList_print(implicitFcnConstraints) ) ));
 }
 
 
@@ -773,10 +786,11 @@ void clabstract_declareFunction (idDecl tid) /*@globals undef saveFunction; @*/
          
          resetGlobals ();
        }
-      
+
       resetStorageClass ();
-      idDecl_free (tid);
     }
+
+  idDecl_free (tid);
 }
 
 void declareStaticFunction (idDecl tid) /*@globals undef saveFunction; @*/
@@ -956,12 +970,23 @@ checkTypeDecl (uentry e, ctype rep)
                      uentry ue = usymtab_lookupSafe (ye);
 
                      llassert (uentry_isEitherConstant (ue));
-                     llassertprint (ctype_match (uentry_getType (ue), rrep),
-                                    ("Bad enum: %s / %s",
-                                     uentry_unparse (ue),
-                                     ctype_unparse (rrep)));
-                     
-                     uentry_setType (ue, at);
+
+                     /* evans 2002-04-22 */
+                     if (ctype_isBool (uentry_getType (ue)))
+                       {
+                         /*
+                         ** If set using -booltrue or -boolfalse, don't change the type.
+                         */
+                       }
+                     else
+                       {
+                         llassertprint (ctype_match (uentry_getType (ue), rrep),
+                                        ("Bad enum: %s / %s",
+                                         uentry_unparse (ue),
+                                         ctype_unparse (rrep)));
+                         
+                         uentry_setType (ue, at);
+                       }
                    }
                } end_enumNameList_elements;
            }
@@ -1798,7 +1823,7 @@ handleEnum (cstring id)
     }
   else
     {
-      return (declareEnum (id, enumNameList_new ()));
+      return (ctype_createForwardEnum (id));
     }
 }
 
@@ -2153,6 +2178,7 @@ sRef checkStateClausesId (uentry ue)
 
 sRef checkbufferConstraintClausesId (uentry ue)
 {
+  sRef sr;
   cstring s = uentry_rawName (ue);
 
   if (cstring_equalLit (s, "result"))
@@ -2167,8 +2193,14 @@ sRef checkbufferConstraintClausesId (uentry ue)
        }
     }
   
-  DPRINTF (("constrant id: %s", uentry_unparseFull (ue)));
-  return sRef_saveCopy (uentry_getSref (ue)); /*@i523 why the saveCopy? */
+  DPRINTF (("constraint id: %s", uentry_unparseFull (ue)));
+  sr = uentry_getSref (ue);
+
+  if (sRef_isInvalid (sr) )
+    {
+      llfatalerrorLoc (cstring_makeLiteral("Macro defined constants can not be used in function constraints unless they are specifed with the constant annotation.  To use a macro defined constant include an annotation of the form /*@constant <type> <name>=<value>@*/ somewhere before the function constraint.  This restriction may be removed in future releases if it is determined to be excessively burdensome." ));
+    }
+  return sRef_saveCopy (sr); /*@i523 why the saveCopy? */
 }
 
 void checkModifiesId (uentry ue)
This page took 0.180399 seconds and 4 git commands to generate.