PTREE AnalyseReturnClassVal // RETURN CLASS VALUE ( PTREE expr ) // - expression for return { TYPE retn_type; // - return type TYPE retn_class; // - class for return PTREE tgt; // - target expression CNV_DIAG* diag; // - diagnosis retn_type = expr->u.subtree[0]->type; retn_class = StructType( retn_type ); DbgVerify( retn_class != NULL, "AnalyseReturnClassVal -- not class" ); if( ClassCorrupted( retn_class ) ) { PTreeErrorNode( expr ); } else if( TypeAbstract( retn_class ) ) { PTreeErrorExprType( expr, ERR_CONVERT_TO_ABSTRACT_TYPE, retn_class ); ScopeNotePureFunctions( retn_class ); } else { diag = DefargBeingCompiled() ? &diagDefarg : &diagReturn; tgt = NodeFetchReference( getReturnSym() ); expr = removeReturnNode( expr ); expr = CopyClassRetnVal( expr, tgt, retn_type, diag ); if( expr->op != PT_ERROR ) { if( NodeIsBinaryOp( expr, CO_DTOR ) ) { PTREE node = expr->u.subtree[0]; if( SymFunctionReturn() == node->u.symcg.symbol ) { PTreeFree( node ); node = expr; expr = expr->u.subtree[1]; PTreeFree( node ); } } } #if 0 // this is just so we can do some checking expr = CastImplicit( expr , retn_type , CNV_EXPR , DefargBeingCompiled() ? &diagDefarg : &diagReturn ); } #endif }
bool TypeDefedNonAbstract // REQUIRE DEFINED, NON-ABSTRACT TYPE ( TYPE type // - the type , PTREE expr // - NULL or expression for error , MSG_NUM msg_abstract // - message when abstract , MSG_NUM msg_undefed ) // - message when undefined { bool retb; // - return: true ==> defined & non-abstract expr = expr; retb = false; if( ! TypeDefined( type ) ) { CErr1( msg_undefed ); InfClassDecl( type ); } else if( AbstractClassType( type ) ) { CErr1( msg_abstract ); InfClassDecl( type ); ScopeNotePureFunctions( type ); } else { retb = true; } return( retb ); }