static bool matchTempness(CodePtr code, const vector<ValueTempness> &argsTempness, bool callByName, vector<ValueTempness> &tempnessKey, vector<bool> &forwardedRValueFlags) { const vector<FormalArgPtr> &fargs = code->formalArgs; FormalArgPtr fvarArg = code->formalVarArg; if (fvarArg.ptr()) assert(fargs.size() <= argsTempness.size()); else assert(fargs.size() == argsTempness.size()); tempnessKey.clear(); forwardedRValueFlags.clear(); for (unsigned i = 0; i < fargs.size(); ++i) { if (callByName && (fargs[i]->tempness == TEMPNESS_FORWARD)) { error(fargs[i], "forwarded arguments are not allowed " "in call-by-name procedures"); } if (!tempnessMatches(argsTempness[i], fargs[i]->tempness)) return false; tempnessKey.push_back( tempnessKeyItem(fargs[i]->tempness, argsTempness[i])); bool forwardedRValue = (fargs[i]->tempness == TEMPNESS_FORWARD) && (argsTempness[i] == TEMPNESS_RVALUE); forwardedRValueFlags.push_back(forwardedRValue); } if (fvarArg.ptr()) { if (callByName && (fvarArg->tempness == TEMPNESS_FORWARD)) { error(fvarArg, "forwarded arguments are not allowed " "in call-by-name procedures"); } for (unsigned i = fargs.size(); i < argsTempness.size(); ++i) { if (!tempnessMatches(argsTempness[i], fvarArg->tempness)) return false; tempnessKey.push_back( tempnessKeyItem(fvarArg->tempness, argsTempness[i])); bool forwardedRValue = (fvarArg->tempness == TEMPNESS_FORWARD) && (argsTempness[i] == TEMPNESS_RVALUE); forwardedRValueFlags.push_back(forwardedRValue); } } return true; }
static bool matchTempness(CodePtr code, llvm::ArrayRef<ValueTempness> argsTempness, bool callByName, vector<ValueTempness> &tempnessKey, vector<uint8_t> &forwardedRValueFlags) { llvm::ArrayRef<FormalArgPtr> fargs = code->formalArgs; if (code->hasVarArg) assert(fargs.size()-1 <= argsTempness.size()); else assert(fargs.size() == argsTempness.size()); tempnessKey.clear(); forwardedRValueFlags.clear(); unsigned varArgSize = argsTempness.size()-fargs.size()+1; for (unsigned i = 0, j = 0; i < fargs.size(); ++i) { if (callByName && (fargs[i]->tempness == TEMPNESS_FORWARD)) { error(fargs[i], "forwarded arguments are not allowed " "in call-by-name procedures"); } if (fargs[i]->varArg) { for (; j < varArgSize; ++j) { if (!tempnessMatches(argsTempness[i+j], fargs[i]->tempness)) return false; tempnessKey.push_back( tempnessKeyItem(fargs[i]->tempness, argsTempness[i+j])); bool forwardedRValue = (fargs[i]->tempness == TEMPNESS_FORWARD) && (argsTempness[i+j] == TEMPNESS_RVALUE); forwardedRValueFlags.push_back(forwardedRValue); } --j; } else { if (!tempnessMatches(argsTempness[i+j], fargs[i]->tempness)) return false; tempnessKey.push_back( tempnessKeyItem(fargs[i]->tempness, argsTempness[i+j])); bool forwardedRValue = (fargs[i]->tempness == TEMPNESS_FORWARD) && (argsTempness[i+j] == TEMPNESS_RVALUE); forwardedRValueFlags.push_back(forwardedRValue); } } return true; }