Improved error message for lookup in function types.

This commit is contained in:
Martin Diz 2018-10-04 12:31:52 -03:00
parent dd4acda73a
commit ef25454a04
7 changed files with 105 additions and 2 deletions

View File

@ -99,6 +99,7 @@ Compiler Features:
* Tests: Determine transaction status during IPC calls.
* Code Generator: Allocate and free local variables according to their scope.
* Removed ``pragma experimental "v0.5.0";``.
* Syntax Checker: Improved error message for lookup in function types.
Bugfixes:
* Build System: Support versions of CVC4 linked against CLN instead of GMP. In case of compilation issues due to the experimental SMT solver support, the solvers can be disabled when configuring the project with CMake using ``-DUSE_CVC4=OFF`` or ``-DUSE_Z3=OFF``.

View File

@ -2141,8 +2141,25 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess)
);
}
string errorMsg = "Member \"" + memberName + "\" not found or not visible "
"after argument-dependent lookup in " + exprType->toString() +
(memberName == "value" ? " - did you forget the \"payable\" modifier?" : ".");
"after argument-dependent lookup in " + exprType->toString() + ".";
if (memberName == "value")
{
errorMsg.pop_back();
errorMsg += " - did you forget the \"payable\" modifier?";
}
else if (exprType->category() == Type::Category::Function)
{
if (auto const& funType = dynamic_pointer_cast<FunctionType const>(exprType))
{
auto const& t = funType->returnParameterTypes();
if (t.size() == 1)
if (
t.front()->category() == Type::Category::Contract ||
t.front()->category() == Type::Category::Struct
)
errorMsg += " Did you intend to call the function?";
}
}
if (exprType->category() == Type::Category::Contract)
for (auto const& addressMember: AddressType::addressPayable().nativeMembers(nullptr))
if (addressMember.name == memberName)

View File

@ -0,0 +1,19 @@
contract A{
function f() public pure{
}
}
contract B{
A public a;
}
contract C{
B public b;
}
contract D{
C c;
function f() public view{
c.b.a.f();
}
}
// ----
// TypeError: (170-175): Member "a" not found or not visible after argument-dependent lookup in function () view external returns (contract B). Did you intend to call the function?

View File

@ -0,0 +1,17 @@
contract A{
function f() public pure{
}
}
contract B{
A public a;
}
contract C{
B b;
function f() public view{
b.a.f();
}
}
// ----
// TypeError: (140-145): Member "f" not found or not visible after argument-dependent lookup in function () view external returns (contract A). Did you intend to call the function?

View File

@ -0,0 +1,15 @@
contract A{
}
contract B{
A public a;
}
contract C{
B b;
function f() public view{
b.a.f();
}
}
// ----
// TypeError: (104-109): Member "f" not found or not visible after argument-dependent lookup in function () view external returns (contract A). Did you intend to call the function?

View File

@ -0,0 +1,17 @@
contract A{
function f() public pure{
}
}
contract B{
A private a;
}
contract C{
B b;
function f() public view{
b.a.f();
}
}
// ----
// TypeError: (141-144): Member "a" not found or not visible after argument-dependent lookup in contract B.

View File

@ -0,0 +1,17 @@
contract A{
function f() private pure{
}
}
contract B{
A public a;
}
contract C{
B b;
function f() public view{
b.a.f();
}
}
// ----
// TypeError: (141-146): Member "f" not found or not visible after argument-dependent lookup in function () view external returns (contract A). Did you intend to call the function?