MCPcopy Create free account
hub / github.com/argotorg/solidity / checkAccessedMemberFunction

Method checkAccessedMemberFunction

libsolidity/analysis/TypeChecker.cpp:3239–3298  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3237}
3238
3239void 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 )

Callers

nothing calls this directly

Calls 13

typeFunction · 0.85
hasBoundFirstArgumentMethod · 0.80
selfTypeMethod · 0.80
typeErrorMethod · 0.80
numArgumentsMethod · 0.80
expressionMethod · 0.45
humanReadableNameMethod · 0.45
locationMethod · 0.45
kindMethod · 0.45
valueMethod · 0.45
containsNestedMappingMethod · 0.45

Tested by

no test coverage detected