summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-08-08 16:33:09 +0300
committerAndrei Karas <akaras@inbox.ru>2015-08-08 16:33:09 +0300
commitbe6e1735147a73427412e101fd924938ec6880d3 (patch)
treef9fdee74ac0fe74132975c9f3be09607bacc2856
parentf91cfd225fdd0a5d2d6bbabf3fadad11205a66e5 (diff)
downloadparanucker-be6e1735147a73427412e101fd924938ec6880d3.tar.gz
paranucker-be6e1735147a73427412e101fd924938ec6880d3.tar.bz2
paranucker-be6e1735147a73427412e101fd924938ec6880d3.tar.xz
paranucker-be6e1735147a73427412e101fd924938ec6880d3.zip
Add support for non null pointer attribute in PARM_DECL nodes.
-rw-r--r--src/analysis/expression.cpp25
-rw-r--r--src/parsers/decl/parm_decl.cpp4
2 files changed, 26 insertions, 3 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index f14bc2d..6af1d78 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -163,6 +163,16 @@ VarItem getComponentRefVariable(Node *node)
Node *ref = skipNop(indirect->ref);
if (ref && !isValidVar(ref->label))
return str;
+ if (ref == PARM_DECL)
+ {
+ ParmDeclNode *parmDecl = static_cast<ParmDeclNode*>(ref);
+ if (findTreeListPurpose(static_cast<TreeListNode*>(
+ skipNop(parmDecl->attribute)),
+ "nonnullpointer"))
+ {
+ str.isNonNull = true;
+ }
+ }
if (ref == VAR_DECL)
{
VarDeclNode *varDecl = static_cast<VarDeclNode*>(ref);
@@ -219,10 +229,17 @@ std::vector<VarItem> getComponentRefParts(Node *node)
if (ref == PARM_DECL)
{
ParmDeclNode *parmDecl = static_cast<ParmDeclNode*>(ref);
+ bool isNonNull2(false);
+ if (findTreeListPurpose(static_cast<TreeListNode*>(
+ skipNop(parmDecl->attribute)),
+ "nonnullpointer"))
+ {
+ isNonNull2 = true;
+ }
if (skipNop(parmDecl->declType) == nullptr ||
skipNop(parmDecl->declType) == POINTER_TYPE)
{
- str.push_back(VarItem(ref->label, false));
+ str.push_back(VarItem(ref->label, isNonNull2));
}
}
if (ref == VAR_DECL)
@@ -281,6 +298,12 @@ std::vector<VarItem> getComponentRefLeftParts(Node *node)
if (ref == PARM_DECL)
{
ParmDeclNode *parmDecl = static_cast<ParmDeclNode*>(ref);
+ if (findTreeListPurpose(static_cast<TreeListNode*>(
+ skipNop(parmDecl->attribute)),
+ "nonnullpointer"))
+ {
+ isNonNull = true;
+ }
if (skipNop(parmDecl->declType) != nullptr &&
skipNop(parmDecl->declType) != POINTER_TYPE)
{
diff --git a/src/parsers/decl/parm_decl.cpp b/src/parsers/decl/parm_decl.cpp
index 0f2e966..3a38a8d 100644
--- a/src/parsers/decl/parm_decl.cpp
+++ b/src/parsers/decl/parm_decl.cpp
@@ -40,11 +40,11 @@ void parseParmDeclNode(ParmDeclNode *node)
fillDeclAutoGenerated(node);
+ fillDeclAttributes(node);
+
if (node->parseChilds <= 0)
return;
- fillDeclAttributes(node);
-
node->declType = static_cast<TypeNode*>(createParseNode(
node,
DECL_ARG_TYPE(node->gccNode),