diff --git a/flang/lib/Semantics/unparse-with-symbols.cpp b/flang/lib/Semantics/unparse-with-symbols.cpp index b199481131065..ec5b3ffadf30e 100644 --- a/flang/lib/Semantics/unparse-with-symbols.cpp +++ b/flang/lib/Semantics/unparse-with-symbols.cpp @@ -37,6 +37,8 @@ class SymbolDumpVisitor { template void Post(const parser::Statement &) { currStmt_ = std::nullopt; } + void Post(const parser::Name &name); + bool Pre(const parser::AccClause &clause) { currStmt_ = clause.source; return true; @@ -57,7 +59,6 @@ class SymbolDumpVisitor { return true; } void Post(const parser::OpenMPThreadprivate &) { currStmt_ = std::nullopt; } - void Post(const parser::Name &name); bool Pre(const parser::OpenMPDeclareMapperConstruct &x) { currStmt_ = x.source; @@ -67,6 +68,14 @@ class SymbolDumpVisitor { currStmt_ = std::nullopt; } + bool Pre(const parser::OpenMPDeclareReductionConstruct &x) { + currStmt_ = x.source; + return true; + } + void Post(const parser::OpenMPDeclareReductionConstruct &) { + currStmt_ = std::nullopt; + } + bool Pre(const parser::OpenMPDeclareTargetConstruct &x) { currStmt_ = x.source; return true; @@ -120,6 +129,7 @@ void SymbolDumpVisitor::Indent(llvm::raw_ostream &out, int indent) const { void SymbolDumpVisitor::Post(const parser::Name &name) { if (const auto *symbol{name.symbol}) { if (!symbol->has()) { + CHECK(currStmt_.has_value()); symbols_.emplace(currStmt_.value().begin(), symbol); } } diff --git a/flang/test/Parser/OpenMP/declare-reduction-unparse-with-symbols.f90 b/flang/test/Parser/OpenMP/declare-reduction-unparse-with-symbols.f90 new file mode 100644 index 0000000000000..fbcd5b62821a3 --- /dev/null +++ b/flang/test/Parser/OpenMP/declare-reduction-unparse-with-symbols.f90 @@ -0,0 +1,13 @@ +!RUN: %flang_fc1 -fdebug-unparse-with-symbols -fopenmp %s | FileCheck %s + +! This used to crash. + +subroutine f00 + !$omp declare reduction(fred : integer, real : omp_out = omp_in + omp_out) +end + +!CHECK: !DEF: /f00 (Subroutine) Subprogram +!CHECK: subroutine f00 +!CHECK: !$omp declare reduction (fred:integer,real:omp_out = omp_in+omp_out) +!CHECK: end subroutine +