mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #1412 from ethereum/disallow-multiple-errors
disallow more than one errors in name and type tests
This commit is contained in:
commit
e7ff4ac810
@ -46,7 +46,7 @@ namespace
|
|||||||
{
|
{
|
||||||
|
|
||||||
pair<ASTPointer<SourceUnit>, std::shared_ptr<Error const>>
|
pair<ASTPointer<SourceUnit>, std::shared_ptr<Error const>>
|
||||||
parseAnalyseAndReturnError(string const& _source, bool _reportWarnings = false, bool _insertVersionPragma = true)
|
parseAnalyseAndReturnError(string const& _source, bool _reportWarnings = false, bool _insertVersionPragma = true, bool _allowMultipleErrors = false)
|
||||||
{
|
{
|
||||||
// Silence compiler version warning
|
// Silence compiler version warning
|
||||||
string source = _insertVersionPragma ? "pragma solidity >=0.0;\n" + _source : _source;
|
string source = _insertVersionPragma ? "pragma solidity >=0.0;\n" + _source : _source;
|
||||||
@ -91,6 +91,8 @@ parseAnalyseAndReturnError(string const& _source, bool _reportWarnings = false,
|
|||||||
BOOST_CHECK(success || !errors.empty());
|
BOOST_CHECK(success || !errors.empty());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (errors.size() > 1 && !_allowMultipleErrors)
|
||||||
|
BOOST_FAIL("Multiple errors found");
|
||||||
for (auto const& currentError: errors)
|
for (auto const& currentError: errors)
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
@ -131,9 +133,9 @@ bool success(string const& _source)
|
|||||||
return !parseAnalyseAndReturnError(_source).second;
|
return !parseAnalyseAndReturnError(_source).second;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error expectError(std::string const& _source, bool _warning = false)
|
Error expectError(std::string const& _source, bool _warning = false, bool _allowMultiple = false)
|
||||||
{
|
{
|
||||||
auto sourceAndError = parseAnalyseAndReturnError(_source, _warning);
|
auto sourceAndError = parseAnalyseAndReturnError(_source, _warning, true, _allowMultiple);
|
||||||
BOOST_REQUIRE(!!sourceAndError.second);
|
BOOST_REQUIRE(!!sourceAndError.second);
|
||||||
BOOST_REQUIRE(!!sourceAndError.first);
|
BOOST_REQUIRE(!!sourceAndError.first);
|
||||||
return *sourceAndError.second;
|
return *sourceAndError.second;
|
||||||
@ -161,10 +163,10 @@ static FunctionTypePointer retrieveFunctionBySignature(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CHECK_ERROR_OR_WARNING(text, typ, substring, warning) \
|
#define CHECK_ERROR_OR_WARNING(text, typ, substring, warning, allowMulti) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
Error err = expectError((text), (warning)); \
|
Error err = expectError((text), (warning), (allowMulti)); \
|
||||||
BOOST_CHECK(err.type() == (Error::Type::typ)); \
|
BOOST_CHECK(err.type() == (Error::Type::typ)); \
|
||||||
BOOST_CHECK(searchErrorMessage(err, (substring))); \
|
BOOST_CHECK(searchErrorMessage(err, (substring))); \
|
||||||
} while(0)
|
} while(0)
|
||||||
@ -172,12 +174,17 @@ do \
|
|||||||
// [checkError(text, type, substring)] asserts that the compilation down to typechecking
|
// [checkError(text, type, substring)] asserts that the compilation down to typechecking
|
||||||
// emits an error of type [type] and with a message containing [substring].
|
// emits an error of type [type] and with a message containing [substring].
|
||||||
#define CHECK_ERROR(text, type, substring) \
|
#define CHECK_ERROR(text, type, substring) \
|
||||||
CHECK_ERROR_OR_WARNING(text, type, substring, false)
|
CHECK_ERROR_OR_WARNING(text, type, substring, false, false)
|
||||||
|
|
||||||
|
// [checkError(text, type, substring)] asserts that the compilation down to typechecking
|
||||||
|
// emits an error of type [type] and with a message containing [substring].
|
||||||
|
#define CHECK_ERROR_ALLOW_MULTI(text, type, substring) \
|
||||||
|
CHECK_ERROR_OR_WARNING(text, type, substring, false, true)
|
||||||
|
|
||||||
// [checkWarning(text, type, substring)] asserts that the compilation down to typechecking
|
// [checkWarning(text, type, substring)] asserts that the compilation down to typechecking
|
||||||
// emits a warning of type [type] and with a message containing [substring].
|
// emits a warning of type [type] and with a message containing [substring].
|
||||||
#define CHECK_WARNING(text, substring) \
|
#define CHECK_WARNING(text, substring) \
|
||||||
CHECK_ERROR_OR_WARNING(text, Warning, substring, true)
|
CHECK_ERROR_OR_WARNING(text, Warning, substring, true, false)
|
||||||
|
|
||||||
// [checkSuccess(text)] asserts that the compilation down to typechecking succeeds.
|
// [checkSuccess(text)] asserts that the compilation down to typechecking succeeds.
|
||||||
#define CHECK_SUCCESS(text) do { BOOST_CHECK(success((text))); } while(0)
|
#define CHECK_SUCCESS(text) do { BOOST_CHECK(success((text))); } while(0)
|
||||||
@ -839,7 +846,7 @@ BOOST_AUTO_TEST_CASE(cyclic_inheritance)
|
|||||||
contract A is B { }
|
contract A is B { }
|
||||||
contract B is A { }
|
contract B is A { }
|
||||||
)";
|
)";
|
||||||
CHECK_ERROR(text, TypeError, "");
|
CHECK_ERROR_ALLOW_MULTI(text, TypeError, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(legal_override_direct)
|
BOOST_AUTO_TEST_CASE(legal_override_direct)
|
||||||
@ -1283,7 +1290,7 @@ BOOST_AUTO_TEST_CASE(fallback_function_twice)
|
|||||||
function() { x = 3; }
|
function() { x = 3; }
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
CHECK_ERROR(text, DeclarationError, "");
|
CHECK_ERROR_ALLOW_MULTI(text, DeclarationError, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(fallback_function_inheritance)
|
BOOST_AUTO_TEST_CASE(fallback_function_inheritance)
|
||||||
@ -1665,16 +1672,28 @@ BOOST_AUTO_TEST_CASE(int_to_enum_explicit_conversion_is_okay)
|
|||||||
CHECK_SUCCESS(text);
|
CHECK_SUCCESS(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(enum_implicit_conversion_is_not_okay)
|
BOOST_AUTO_TEST_CASE(enum_implicit_conversion_is_not_okay_256)
|
||||||
{
|
{
|
||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract test {
|
contract test {
|
||||||
enum ActionChoices { GoLeft, GoRight, GoStraight, Sit }
|
enum ActionChoices { GoLeft, GoRight, GoStraight, Sit }
|
||||||
function test() {
|
function test() {
|
||||||
a = ActionChoices.GoStraight;
|
a = ActionChoices.GoStraight;
|
||||||
b = ActionChoices.Sit;
|
|
||||||
}
|
}
|
||||||
uint256 a;
|
uint256 a;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_ERROR(text, TypeError, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(enum_implicit_conversion_is_not_okay_64)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract test {
|
||||||
|
enum ActionChoices { GoLeft, GoRight, GoStraight, Sit }
|
||||||
|
function test() {
|
||||||
|
b = ActionChoices.Sit;
|
||||||
|
}
|
||||||
uint64 b;
|
uint64 b;
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
@ -2038,7 +2057,8 @@ BOOST_AUTO_TEST_CASE(complex_const_variable)
|
|||||||
//for now constant specifier is valid only for uint bytesXX and enums
|
//for now constant specifier is valid only for uint bytesXX and enums
|
||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract Foo {
|
contract Foo {
|
||||||
mapping(uint => bool) constant mapVar;
|
mapping(uint => bool) x;
|
||||||
|
mapping(uint => bool) constant mapVar = x;
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
CHECK_ERROR(text, TypeError, "");
|
CHECK_ERROR(text, TypeError, "");
|
||||||
@ -2143,12 +2163,12 @@ BOOST_AUTO_TEST_CASE(multiple_constructors)
|
|||||||
BOOST_AUTO_TEST_CASE(equal_overload)
|
BOOST_AUTO_TEST_CASE(equal_overload)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
contract test {
|
contract C {
|
||||||
function test(uint a) returns (uint b) { }
|
function test(uint a) returns (uint b) { }
|
||||||
function test(uint a) external {}
|
function test(uint a) external {}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
CHECK_ERROR(sourceCode, DeclarationError, "");
|
CHECK_ERROR_ALLOW_MULTI(sourceCode, DeclarationError, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(uninitialized_var)
|
BOOST_AUTO_TEST_CASE(uninitialized_var)
|
||||||
@ -3299,7 +3319,7 @@ BOOST_AUTO_TEST_CASE(left_value_in_conditional_expression_not_supported_yet)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
CHECK_ERROR(text, TypeError, "");
|
CHECK_ERROR_ALLOW_MULTI(text, TypeError, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(conditional_expression_with_different_struct)
|
BOOST_AUTO_TEST_CASE(conditional_expression_with_different_struct)
|
||||||
@ -3313,8 +3333,8 @@ BOOST_AUTO_TEST_CASE(conditional_expression_with_different_struct)
|
|||||||
uint x;
|
uint x;
|
||||||
}
|
}
|
||||||
function f() {
|
function f() {
|
||||||
s1 x;
|
s1 memory x;
|
||||||
s2 y;
|
s2 memory y;
|
||||||
true ? x : y;
|
true ? x : y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3795,7 +3815,7 @@ BOOST_AUTO_TEST_CASE(fixed_to_bytes_implicit_conversion)
|
|||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract test {
|
contract test {
|
||||||
function f() {
|
function f() {
|
||||||
fixed a = 3.2;
|
fixed a = 3.25;
|
||||||
bytes32 c = a;
|
bytes32 c = a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3885,14 +3905,47 @@ BOOST_AUTO_TEST_CASE(rational_to_fixed_literal_expression)
|
|||||||
CHECK_SUCCESS(text);
|
CHECK_SUCCESS(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(rational_as_exponent_value)
|
BOOST_AUTO_TEST_CASE(rational_as_exponent_value_neg_decimal)
|
||||||
{
|
{
|
||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract test {
|
contract test {
|
||||||
function f() {
|
function f() {
|
||||||
fixed g = 2 ** -2.2;
|
fixed g = 2 ** -2.2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
BOOST_CHECK(!success(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(rational_as_exponent_value_pos_decimal)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract test {
|
||||||
|
function f() {
|
||||||
ufixed b = 3 ** 2.5;
|
ufixed b = 3 ** 2.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
BOOST_CHECK(!success(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(rational_as_exponent_half)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract test {
|
||||||
|
function f() {
|
||||||
ufixed24x24 b = 2 ** (1/2);
|
ufixed24x24 b = 2 ** (1/2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
BOOST_CHECK(!success(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(rational_as_exponent_value_neg_quarter)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract test {
|
||||||
|
function f() {
|
||||||
fixed40x40 c = 42 ** (-1/4);
|
fixed40x40 c = 42 ** (-1/4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3900,15 +3953,48 @@ BOOST_AUTO_TEST_CASE(rational_as_exponent_value)
|
|||||||
BOOST_CHECK(!success(text));
|
BOOST_CHECK(!success(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(fixed_point_casting_exponents)
|
BOOST_AUTO_TEST_CASE(fixed_point_casting_exponents_15)
|
||||||
{
|
{
|
||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract test {
|
contract test {
|
||||||
function f() {
|
function f() {
|
||||||
ufixed a = 3 ** ufixed(1.5);
|
ufixed a = 3 ** ufixed(1.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
BOOST_CHECK(!success(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(fixed_point_casting_exponents_half)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract test {
|
||||||
|
function f() {
|
||||||
ufixed b = 2 ** ufixed(1/2);
|
ufixed b = 2 ** ufixed(1/2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
BOOST_CHECK(!success(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(fixed_point_casting_exponents_neg)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract test {
|
||||||
|
function f() {
|
||||||
fixed c = 42 ** fixed(-1/4);
|
fixed c = 42 ** fixed(-1/4);
|
||||||
fixed d = 16 ** fixed(-0.33);
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
BOOST_CHECK(!success(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(fixed_point_casting_exponents_neg_decimal)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract test {
|
||||||
|
function f() {
|
||||||
|
fixed d = 16 ** fixed(-0.5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
@ -3958,7 +4044,7 @@ BOOST_AUTO_TEST_CASE(rational_bitnot_unary_operation)
|
|||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract test {
|
contract test {
|
||||||
function f() {
|
function f() {
|
||||||
fixed a = ~3.56;
|
fixed a = ~3.5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
@ -3970,7 +4056,7 @@ BOOST_AUTO_TEST_CASE(rational_bitor_binary_operation)
|
|||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract test {
|
contract test {
|
||||||
function f() {
|
function f() {
|
||||||
fixed a = 1.56 | 3;
|
fixed a = 1.5 | 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
@ -3982,7 +4068,7 @@ BOOST_AUTO_TEST_CASE(rational_bitxor_binary_operation)
|
|||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract test {
|
contract test {
|
||||||
function f() {
|
function f() {
|
||||||
fixed a = 1.56 ^ 3;
|
fixed a = 1.75 ^ 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
@ -3994,7 +4080,7 @@ BOOST_AUTO_TEST_CASE(rational_bitand_binary_operation)
|
|||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract test {
|
contract test {
|
||||||
function f() {
|
function f() {
|
||||||
fixed a = 1.56 & 3;
|
fixed a = 1.75 & 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
@ -4651,6 +4737,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_storage)
|
|||||||
function f() {
|
function f() {
|
||||||
assembly {
|
assembly {
|
||||||
x := 2
|
x := 2
|
||||||
|
pop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4666,6 +4753,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_storage_in_modifiers)
|
|||||||
modifier m {
|
modifier m {
|
||||||
assembly {
|
assembly {
|
||||||
x := 2
|
x := 2
|
||||||
|
pop
|
||||||
}
|
}
|
||||||
_;
|
_;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user