aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis
diff options
context:
space:
mode:
authorVoR0220 <catalanor0220@gmail.com>2016-04-13 01:36:34 +0800
committerVoR0220 <catalanor0220@gmail.com>2016-05-10 00:41:03 +0800
commitbfc238c8d11e118443d373d819deeada9fe1ea3b (patch)
tree54076cd985d031a5a813946a678a4e6696af2117 /libsolidity/analysis
parent5bddb2d6ffdd8a2c02a61cc304f2743f55dcb5f9 (diff)
downloaddexon-solidity-bfc238c8d11e118443d373d819deeada9fe1ea3b.tar.gz
dexon-solidity-bfc238c8d11e118443d373d819deeada9fe1ea3b.tar.zst
dexon-solidity-bfc238c8d11e118443d373d819deeada9fe1ea3b.zip
updated algorithm for bit finding...now to figure out literal value
tiny fixups changed location of the check got rid of extra space and fixed a couple of things added binary results bits change back literal value
Diffstat (limited to 'libsolidity/analysis')
-rw-r--r--libsolidity/analysis/ReferencesResolver.cpp6
-rw-r--r--libsolidity/analysis/TypeChecker.cpp21
2 files changed, 14 insertions, 13 deletions
diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp
index f4e0f838..9f83971b 100644
--- a/libsolidity/analysis/ReferencesResolver.cpp
+++ b/libsolidity/analysis/ReferencesResolver.cpp
@@ -104,10 +104,8 @@ void ReferencesResolver::endVisit(ArrayTypeName const& _typeName)
if (!length->annotation().type)
ConstantEvaluator e(*length);
auto const* lengthType = dynamic_cast<RationalNumberType const*>(length->annotation().type.get());
- if (!lengthType)
- fatalTypeError(length->location(), "Invalid array length.");
- else if (lengthType->denominator() != 1)
- fatalTypeError(length->location(), "Invalid input for array length, expected integer.");
+ if (!lengthType || lengthType->denominator() != 1)
+ fatalTypeError(length->location(), "Invalid array length, expected integer literal.");
else
_typeName.annotation().type = make_shared<ArrayType>(DataLocation::Storage, baseType, lengthType->literalValue(nullptr));
}
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index fb0c665c..1b37d42e 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -774,9 +774,10 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement)
solAssert(!var.typeName(), "");
if (
valueComponentType->category() == Type::Category::RationalNumber &&
- !dynamic_pointer_cast<RationalNumberType const>(valueComponentType)->integerType()
+ !dynamic_pointer_cast<RationalNumberType const>(valueComponentType)->integerType() &&
+ !dynamic_pointer_cast<RationalNumberType const>(valueComponentType)->fixedPointType()
)
- fatalTypeError(_statement.initialValue()->location(), "Invalid integer constant " + valueComponentType->toString() + ".");
+ fatalTypeError(_statement.initialValue()->location(), "Invalid rational " + valueComponentType->toString() + ".");
var.annotation().type = valueComponentType->mobileType();
var.accept(*this);
}
@@ -800,8 +801,11 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement)
void TypeChecker::endVisit(ExpressionStatement const& _statement)
{
if (type(_statement.expression())->category() == Type::Category::RationalNumber)
- if (!dynamic_pointer_cast<RationalNumberType const>(type(_statement.expression()))->integerType())
- typeError(_statement.expression().location(), "Invalid integer constant.");
+ if (
+ !dynamic_pointer_cast<RationalNumberType const>(type(_statement.expression()))->integerType() &&
+ !dynamic_pointer_cast<RationalNumberType const>(type(_statement.expression()))->fixedPointType()
+ )
+ typeError(_statement.expression().location(), "Invalid rational number.");
}
bool TypeChecker::visit(Conditional const& _conditional)
@@ -1107,8 +1111,8 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
if (functionType->takesArbitraryParameters())
{
if (auto t = dynamic_cast<RationalNumberType const*>(argType.get()))
- if (!t->integerType())
- typeError(arguments[i]->location(), "Integer constant too large.");
+ if (!t->integerType() && !t->fixedPointType())
+ typeError(arguments[i]->location(), "Rational number too large.");
}
else if (!type(*arguments[i])->isImplicitlyConvertibleTo(*parameterTypes[i]))
typeError(
@@ -1343,8 +1347,7 @@ bool TypeChecker::visit(IndexAccess const& _access)
expectType(*index, IntegerType(256));
if (auto numberType = dynamic_cast<RationalNumberType const*>(type(*index).get()))
{
- if (numberType->denominator() != 1)
- typeError(_access.location(), "Invalid type for array access.");
+ solAssert(!numberType->denominator() != 1 ,"Invalid type for array access.");
if (!actualType.isDynamicallySized() && actualType.length() <= numberType->literalValue(nullptr))
typeError(_access.location(), "Out of bounds array access.");
}
@@ -1371,7 +1374,7 @@ bool TypeChecker::visit(IndexAccess const& _access)
resultType = make_shared<TypeType>(make_shared<ArrayType>(DataLocation::Memory, typeType.actualType()));
else
{
- index->accept(*this);
+ expectType(*index, IntegerType(256));
if (auto length = dynamic_cast<RationalNumberType const*>(type(*index).get()))
resultType = make_shared<TypeType>(make_shared<ArrayType>(
DataLocation::Memory,