mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix forward references to user defined value types.
This commit is contained in:
parent
863a0d3b9c
commit
772a885333
@ -10,6 +10,7 @@ Compiler Features:
|
|||||||
* SMTChecker: Output values for ``block.*``, ``msg.*`` and ``tx.*`` variables that are present in the called functions.
|
* SMTChecker: Output values for ``block.*``, ``msg.*`` and ``tx.*`` variables that are present in the called functions.
|
||||||
* Standard JSON: Accept nested brackets in step sequences passed to ``settings.optimizer.details.yulDetails.optimizerSteps``.
|
* Standard JSON: Accept nested brackets in step sequences passed to ``settings.optimizer.details.yulDetails.optimizerSteps``.
|
||||||
* Standard JSON: Add ``settings.debug.debugInfo`` option for selecting how much extra debug information should be included in the produced EVM assembly and Yul code.
|
* Standard JSON: Add ``settings.debug.debugInfo`` option for selecting how much extra debug information should be included in the produced EVM assembly and Yul code.
|
||||||
|
* Type Checker: Fix internal error about forward-references of user defined value types.
|
||||||
|
|
||||||
|
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
|
@ -150,18 +150,6 @@ void DeclarationTypeChecker::endVisit(UserDefinedValueTypeDefinition const& _use
|
|||||||
typeName->location(),
|
typeName->location(),
|
||||||
"The underlying type for a user defined value type has to be an elementary value type."
|
"The underlying type for a user defined value type has to be an elementary value type."
|
||||||
);
|
);
|
||||||
|
|
||||||
Type const* type = typeName->annotation().type;
|
|
||||||
solAssert(type, "");
|
|
||||||
solAssert(!dynamic_cast<UserDefinedValueType const*>(type), "");
|
|
||||||
if (!type->isValueType())
|
|
||||||
m_errorReporter.typeError(
|
|
||||||
8129_error,
|
|
||||||
_userDefined.location(),
|
|
||||||
"The underlying type of the user defined value type \"" +
|
|
||||||
_userDefined.name() +
|
|
||||||
"\" is not a value type."
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeclarationTypeChecker::endVisit(UserDefinedTypeName const& _typeName)
|
void DeclarationTypeChecker::endVisit(UserDefinedTypeName const& _typeName)
|
||||||
|
@ -338,6 +338,22 @@ void TypeChecker::endVisit(ModifierDefinition const& _modifier)
|
|||||||
m_errorReporter.typeError(8063_error, _modifier.location(), "Modifiers without implementation must be marked virtual.");
|
m_errorReporter.typeError(8063_error, _modifier.location(), "Modifiers without implementation must be marked virtual.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TypeChecker::endVisit(UserDefinedValueTypeDefinition const& _userDefined)
|
||||||
|
{
|
||||||
|
solAssert(_userDefined.underlyingType());
|
||||||
|
Type const* underlyingType = _userDefined.underlyingType()->annotation().type;
|
||||||
|
solAssert(underlyingType, "");
|
||||||
|
solAssert(!dynamic_cast<UserDefinedValueType const*>(underlyingType), "");
|
||||||
|
if (!underlyingType->isValueType())
|
||||||
|
m_errorReporter.typeError(
|
||||||
|
8129_error,
|
||||||
|
_userDefined.location(),
|
||||||
|
"The underlying type of the user defined value type \"" +
|
||||||
|
_userDefined.name() +
|
||||||
|
"\" is not a value type."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
bool TypeChecker::visit(FunctionDefinition const& _function)
|
bool TypeChecker::visit(FunctionDefinition const& _function)
|
||||||
{
|
{
|
||||||
if (_function.markedVirtual())
|
if (_function.markedVirtual())
|
||||||
|
@ -118,6 +118,7 @@ private:
|
|||||||
|
|
||||||
void endVisit(InheritanceSpecifier const& _inheritance) override;
|
void endVisit(InheritanceSpecifier const& _inheritance) override;
|
||||||
void endVisit(ModifierDefinition const& _modifier) override;
|
void endVisit(ModifierDefinition const& _modifier) override;
|
||||||
|
void endVisit(UserDefinedValueTypeDefinition const& _userDefined) override;
|
||||||
bool visit(FunctionDefinition const& _function) override;
|
bool visit(FunctionDefinition const& _function) override;
|
||||||
bool visit(VariableDeclaration const& _variable) override;
|
bool visit(VariableDeclaration const& _variable) override;
|
||||||
/// We need to do this manually because we want to pass the bases of the current contract in
|
/// We need to do this manually because we want to pass the bases of the current contract in
|
||||||
|
Loading…
Reference in New Issue
Block a user