diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 469ea830b..73bf1b18e 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -2359,7 +2359,18 @@ bool TypeChecker::visit(Identifier const& _identifier) SecondarySourceLocation ssl; for (Declaration const* declaration: annotation.overloadedDeclarations) - ssl.append("Candidate:", declaration->location()); + if (declaration->location().isEmpty()) + { + // Try to re-construct function definition + string description; + for (auto const& param: declaration->functionType(true)->parameterTypes()) + description += (description.empty() ? "" : ", ") + param->toString(false); + description = "function " + _identifier.name() + "(" + description + ")"; + + ssl.append("Candidate: " + description, declaration->location()); + } + else + ssl.append("Candidate:", declaration->location()); if (candidates.empty()) m_errorReporter.fatalTypeError(_identifier.location(), ssl, "No matching declaration found after argument-dependent lookup."); else diff --git a/test/cmdlineTests/require_overload/err b/test/cmdlineTests/require_overload/err new file mode 100644 index 000000000..42243e7af --- /dev/null +++ b/test/cmdlineTests/require_overload/err @@ -0,0 +1,5 @@ +require_overload/input.sol:4:9: Error: No matching declaration found after argument-dependent lookup. + require(this); + ^-----^ +Candidate: function require(bool) +Candidate: function require(bool, string memory) diff --git a/test/cmdlineTests/require_overload/exit b/test/cmdlineTests/require_overload/exit new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/test/cmdlineTests/require_overload/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/require_overload/input.sol b/test/cmdlineTests/require_overload/input.sol new file mode 100644 index 000000000..6d48ac24a --- /dev/null +++ b/test/cmdlineTests/require_overload/input.sol @@ -0,0 +1,6 @@ +pragma solidity >=0.0; +contract C { + function f() public pure { + require(this); + } +}