From: Tim Keith Date: Fri, 15 Nov 2019 03:22:24 +0000 (-0800) Subject: [flang] Fix bad deference in ProgramTree X-Git-Tag: llvmorg-12-init~9537^2~374 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=158f9e09fc9123bb2fd3f339f8d614668c2e2566;p=platform%2Fupstream%2Fllvm.git [flang] Fix bad deference in ProgramTree We weren't handling MainProgram with no ProgramStmt correctly in ProgramTree. When building it we were dereferencing an empty optional. And in ResolveSpecificationParts we were dereferencing a null pointer. Original-commit: flang-compiler/f18@1bda90d0051d7b67bf76f9aaa1f2963976a15d4a Reviewed-on: https://github.com/flang-compiler/f18/pull/827 --- diff --git a/flang/lib/semantics/program-tree.cc b/flang/lib/semantics/program-tree.cc index 9a55f5f..e31f282 100644 --- a/flang/lib/semantics/program-tree.cc +++ b/flang/lib/semantics/program-tree.cc @@ -62,8 +62,9 @@ ProgramTree ProgramTree::Build(const parser::MainProgram &x) { std::get>>(x.t)}; const auto &end{std::get>(x.t)}; static parser::Name emptyName; - const auto &name{stmt ? stmt->statement.v : emptyName}; - return BuildSubprogramTree(name, x).set_stmt(*stmt).set_endStmt(end); + auto result{stmt ? BuildSubprogramTree(stmt->statement.v, x).set_stmt(*stmt) + : BuildSubprogramTree(emptyName, x)}; + return result.set_endStmt(end); } ProgramTree ProgramTree::Build(const parser::FunctionSubprogram &x) { diff --git a/flang/lib/semantics/resolve-names.cc b/flang/lib/semantics/resolve-names.cc index 8d3e9c9..6685ff0 100644 --- a/flang/lib/semantics/resolve-names.cc +++ b/flang/lib/semantics/resolve-names.cc @@ -5921,7 +5921,13 @@ void ResolveNamesVisitor::ResolveSpecificationParts(ProgramTree &node) { Scope &scope{currScope()}; node.set_scope(scope); AddSubpNames(node); - std::visit([&](const auto *x) { Walk(*x); }, node.stmt()); + std::visit( + [&](const auto *x) { + if (x) { + Walk(*x); + } + }, + node.stmt()); Walk(node.spec()); // If this is a function, convert result to an object. This is to prevent the // result to be converted later to a function symbol if it is called inside