diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-08-08 16:33:09 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-08-08 16:33:09 +0300 |
commit | be6e1735147a73427412e101fd924938ec6880d3 (patch) | |
tree | f9fdee74ac0fe74132975c9f3be09607bacc2856 | |
parent | f91cfd225fdd0a5d2d6bbabf3fadad11205a66e5 (diff) | |
download | paranucker-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.cpp | 25 | ||||
-rw-r--r-- | src/parsers/decl/parm_decl.cpp | 4 |
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), |