X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/2f2892c2eae871c76b3acfd77a8accfb9f4c7322..35b9a1d988c06908076e3a6eeae55b1147879607:/src/cgrammar.y diff --git a/src/cgrammar.y b/src/cgrammar.y index 780c349..e91de36 100644 --- a/src/cgrammar.y +++ b/src/cgrammar.y @@ -1,6 +1,6 @@ /*;-*-C-*-; ** Splint - annotation-assisted static program checker -** Copyright (C) 1994-2002 University of Virginia, +** Copyright (C) 1994-2003 University of Virginia, ** Massachusetts Institute of Technology ** ** This program is free software; you can redistribute it and/or modify it @@ -52,6 +52,7 @@ extern void yyerror (char *); # include "splintMacros.nf" # include "basic.h" # include "cscanner.h" +# include "cscannerHelp.h" # include "cgrammar.h" # include "exprChecks.h" @@ -189,7 +190,7 @@ extern void yyerror (char *); %token QRETURNED QEXPOSED QNULL QOBSERVER QISNULL %token QEXITS QMAYEXIT QNEVEREXIT QTRUEEXIT QFALSEEXIT %token QLONG QSIGNED QUNSIGNED QSHORT QUNUSED QSEF QNOTNULL QRELNULL -%token QABSTRACT QCONCRETE QMUTABLE QIMMUTABLE +%token QABSTRACT QNUMABSTRACT QCONCRETE QMUTABLE QIMMUTABLE %token QTRUENULL QFALSENULL QEXTERNAL %token QREFCOUNTED QREFS QNEWREF QTEMPREF QKILLREF QRELDEF %token CGCHAR CBOOL CINT CGFLOAT CDOUBLE CVOID @@ -259,7 +260,7 @@ extern void yyerror (char *); %type genericParamList paramTypeList paramList idList paramIdList %type argumentExprList iterArgList -%type initList namedInitializerList namedInitializerListAux +%type initList namedInitializerList namedInitializerListAux namedInitializerTypeList namedInitializerTypeListAux %type structDeclList structDecl %type locModifies modList specClauseList optSpecClauseList %type mExpr modListExpr specClauseListExpr @@ -289,7 +290,7 @@ extern void yyerror (char *); %type sizeofExpr sizeofExprAux offsetofExpr %type openScope closeScope -%type instanceDecl namedInitializer optDeclarators +%type instanceDecl namedInitializer optDeclarators namedInitializerType %type primaryExpr postfixExpr primaryIterExpr postfixIterExpr %type unaryExpr castExpr timesExpr plusExpr %type unaryIterExpr castIterExpr timesIterExpr plusIterExpr @@ -401,6 +402,7 @@ namedDeclBase { setCurrentParams (uentryList_missingParams); } functionClauses { /* need to support globals and modifies here! */ + functionClauseList fcl; ctype ct = ctype_makeFunction (idDecl_getCtype ($1), uentryList_makeMissingParams ()); @@ -409,9 +411,21 @@ namedDeclBase /*drl 7/25/01 added*/ setImplictfcnConstraints(); - /* functionClauseList_ImplictConstraints($6); */ + DPRINTF((message("namedDeclBase PushType TLPAREN TRPAREN...:\n adding implict constraints to functionClause List: %s", + functionClauseList_unparse($6) + ) + )); + + fcl = functionClauseList_setImplictConstraints($6); - idDecl_addClauses ($$, $6); + idDecl_addClauses ($$, fcl); + + DPRINTF((message("1 added fuctionClause List: %s to the Id", + functionClauseList_unparse(fcl) + ) + )); + + context_popLoc (); lltok_free2 ($3, $4); } @@ -419,11 +433,26 @@ namedDeclBase { setCurrentParams ($4); } functionClauses { + functionClauseList fcl; setImplictfcnConstraints (); - /* functionClauseList_ImplictConstraints($7);*/ clearCurrentParams (); $$ = idDecl_replaceCtype ($1, ctype_makeFunction (idDecl_getCtype ($1), $4)); - idDecl_addClauses ($$, $7); + + DPRINTF((message("namedDeclBase PushType TLPAREN genericParamList TRPAREN...:\n adding implict constraints to functionClause List: %s", + functionClauseList_unparse($7) + ) + )) ; + + fcl = functionClauseList_setImplictConstraints($7); + + idDecl_addClauses ($$, fcl); + + DPRINTF((message("added fuctionClause List: %s to the Id", + functionClauseList_unparse(fcl) + ) + )); + + context_popLoc (); lltok_free2 ($3, $5); } @@ -505,13 +534,13 @@ metaStateConstraint ; metaStateSpecifier - : BufConstraintSrefExpr { cscanner_expectingMetaStateName (); } TCOLON metaStateName - { cscanner_clearExpectingMetaStateName (); + : BufConstraintSrefExpr { cscannerHelp_expectingMetaStateName (); } TCOLON metaStateName + { cscannerHelp_clearExpectingMetaStateName (); $$ = metaStateSpecifier_create ($1, $4); lltok_free ($3); } - | CTOK_ELIPSIS { cscanner_expectingMetaStateName (); } TCOLON metaStateName - { cscanner_clearExpectingMetaStateName (); + | CTOK_ELIPSIS { cscannerHelp_expectingMetaStateName (); } TCOLON metaStateName + { cscannerHelp_clearExpectingMetaStateName (); $$ = metaStateSpecifier_createElipsis ($4); lltok_free2 ($1, $3); } @@ -845,14 +874,16 @@ specClauseListExpr ; optSpecClauseList - : /* empty */ { $$ = sRefSet_undefined } + : /* empty */ { DPRINTF ((message("Empty optSpecClauseList") )); $$ = sRefSet_undefined } | specClauseList ; specClauseList : specClauseListExpr { if (sRef_isValid ($1)) { $$ = sRefSet_single ($1); } - else { $$ = sRefSet_undefined; } + else { + DPRINTF((message("returning sRefSEt_undefined ") )); + $$ = sRefSet_undefined; } } | specClauseList TCOMMA specClauseListExpr { if (sRef_isValid ($3)) @@ -871,7 +902,7 @@ primaryExpr | NEW_IDENTIFIER { $$ = exprNode_fromUIO ($1); } | cconstantExpr | TLPAREN expr TRPAREN { $$ = exprNode_addParens ($1, $2); } - | TYPE_NAME_OR_ID { $$ = exprNode_fromIdentifier (coerceId ($1)); } + | TYPE_NAME_OR_ID { $$ = exprNode_fromIdentifier (cscannerHelp_coerceId ($1)); } | QEXTENSION { $$ = exprNode_makeError (); } | TLPAREN { exprChecks_inCompoundStatementExpression (); } compoundStmt TRPAREN @@ -907,7 +938,7 @@ unaryExpr | TMINUS castExpr { $$ = exprNode_preOp ($2, $1); } | TTILDE castExpr { $$ = exprNode_preOp ($2, $1); } | TEXCL castExpr { $$ = exprNode_preOp ($2, $1); } - | sizeofExpr { $$ = $1; } + | processSizeof sizeofExpr endprocessSizeof { $$ = $2; } | offsetofExpr { $$ = $1; } ; @@ -929,13 +960,21 @@ sizeofExpr sizeofExprAux { context_sizeofReleaseVars (); $$ = $3; } ; +processSizeof: {context_enterSizeof()}; + + +endprocessSizeof: {context_leaveSizeof()}; + + sizeofExprAux - : CSIZEOF TLPAREN typeExpression TRPAREN { $$ = exprNode_sizeofType ($3); lltok_free3 ($1, $2, $4); } - | CSIZEOF unaryExpr { $$ = exprNode_sizeofExpr ($2); lltok_free ($1); } + : CSIZEOF TLPAREN typeExpression TRPAREN { $$ = exprNode_sizeofType ($3); lltok_free3 ($1, $2, $4); } + | CSIZEOF unaryExpr { $$ = exprNode_sizeofExpr ($2); lltok_free ($1); } | CALIGNOF TLPAREN typeExpression TRPAREN { $$ = exprNode_alignofType ($3); lltok_free3 ($1, $2, $4); } | CALIGNOF unaryExpr { $$ = exprNode_alignofExpr ($2); lltok_free ($1); } ; - + + + castExpr : unaryExpr | TLPAREN typeExpression TRPAREN castExpr @@ -1095,6 +1134,11 @@ instanceDecl } ; +namedInitializerType + : namedInitializer { $$ = $1; } + | TYPE_NAME { $$ = exprNode_fromIdentifier (usymtab_getTypeEntry (ctype_typeId ($1))); } +; + namedInitializer : namedDecl NotType { @@ -1107,18 +1151,18 @@ namedInitializer typeDecl : CTYPEDEF completeTypeSpecifier { setProcessingTypedef ($2); } - NotType namedInitializerList IsType optWarnClause TSEMI + NotType namedInitializerTypeList IsType optWarnClause TSEMI { clabstract_declareType ($5, $7); } | CTYPEDEF completeTypeSpecifier IsType TSEMI { /* in the ANSI grammar, semantics unclear */ } | CTYPEDEF namedInitializerList IsType TSEMI { /* in the ANSI grammar, semantics unclear */ } ; IsType - : { g_expectingTypeName = TRUE; } + : { cscannerHelp_setExpectingTypeName (); } ; PushType - : { g_expectingTypeName = TRUE; context_pushLoc (); } + : { cscannerHelp_setExpectingTypeName (); context_pushLoc (); } ; namedInitializerList @@ -1130,6 +1174,15 @@ namedInitializerListAux | namedInitializerList TCOMMA NotType namedInitializer { $$ = exprNodeList_push ($1, $4); } ; +namedInitializerTypeList + : namedInitializerTypeListAux IsType { $$ = $1; } +; + +namedInitializerTypeListAux + : namedInitializerType { $$ = exprNodeList_singleton ($1); } + | namedInitializerTypeList TCOMMA NotType namedInitializerType { $$ = exprNodeList_push ($1, $4); } +; + optDeclarators : /* empty */ { $$ = exprNode_makeError (); } | optDeclarators TCOMMA NotType namedInitializer { $$ = exprNode_concat ($1, $4); } @@ -1313,6 +1366,7 @@ returnQualifier typedefQualifier : QABSTRACT { $$ = qual_createAbstract (); } + | QNUMABSTRACT { $$ = qual_createNumAbstract (); } | QCONCRETE { $$ = qual_createConcrete (); } | QMUTABLE { $$ = qual_createMutable (); } | QIMMUTABLE { $$ = qual_createImmutable (); } @@ -1418,7 +1472,7 @@ suSpc structDeclList DeleteStructInnerScope { sRef_clearGlobalScopeSafe (); } TRBRACE optStructInvariant - { ctype ct; ct = declareStruct ($3, $8); setGlobalStructInfo(ct, $12); $$ = ct; } + { ctype ct; ct = declareStruct ($3, $8); context_setGlobalStructInfo(ct, $12); $$ = ct; } | NotType CUNION newId IsType TLBRACE { sRef_setGlobalScopeSafe (); } CreateStructInnerScope structDeclList DeleteStructInnerScope { sRef_clearGlobalScopeSafe (); } @@ -1447,7 +1501,7 @@ suSpc ; NotType - : { g_expectingTypeName = FALSE; } +: { cscannerHelp_clearExpectingTypeName (); } ; structDeclList @@ -1513,7 +1567,7 @@ optNamedDecl { qtype qt = qtype_unknown (); qtype_adjustPointers ($1, qt); - $$ = idDecl_create (cstring_copy (cscanner_observeLastIdentifier ()), qt); + $$ = idDecl_create (cstring_copy (cscannerHelp_observeLastIdentifier ()), qt); } | pointers optNamedDecl { $$ = $2; qtype_adjustPointers ($1, idDecl_getTyp ($$)); } @@ -1929,7 +1983,7 @@ iterArgList iterArgExpr : assignIterExpr { $$ = exprNode_iterExpr ($1); } | id { $$ = exprNode_iterId ($1); } - | TYPE_NAME_OR_ID { uentry ue = coerceIterId ($1); + | TYPE_NAME_OR_ID { uentry ue = cscannerHelp_coerceIterId ($1); if (uentry_isValid (ue)) { @@ -1937,7 +1991,7 @@ iterArgExpr } else { - $$ = exprNode_iterNewId (cstring_copy (cscanner_observeLastIdentifier ())); + $$ = exprNode_iterNewId (cstring_copy (cscannerHelp_observeLastIdentifier ())); } } | NEW_IDENTIFIER { $$ = exprNode_iterNewId ($1); } @@ -2176,7 +2230,7 @@ void yyerror (/*@unused@*/ char *s) } } - cscanner_swallowMacro (); + cscannerHelp_swallowMacro (); context_exitAllClausesQuiet (); } else