[flang] Ensure no failed expression analyses without fatal errors.
authorpeter klausler <pklausler@nvidia.com>
Fri, 12 Apr 2019 18:43:03 +0000 (11:43 -0700)
committerpeter klausler <pklausler@nvidia.com>
Mon, 15 Apr 2019 16:41:49 +0000 (09:41 -0700)
Original-commit: flang-compiler/f18@3ef8b430311653cafb8f830c08ac08d5926bb11b
Reviewed-on: https://github.com/flang-compiler/f18/pull/406
Tree-same-pre-rewrite: false

flang/lib/semantics/expression.cc
flang/lib/semantics/expression.h

index 144ea94..2f2db73 100644 (file)
@@ -1832,6 +1832,9 @@ MaybeExpr ExpressionAnalyzer::Analyze(const parser::Expr &expr) {
     }
     if (result.has_value()) {
       expr.typedExpr.reset(new GenericExprWrapper{common::Clone(*result)});
+    } else if (!fatalErrors_) {
+      CHECK(context_.AnyFatalError());  // somewhat expensive
+      fatalErrors_ = true;
     }
     return result;
   }
@@ -1968,6 +1971,7 @@ evaluate::Expr<evaluate::SubscriptInteger> AnalyzeKindSelector(
   auto save{analyzer.GetContextualMessages().SetLocation(*context.location())};
   return analyzer.AnalyzeKindSelector(category, selector);
 }
+
 bool ExprChecker::Walk(const parser::Program &program) {
   parser::Walk(program, *this);
   return !context_.AnyFatalError();
index 7346292..fbeb2d9 100644 (file)
@@ -249,6 +249,7 @@ private:
 
   semantics::SemanticsContext &context_;
   std::map<parser::CharBlock, int> acImpliedDos_;  // values are INTEGER kinds
+  bool fatalErrors_{false};
 };
 
 template<typename L, typename R>
@@ -303,6 +304,7 @@ public:
     AnalyzeExpr(context_, x);
     return false;
   }
+
   template<typename A> bool Pre(const parser::Scalar<A> &x) {
     AnalyzeExpr(context_, x);
     return false;