diff --git a/flang/lib/semantics/semantics.cc b/flang/lib/semantics/semantics.cc index d51823eae907..c48abefde045 100644 --- a/flang/lib/semantics/semantics.cc +++ b/flang/lib/semantics/semantics.cc @@ -48,10 +48,12 @@ template struct SemanticsVisitor : public virtual C... { return true; } template void Post(const N &node) { Leave(node); } + void Walk(const parser::Program &program) { parser::Walk(program, *this); } }; -using StatementSemantics = - SemanticsVisitor; +using StatementSemanticsPass1 = SemanticsVisitor; +using StatementSemanticsPass2 = + SemanticsVisitor; SemanticsContext::SemanticsContext( const common::IntrinsicTypeDefaultKinds &defaultKinds) @@ -102,8 +104,11 @@ bool Semantics::Perform() { if (AnyFatalError()) { return false; } - StatementSemantics visitor{context_}; - parser::Walk(program_, visitor); + StatementSemanticsPass1{context_}.Walk(program_); + if (AnyFatalError()) { + return false; + } + StatementSemanticsPass2{context_}.Walk(program_); if (AnyFatalError()) { return false; } diff --git a/flang/lib/semantics/semantics.h b/flang/lib/semantics/semantics.h index bf8df0131021..73c16a194ce3 100644 --- a/flang/lib/semantics/semantics.h +++ b/flang/lib/semantics/semantics.h @@ -122,8 +122,8 @@ private: // Base class for semantics checkers. struct BaseChecker { - template void Enter(const C &x) {} - template void Leave(const C &x) {} + template void Enter(const N &) {} + template void Leave(const N &) {} }; }