mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #3790 from ethereum/empty-structs
Disallow empty structs
This commit is contained in:
commit
326d656a55
@ -4,6 +4,7 @@ Features:
|
|||||||
* Commandline interface: Error when missing or inaccessible file detected. Suppress it with the ``--ignore-missing`` flag.
|
* Commandline interface: Error when missing or inaccessible file detected. Suppress it with the ``--ignore-missing`` flag.
|
||||||
* General: Support accessing dynamic return data in post-byzantium EVMs.
|
* General: Support accessing dynamic return data in post-byzantium EVMs.
|
||||||
* Interfaces: Allow overriding external functions in interfaces with public in an implementing contract.
|
* Interfaces: Allow overriding external functions in interfaces with public in an implementing contract.
|
||||||
|
* Syntax Checker: Issue warning for empty structs (or error as experimental 0.5.0 feature).
|
||||||
|
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
* Code Generator: Allow ``block.blockhash`` without being called.
|
* Code Generator: Allow ``block.blockhash`` without being called.
|
||||||
|
@ -19,7 +19,7 @@ InheritanceSpecifier = UserDefinedTypeName ( '(' Expression ( ',' Expression )*
|
|||||||
StateVariableDeclaration = TypeName ( 'public' | 'internal' | 'private' | 'constant' )? Identifier ('=' Expression)? ';'
|
StateVariableDeclaration = TypeName ( 'public' | 'internal' | 'private' | 'constant' )? Identifier ('=' Expression)? ';'
|
||||||
UsingForDeclaration = 'using' Identifier 'for' ('*' | TypeName) ';'
|
UsingForDeclaration = 'using' Identifier 'for' ('*' | TypeName) ';'
|
||||||
StructDefinition = 'struct' Identifier '{'
|
StructDefinition = 'struct' Identifier '{'
|
||||||
( VariableDeclaration ';' (VariableDeclaration ';')* )? '}'
|
( VariableDeclaration ';' (VariableDeclaration ';')* ) '}'
|
||||||
|
|
||||||
ModifierDefinition = 'modifier' Identifier ParameterList? Block
|
ModifierDefinition = 'modifier' Identifier ParameterList? Block
|
||||||
ModifierInvocation = Identifier ( '(' ExpressionList? ')' )?
|
ModifierInvocation = Identifier ( '(' ExpressionList? ')' )?
|
||||||
|
@ -255,3 +255,17 @@ bool SyntaxChecker::visit(VariableDeclaration const& _declaration)
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SyntaxChecker::visit(StructDefinition const& _struct)
|
||||||
|
{
|
||||||
|
bool const v050 = m_sourceUnit->annotation().experimentalFeatures.count(ExperimentalFeature::V050);
|
||||||
|
|
||||||
|
if (_struct.members().empty())
|
||||||
|
{
|
||||||
|
if (v050)
|
||||||
|
m_errorReporter.syntaxError(_struct.location(), "Defining empty structs is disallowed.");
|
||||||
|
else
|
||||||
|
m_errorReporter.warning(_struct.location(), "Defining empty structs is deprecated.");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -71,6 +71,8 @@ private:
|
|||||||
|
|
||||||
virtual bool visit(VariableDeclaration const& _declaration) override;
|
virtual bool visit(VariableDeclaration const& _declaration) override;
|
||||||
|
|
||||||
|
virtual bool visit(StructDefinition const& _struct) override;
|
||||||
|
|
||||||
ErrorReporter& m_errorReporter;
|
ErrorReporter& m_errorReporter;
|
||||||
|
|
||||||
/// Flag that indicates whether a function modifier actually contains '_'.
|
/// Flag that indicates whether a function modifier actually contains '_'.
|
||||||
|
@ -7289,7 +7289,7 @@ BOOST_AUTO_TEST_CASE(modifiers_access_storage_pointer)
|
|||||||
{
|
{
|
||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract C {
|
contract C {
|
||||||
struct S { }
|
struct S { uint a; }
|
||||||
modifier m(S storage x) {
|
modifier m(S storage x) {
|
||||||
x;
|
x;
|
||||||
_;
|
_;
|
||||||
|
5
test/libsolidity/syntaxTests/empty_struct.sol
Normal file
5
test/libsolidity/syntaxTests/empty_struct.sol
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
contract test {
|
||||||
|
struct A {}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// Warning: Defining empty structs is deprecated.
|
6
test/libsolidity/syntaxTests/empty_struct_050.sol
Normal file
6
test/libsolidity/syntaxTests/empty_struct_050.sol
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
pragma experimental "v0.5.0";
|
||||||
|
contract test {
|
||||||
|
struct A {}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// SyntaxError: Defining empty structs is disallowed.
|
Loading…
Reference in New Issue
Block a user