From 2b938d703c75594b109bcf48e15cca94ad109f60 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Mon, 2 Sep 2019 11:52:51 +0200 Subject: [PATCH] Allow global enum definitions. --- libsolidity/parsing/Parser.cpp | 5 ++++- test/libsolidity/syntaxTests/enums/global_enum.sol | 7 +++++++ .../enums/global_enum_contract_name_clash.sol | 4 ++++ .../syntaxTests/enums/global_enum_name_clash.sol | 4 ++++ .../syntaxTests/enums/global_enum_shadowing.sol | 10 ++++++++++ .../syntaxTests/imports/name_clash_in_import_enum.sol | 7 +++++++ .../imports/name_clash_in_import_enum_contract.sol | 7 +++++++ .../imports/name_clash_in_import_enum_struct.sol | 7 +++++++ 8 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 test/libsolidity/syntaxTests/enums/global_enum.sol create mode 100644 test/libsolidity/syntaxTests/enums/global_enum_contract_name_clash.sol create mode 100644 test/libsolidity/syntaxTests/enums/global_enum_name_clash.sol create mode 100644 test/libsolidity/syntaxTests/enums/global_enum_shadowing.sol create mode 100644 test/libsolidity/syntaxTests/imports/name_clash_in_import_enum.sol create mode 100644 test/libsolidity/syntaxTests/imports/name_clash_in_import_enum_contract.sol create mode 100644 test/libsolidity/syntaxTests/imports/name_clash_in_import_enum_struct.sol diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index 7c42248f3..1945a07dc 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -99,8 +99,11 @@ ASTPointer Parser::parse(shared_ptr const& _scanner) case Token::Struct: nodes.push_back(parseStructDefinition()); break; + case Token::Enum: + nodes.push_back(parseEnumDefinition()); + break; default: - fatalParserError(string("Expected pragma, import directive or contract/interface/library/struct definition.")); + fatalParserError(string("Expected pragma, import directive or contract/interface/library/struct/enum definition.")); } } solAssert(m_recursionDepth == 0, ""); diff --git a/test/libsolidity/syntaxTests/enums/global_enum.sol b/test/libsolidity/syntaxTests/enums/global_enum.sol new file mode 100644 index 000000000..1229b22c2 --- /dev/null +++ b/test/libsolidity/syntaxTests/enums/global_enum.sol @@ -0,0 +1,7 @@ +enum E { A } +contract C { + function f() public pure { + E e = E.A; + e; + } +} \ No newline at end of file diff --git a/test/libsolidity/syntaxTests/enums/global_enum_contract_name_clash.sol b/test/libsolidity/syntaxTests/enums/global_enum_contract_name_clash.sol new file mode 100644 index 000000000..be667496f --- /dev/null +++ b/test/libsolidity/syntaxTests/enums/global_enum_contract_name_clash.sol @@ -0,0 +1,4 @@ +enum E { A } +contract E {} +// ---- +// DeclarationError: (13-26): Identifier already declared. diff --git a/test/libsolidity/syntaxTests/enums/global_enum_name_clash.sol b/test/libsolidity/syntaxTests/enums/global_enum_name_clash.sol new file mode 100644 index 000000000..dd49c33ad --- /dev/null +++ b/test/libsolidity/syntaxTests/enums/global_enum_name_clash.sol @@ -0,0 +1,4 @@ +enum E { A } +enum E { A } +// ---- +// DeclarationError: (13-25): Identifier already declared. diff --git a/test/libsolidity/syntaxTests/enums/global_enum_shadowing.sol b/test/libsolidity/syntaxTests/enums/global_enum_shadowing.sol new file mode 100644 index 000000000..240d7f648 --- /dev/null +++ b/test/libsolidity/syntaxTests/enums/global_enum_shadowing.sol @@ -0,0 +1,10 @@ +enum E { A } +contract C { + enum E { A } + function f() public pure { + E e = E.A; + e; + } +} +// ---- +// Warning: (30-42): This declaration shadows an existing declaration. diff --git a/test/libsolidity/syntaxTests/imports/name_clash_in_import_enum.sol b/test/libsolidity/syntaxTests/imports/name_clash_in_import_enum.sol new file mode 100644 index 000000000..f3e583dff --- /dev/null +++ b/test/libsolidity/syntaxTests/imports/name_clash_in_import_enum.sol @@ -0,0 +1,7 @@ +==== Source: a ==== +enum E { A } +==== Source: b ==== +import "a"; +enum E { A } +// ---- +// DeclarationError: (b:12-24): Identifier already declared. diff --git a/test/libsolidity/syntaxTests/imports/name_clash_in_import_enum_contract.sol b/test/libsolidity/syntaxTests/imports/name_clash_in_import_enum_contract.sol new file mode 100644 index 000000000..31e56bab4 --- /dev/null +++ b/test/libsolidity/syntaxTests/imports/name_clash_in_import_enum_contract.sol @@ -0,0 +1,7 @@ +==== Source: a ==== +enum E { A } +==== Source: b ==== +import "a"; +contract E { } +// ---- +// DeclarationError: (b:12-26): Identifier already declared. diff --git a/test/libsolidity/syntaxTests/imports/name_clash_in_import_enum_struct.sol b/test/libsolidity/syntaxTests/imports/name_clash_in_import_enum_struct.sol new file mode 100644 index 000000000..3c204e3f0 --- /dev/null +++ b/test/libsolidity/syntaxTests/imports/name_clash_in_import_enum_struct.sol @@ -0,0 +1,7 @@ +==== Source: a ==== +enum E { A } +==== Source: b ==== +import "a"; +struct E { uint256 a; } +// ---- +// DeclarationError: (b:12-35): Identifier already declared.