aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/ast
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity/ast')
-rw-r--r--libsolidity/ast/AST.h278
-rw-r--r--libsolidity/ast/ASTAnnotations.h16
-rw-r--r--libsolidity/ast/ASTEnums.h2
-rw-r--r--libsolidity/ast/ASTJsonConverter.cpp13
-rw-r--r--libsolidity/ast/ASTJsonConverter.h11
-rw-r--r--libsolidity/ast/ASTPrinter.cpp1
-rw-r--r--libsolidity/ast/ASTVisitor.h4
-rw-r--r--libsolidity/ast/Types.cpp31
-rw-r--r--libsolidity/ast/Types.h539
9 files changed, 457 insertions, 438 deletions
diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h
index 4fd2bcb8..2f418b09 100644
--- a/libsolidity/ast/AST.h
+++ b/libsolidity/ast/AST.h
@@ -23,13 +23,13 @@
#pragma once
-#include <libsolidity/ast/ASTForward.h>
#include <libsolidity/parsing/Token.h>
+#include <libsolidity/ast/ASTForward.h>
#include <libsolidity/ast/Types.h>
#include <libsolidity/ast/ASTAnnotations.h>
#include <libsolidity/ast/ASTEnums.h>
-#include <libevmasm/SourceLocation.h>
+#include <liblangutil/SourceLocation.h>
#include <libevmasm/Instruction.h>
#include <libdevcore/FixedHash.h>
@@ -41,6 +41,12 @@
#include <vector>
#include <memory>
+namespace yul
+{
+// Forward-declaration to <yul/AsmData.h>
+struct Block;
+}
+
namespace dev
{
namespace solidity
@@ -58,6 +64,8 @@ class ASTConstVisitor;
class ASTNode: private boost::noncopyable
{
public:
+ using SourceLocation = langutil::SourceLocation;
+
explicit ASTNode(SourceLocation const& _location);
virtual ~ASTNode();
@@ -126,9 +134,9 @@ public:
SourceUnit(SourceLocation const& _location, std::vector<ASTPointer<ASTNode>> const& _nodes):
ASTNode(_location), m_nodes(_nodes) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
- virtual SourceUnitAnnotation& annotation() const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
+ SourceUnitAnnotation& annotation() const override;
std::vector<ASTPointer<ASTNode>> nodes() const { return m_nodes; }
@@ -242,8 +250,8 @@ public:
): ASTNode(_location), m_tokens(_tokens), m_literals(_literals)
{}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
std::vector<Token> const& tokens() const { return m_tokens; }
std::vector<ASTString> const& literals() const { return m_literals; }
@@ -279,17 +287,17 @@ public:
m_symbolAliases(_symbolAliases)
{ }
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
ASTString const& path() const { return *m_path; }
std::vector<std::pair<ASTPointer<Identifier>, ASTPointer<ASTString>>> const& symbolAliases() const
{
return m_symbolAliases;
}
- virtual ImportAnnotation& annotation() const override;
+ ImportAnnotation& annotation() const override;
- virtual TypePointer type() const override;
+ TypePointer type() const override;
private:
ASTPointer<ASTString> m_path;
@@ -375,8 +383,8 @@ public:
m_contractKind(_contractKind)
{}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
std::vector<ASTPointer<InheritanceSpecifier>> const& baseContracts() const { return m_baseContracts; }
std::vector<ASTPointer<ASTNode>> const& subNodes() const { return m_subNodes; }
@@ -407,9 +415,9 @@ public:
std::string fullyQualifiedName() const { return sourceUnitName() + ":" + name(); }
- virtual TypePointer type() const override;
+ TypePointer type() const override;
- virtual ContractDefinitionAnnotation& annotation() const override;
+ ContractDefinitionAnnotation& annotation() const override;
ContractKind contractKind() const { return m_contractKind; }
@@ -434,8 +442,8 @@ public:
):
ASTNode(_location), m_baseName(_baseName), m_arguments(std::move(_arguments)) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
UserDefinedTypeName const& name() const { return *m_baseName; }
// Returns nullptr if no argument list was given (``C``).
@@ -463,8 +471,8 @@ public:
):
ASTNode(_location), m_libraryName(_libraryName), m_typeName(_typeName) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
UserDefinedTypeName const& libraryName() const { return *m_libraryName; }
/// @returns the type name the library is attached to, null for `*`.
@@ -485,14 +493,14 @@ public:
):
Declaration(_location, _name), m_members(_members) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
std::vector<ASTPointer<VariableDeclaration>> const& members() const { return m_members; }
- virtual TypePointer type() const override;
+ TypePointer type() const override;
- virtual TypeDeclarationAnnotation& annotation() const override;
+ TypeDeclarationAnnotation& annotation() const override;
private:
std::vector<ASTPointer<VariableDeclaration>> m_members;
@@ -507,14 +515,14 @@ public:
std::vector<ASTPointer<EnumValue>> const& _members
):
Declaration(_location, _name), m_members(_members) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
std::vector<ASTPointer<EnumValue>> const& members() const { return m_members; }
- virtual TypePointer type() const override;
+ TypePointer type() const override;
- virtual TypeDeclarationAnnotation& annotation() const override;
+ TypeDeclarationAnnotation& annotation() const override;
private:
std::vector<ASTPointer<EnumValue>> m_members;
@@ -529,10 +537,10 @@ public:
EnumValue(SourceLocation const& _location, ASTPointer<ASTString> const& _name):
Declaration(_location, _name) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
- virtual TypePointer type() const override;
+ TypePointer type() const override;
};
/**
@@ -548,8 +556,8 @@ public:
std::vector<ASTPointer<VariableDeclaration>> const& _parameters
):
ASTNode(_location), m_parameters(_parameters) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
std::vector<ASTPointer<VariableDeclaration>> const& parameters() const { return m_parameters; }
@@ -610,8 +618,8 @@ public:
m_body(_body)
{}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
StateMutability stateMutability() const { return m_stateMutability; }
bool isConstructor() const { return m_isConstructor; }
@@ -620,11 +628,11 @@ public:
std::vector<ASTPointer<ModifierInvocation>> const& modifiers() const { return m_functionModifiers; }
std::vector<ASTPointer<VariableDeclaration>> const& returnParameters() const { return m_returnParameters->parameters(); }
Block const& body() const { solAssert(m_body, ""); return *m_body; }
- virtual bool isVisibleInContract() const override
+ bool isVisibleInContract() const override
{
return Declaration::isVisibleInContract() && !isConstructor() && !isFallback();
}
- virtual bool isPartOfExternalInterface() const override { return isPublic() && !isConstructor() && !isFallback(); }
+ bool isPartOfExternalInterface() const override { return isPublic() && !isConstructor() && !isFallback(); }
/// @returns the external signature of the function
/// That consists of the name of the function followed by the types of the
@@ -633,13 +641,13 @@ public:
ContractDefinition::ContractKind inContractKind() const;
- virtual TypePointer type() const override;
+ TypePointer type() const override;
/// @param _internal false indicates external interface is concerned, true indicates internal interface is concerned.
/// @returns null when it is not accessible as a function.
- virtual FunctionTypePointer functionType(bool /*_internal*/) const override;
+ FunctionTypePointer functionType(bool /*_internal*/) const override;
- virtual FunctionDefinitionAnnotation& annotation() const override;
+ FunctionDefinitionAnnotation& annotation() const override;
private:
StateMutability m_stateMutability;
@@ -676,14 +684,14 @@ public:
m_isConstant(_isConstant),
m_location(_referenceLocation) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
TypeName* typeName() const { return m_typeName.get(); }
ASTPointer<Expression> const& value() const { return m_value; }
- virtual bool isLValue() const override;
- virtual bool isPartOfExternalInterface() const override { return isPublic(); }
+ bool isLValue() const override;
+ bool isPartOfExternalInterface() const override { return isPublic(); }
/// @returns true iff this variable is the parameter (or return parameter) of a function
/// (or function type name or event) or declared inside a function body.
@@ -717,13 +725,13 @@ public:
/// @returns a set of allowed storage locations for the variable.
std::set<Location> allowedDataLocations() const;
- virtual TypePointer type() const override;
+ TypePointer type() const override;
/// @param _internal false indicates external interface is concerned, true indicates internal interface is concerned.
/// @returns null when it is not accessible as a function.
- virtual FunctionTypePointer functionType(bool /*_internal*/) const override;
+ FunctionTypePointer functionType(bool /*_internal*/) const override;
- virtual VariableDeclarationAnnotation& annotation() const override;
+ VariableDeclarationAnnotation& annotation() const override;
protected:
Visibility defaultVisibility() const override { return Visibility::Internal; }
@@ -758,14 +766,14 @@ public:
{
}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Block const& body() const { return *m_body; }
- virtual TypePointer type() const override;
+ TypePointer type() const override;
- virtual ModifierDefinitionAnnotation& annotation() const override;
+ ModifierDefinitionAnnotation& annotation() const override;
private:
ASTPointer<Block> m_body;
@@ -784,8 +792,8 @@ public:
):
ASTNode(_location), m_modifierName(_name), m_arguments(std::move(_arguments)) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
ASTPointer<Identifier> const& name() const { return m_modifierName; }
// Returns nullptr if no argument list was given (``mod``).
@@ -817,15 +825,15 @@ public:
{
}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
bool isAnonymous() const { return m_anonymous; }
- virtual TypePointer type() const override;
- virtual FunctionTypePointer functionType(bool /*_internal*/) const override;
+ TypePointer type() const override;
+ FunctionTypePointer functionType(bool /*_internal*/) const override;
- virtual EventDefinitionAnnotation& annotation() const override;
+ EventDefinitionAnnotation& annotation() const override;
private:
bool m_anonymous = false;
@@ -840,21 +848,21 @@ class MagicVariableDeclaration: public Declaration
public:
MagicVariableDeclaration(ASTString const& _name, std::shared_ptr<Type const> const& _type):
Declaration(SourceLocation(), std::make_shared<ASTString>(_name)), m_type(_type) {}
- virtual void accept(ASTVisitor&) override
+ void accept(ASTVisitor&) override
{
solAssert(false, "MagicVariableDeclaration used inside real AST.");
}
- virtual void accept(ASTConstVisitor&) const override
+ void accept(ASTConstVisitor&) const override
{
solAssert(false, "MagicVariableDeclaration used inside real AST.");
}
- virtual FunctionTypePointer functionType(bool) const override
+ FunctionTypePointer functionType(bool) const override
{
solAssert(m_type->category() == Type::Category::Function, "");
return std::dynamic_pointer_cast<FunctionType const>(m_type);
}
- virtual TypePointer type() const override { return m_type; }
+ TypePointer type() const override { return m_type; }
private:
std::shared_ptr<Type const> m_type;
@@ -872,7 +880,7 @@ protected:
explicit TypeName(SourceLocation const& _location): ASTNode(_location) {}
public:
- virtual TypeNameAnnotation& annotation() const override;
+ TypeNameAnnotation& annotation() const override;
};
/**
@@ -891,8 +899,8 @@ public:
solAssert(!_stateMutability.is_initialized() || _elem.token() == Token::Address, "");
}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
ElementaryTypeNameToken const& typeName() const { return m_type; }
@@ -911,12 +919,12 @@ class UserDefinedTypeName: public TypeName
public:
UserDefinedTypeName(SourceLocation const& _location, std::vector<ASTString> const& _namePath):
TypeName(_location), m_namePath(_namePath) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
std::vector<ASTString> const& namePath() const { return m_namePath; }
- virtual UserDefinedTypeNameAnnotation& annotation() const override;
+ UserDefinedTypeNameAnnotation& annotation() const override;
private:
std::vector<ASTString> m_namePath;
@@ -938,8 +946,8 @@ public:
TypeName(_location), m_parameterTypes(_parameterTypes), m_returnTypes(_returnTypes),
m_visibility(_visibility), m_stateMutability(_stateMutability)
{}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
std::vector<ASTPointer<VariableDeclaration>> const& parameterTypes() const { return m_parameterTypes->parameters(); }
std::vector<ASTPointer<VariableDeclaration>> const& returnParameterTypes() const { return m_returnTypes->parameters(); }
@@ -972,8 +980,8 @@ public:
ASTPointer<TypeName> const& _valueType
):
TypeName(_location), m_keyType(_keyType), m_valueType(_valueType) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
ElementaryTypeName const& keyType() const { return *m_keyType; }
TypeName const& valueType() const { return *m_valueType; }
@@ -995,8 +1003,8 @@ public:
ASTPointer<Expression> const& _length
):
TypeName(_location), m_baseType(_baseType), m_length(_length) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
TypeName const& baseType() const { return *m_baseType; }
Expression const* length() const { return m_length.get(); }
@@ -1023,15 +1031,9 @@ public:
ASTPointer<ASTString> const& _docString
): ASTNode(_location), Documented(_docString) {}
- virtual StatementAnnotation& annotation() const override;
+ StatementAnnotation& annotation() const override;
};
-namespace assembly
-{
-// Forward-declaration to AsmData.h
-struct Block;
-}
-
/**
* Inline assembly.
*/
@@ -1041,18 +1043,18 @@ public:
InlineAssembly(
SourceLocation const& _location,
ASTPointer<ASTString> const& _docString,
- std::shared_ptr<assembly::Block> const& _operations
+ std::shared_ptr<yul::Block> const& _operations
):
Statement(_location, _docString), m_operations(_operations) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
- assembly::Block const& operations() const { return *m_operations; }
+ yul::Block const& operations() const { return *m_operations; }
- virtual InlineAssemblyAnnotation& annotation() const override;
+ InlineAssemblyAnnotation& annotation() const override;
private:
- std::shared_ptr<assembly::Block> m_operations;
+ std::shared_ptr<yul::Block> m_operations;
};
/**
@@ -1067,8 +1069,8 @@ public:
std::vector<ASTPointer<Statement>> const& _statements
):
Statement(_location, _docString), m_statements(_statements) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
std::vector<ASTPointer<Statement>> const& statements() const { return m_statements; }
@@ -1088,8 +1090,8 @@ public:
ASTPointer<ASTString> const& _docString
): Statement(_location, _docString) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
};
/**
@@ -1111,8 +1113,8 @@ public:
m_trueBody(_trueBody),
m_falseBody(_falseBody)
{}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Expression const& condition() const { return *m_condition; }
Statement const& trueStatement() const { return *m_trueBody; }
@@ -1149,8 +1151,8 @@ public:
):
BreakableStatement(_location, _docString), m_condition(_condition), m_body(_body),
m_isDoWhile(_isDoWhile) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Expression const& condition() const { return *m_condition; }
Statement const& body() const { return *m_body; }
@@ -1182,8 +1184,8 @@ public:
m_loopExpression(_loopExpression),
m_body(_body)
{}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Statement const* initializationExpression() const { return m_initExpression.get(); }
Expression const* condition() const { return m_condExpression.get(); }
@@ -1206,8 +1208,8 @@ class Continue: public Statement
public:
explicit Continue(SourceLocation const& _location, ASTPointer<ASTString> const& _docString):
Statement(_location, _docString) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
};
class Break: public Statement
@@ -1215,8 +1217,8 @@ class Break: public Statement
public:
explicit Break(SourceLocation const& _location, ASTPointer<ASTString> const& _docString):
Statement(_location, _docString) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
};
class Return: public Statement
@@ -1227,12 +1229,12 @@ public:
ASTPointer<ASTString> const& _docString,
ASTPointer<Expression> _expression
): Statement(_location, _docString), m_expression(_expression) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Expression const* expression() const { return m_expression.get(); }
- virtual ReturnAnnotation& annotation() const override;
+ ReturnAnnotation& annotation() const override;
private:
ASTPointer<Expression> m_expression; ///< value to return, optional
@@ -1246,8 +1248,8 @@ class Throw: public Statement
public:
explicit Throw(SourceLocation const& _location, ASTPointer<ASTString> const& _docString):
Statement(_location, _docString) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
};
/**
@@ -1262,8 +1264,8 @@ public:
ASTPointer<FunctionCall> const& _functionCall
):
Statement(_location, _docString), m_eventCall(_functionCall) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
FunctionCall const& eventCall() const { return *m_eventCall; }
@@ -1289,8 +1291,8 @@ public:
ASTPointer<Expression> const& _initialValue
):
Statement(_location, _docString), m_variables(_variables), m_initialValue(_initialValue) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
std::vector<ASTPointer<VariableDeclaration>> const& declarations() const { return m_variables; }
Expression const* initialValue() const { return m_initialValue.get(); }
@@ -1317,8 +1319,8 @@ public:
ASTPointer<Expression> _expression
):
Statement(_location, _docString), m_expression(_expression) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Expression const& expression() const { return *m_expression; }
@@ -1358,8 +1360,8 @@ public:
m_trueExpression(_trueExpression),
m_falseExpression(_falseExpression)
{}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Expression const& condition() const { return *m_condition; }
Expression const& trueExpression() const { return *m_trueExpression; }
@@ -1389,8 +1391,8 @@ public:
{
solAssert(TokenTraits::isAssignmentOp(_assignmentOperator), "");
}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Expression const& leftHandSide() const { return *m_leftHandSide; }
Token assignmentOperator() const { return m_assigmentOperator; }
@@ -1421,8 +1423,8 @@ public:
Expression(_location),
m_components(_components),
m_isArray(_isArray) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
std::vector<ASTPointer<Expression>> const& components() const { return m_components; }
bool isInlineArray() const { return m_isArray; }
@@ -1452,8 +1454,8 @@ public:
{
solAssert(TokenTraits::isUnaryOp(_operator), "");
}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Token getOperator() const { return m_operator; }
bool isPrefixOperation() const { return m_isPrefix; }
@@ -1482,8 +1484,8 @@ public:
{
solAssert(TokenTraits::isBinaryOp(_operator) || TokenTraits::isCompareOp(_operator), "");
}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Expression const& leftExpression() const { return *m_left; }
Expression const& rightExpression() const { return *m_right; }
@@ -1510,14 +1512,14 @@ public:
std::vector<ASTPointer<ASTString>> const& _names
):
Expression(_location), m_expression(_expression), m_arguments(_arguments), m_names(_names) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Expression const& expression() const { return *m_expression; }
std::vector<ASTPointer<Expression const>> arguments() const { return {m_arguments.begin(), m_arguments.end()}; }
std::vector<ASTPointer<ASTString>> const& names() const { return m_names; }
- virtual FunctionCallAnnotation& annotation() const override;
+ FunctionCallAnnotation& annotation() const override;
private:
ASTPointer<Expression> m_expression;
@@ -1537,8 +1539,8 @@ public:
ASTPointer<TypeName> const& _typeName
):
Expression(_location), m_typeName(_typeName) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
TypeName const& typeName() const { return *m_typeName; }
@@ -1558,12 +1560,12 @@ public:
ASTPointer<ASTString> const& _memberName
):
Expression(_location), m_expression(_expression), m_memberName(_memberName) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Expression const& expression() const { return *m_expression; }
ASTString const& memberName() const { return *m_memberName; }
- virtual MemberAccessAnnotation& annotation() const override;
+ MemberAccessAnnotation& annotation() const override;
private:
ASTPointer<Expression> m_expression;
@@ -1582,8 +1584,8 @@ public:
ASTPointer<Expression> const& _index
):
Expression(_location), m_base(_base), m_index(_index) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Expression const& baseExpression() const { return *m_base; }
Expression const* indexExpression() const { return m_index.get(); }
@@ -1614,12 +1616,12 @@ public:
ASTPointer<ASTString> const& _name
):
PrimaryExpression(_location), m_name(_name) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
ASTString const& name() const { return *m_name; }
- virtual IdentifierAnnotation& annotation() const override;
+ IdentifierAnnotation& annotation() const override;
private:
ASTPointer<ASTString> m_name;
@@ -1636,8 +1638,8 @@ public:
ElementaryTypeNameExpression(SourceLocation const& _location, ElementaryTypeNameToken const& _type):
PrimaryExpression(_location), m_typeToken(_type)
{}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
ElementaryTypeNameToken const& typeName() const { return m_typeToken; }
@@ -1672,8 +1674,8 @@ public:
SubDenomination _sub = SubDenomination::None
):
PrimaryExpression(_location), m_token(_token), m_value(_value), m_subDenomination(_sub) {}
- virtual void accept(ASTVisitor& _visitor) override;
- virtual void accept(ASTConstVisitor& _visitor) const override;
+ void accept(ASTVisitor& _visitor) override;
+ void accept(ASTConstVisitor& _visitor) const override;
Token token() const { return m_token; }
/// @returns the non-parsed value of the literal
diff --git a/libsolidity/ast/ASTAnnotations.h b/libsolidity/ast/ASTAnnotations.h
index e0b3f492..e9cc905e 100644
--- a/libsolidity/ast/ASTAnnotations.h
+++ b/libsolidity/ast/ASTAnnotations.h
@@ -30,6 +30,12 @@
#include <vector>
#include <set>
+namespace yul
+{
+ struct AsmAnalysisInfo;
+ struct Identifier;
+}
+
namespace dev
{
namespace solidity
@@ -120,12 +126,6 @@ struct StatementAnnotation: ASTAnnotation, DocumentedAnnotation
{
};
-namespace assembly
-{
- struct AsmAnalysisInfo;
- struct Identifier;
-}
-
struct InlineAssemblyAnnotation: StatementAnnotation
{
struct ExternalIdentifierInfo
@@ -137,9 +137,9 @@ struct InlineAssemblyAnnotation: StatementAnnotation
};
/// Mapping containing resolved references to external identifiers and their value size
- std::map<assembly::Identifier const*, ExternalIdentifierInfo> externalReferences;
+ std::map<yul::Identifier const*, ExternalIdentifierInfo> externalReferences;
/// Information generated during analysis phase.
- std::shared_ptr<assembly::AsmAnalysisInfo> analysisInfo;
+ std::shared_ptr<yul::AsmAnalysisInfo> analysisInfo;
};
struct ReturnAnnotation: StatementAnnotation
diff --git a/libsolidity/ast/ASTEnums.h b/libsolidity/ast/ASTEnums.h
index 5ba21907..d47a5f05 100644
--- a/libsolidity/ast/ASTEnums.h
+++ b/libsolidity/ast/ASTEnums.h
@@ -21,7 +21,7 @@
#pragma once
-#include <libsolidity/interface/Exceptions.h>
+#include <liblangutil/Exceptions.h>
#include <string>
diff --git a/libsolidity/ast/ASTJsonConverter.cpp b/libsolidity/ast/ASTJsonConverter.cpp
index 2d26ce8a..cfb13271 100644
--- a/libsolidity/ast/ASTJsonConverter.cpp
+++ b/libsolidity/ast/ASTJsonConverter.cpp
@@ -23,10 +23,11 @@
#include <boost/algorithm/string/join.hpp>
#include <libdevcore/UTF8.h>
#include <libsolidity/ast/AST.h>
-#include <libsolidity/inlineasm/AsmData.h>
-#include <libsolidity/inlineasm/AsmPrinter.h>
+#include <libyul/AsmData.h>
+#include <libyul/AsmPrinter.h>
using namespace std;
+using namespace langutil;
namespace dev
{
@@ -121,8 +122,8 @@ void ASTJsonConverter::setJsonNode(
string ASTJsonConverter::sourceLocationToString(SourceLocation const& _location) const
{
int sourceIndex{-1};
- if (_location.sourceName && m_sourceIndices.count(*_location.sourceName))
- sourceIndex = m_sourceIndices.at(*_location.sourceName);
+ if (_location.source && m_sourceIndices.count(_location.source->name()))
+ sourceIndex = m_sourceIndices.at(_location.source->name());
int length = -1;
if (_location.start >= 0 && _location.end >= 0)
length = _location.end - _location.start;
@@ -171,7 +172,7 @@ void ASTJsonConverter::appendExpressionAttributes(
_attributes += exprAttributes;
}
-Json::Value ASTJsonConverter::inlineAssemblyIdentifierToJson(pair<assembly::Identifier const* ,InlineAssemblyAnnotation::ExternalIdentifierInfo> _info) const
+Json::Value ASTJsonConverter::inlineAssemblyIdentifierToJson(pair<yul::Identifier const* ,InlineAssemblyAnnotation::ExternalIdentifierInfo> _info) const
{
Json::Value tuple(Json::objectValue);
tuple["src"] = sourceLocationToString(_info.first->location);
@@ -464,7 +465,7 @@ bool ASTJsonConverter::visit(InlineAssembly const& _node)
}
}
setJsonNode(_node, "InlineAssembly", {
- make_pair("operations", Json::Value(assembly::AsmPrinter()(_node.operations()))),
+ make_pair("operations", Json::Value(yul::AsmPrinter()(_node.operations()))),
make_pair("externalReferences", std::move(externalReferences))
});
return false;
diff --git a/libsolidity/ast/ASTJsonConverter.h b/libsolidity/ast/ASTJsonConverter.h
index 8429708c..ef0a217a 100644
--- a/libsolidity/ast/ASTJsonConverter.h
+++ b/libsolidity/ast/ASTJsonConverter.h
@@ -25,10 +25,15 @@
#include <ostream>
#include <stack>
#include <libsolidity/ast/ASTVisitor.h>
-#include <libsolidity/interface/Exceptions.h>
+#include <liblangutil/Exceptions.h>
#include <libsolidity/ast/ASTAnnotations.h>
#include <json/json.h>
+namespace langutil
+{
+struct SourceLocation;
+}
+
namespace dev
{
namespace solidity
@@ -120,7 +125,7 @@ private:
std::string const& _nodeName,
std::vector<std::pair<std::string, Json::Value>>&& _attributes
);
- std::string sourceLocationToString(SourceLocation const& _location) const;
+ std::string sourceLocationToString(langutil::SourceLocation const& _location) const;
static std::string namePathToString(std::vector<ASTString> const& _namePath);
static Json::Value idOrNull(ASTNode const* _pt)
{
@@ -130,7 +135,7 @@ private:
{
return _node ? toJson(*_node) : Json::nullValue;
}
- Json::Value inlineAssemblyIdentifierToJson(std::pair<assembly::Identifier const* , InlineAssemblyAnnotation::ExternalIdentifierInfo> _info) const;
+ Json::Value inlineAssemblyIdentifierToJson(std::pair<yul::Identifier const* , InlineAssemblyAnnotation::ExternalIdentifierInfo> _info) const;
static std::string location(VariableDeclaration::Location _location);
static std::string contractKind(ContractDefinition::ContractKind _kind);
static std::string functionCallKind(FunctionCallKind _kind);
diff --git a/libsolidity/ast/ASTPrinter.cpp b/libsolidity/ast/ASTPrinter.cpp
index 255cb9be..cdc6ae7d 100644
--- a/libsolidity/ast/ASTPrinter.cpp
+++ b/libsolidity/ast/ASTPrinter.cpp
@@ -28,6 +28,7 @@
#include <boost/algorithm/string/join.hpp>
using namespace std;
+using namespace langutil;
namespace dev
{
diff --git a/libsolidity/ast/ASTVisitor.h b/libsolidity/ast/ASTVisitor.h
index 6c0ce6f8..1a761032 100644
--- a/libsolidity/ast/ASTVisitor.h
+++ b/libsolidity/ast/ASTVisitor.h
@@ -262,8 +262,8 @@ public:
): m_onVisit(_onVisit), m_onEndVisit(_onEndVisit) {}
protected:
- virtual bool visitNode(ASTNode const& _n) override { return m_onVisit ? m_onVisit(_n) : true; }
- virtual void endVisitNode(ASTNode const& _n) override { m_onEndVisit(_n); }
+ bool visitNode(ASTNode const& _n) override { return m_onVisit ? m_onVisit(_n) : true; }
+ void endVisitNode(ASTNode const& _n) override { m_onEndVisit(_n); }
private:
std::function<bool(ASTNode const&)> m_onVisit;
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp
index 4b31d2e8..6cadb5f3 100644
--- a/libsolidity/ast/Types.cpp
+++ b/libsolidity/ast/Types.cpp
@@ -45,6 +45,7 @@
using namespace std;
using namespace dev;
+using namespace langutil;
using namespace dev::solidity;
namespace
@@ -441,10 +442,11 @@ MemberList::MemberMap Type::boundFunctions(Type const& _type, ContractDefinition
if (!function->isVisibleAsLibraryMember() || seenFunctions.count(function))
continue;
seenFunctions.insert(function);
- FunctionType funType(*function, false);
- if (auto fun = funType.asMemberFunction(true, true))
- if (_type.isImplicitlyConvertibleTo(*fun->selfType()))
- members.push_back(MemberList::Member(function->name(), fun, function));
+ if (function->parameters().empty())
+ continue;
+ FunctionTypePointer fun = FunctionType(*function, false).asCallableFunction(true, true);
+ if (_type.isImplicitlyConvertibleTo(*fun->selfType()))
+ members.push_back(MemberList::Member(function->name(), fun, function));
}
}
return members;
@@ -1941,8 +1943,9 @@ MemberList::MemberMap ContractType::nativeMembers(ContractDefinition const* _con
for (ContractDefinition const* base: bases | boost::adaptors::sliced(1, bases.size()))
for (FunctionDefinition const* function: base->definedFunctions())
{
- if (!function->isVisibleInDerivedContracts())
+ if (!function->isVisibleInDerivedContracts() || !function->isImplemented())
continue;
+
auto functionType = make_shared<FunctionType>(*function, true);
bool functionWithEqualArgumentsFound = false;
for (auto const& member: members)
@@ -1969,7 +1972,7 @@ MemberList::MemberMap ContractType::nativeMembers(ContractDefinition const* _con
for (auto const& it: m_contract.interfaceFunctions())
members.push_back(MemberList::Member(
it.second->declaration().name(),
- it.second->asMemberFunction(m_contract.isLibrary()),
+ it.second->asCallableFunction(m_contract.isLibrary()),
&it.second->declaration()
));
}
@@ -2122,9 +2125,15 @@ bool StructType::canBeUsedExternally(bool _inLibrary) const
// We pass "false" to canBeUsedExternally (_inLibrary), because this struct will be
// passed by value and thus the encoding does not differ, but it will disallow
// mappings.
+ // Also return false if at least one struct member does not have a type.
+ // This might happen, for example, if the type of the member does not exist,
+ // which is reported as an error.
for (auto const& var: m_struct.members())
{
- solAssert(var->annotation().type, "");
+ // If the struct member does not have a type return false.
+ // A TypeError is expected in this case.
+ if (!var->annotation().type)
+ return false;
if (!var->annotation().type->canBeUsedExternally(false))
return false;
}
@@ -3058,10 +3067,10 @@ TypePointer FunctionType::copyAndSetGasOrValue(bool _setGas, bool _setValue) con
);
}
-FunctionTypePointer FunctionType::asMemberFunction(bool _inLibrary, bool _bound) const
+FunctionTypePointer FunctionType::asCallableFunction(bool _inLibrary, bool _bound) const
{
- if (_bound && m_parameterTypes.empty())
- return FunctionTypePointer();
+ if (_bound)
+ solAssert(!m_parameterTypes.empty(), "");
TypePointers parameterTypes;
for (auto const& t: m_parameterTypes)
@@ -3200,7 +3209,7 @@ MemberList::MemberMap TypeType::nativeMembers(ContractDefinition const* _current
if (function->isVisibleAsLibraryMember())
members.push_back(MemberList::Member(
function->name(),
- FunctionType(*function).asMemberFunction(true),
+ FunctionType(*function).asCallableFunction(true),
function
));
if (isBase)
diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h
index 24ace447..0f0548d3 100644
--- a/libsolidity/ast/Types.h
+++ b/libsolidity/ast/Types.h
@@ -22,7 +22,7 @@
#pragma once
-#include <libsolidity/interface/Exceptions.h>
+#include <liblangutil/Exceptions.h>
#include <libsolidity/ast/ASTForward.h>
#include <libsolidity/ast/ASTEnums.h>
#include <libsolidity/parsing/Token.h>
@@ -331,31 +331,31 @@ public:
static AddressType& address() { static std::shared_ptr<AddressType> addr(std::make_shared<AddressType>(StateMutability::NonPayable)); return *addr; }
static AddressType& addressPayable() { static std::shared_ptr<AddressType> addr(std::make_shared<AddressType>(StateMutability::Payable)); return *addr; }
- virtual Category category() const override { return Category::Address; }
+ Category category() const override { return Category::Address; }
explicit AddressType(StateMutability _stateMutability);
- virtual std::string richIdentifier() const override;
- virtual bool isImplicitlyConvertibleTo(Type const& _other) const override;
- virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual TypePointer unaryOperatorResult(Token _operator) const override;
- virtual TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
+ std::string richIdentifier() const override;
+ bool isImplicitlyConvertibleTo(Type const& _other) const override;
+ bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
+ TypePointer unaryOperatorResult(Token _operator) const override;
+ TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
- virtual bool operator==(Type const& _other) const override;
+ bool operator==(Type const& _other) const override;
- virtual unsigned calldataEncodedSize(bool _padded = true) const override { return _padded ? 32 : 160 / 8; }
- virtual unsigned storageBytes() const override { return 160 / 8; }
- virtual bool isValueType() const override { return true; }
+ unsigned calldataEncodedSize(bool _padded = true) const override { return _padded ? 32 : 160 / 8; }
+ unsigned storageBytes() const override { return 160 / 8; }
+ bool isValueType() const override { return true; }
- virtual MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
+ MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
- virtual std::string toString(bool _short) const override;
- virtual std::string canonicalName() const override;
+ std::string toString(bool _short) const override;
+ std::string canonicalName() const override;
- virtual u256 literalValue(Literal const* _literal) const override;
+ u256 literalValue(Literal const* _literal) const override;
- virtual TypePointer encodingType() const override { return shared_from_this(); }
- virtual TypePointer interfaceType(bool) const override { return shared_from_this(); }
+ TypePointer encodingType() const override { return shared_from_this(); }
+ TypePointer interfaceType(bool) const override { return shared_from_this(); }
StateMutability stateMutability(void) const { return m_stateMutability; }
@@ -374,26 +374,28 @@ public:
Unsigned, Signed
};
- virtual Category category() const override { return Category::Integer; }
+ static IntegerType& uint256() { static std::shared_ptr<IntegerType> uint256(std::make_shared<IntegerType>(256)); return *uint256; }
+
+ Category category() const override { return Category::Integer; }
explicit IntegerType(unsigned _bits, Modifier _modifier = Modifier::Unsigned);
- virtual std::string richIdentifier() const override;
- virtual bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual TypePointer unaryOperatorResult(Token _operator) const override;
- virtual TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
+ std::string richIdentifier() const override;
+ bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
+ bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
+ TypePointer unaryOperatorResult(Token _operator) const override;
+ TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
- virtual bool operator==(Type const& _other) const override;
+ bool operator==(Type const& _other) const override;
- virtual unsigned calldataEncodedSize(bool _padded = true) const override { return _padded ? 32 : m_bits / 8; }
- virtual unsigned storageBytes() const override { return m_bits / 8; }
- virtual bool isValueType() const override { return true; }
+ unsigned calldataEncodedSize(bool _padded = true) const override { return _padded ? 32 : m_bits / 8; }
+ unsigned storageBytes() const override { return m_bits / 8; }
+ bool isValueType() const override { return true; }
- virtual std::string toString(bool _short) const override;
+ std::string toString(bool _short) const override;
- virtual TypePointer encodingType() const override { return shared_from_this(); }
- virtual TypePointer interfaceType(bool) const override { return shared_from_this(); }
+ TypePointer encodingType() const override { return shared_from_this(); }
+ TypePointer interfaceType(bool) const override { return shared_from_this(); }
unsigned numBits() const { return m_bits; }
bool isSigned() const { return m_modifier == Modifier::Signed; }
@@ -416,26 +418,26 @@ public:
{
Unsigned, Signed
};
- virtual Category category() const override { return Category::FixedPoint; }
+ Category category() const override { return Category::FixedPoint; }
explicit FixedPointType(unsigned _totalBits, unsigned _fractionalDigits, Modifier _modifier = Modifier::Unsigned);
- virtual std::string richIdentifier() const override;
- virtual bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual TypePointer unaryOperatorResult(Token _operator) const override;
- virtual TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
+ std::string richIdentifier() const override;
+ bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
+ bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
+ TypePointer unaryOperatorResult(Token _operator) const override;
+ TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
- virtual bool operator==(Type const& _other) const override;
+ bool operator==(Type const& _other) const override;
- virtual unsigned calldataEncodedSize(bool _padded = true) const override { return _padded ? 32 : m_totalBits / 8; }
- virtual unsigned storageBytes() const override { return m_totalBits / 8; }
- virtual bool isValueType() const override { return true; }
+ unsigned calldataEncodedSize(bool _padded = true) const override { return _padded ? 32 : m_totalBits / 8; }
+ unsigned storageBytes() const override { return m_totalBits / 8; }
+ bool isValueType() const override { return true; }
- virtual std::string toString(bool _short) const override;
+ std::string toString(bool _short) const override;
- virtual TypePointer encodingType() const override { return shared_from_this(); }
- virtual TypePointer interfaceType(bool) const override { return shared_from_this(); }
+ TypePointer encodingType() const override { return shared_from_this(); }
+ TypePointer interfaceType(bool) const override { return shared_from_this(); }
/// Number of bits used for this type in total.
unsigned numBits() const { return m_totalBits; }
@@ -467,7 +469,7 @@ class RationalNumberType: public Type
{
public:
- virtual Category category() const override { return Category::RationalNumber; }
+ Category category() const override { return Category::RationalNumber; }
static TypePointer forLiteral(Literal const& _literal);
@@ -475,20 +477,20 @@ public:
m_value(_value), m_compatibleBytesType(_compatibleBytesType)
{}
- virtual bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual TypePointer unaryOperatorResult(Token _operator) const override;
- virtual TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
+ bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
+ bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
+ TypePointer unaryOperatorResult(Token _operator) const override;
+ TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
- virtual bool canBeStored() const override { return false; }
- virtual bool canLiveOutsideStorage() const override { return false; }
+ bool canBeStored() const override { return false; }
+ bool canLiveOutsideStorage() const override { return false; }
- virtual std::string toString(bool _short) const override;
- virtual u256 literalValue(Literal const* _literal) const override;
- virtual TypePointer mobileType() const override;
+ std::string toString(bool _short) const override;
+ u256 literalValue(Literal const* _literal) const override;
+ TypePointer mobileType() const override;
/// @returns the smallest integer type that can hold the value or an empty pointer if not possible.
std::shared_ptr<IntegerType const> integerType() const;
@@ -530,25 +532,25 @@ private:
class StringLiteralType: public Type
{
public:
- virtual Category category() const override { return Category::StringLiteral; }
+ Category category() const override { return Category::StringLiteral; }
explicit StringLiteralType(Literal const& _literal);
- virtual bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual TypePointer binaryOperatorResult(Token, TypePointer const&) const override
+ bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
+ TypePointer binaryOperatorResult(Token, TypePointer const&) const override
{
return TypePointer();
}
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
- virtual bool canBeStored() const override { return false; }
- virtual bool canLiveOutsideStorage() const override { return false; }
- virtual unsigned sizeOnStack() const override { return 0; }
+ bool canBeStored() const override { return false; }
+ bool canLiveOutsideStorage() const override { return false; }
+ unsigned sizeOnStack() const override { return 0; }
- virtual std::string toString(bool) const override;
- virtual TypePointer mobileType() const override;
+ std::string toString(bool) const override;
+ TypePointer mobileType() const override;
bool isValidUTF8() const;
@@ -564,25 +566,25 @@ private:
class FixedBytesType: public Type
{
public:
- virtual Category category() const override { return Category::FixedBytes; }
+ Category category() const override { return Category::FixedBytes; }
explicit FixedBytesType(unsigned _bytes);
- virtual bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual TypePointer unaryOperatorResult(Token _operator) const override;
- virtual TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
+ bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
+ bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ TypePointer unaryOperatorResult(Token _operator) const override;
+ TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
- virtual unsigned calldataEncodedSize(bool _padded) const override { return _padded && m_bytes > 0 ? 32 : m_bytes; }
- virtual unsigned storageBytes() const override { return m_bytes; }
- virtual bool isValueType() const override { return true; }
+ unsigned calldataEncodedSize(bool _padded) const override { return _padded && m_bytes > 0 ? 32 : m_bytes; }
+ unsigned storageBytes() const override { return m_bytes; }
+ bool isValueType() const override { return true; }
- virtual std::string toString(bool) const override { return "bytes" + dev::toString(m_bytes); }
- virtual MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
- virtual TypePointer encodingType() const override { return shared_from_this(); }
- virtual TypePointer interfaceType(bool) const override { return shared_from_this(); }
+ std::string toString(bool) const override { return "bytes" + dev::toString(m_bytes); }
+ MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
+ TypePointer encodingType() const override { return shared_from_this(); }
+ TypePointer interfaceType(bool) const override { return shared_from_this(); }
unsigned numBytes() const { return m_bytes; }
@@ -597,19 +599,19 @@ class BoolType: public Type
{
public:
BoolType() {}
- virtual Category category() const override { return Category::Bool; }
- virtual std::string richIdentifier() const override { return "t_bool"; }
- virtual TypePointer unaryOperatorResult(Token _operator) const override;
- virtual TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
-
- virtual unsigned calldataEncodedSize(bool _padded) const override{ return _padded ? 32 : 1; }
- virtual unsigned storageBytes() const override { return 1; }
- virtual bool isValueType() const override { return true; }
-
- virtual std::string toString(bool) const override { return "bool"; }
- virtual u256 literalValue(Literal const* _literal) const override;
- virtual TypePointer encodingType() const override { return shared_from_this(); }
- virtual TypePointer interfaceType(bool) const override { return shared_from_this(); }
+ Category category() const override { return Category::Bool; }
+ std::string richIdentifier() const override { return "t_bool"; }
+ TypePointer unaryOperatorResult(Token _operator) const override;
+ TypePointer binaryOperatorResult(Token _operator, TypePointer const& _other) const override;
+
+ unsigned calldataEncodedSize(bool _padded) const override{ return _padded ? 32 : 1; }
+ unsigned storageBytes() const override { return 1; }
+ bool isValueType() const override { return true; }
+
+ std::string toString(bool) const override { return "bool"; }
+ u256 literalValue(Literal const* _literal) const override;
+ TypePointer encodingType() const override { return shared_from_this(); }
+ TypePointer interfaceType(bool) const override { return shared_from_this(); }
};
/**
@@ -622,20 +624,20 @@ public:
explicit ReferenceType(DataLocation _location): m_location(_location) {}
DataLocation location() const { return m_location; }
- virtual TypePointer unaryOperatorResult(Token _operator) const override;
- virtual TypePointer binaryOperatorResult(Token, TypePointer const&) const override
+ TypePointer unaryOperatorResult(Token _operator) const override;
+ TypePointer binaryOperatorResult(Token, TypePointer const&) const override
{
return TypePointer();
}
- virtual unsigned memoryHeadSize() const override { return 32; }
+ unsigned memoryHeadSize() const override { return 32; }
/// @returns a copy of this type with location (recursively) changed to @a _location,
/// whereas isPointer is only shallowly changed - the deep copy is always a bound reference.
virtual TypePointer copyForLocation(DataLocation _location, bool _isPointer) const = 0;
- virtual TypePointer mobileType() const override { return copyForLocation(m_location, true); }
- virtual bool dataStoredIn(DataLocation _location) const override { return m_location == _location; }
- virtual bool hasSimpleZeroValueInMemory() const override { return false; }
+ TypePointer mobileType() const override { return copyForLocation(m_location, true); }
+ bool dataStoredIn(DataLocation _location) const override { return m_location == _location; }
+ bool hasSimpleZeroValueInMemory() const override { return false; }
/// Storage references can be pointers or bound references. In general, local variables are of
/// pointer type, state variables are bound references. Assignments to pointers or deleting
@@ -677,7 +679,7 @@ public:
static ArrayType& bytesMemory() { static std::shared_ptr<ArrayType> addr(std::make_shared<ArrayType>(DataLocation::Memory)); return *addr; }
static ArrayType& stringMemory() { static std::shared_ptr<ArrayType> addr(std::make_shared<ArrayType>(DataLocation::Memory, true)); return *addr; }
- virtual Category category() const override { return Category::Array; }
+ Category category() const override { return Category::Array; }
/// Constructor for a byte array ("bytes") and string.
explicit ArrayType(DataLocation _location, bool _isString = false):
@@ -700,24 +702,24 @@ public:
m_length(_length)
{}
- virtual bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual std::string richIdentifier() const override;
- virtual bool operator==(const Type& _other) const override;
- virtual unsigned calldataEncodedSize(bool _padded) const override;
- virtual bool isDynamicallySized() const override { return m_hasDynamicLength; }
- virtual bool isDynamicallyEncoded() const override;
- virtual u256 storageSize() const override;
- virtual bool canLiveOutsideStorage() const override { return m_baseType->canLiveOutsideStorage(); }
- virtual unsigned sizeOnStack() const override;
- virtual std::string toString(bool _short) const override;
- virtual std::string canonicalName() const override;
- virtual std::string signatureInExternalFunction(bool _structsByName) const override;
- virtual MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
- virtual TypePointer encodingType() const override;
- virtual TypePointer decodingType() const override;
- virtual TypePointer interfaceType(bool _inLibrary) const override;
- virtual bool canBeUsedExternally(bool _inLibrary) const override;
+ bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
+ bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
+ std::string richIdentifier() const override;
+ bool operator==(const Type& _other) const override;
+ unsigned calldataEncodedSize(bool _padded) const override;
+ bool isDynamicallySized() const override { return m_hasDynamicLength; }
+ bool isDynamicallyEncoded() const override;
+ u256 storageSize() const override;
+ bool canLiveOutsideStorage() const override { return m_baseType->canLiveOutsideStorage(); }
+ unsigned sizeOnStack() const override;
+ std::string toString(bool _short) const override;
+ std::string canonicalName() const override;
+ std::string signatureInExternalFunction(bool _structsByName) const override;
+ MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
+ TypePointer encodingType() const override;
+ TypePointer decodingType() const override;
+ TypePointer interfaceType(bool _inLibrary) const override;
+ bool canBeUsedExternally(bool _inLibrary) const override;
/// @returns true if this is valid to be stored in calldata
bool validForCalldata() const;
@@ -751,36 +753,36 @@ private:
class ContractType: public Type
{
public:
- virtual Category category() const override { return Category::Contract; }
+ Category category() const override { return Category::Contract; }
explicit ContractType(ContractDefinition const& _contract, bool _super = false):
m_contract(_contract), m_super(_super) {}
/// Contracts can be implicitly converted only to base contracts.
- virtual bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
+ bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
/// Contracts can only be explicitly converted to address types and base contracts.
- virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual TypePointer unaryOperatorResult(Token _operator) const override;
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual unsigned calldataEncodedSize(bool _padded ) const override
+ bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
+ TypePointer unaryOperatorResult(Token _operator) const override;
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ unsigned calldataEncodedSize(bool _padded ) const override
{
solAssert(!isSuper(), "");
return encodingType()->calldataEncodedSize(_padded);
}
- virtual unsigned storageBytes() const override { solAssert(!isSuper(), ""); return 20; }
- virtual bool canLiveOutsideStorage() const override { return !isSuper(); }
- virtual unsigned sizeOnStack() const override { return m_super ? 0 : 1; }
- virtual bool isValueType() const override { return !isSuper(); }
- virtual std::string toString(bool _short) const override;
- virtual std::string canonicalName() const override;
-
- virtual MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
- virtual TypePointer encodingType() const override
+ unsigned storageBytes() const override { solAssert(!isSuper(), ""); return 20; }
+ bool canLiveOutsideStorage() const override { return !isSuper(); }
+ unsigned sizeOnStack() const override { return m_super ? 0 : 1; }
+ bool isValueType() const override { return !isSuper(); }
+ std::string toString(bool _short) const override;
+ std::string canonicalName() const override;
+
+ MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
+ TypePointer encodingType() const override
{
if (isSuper())
return TypePointer{};
return std::make_shared<AddressType>(isPayable() ? StateMutability::Payable : StateMutability::NonPayable);
}
- virtual TypePointer interfaceType(bool _inLibrary) const override
+ TypePointer interfaceType(bool _inLibrary) const override
{
if (isSuper())
return TypePointer{};
@@ -816,31 +818,31 @@ private:
class StructType: public ReferenceType
{
public:
- virtual Category category() const override { return Category::Struct; }
+ Category category() const override { return Category::Struct; }
explicit StructType(StructDefinition const& _struct, DataLocation _location = DataLocation::Storage):
ReferenceType(_location), m_struct(_struct) {}
- virtual bool isImplicitlyConvertibleTo(const Type& _convertTo) const override;
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual unsigned calldataEncodedSize(bool _padded) const override;
- virtual bool isDynamicallyEncoded() const override;
+ bool isImplicitlyConvertibleTo(const Type& _convertTo) const override;
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ unsigned calldataEncodedSize(bool _padded) const override;
+ bool isDynamicallyEncoded() const override;
u256 memorySize() const;
- virtual u256 storageSize() const override;
- virtual bool canLiveOutsideStorage() const override { return true; }
- virtual std::string toString(bool _short) const override;
+ u256 storageSize() const override;
+ bool canLiveOutsideStorage() const override { return true; }
+ std::string toString(bool _short) const override;
- virtual MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
- virtual TypePointer encodingType() const override
+ MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
+ TypePointer encodingType() const override
{
return location() == DataLocation::Storage ? std::make_shared<IntegerType>(256) : shared_from_this();
}
- virtual TypePointer interfaceType(bool _inLibrary) const override;
- virtual bool canBeUsedExternally(bool _inLibrary) const override;
+ TypePointer interfaceType(bool _inLibrary) const override;
+ bool canBeUsedExternally(bool _inLibrary) const override;
TypePointer copyForLocation(DataLocation _location, bool _isPointer) const override;
- virtual std::string canonicalName() const override;
- virtual std::string signatureInExternalFunction(bool _structsByName) const override;
+ std::string canonicalName() const override;
+ std::string signatureInExternalFunction(bool _structsByName) const override;
/// @returns a function that performs the type conversion between a list of struct members
/// and a memory struct of this type.
@@ -872,27 +874,27 @@ private:
class EnumType: public Type
{
public:
- virtual Category category() const override { return Category::Enum; }
+ Category category() const override { return Category::Enum; }
explicit EnumType(EnumDefinition const& _enum): m_enum(_enum) {}
- virtual TypePointer unaryOperatorResult(Token _operator) const override;
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual unsigned calldataEncodedSize(bool _padded) const override
+ TypePointer unaryOperatorResult(Token _operator) const override;
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ unsigned calldataEncodedSize(bool _padded) const override
{
return encodingType()->calldataEncodedSize(_padded);
}
- virtual unsigned storageBytes() const override;
- virtual bool canLiveOutsideStorage() const override { return true; }
- virtual std::string toString(bool _short) const override;
- virtual std::string canonicalName() const override;
- virtual bool isValueType() const override { return true; }
-
- virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual TypePointer encodingType() const override
+ unsigned storageBytes() const override;
+ bool canLiveOutsideStorage() const override { return true; }
+ std::string toString(bool _short) const override;
+ std::string canonicalName() const override;
+ bool isValueType() const override { return true; }
+
+ bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
+ TypePointer encodingType() const override
{
return std::make_shared<IntegerType>(8 * int(storageBytes()));
}
- virtual TypePointer interfaceType(bool _inLibrary) const override
+ TypePointer interfaceType(bool _inLibrary) const override
{
return _inLibrary ? shared_from_this() : encodingType();
}
@@ -913,21 +915,21 @@ private:
class TupleType: public Type
{
public:
- virtual Category category() const override { return Category::Tuple; }
+ Category category() const override { return Category::Tuple; }
explicit TupleType(std::vector<TypePointer> const& _types = std::vector<TypePointer>()): m_components(_types) {}
- virtual bool isImplicitlyConvertibleTo(Type const& _other) const override;
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
- virtual std::string toString(bool) const override;
- virtual bool canBeStored() const override { return false; }
- virtual u256 storageSize() const override;
- virtual bool canLiveOutsideStorage() const override { return false; }
- virtual unsigned sizeOnStack() const override;
- virtual bool hasSimpleZeroValueInMemory() const override { return false; }
- virtual TypePointer mobileType() const override;
+ bool isImplicitlyConvertibleTo(Type const& _other) const override;
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
+ std::string toString(bool) const override;
+ bool canBeStored() const override { return false; }
+ u256 storageSize() const override;
+ bool canLiveOutsideStorage() const override { return false; }
+ unsigned sizeOnStack() const override;
+ bool hasSimpleZeroValueInMemory() const override { return false; }
+ TypePointer mobileType() const override;
/// Converts components to their temporary types and performs some wildcard matching.
- virtual TypePointer closestTemporaryType(TypePointer const& _targetType) const override;
+ TypePointer closestTemporaryType(TypePointer const& _targetType) const override;
std::vector<TypePointer> const& components() const { return m_components; }
@@ -987,7 +989,7 @@ public:
GasLeft, ///< gasleft()
};
- virtual Category category() const override { return Category::Function; }
+ Category category() const override { return Category::Function; }
/// Creates the type of a function.
explicit FunctionType(FunctionDefinition const& _function, bool _isInternal = true);
@@ -1061,25 +1063,25 @@ public:
/// @returns the "self" parameter type for a bound function
TypePointer const& selfType() const;
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual TypePointer unaryOperatorResult(Token _operator) const override;
- virtual TypePointer binaryOperatorResult(Token, TypePointer const&) const override;
- virtual std::string canonicalName() const override;
- virtual std::string toString(bool _short) const override;
- virtual unsigned calldataEncodedSize(bool _padded) const override;
- virtual bool canBeStored() const override { return m_kind == Kind::Internal || m_kind == Kind::External; }
- virtual u256 storageSize() const override;
- virtual unsigned storageBytes() const override;
- virtual bool isValueType() const override { return true; }
- virtual bool canLiveOutsideStorage() const override { return m_kind == Kind::Internal || m_kind == Kind::External; }
- virtual unsigned sizeOnStack() const override;
- virtual bool hasSimpleZeroValueInMemory() const override { return false; }
- virtual MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
- virtual TypePointer encodingType() const override;
- virtual TypePointer interfaceType(bool _inLibrary) const override;
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
+ bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
+ TypePointer unaryOperatorResult(Token _operator) const override;
+ TypePointer binaryOperatorResult(Token, TypePointer const&) const override;
+ std::string canonicalName() const override;
+ std::string toString(bool _short) const override;
+ unsigned calldataEncodedSize(bool _padded) const override;
+ bool canBeStored() const override { return m_kind == Kind::Internal || m_kind == Kind::External; }
+ u256 storageSize() const override;
+ unsigned storageBytes() const override;
+ bool isValueType() const override { return true; }
+ bool canLiveOutsideStorage() const override { return m_kind == Kind::Internal || m_kind == Kind::External; }
+ unsigned sizeOnStack() const override;
+ bool hasSimpleZeroValueInMemory() const override { return false; }
+ MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
+ TypePointer encodingType() const override;
+ TypePointer interfaceType(bool _inLibrary) const override;
/// @returns TypePointer of a new FunctionType object. All input/return parameters are an
/// appropriate external types (i.e. the interfaceType()s) of input/return parameters of
@@ -1154,14 +1156,13 @@ public:
/// of the parameters to false.
TypePointer copyAndSetGasOrValue(bool _setGas, bool _setValue) const;
- /// @returns a copy of this function type where all return parameters of dynamic size are
- /// removed and the location of reference types is changed from CallData to Memory.
- /// This is needed if external functions are called on other contracts, as they cannot return
- /// dynamic values.
- /// Returns empty shared pointer on a failure. Namely, if a bound function has no parameters.
+ /// @returns a copy of this function type where the location of reference types is changed
+ /// from CallData to Memory. This is the type that would be used when the function is
+ /// called, as opposed to the parameter types that are available inside the function body.
+ /// Also supports variants to be used for library or bound calls.
/// @param _inLibrary if true, uses DelegateCall as location.
- /// @param _bound if true, the arguments are placed as `arg1.functionName(arg2, ..., argn)`.
- FunctionTypePointer asMemberFunction(bool _inLibrary, bool _bound = false) const;
+ /// @param _bound if true, the function type is set to be bound.
+ FunctionTypePointer asCallableFunction(bool _inLibrary, bool _bound = false) const;
private:
static TypePointers parseElementaryTypeVector(strings const& _types);
@@ -1187,27 +1188,27 @@ private:
class MappingType: public Type
{
public:
- virtual Category category() const override { return Category::Mapping; }
+ Category category() const override { return Category::Mapping; }
MappingType(TypePointer const& _keyType, TypePointer const& _valueType):
m_keyType(_keyType), m_valueType(_valueType) {}
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual std::string toString(bool _short) const override;
- virtual std::string canonicalName() const override;
- virtual bool canLiveOutsideStorage() const override { return false; }
- virtual TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
- virtual TypePointer encodingType() const override
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ std::string toString(bool _short) const override;
+ std::string canonicalName() const override;
+ bool canLiveOutsideStorage() const override { return false; }
+ TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
+ TypePointer encodingType() const override
{
return std::make_shared<IntegerType>(256);
}
- virtual TypePointer interfaceType(bool _inLibrary) const override
+ TypePointer interfaceType(bool _inLibrary) const override
{
return _inLibrary ? shared_from_this() : TypePointer();
}
- virtual bool dataStoredIn(DataLocation _location) const override { return _location == DataLocation::Storage; }
+ bool dataStoredIn(DataLocation _location) const override { return _location == DataLocation::Storage; }
/// Cannot be stored in memory, but just in case.
- virtual bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
+ bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
TypePointer const& keyType() const { return m_keyType; }
TypePointer const& valueType() const { return m_valueType; }
@@ -1225,20 +1226,20 @@ private:
class TypeType: public Type
{
public:
- virtual Category category() const override { return Category::TypeType; }
+ Category category() const override { return Category::TypeType; }
explicit TypeType(TypePointer const& _actualType): m_actualType(_actualType) {}
TypePointer const& actualType() const { return m_actualType; }
- virtual TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual bool canBeStored() const override { return false; }
- virtual u256 storageSize() const override;
- virtual bool canLiveOutsideStorage() const override { return false; }
- virtual unsigned sizeOnStack() const override;
- virtual bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
- virtual std::string toString(bool _short) const override { return "type(" + m_actualType->toString(_short) + ")"; }
- virtual MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
+ TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ bool canBeStored() const override { return false; }
+ u256 storageSize() const override;
+ bool canLiveOutsideStorage() const override { return false; }
+ unsigned sizeOnStack() const override;
+ bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
+ std::string toString(bool _short) const override { return "type(" + m_actualType->toString(_short) + ")"; }
+ MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
private:
TypePointer m_actualType;
@@ -1251,18 +1252,18 @@ private:
class ModifierType: public Type
{
public:
- virtual Category category() const override { return Category::Modifier; }
+ Category category() const override { return Category::Modifier; }
explicit ModifierType(ModifierDefinition const& _modifier);
- virtual TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
- virtual bool canBeStored() const override { return false; }
- virtual u256 storageSize() const override;
- virtual bool canLiveOutsideStorage() const override { return false; }
- virtual unsigned sizeOnStack() const override { return 0; }
- virtual bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual std::string toString(bool _short) const override;
+ TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
+ bool canBeStored() const override { return false; }
+ u256 storageSize() const override;
+ bool canLiveOutsideStorage() const override { return false; }
+ unsigned sizeOnStack() const override { return 0; }
+ bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ std::string toString(bool _short) const override;
private:
TypePointers m_parameterTypes;
@@ -1276,20 +1277,20 @@ private:
class ModuleType: public Type
{
public:
- virtual Category category() const override { return Category::Module; }
+ Category category() const override { return Category::Module; }
explicit ModuleType(SourceUnit const& _source): m_sourceUnit(_source) {}
- virtual TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual bool canBeStored() const override { return false; }
- virtual bool canLiveOutsideStorage() const override { return true; }
- virtual bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
- virtual unsigned sizeOnStack() const override { return 0; }
- virtual MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
+ TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ bool canBeStored() const override { return false; }
+ bool canLiveOutsideStorage() const override { return true; }
+ bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
+ unsigned sizeOnStack() const override { return 0; }
+ MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
- virtual std::string toString(bool _short) const override;
+ std::string toString(bool _short) const override;
private:
SourceUnit const& m_sourceUnit;
@@ -1303,24 +1304,24 @@ class MagicType: public Type
{
public:
enum class Kind { Block, Message, Transaction, ABI };
- virtual Category category() const override { return Category::Magic; }
+ Category category() const override { return Category::Magic; }
explicit MagicType(Kind _kind): m_kind(_kind) {}
- virtual TypePointer binaryOperatorResult(Token, TypePointer const&) const override
+ TypePointer binaryOperatorResult(Token, TypePointer const&) const override
{
return TypePointer();
}
- virtual std::string richIdentifier() const override;
- virtual bool operator==(Type const& _other) const override;
- virtual bool canBeStored() const override { return false; }
- virtual bool canLiveOutsideStorage() const override { return true; }
- virtual bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
- virtual unsigned sizeOnStack() const override { return 0; }
- virtual MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
+ std::string richIdentifier() const override;
+ bool operator==(Type const& _other) const override;
+ bool canBeStored() const override { return false; }
+ bool canLiveOutsideStorage() const override { return true; }
+ bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
+ unsigned sizeOnStack() const override { return 0; }
+ MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
- virtual std::string toString(bool _short) const override;
+ std::string toString(bool _short) const override;
Kind kind() const { return m_kind; }
@@ -1335,20 +1336,20 @@ private:
class InaccessibleDynamicType: public Type
{
public:
- virtual Category category() const override { return Category::InaccessibleDynamic; }
-
- virtual std::string richIdentifier() const override { return "t_inaccessible"; }
- virtual bool isImplicitlyConvertibleTo(Type const&) const override { return false; }
- virtual bool isExplicitlyConvertibleTo(Type const&) const override { return false; }
- virtual TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
- virtual unsigned calldataEncodedSize(bool _padded) const override { (void)_padded; return 32; }
- virtual bool canBeStored() const override { return false; }
- virtual bool canLiveOutsideStorage() const override { return false; }
- virtual bool isValueType() const override { return true; }
- virtual unsigned sizeOnStack() const override { return 1; }
- virtual bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
- virtual std::string toString(bool) const override { return "inaccessible dynamic type"; }
- virtual TypePointer decodingType() const override { return std::make_shared<IntegerType>(256); }
+ Category category() const override { return Category::InaccessibleDynamic; }
+
+ std::string richIdentifier() const override { return "t_inaccessible"; }
+ bool isImplicitlyConvertibleTo(Type const&) const override { return false; }
+ bool isExplicitlyConvertibleTo(Type const&) const override { return false; }
+ TypePointer binaryOperatorResult(Token, TypePointer const&) const override { return TypePointer(); }
+ unsigned calldataEncodedSize(bool _padded) const override { (void)_padded; return 32; }
+ bool canBeStored() const override { return false; }
+ bool canLiveOutsideStorage() const override { return false; }
+ bool isValueType() const override { return true; }
+ unsigned sizeOnStack() const override { return 1; }
+ bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
+ std::string toString(bool) const override { return "inaccessible dynamic type"; }
+ TypePointer decodingType() const override { return std::make_shared<IntegerType>(256); }
};
}