Merge pull request #1412 from ethereum/disallow-multiple-errors

disallow more than one errors in name and type tests
This commit is contained in:
chriseth 2016-12-08 16:07:46 +01:00 committed by GitHub
commit e7ff4ac810

View File

@ -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
} }
_; _;
} }