diff --git a/AST.cpp b/AST.cpp index 50c53bf37..357b9bd94 100644 --- a/AST.cpp +++ b/AST.cpp @@ -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() diff --git a/AST.h b/AST.h index 5679ed831..e94137a84 100644 --- a/AST.h +++ b/AST.h @@ -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); diff --git a/BaseTypes.h b/BaseTypes.h index fdf3f7b53..cfc14c7e9 100644 --- a/BaseTypes.h +++ b/BaseTypes.h @@ -22,6 +22,7 @@ #pragma once +#include 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 << ")"; +} + } } diff --git a/Exceptions.h b/Exceptions.h index 330c37788..5a48c47dd 100644 --- a/Exceptions.h +++ b/Exceptions.h @@ -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 errinfo_sourcePosition; typedef boost::error_info errinfo_sourceLocation; diff --git a/NameAndTypeResolver.cpp b/NameAndTypeResolver.cpp index a56502727..c0467b036 100644 --- a/NameAndTypeResolver.cpp +++ b/NameAndTypeResolver.cpp @@ -182,8 +182,7 @@ bool ReferencesResolver::visit(UserDefinedTypeName& _typeName) StructDefinition* referencedStruct = dynamic_cast(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; }