MCPcopy Create free account
hub / github.com/GaijinEntertainment/daScript / exprReturnsOrBreaks

Function exprReturnsOrBreaks

src/ast/ast_lint.cpp:87–124  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

85 }
86
87 bool exprReturnsOrBreaks ( ExpressionPtr expr ) {
88 if ( expr->rtti_isReturn() ) {
89 return true;
90 } else if ( expr->rtti_isBlock() ) {
91 auto block = static_cast<ExprBlock*>(expr);
92 if ( hasLabels(block) ) {
93 // NOTE: block with labels assumed to always return for now. real world analysis is hard
94 return true;
95 } else {
96 for ( auto & be : block->list ) {
97 if ( be->rtti_isBreak() || be->rtti_isContinue() || be->rtti_isGoto() ) {
98 return true;
99 }
100 if ( exprReturnsOrBreaks(be) ) {
101 return true;
102 }
103 }
104 }
105 } else if ( expr->rtti_isIfThenElse() ) {
106 auto ite = static_cast<ExprIfThenElse*>(expr);
107 if ( ite->if_false ) {
108 return exprReturnsOrBreaks(ite->if_true) && exprReturnsOrBreaks(ite->if_false);
109 }
110 } else if ( expr->rtti_isWith() ) {
111 auto wth = static_cast<ExprWith*>(expr);
112 return exprReturnsOrBreaks(wth->body);
113 } else if ( expr->rtti_isWhile() ) {
114 auto wh = static_cast<ExprWhile*>(expr);
115 return exprReturns(wh->body); // note has its own break
116 } else if ( expr->rtti_isFor() ) {
117 auto fr = static_cast<ExprFor*>(expr);
118 return exprReturns(fr->body); // note has its own break
119 } else if ( expr->rtti_isUnsafe() ) {
120 auto us = static_cast<ExprUnsafe*>(expr);
121 return exprReturnsOrBreaks(us->body);
122 }
123 return false;
124 }
125
126 // CFG-aware super-call count. Each expression produces:
127 // - fallsThrough/fallLo/fallHi: count along the path that reaches the end of expr

Callers

nothing calls this directly

Calls 2

hasLabelsFunction · 0.85
exprReturnsFunction · 0.85

Tested by

no test coverage detected