mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Allow global struct definitions.
This commit is contained in:
parent
25a3a83b34
commit
872d21f527
@ -285,17 +285,17 @@ bool CompilerStack::analyze()
|
|||||||
// the special variables "this" and "super" must be set appropriately.
|
// the special variables "this" and "super" must be set appropriately.
|
||||||
for (Source const* source: m_sourceOrder)
|
for (Source const* source: m_sourceOrder)
|
||||||
for (ASTPointer<ASTNode> const& node: source->ast->nodes())
|
for (ASTPointer<ASTNode> const& node: source->ast->nodes())
|
||||||
|
{
|
||||||
|
if (!resolver.resolveNamesAndTypes(*node))
|
||||||
|
return false;
|
||||||
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
|
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
|
||||||
{
|
|
||||||
|
|
||||||
if (!resolver.resolveNamesAndTypes(*contract)) return false;
|
|
||||||
// Note that we now reference contracts by their fully qualified names, and
|
// Note that we now reference contracts by their fully qualified names, and
|
||||||
// thus contracts can only conflict if declared in the same source file. This
|
// thus contracts can only conflict if declared in the same source file. This
|
||||||
// already causes a double-declaration error elsewhere, so we do not report
|
// already causes a double-declaration error elsewhere, so we do not report
|
||||||
// an error here and instead silently drop any additional contracts we find.
|
// an error here and instead silently drop any additional contracts we find.
|
||||||
if (m_contracts.find(contract->fullyQualifiedName()) == m_contracts.end())
|
if (m_contracts.find(contract->fullyQualifiedName()) == m_contracts.end())
|
||||||
m_contracts[contract->fullyQualifiedName()].contract = contract;
|
m_contracts[contract->fullyQualifiedName()].contract = contract;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next, we check inheritance, overrides, function collisions and other things at
|
// Next, we check inheritance, overrides, function collisions and other things at
|
||||||
// contract or function level.
|
// contract or function level.
|
||||||
|
@ -96,8 +96,11 @@ ASTPointer<SourceUnit> Parser::parse(shared_ptr<Scanner> const& _scanner)
|
|||||||
case Token::Library:
|
case Token::Library:
|
||||||
nodes.push_back(parseContractDefinition());
|
nodes.push_back(parseContractDefinition());
|
||||||
break;
|
break;
|
||||||
|
case Token::Struct:
|
||||||
|
nodes.push_back(parseStructDefinition());
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fatalParserError(string("Expected pragma, import directive or contract/interface/library definition."));
|
fatalParserError(string("Expected pragma, import directive or contract/interface/library/struct definition."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
solAssert(m_recursionDepth == 0, "");
|
solAssert(m_recursionDepth == 0, "");
|
||||||
|
10
test/libsolidity/semanticTests/structs/global.sol
Normal file
10
test/libsolidity/semanticTests/structs/global.sol
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
|
struct S { uint256 a; uint256 b; }
|
||||||
|
contract C {
|
||||||
|
function f(S calldata s) external pure returns (uint256, uint256) {
|
||||||
|
return (s.a, s.b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// f((uint256,uint256)): 42, 23 -> 42, 23
|
@ -0,0 +1,4 @@
|
|||||||
|
contract S {}
|
||||||
|
struct S { uint256 a; }
|
||||||
|
// ----
|
||||||
|
// DeclarationError: (14-37): Identifier already declared.
|
7
test/libsolidity/syntaxTests/structs/global_struct.sol
Normal file
7
test/libsolidity/syntaxTests/structs/global_struct.sol
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
struct S { uint a; }
|
||||||
|
contract C {
|
||||||
|
function f() public pure {
|
||||||
|
S memory s = S(42);
|
||||||
|
s;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
struct S { uint256 a; }
|
||||||
|
contract S {}
|
||||||
|
// ----
|
||||||
|
// DeclarationError: (24-37): Identifier already declared.
|
@ -0,0 +1,10 @@
|
|||||||
|
struct S { uint a; }
|
||||||
|
contract C {
|
||||||
|
struct S { address x; }
|
||||||
|
function f() public view {
|
||||||
|
S memory s = S(address(this));
|
||||||
|
s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// Warning: (38-61): This declaration shadows an existing declaration.
|
@ -0,0 +1,4 @@
|
|||||||
|
struct S { uint256 a; }
|
||||||
|
struct S { uint256 a; }
|
||||||
|
// ----
|
||||||
|
// DeclarationError: (24-47): Identifier already declared.
|
Loading…
Reference in New Issue
Block a user