static Expr* postFoldNormal(CallExpr* call) { FnSymbol* fn = call->resolvedFunction(); Expr* retval = call; if (fn->retTag == RET_PARAM || fn->hasFlag(FLAG_MAYBE_PARAM) == true) { VarSymbol* ret = toVarSymbol(fn->getReturnSymbol()); if (ret != NULL && ret->immediate != NULL) { retval = new SymExpr(ret); call->replace(retval); } else if (EnumSymbol* es = toEnumSymbol(fn->getReturnSymbol())) { retval = new SymExpr(es); call->replace(retval); } else if (ret == gVoid) { retval = new SymExpr(gVoid); call->replace(retval); } } if (fn->hasFlag(FLAG_MAYBE_TYPE) == true && fn->getReturnSymbol()->hasFlag(FLAG_TYPE_VARIABLE) == true) { fn->retTag = RET_TYPE; } if (fn->retTag == RET_TYPE) { Symbol* ret = fn->getReturnSymbol(); if (ret->type->symbol->hasFlag(FLAG_HAS_RUNTIME_TYPE) == false) { retval = new SymExpr(ret->type->symbol); call->replace(retval); } } if (call->isNamedAstr(astrSequals) == true) { if (SymExpr* lhs = toSymExpr(call->get(1))) { if (lhs->symbol()->hasFlag(FLAG_MAYBE_PARAM) == true || lhs->symbol()->isParameter() == true) { if (paramMap.get(lhs->symbol())) { USR_FATAL(call, "parameter set multiple times"); } } } } return retval; }
void viewFlags(BaseAST* ast) { if (!viewFlagsShort && !viewFlagsName && !viewFlagsComment) viewFlagsName = true; if (Symbol* sym = toSymbol(ast)) { for (int flagNum = FLAG_FIRST; flagNum <= FLAG_LAST; flagNum++) { if (sym->flags[flagNum]) { if (viewFlagsName) printf("%s ", flagNames[flagNum]); if (viewFlagsPragma) printf("%s", flagPragma[flagNum] ? "ypr " : "npr "); if (viewFlagsShort) printf("\"%s\" ", flagShortNames[flagNum]); if (viewFlagsComment) printf("// %s", *flagComments[flagNum] ? flagComments[flagNum] : "ncm"); printf("\n"); } } if (viewFlagsExtras) { if (VarSymbol* vs = toVarSymbol(sym)) { if (vs->immediate) { printf("immediate "); fprint_imm(stdout, *toVarSymbol(sym)->immediate, true); printf("\n"); } } else if (ArgSymbol* as = toArgSymbol(sym)) { printf("%s arg\n", as->intentDescrString()); } else if (toTypeSymbol(sym)) { printf("a TypeSymbol\n"); } else if (FnSymbol* fs = toFnSymbol(sym)) { printf("fn %s(%d args) %s\n", fs->_this ? intentDescrString(fs->thisTag) : "", fs->numFormals(), retTagDescrString(fs->retTag)); } else if (toEnumSymbol(sym)) { printf("an EnumSymbol\n"); } else if (ModuleSymbol* ms = toModuleSymbol(sym)) { printf("module %s\n", modTagDescrString(ms->modTag)); } else if (toLabelSymbol(sym)) { printf("a LabelSymbol\n"); } else { printf("unknown symbol kind\n"); } } } else { printf("[%d]: not a Symbol, has no flags\n", ast->id); } }