| 3237 | } |
| 3238 | |
| 3239 | void TypeChecker::checkAccessedMemberFunction(MemberAccess const& _memberAccess) const |
| 3240 | { |
| 3241 | auto const* accessedMemberFunctionType = dynamic_cast<FunctionType const*>(type(_memberAccess)); |
| 3242 | solAssert(accessedMemberFunctionType, "Expected function type."); |
| 3243 | |
| 3244 | Type const* owningObjectType = type(_memberAccess.expression()); |
| 3245 | solAssert(owningObjectType); |
| 3246 | |
| 3247 | auto const& memberName = _memberAccess.memberName(); |
| 3248 | |
| 3249 | solAssert( |
| 3250 | !accessedMemberFunctionType->hasBoundFirstArgument() || |
| 3251 | owningObjectType->isImplicitlyConvertibleTo(*accessedMemberFunctionType->selfType()), |
| 3252 | fmt::format( |
| 3253 | R"(Function "{}" cannot be called on an object of type {} (expected {}).)", |
| 3254 | memberName, |
| 3255 | owningObjectType->humanReadableName(), |
| 3256 | accessedMemberFunctionType->selfType()->humanReadableName() |
| 3257 | ) |
| 3258 | ); |
| 3259 | |
| 3260 | if ( |
| 3261 | dynamic_cast<FunctionType const*>(owningObjectType) && |
| 3262 | _memberAccess.annotation().referencedDeclaration == nullptr && // It's not defined |
| 3263 | (memberName == "value" || memberName == "gas") |
| 3264 | ) |
| 3265 | m_errorReporter.typeError( |
| 3266 | 1621_error, |
| 3267 | _memberAccess.location(), |
| 3268 | fmt::format( |
| 3269 | R"abc(Using ".{}(...)" is deprecated. Use "{{{}: ...}}" instead.)abc", |
| 3270 | memberName, |
| 3271 | memberName |
| 3272 | ) |
| 3273 | ); |
| 3274 | |
| 3275 | if ( |
| 3276 | accessedMemberFunctionType->kind() == FunctionType::Kind::ArrayPush && |
| 3277 | _memberAccess.annotation().arguments.value().numArguments() > 0 && |
| 3278 | owningObjectType->containsNestedMapping() |
| 3279 | ) |
| 3280 | m_errorReporter.typeError( |
| 3281 | 8871_error, |
| 3282 | _memberAccess.location(), |
| 3283 | "Storage arrays with nested mappings do not support .push(<arg>)." |
| 3284 | ); |
| 3285 | |
| 3286 | if ( |
| 3287 | accessedMemberFunctionType->kind() == FunctionType::Kind::Send || |
| 3288 | accessedMemberFunctionType->kind() == FunctionType::Kind::Transfer |
| 3289 | ) |
| 3290 | m_errorReporter.warning( |
| 3291 | 9207_error, |
| 3292 | _memberAccess.location(), |
| 3293 | fmt::format( |
| 3294 | R"('{}' is deprecated and scheduled for removal. Use 'call{{value: <amount>}}("")' instead.)", |
| 3295 | accessedMemberFunctionType->kind() == FunctionType::Kind::Send ? "send" : "transfer" |
| 3296 | ) |
nothing calls this directly
no test coverage detected