aboutsummaryrefslogtreecommitdiffstats
path: root/AST.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'AST.cpp')
-rw-r--r--AST.cpp39
1 files changed, 6 insertions, 33 deletions
diff --git a/AST.cpp b/AST.cpp
index 9d19b30c..09c03ef6 100644
--- a/AST.cpp
+++ b/AST.cpp
@@ -356,7 +356,12 @@ void VariableDeclaration::checkTypeRequirements()
else
{
// no type declared and no previous assignment, infer the type
- m_value->checkTypeRequirements();
+ Identifier* identifier = dynamic_cast<Identifier*>(m_value.get());
+ if (identifier)
+ identifier->checkTypeRequirementsFromVariableDeclaration();
+ else
+ m_value->checkTypeRequirements();
+
TypePointer type = m_value->getType();
if (type->getCategory() == Type::Category::IntegerConstant)
{
@@ -484,39 +489,7 @@ void Return::checkTypeRequirements()
void VariableDeclarationStatement::checkTypeRequirements()
{
-<<<<<<< HEAD
m_variable->checkTypeRequirements();
-=======
- // Variables can be declared without type (with "var"), in which case the first assignment
- // sets the type.
- // Note that assignments before the first declaration are legal because of the special scoping
- // rules inherited from JavaScript.
- if (m_variable->getValue())
- {
- if (m_variable->getType())
- m_variable->getValue()->expectType(*m_variable->getType());
- else
- {
- // no type declared and no previous assignment, infer the type
- Identifier* identifier = dynamic_cast<Identifier*>(m_variable->getValue().get());
- if (identifier)
- identifier->checkTypeRequirementsFromVariableDeclaration();
- else
- m_variable->getValue()->checkTypeRequirements();
- TypePointer type = m_variable->getValue()->getType();
- if (type->getCategory() == Type::Category::IntegerConstant)
- {
- auto intType = dynamic_pointer_cast<IntegerConstantType const>(type)->getIntegerType();
- if (!intType)
- BOOST_THROW_EXCEPTION(m_variable->getValue()->createTypeError("Invalid integer constant " + type->toString()));
- type = intType;
- }
- else if (type->getCategory() == Type::Category::Void)
- BOOST_THROW_EXCEPTION(m_variable->createTypeError("var cannot be void type"));
- m_variable->setType(type);
- }
- }
->>>>>>> implement overload resolution
}
void Assignment::checkTypeRequirements()