Esempio n. 1
0
bool ASTPrinter::visit(MemberAccess const& _node)
{
	writeLine("MemberAccess to member " + _node.getMemberName());
	printType(_node);
	printSourcePart(_node);
	return goDeeper();
}
bool Why3Translator::visit(MemberAccess const& _node)
{
	if (
		_node.expression().annotation().type->category() == Type::Category::Array &&
		_node.memberName() == "length" &&
		!_node.annotation().lValueRequested
	)
	{
		add("(of_int ");
		_node.expression().accept(*this);
		add(".length");
		add(")");
	}
	else if (
		_node.memberName() == "call" &&
		*_node.expression().annotation().type == IntegerType(160, IntegerType::Modifier::Address)
	)
	{
		// Do nothing, do not even visit the address because this will be an external call
		//@TODO ensure that the expression itself does not have side-effects
		return false;
	}
	else
		error(_node, "Member access: Only call and array length supported.");
	return false;
}