Skip to content

Commit

Permalink
Merge pull request #2697 from ethereum/unimplemented-inlined-library
Browse files Browse the repository at this point in the history
Raise error when using unimplemented internal library functions.
  • Loading branch information
chriseth authored Aug 8, 2017
2 parents bea37e5 + 8df89c5 commit 41e7243
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 1 deletion.
3 changes: 2 additions & 1 deletion Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ Bugfixes:
* Code Generator: ``.delegatecall()`` should always return execution outcome.
* Code Generator: Provide "new account gas" for low-level ``callcode`` and ``delegatecall``.
* Type Checker: Constructors must be implemented if declared.
* Type Checker: Do not mark overloaded functions as shadowing other functions.
* Type Checker: Disallow the ``.gas()`` modifier on ``ecrecover``, ``sha256`` and ``ripemd160``.
* Type Checker: Do not mark overloaded functions as shadowing other functions.
* Type Checker: Internal library functions must be implemented if declared.

### 0.4.14 (2017-07-31)

Expand Down
2 changes: 2 additions & 0 deletions libsolidity/analysis/TypeChecker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,8 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
_function.body().accept(*this);
else if (_function.isConstructor())
m_errorReporter.typeError(_function.location(), "Constructor must be implemented if declared.");
else if (isLibraryFunction && _function.visibility() <= FunctionDefinition::Visibility::Internal)
m_errorReporter.typeError(_function.location(), "Internal library function must be implemented if declared.");
return false;
}

Expand Down
22 changes: 22 additions & 0 deletions test/libsolidity/SolidityNameAndTypeResolution.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6536,6 +6536,28 @@ BOOST_AUTO_TEST_CASE(constructor_without_implementation)
CHECK_ERROR(text, TypeError, "Constructor must be implemented if declared.");
}

BOOST_AUTO_TEST_CASE(library_function_without_implementation)
{
char const* text = R"(
library L {
function f();
}
)";
CHECK_SUCCESS_NO_WARNINGS(text);
text = R"(
library L {
function f() internal;
}
)";
CHECK_ERROR(text, TypeError, "Internal library function must be implemented if declared.");
text = R"(
library L {
function f() private;
}
)";
CHECK_ERROR(text, TypeError, "Internal library function must be implemented if declared.");
}

BOOST_AUTO_TEST_SUITE_END()

}
Expand Down

0 comments on commit 41e7243

Please sign in to comment.