/*
-** LCLint - annotation-assisted static program checker
-** Copyright (C) 1994-2001 University of Virginia,
+** Splint - annotation-assisted static program checker
+** Copyright (C) 1994-2003 University of Virginia,
** Massachusetts Institute of Technology
**
** This program is free software; you can redistribute it and/or modify it
** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
** MA 02111-1307, USA.
**
-** For information on lclint: lclint-request@cs.virginia.edu
-** To report a bug: lclint-bug@cs.virginia.edu
-** For more information: http://lclint.cs.virginia.edu
+** For information on splint: info@splint.org
+** To report a bug: splint-bug@splint.org
+** For more information: http://www.splint.org
*/
/*
** stateClauseList.c
*/
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
# include "basic.h"
static /*@notnull@*/ stateClauseList stateClauseList_new (void)
}
else
{
- if ((int) s1 > (int) s2)
+ if (s1 - s2 > 0) /* evans 2001-08-21: was (int) s1 > (int) s2) */
{
return 1;
}
if (stateClause_isGlobal (cl))
{
- /*@i232@*/
+ ;
}
else
{
sRef rb = sRef_getRootBase (el);
DPRINTF (("Check: %s", sRef_unparse (el)));
+
+ if (sRef_isResult (rb))
+ {
+ /*
+ ** The result type is now know, need to set it:
+ */
+
+ if (ctype_isUnknown (sRef_getType (rb)))
+ {
+ ctype utype = uentry_getType (ue);
+ llassert (ctype_isFunction (utype));
+
+ sRef_setTypeFull (rb, ctype_getReturnType (utype));
+ DPRINTF (("el: %s", sRef_unparseFull (el)));
+ }
+ }
if (stateClause_setsMetaState (cl))
{
{
if (optgenerror
(FLG_ANNOTATIONERROR,
- message ("Meta state anntation %s used on inappropriate reference %q in %q clause of %q: %q",
+ message ("Attribute annotation %s used on inappropriate reference %q in %q clause of %q: %q",
qual_unparse (q),
sRef_unparse (el),
stateClause_unparseKind (cl),
stateClause_unparse (cl)),
uentry_whereLast (ue)))
{
- /*@i! annotationInfo_showContextError (ainfo, ue); */
+ /* annotationInfo_showContextError (ainfo, ue); */
}
}
}
{
if (!sRef_isStateSpecial (res))
{
+ DPRINTF (("Here we are: %s", sRef_unparseFull (res)));
+
if (!specialResult)
{
sstate pstate = sRef_getDefState (res);
if (!sRef_makeStateSpecial (res))
{
- voptgenerror
- (FLG_INCONDEFS,
- message ("Function result is used in %q clause of %q "
- "but was previously annotated with %s: %q",
- stateClause_unparseKind (cl),
- uentry_getName (ue),
- sstate_unparse (pstate),
- sRef_unparse (el)),
- uentry_whereLast (ue));
- }
-
- specialResult = TRUE;
+ if (optgenerror
+ (FLG_INCONDEFS,
+ message ("Function result is used in %q clause of %q "
+ "but was previously annotated with %s: %q",
+ stateClause_unparseKind (cl),
+ uentry_getName (ue),
+ sstate_unparse (pstate),
+ sRef_unparse (el)),
+ uentry_whereLast (ue)))
+ {
+ specialResult = TRUE;
+ }
+ }
}
}
+ DPRINTF (("Fixing result type! %s", sRef_unparseFull (el)));
(void) sRef_fixResultType (el, sRef_getType (res), ue);
}
}
{
; /* Okay to override in .xh files */
}
+ else if (stateClause_isQual (cl))
+ {
+ ; /* qual clauses don't interfere with definition state */
+ }
else
{
voptgenerror
{
voptgenerror
(FLG_ANNOTATIONERROR,
- /*@-sefparams@*/ /* This is okay because its fresh storage. */ /*@i32@*/
+ /*@-sefparams@*/ /* This is okay because its fresh storage. */
message
("%q clauses includes %q of "
"non-dynamically allocated type %s",
{
if (stateClause_isGlobal (cl))
{
- ; /*@i32@*/
+ ; /* Don't handle globals for now */
}
else
{