aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Parser/Parser.cc8
-rw-r--r--lib/Parser/ParserExpression.cc14
2 files changed, 11 insertions, 11 deletions
diff --git a/lib/Parser/Parser.cc b/lib/Parser/Parser.cc
index 37fe8ec..d17856b 100644
--- a/lib/Parser/Parser.cc
+++ b/lib/Parser/Parser.cc
@@ -271,13 +271,7 @@ std::unique_ptr<StmtAST> Parser::ParseInputStmt() {
getNextToken();
std::vector<DesignatorAccess> Accesses;
if (!ParseDesignatorSuffix(Accesses)) return nullptr;
- std::unique_ptr<ExprAST> Target;
- if (Accesses.empty())
- Target = std::make_unique<VariableExprAST>(Name);
- else if (Accesses.size() == 1 && Accesses[0].Kind == AccessKind::Index)
- Target = std::make_unique<ArrayAccessExprAST>(Name, std::move(Accesses[0].Indices), Line);
- else
- Target = std::make_unique<DesignatorExprAST>(Name, std::move(Accesses), Line);
+ auto Target = makeDesignator(Name, std::move(Accesses), Line);
Target->setLine(Line);
return std::make_unique<InputStmtAST>(std::move(Target));
}
diff --git a/lib/Parser/ParserExpression.cc b/lib/Parser/ParserExpression.cc
index 6ed3f1c..398ba84 100644
--- a/lib/Parser/ParserExpression.cc
+++ b/lib/Parser/ParserExpression.cc
@@ -112,12 +112,18 @@ std::unique_ptr<ExprAST> Parser::ParseIdentifierExpr() {
if (CurTok == '(' && !atCaseBoundary())
return ParseMemberCall(IdName, std::move(Accesses), Line);
- // Degrade rule: shapes that existed before designators keep their nodes.
+ return makeDesignator(IdName, std::move(Accesses), Line);
+}
+
+// Degrade rule: shapes that existed before designators keep their nodes.
+// A bare VariableExprAST carries no line; callers set it when they need one.
+std::unique_ptr<ExprAST> Parser::makeDesignator(
+ const std::string &Name, std::vector<DesignatorAccess> Accesses, int Line) {
if (Accesses.empty())
- return std::make_unique<VariableExprAST>(IdName);
+ return std::make_unique<VariableExprAST>(Name);
if (Accesses.size() == 1 && Accesses[0].Kind == AccessKind::Index)
- return std::make_unique<ArrayAccessExprAST>(IdName, std::move(Accesses[0].Indices), Line);
- return std::make_unique<DesignatorExprAST>(IdName, std::move(Accesses), Line);
+ return std::make_unique<ArrayAccessExprAST>(Name, std::move(Accesses[0].Indices), Line);
+ return std::make_unique<DesignatorExprAST>(Name, std::move(Accesses), Line);
}
// The final field suffix names the method; preceding suffixes form its receiver.