aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis/TypeChecker.cpp
diff options
context:
space:
mode:
authorYoichi Hirai <i@yoichihirai.com>2016-12-02 23:24:53 +0800
committerYoichi Hirai <i@yoichihirai.com>2017-01-12 01:28:11 +0800
commit91d4e8e0bab6f5285103af6ef84a7813cfbb61a2 (patch)
tree87f3a1c7fb668b65dc47fdda0e1ced171f262a04 /libsolidity/analysis/TypeChecker.cpp
parent42b672617392ecb294447f73fd011092cd58702b (diff)
downloaddexon-solidity-91d4e8e0bab6f5285103af6ef84a7813cfbb61a2.tar
dexon-solidity-91d4e8e0bab6f5285103af6ef84a7813cfbb61a2.tar.gz
dexon-solidity-91d4e8e0bab6f5285103af6ef84a7813cfbb61a2.tar.bz2
dexon-solidity-91d4e8e0bab6f5285103af6ef84a7813cfbb61a2.tar.lz
dexon-solidity-91d4e8e0bab6f5285103af6ef84a7813cfbb61a2.tar.xz
dexon-solidity-91d4e8e0bab6f5285103af6ef84a7813cfbb61a2.tar.zst
dexon-solidity-91d4e8e0bab6f5285103af6ef84a7813cfbb61a2.zip
analysis: changes necessary to compile std/StandardToken.sol
Diffstat (limited to 'libsolidity/analysis/TypeChecker.cpp')
-rw-r--r--libsolidity/analysis/TypeChecker.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index e414e27c..67c8ac17 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -1500,8 +1500,23 @@ bool TypeChecker::visit(Identifier const& _identifier)
if (!annotation.referencedDeclaration)
{
if (!annotation.argumentTypes)
- fatalTypeError(_identifier.location(), "Unable to determine overloaded type.");
- if (annotation.overloadedDeclarations.empty())
+ {
+ // The identifier should be a public state variable shadowing other functions
+ vector<Declaration const*> candidates;
+
+ for (Declaration const* declaration: annotation.overloadedDeclarations)
+ {
+ if (VariableDeclaration const* variableDeclaration = dynamic_cast<decltype(variableDeclaration)>(declaration))
+ candidates.push_back(declaration);
+ }
+ if (candidates.empty())
+ fatalTypeError(_identifier.location(), "No matching declaration found after variable lookup.");
+ else if (candidates.size() == 1)
+ annotation.referencedDeclaration = candidates.front();
+ else
+ fatalTypeError(_identifier.location(), "No unique declaration found after variable lookup.");
+ }
+ else if (annotation.overloadedDeclarations.empty())
fatalTypeError(_identifier.location(), "No candidates for overload resolution found.");
else if (annotation.overloadedDeclarations.size() == 1)
annotation.referencedDeclaration = *annotation.overloadedDeclarations.begin();