From c91cffa4ec3aa1fbed3557dcd11e3799f1682186 Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 23 Feb 2021 11:30:34 +0100 Subject: [PATCH] Fix module member names for importing with renaming. --- libsolidity/ast/Types.cpp | 11 ++++++----- libsolidity/ast/Types.h | 1 + .../syntaxTests/multiSource/import_alias.sol | 8 ++++++++ .../syntaxTests/multiSource/import_alias_mismatch.sol | 10 ++++++++++ 4 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 test/libsolidity/syntaxTests/multiSource/import_alias.sol create mode 100644 test/libsolidity/syntaxTests/multiSource/import_alias_mismatch.sol diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 182b2b72b..77b074982 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -112,7 +112,11 @@ util::Result transformParametersToExternal(TypePointers const& _pa } MemberList::Member::Member(Declaration const* _declaration, Type const* _type): - name(_declaration->name()), + Member(_declaration, _type, _declaration->name()) +{} + +MemberList::Member::Member(Declaration const* _declaration, Type const* _type, string _name): + name(move(_name)), type(_type), declaration(_declaration) { @@ -3808,10 +3812,7 @@ MemberList::MemberMap ModuleType::nativeMembers(ASTNode const*) const MemberList::MemberMap symbols; for (auto const& [name, declarations]: *m_sourceUnit.annotation().exportedSymbols) for (Declaration const* symbol: declarations) - { - solAssert(name == symbol->name(), ""); - symbols.emplace_back(symbol, symbol->type()); - } + symbols.emplace_back(symbol, symbol->type(), name); return symbols; } diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h index 0414ea783..5c58ebf4c 100644 --- a/libsolidity/ast/Types.h +++ b/libsolidity/ast/Types.h @@ -110,6 +110,7 @@ public: /// Constructs a Member with the name extracted from @p _declaration's name. Member(Declaration const* _declaration, Type const* _type); + Member(Declaration const* _declaration, Type const* _type, std::string _name); std::string name; Type const* type = nullptr; diff --git a/test/libsolidity/syntaxTests/multiSource/import_alias.sol b/test/libsolidity/syntaxTests/multiSource/import_alias.sol new file mode 100644 index 000000000..cc2af8e54 --- /dev/null +++ b/test/libsolidity/syntaxTests/multiSource/import_alias.sol @@ -0,0 +1,8 @@ +==== Source: s1.sol ==== +int constant a = 2; +==== Source: s2.sol ==== +import {a as e} from "s1.sol"; +import "s2.sol" as M; +contract C { + function f() public pure returns (int) { return M.e; } +} diff --git a/test/libsolidity/syntaxTests/multiSource/import_alias_mismatch.sol b/test/libsolidity/syntaxTests/multiSource/import_alias_mismatch.sol new file mode 100644 index 000000000..311ca3e43 --- /dev/null +++ b/test/libsolidity/syntaxTests/multiSource/import_alias_mismatch.sol @@ -0,0 +1,10 @@ +==== Source: s1.sol ==== +int constant a = 2; +==== Source: s2.sol ==== +import {a as e} from "s1.sol"; +import "s2.sol" as M; +contract C { + function f() public pure returns (int) { return M.a; } +} +// ---- +// TypeError 9582: (s2.sol:116-119): Member "a" not found or not visible after argument-dependent lookup in module "s2.sol".