mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
- added more tests to check constant specifier implementation
- deny use of const for local variables - deny unitialized const variables - only int, fixed strings, and enums can be declaired as const
This commit is contained in:
parent
7d6357ae53
commit
ebb4d5e298
7
AST.cpp
7
AST.cpp
@ -332,6 +332,13 @@ void VariableDeclaration::checkTypeRequirements()
|
||||
// sets the type.
|
||||
// Note that assignments before the first declaration are legal because of the special scoping
|
||||
// rules inherited from JavaScript.
|
||||
if (m_isConstant)
|
||||
{
|
||||
if (!dynamic_cast<ContractDefinition const*>(getScope()))
|
||||
BOOST_THROW_EXCEPTION(createTypeError("Illegal use of \"constant\" specifier."));
|
||||
if ((m_type && !m_type->isValueType()) || !m_value)
|
||||
BOOST_THROW_EXCEPTION(createTypeError("Unitialized \"constant\" variable."));
|
||||
}
|
||||
if (!m_value)
|
||||
return;
|
||||
if (m_type)
|
||||
|
1
AST.h
1
AST.h
@ -472,7 +472,6 @@ public:
|
||||
virtual bool isLValue() const override;
|
||||
virtual bool isPartOfExternalInterface() const override { return isPublic() && !m_isConstant; }
|
||||
|
||||
|
||||
void checkTypeRequirements();
|
||||
bool isLocalVariable() const { return !!dynamic_cast<FunctionDefinition const*>(getScope()); }
|
||||
bool isExternalFunctionParameter() const;
|
||||
|
@ -330,8 +330,11 @@ ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration(
|
||||
}
|
||||
if (token == Token::Const)
|
||||
{
|
||||
m_scanner->next();
|
||||
solAssert(_options.isStateVariable, "");
|
||||
if (m_scanner->peekNextToken() != Token::Identifier && !Token::isElementaryTypeName(m_scanner->peekNextToken()))
|
||||
BOOST_THROW_EXCEPTION(createParserError("Invalid use of \"constant\" specifier"));
|
||||
isDeclaredConst = true;
|
||||
m_scanner->next();
|
||||
}
|
||||
nodeFactory.markEndPosition();
|
||||
|
||||
@ -920,6 +923,7 @@ Parser::LookAheadInfo Parser::peekStatementType() const
|
||||
// In all other cases, we have an expression statement.
|
||||
Token::Value token(m_scanner->getCurrentToken());
|
||||
bool mightBeTypeName = (Token::isElementaryTypeName(token) || token == Token::Identifier);
|
||||
|
||||
if (token == Token::Mapping || token == Token::Var ||
|
||||
(mightBeTypeName && m_scanner->peekNextToken() == Token::Identifier))
|
||||
return LookAheadInfo::VariableDeclarationStatement;
|
||||
|
Loading…
Reference in New Issue
Block a user