diff options
author | Federico Bond <federicobond@gmail.com> | 2017-10-26 22:02:36 +0800 |
---|---|---|
committer | Federico Bond <federicobond@gmail.com> | 2018-02-03 01:09:32 +0800 |
commit | 600e66e6057b1d6992affaf6fa646ce865d17b73 (patch) | |
tree | 277c812247d2a66b9016fa64a9497a88d42a67e4 /libsolidity/analysis | |
parent | eba46a65fc55ab598210d2bc2e209809d59f6fbd (diff) | |
download | dexon-solidity-600e66e6057b1d6992affaf6fa646ce865d17b73.tar.gz dexon-solidity-600e66e6057b1d6992affaf6fa646ce865d17b73.tar.zst dexon-solidity-600e66e6057b1d6992affaf6fa646ce865d17b73.zip |
Replace some fatal errors when resolving references with normal ones
Diffstat (limited to 'libsolidity/analysis')
-rw-r--r-- | libsolidity/analysis/ReferencesResolver.cpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp index 540ffaf5..30b06615 100644 --- a/libsolidity/analysis/ReferencesResolver.cpp +++ b/libsolidity/analysis/ReferencesResolver.cpp @@ -47,7 +47,7 @@ bool ReferencesResolver::visit(Identifier const& _identifier) { auto declarations = m_resolver.nameFromCurrentScope(_identifier.name()); if (declarations.empty()) - fatalDeclarationError(_identifier.location(), "Undeclared identifier."); + declarationError(_identifier.location(), "Undeclared identifier."); else if (declarations.size() == 1) _identifier.annotation().referencedDeclaration = declarations.front(); else @@ -90,7 +90,10 @@ void ReferencesResolver::endVisit(UserDefinedTypeName const& _typeName) { Declaration const* declaration = m_resolver.pathFromCurrentScope(_typeName.namePath()); if (!declaration) - fatalDeclarationError(_typeName.location(), "Identifier not found or not unique."); + { + declarationError(_typeName.location(), "Identifier not found or not unique."); + return; + } _typeName.annotation().referencedDeclaration = declaration; @@ -101,7 +104,7 @@ void ReferencesResolver::endVisit(UserDefinedTypeName const& _typeName) else if (ContractDefinition const* contract = dynamic_cast<ContractDefinition const*>(declaration)) _typeName.annotation().type = make_shared<ContractType>(*contract); else - fatalTypeError(_typeName.location(), "Name has to refer to a struct, enum or contract."); + typeError(_typeName.location(), "Name has to refer to a struct, enum or contract."); } void ReferencesResolver::endVisit(FunctionTypeName const& _typeName) @@ -112,17 +115,25 @@ void ReferencesResolver::endVisit(FunctionTypeName const& _typeName) case VariableDeclaration::Visibility::External: break; default: - fatalTypeError(_typeName.location(), "Invalid visibility, can only be \"external\" or \"internal\"."); + typeError(_typeName.location(), "Invalid visibility, can only be \"external\" or \"internal\"."); + return; } if (_typeName.isPayable() && _typeName.visibility() != VariableDeclaration::Visibility::External) - fatalTypeError(_typeName.location(), "Only external function types can be payable."); + { + typeError(_typeName.location(), "Only external function types can be payable."); + return; + } + if (_typeName.visibility() == VariableDeclaration::Visibility::External) for (auto const& t: _typeName.parameterTypes() + _typeName.returnParameterTypes()) { solAssert(t->annotation().type, "Type not set for parameter."); if (!t->annotation().type->canBeUsedExternally(false)) - fatalTypeError(t->location(), "Internal type cannot be used for external function type."); + { + typeError(t->location(), "Internal type cannot be used for external function type."); + return; + } } _typeName.annotation().type = make_shared<FunctionType>(_typeName); @@ -322,17 +333,13 @@ void ReferencesResolver::endVisit(VariableDeclaration const& _variable) type = ref->copyForLocation(typeLoc, isPointer); } else if (varLoc != Location::Default && !ref) - fatalTypeError(_variable.location(), "Storage location can only be given for array or struct types."); - - if (!type) - fatalTypeError(_variable.location(), "Invalid type name."); + typeError(_variable.location(), "Storage location can only be given for array or struct types."); + _variable.annotation().type = type; } else if (!_variable.canHaveAutoType()) - fatalTypeError(_variable.location(), "Explicit type needed."); + typeError(_variable.location(), "Explicit type needed."); // otherwise we have a "var"-declaration whose type is resolved by the first assignment - - _variable.annotation().type = type; } void ReferencesResolver::typeError(SourceLocation const& _location, string const& _description) |