Use createTypeError everywhere and stream out Location.

This commit is contained in:
Christian 2014-10-24 12:42:44 +02:00
parent 094ee44f72
commit 1ae1fc66e2
5 changed files with 13 additions and 11 deletions

View File

@ -257,8 +257,7 @@ void Statement::expectType(Expression& _expression, const Type& _expectedType)
{
_expression.checkTypeRequirements();
if (!_expression.getType()->isImplicitlyConvertibleTo(_expectedType))
BOOST_THROW_EXCEPTION(TypeError() << errinfo_sourceLocation(_expression.getLocation())
<< errinfo_comment("Type not implicitly convertible to expected type."));
BOOST_THROW_EXCEPTION(_expression.createTypeError("Type not implicitly convertible to expected type."));
//@todo provide more information to the exception
}
@ -407,9 +406,7 @@ void FunctionCall::checkTypeRequirements()
m_type = fun.getReturnParameterList()->getParameters().front()->getType();
}
else
{
BOOST_THROW_EXCEPTION(createTypeError("Type does not support invocation."));
}
}
void MemberAccess::checkTypeRequirements()

3
AST.h
View File

@ -57,8 +57,7 @@ public:
Location const& getLocation() const { return m_location; }
protected:
/// Creates a @ref TypeError exception and decorates it with the current location and
/// Creates a @ref TypeError exception and decorates it with the location of the node and
/// the given description
TypeError createTypeError(std::string const& _description);

View File

@ -22,6 +22,7 @@
#pragma once
#include <ostream>
namespace dev
{
@ -41,5 +42,11 @@ struct Location
int end;
};
/// Stream output for Location (used e.g. in boost exceptions).
inline std::ostream& operator<<(std::ostream& _out, Location const& _location)
{
return _out << "[" << _location.start << "," << _location.end << ")";
}
}
}

View File

@ -31,9 +31,9 @@ namespace dev
namespace solidity
{
struct ParserError: public virtual Exception {};
struct TypeError: public virtual Exception {};
struct DeclarationError: public virtual Exception {};
struct ParserError: virtual Exception {};
struct TypeError: virtual Exception {};
struct DeclarationError: virtual Exception {};
typedef boost::error_info<struct tag_sourcePosition, int> errinfo_sourcePosition;
typedef boost::error_info<struct tag_sourceLocation, Location> errinfo_sourceLocation;

View File

@ -182,8 +182,7 @@ bool ReferencesResolver::visit(UserDefinedTypeName& _typeName)
StructDefinition* referencedStruct = dynamic_cast<StructDefinition*>(declaration);
//@todo later, contracts are also valid types
if (referencedStruct == nullptr)
BOOST_THROW_EXCEPTION(TypeError() << errinfo_sourceLocation(_typeName.getLocation())
<< errinfo_comment("Identifier does not name a type name."));
BOOST_THROW_EXCEPTION(_typeName.createTypeError("Identifier does not name a type name."));
_typeName.setReferencedStruct(*referencedStruct);
return false;
}