diff options
Diffstat (limited to 'src')
-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), |