[PATCH] D111308: [flang][driver] Add actions that execute despite semantic errors

Andrzej Warzynski via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 7 05:23:34 PDT 2021


awarzynski created this revision.
Herald added a reviewer: sscalpone.
Herald added a project: Flang.
awarzynski requested review of this revision.
Herald added subscribers: llvm-commits, jdoerfert.
Herald added a project: LLVM.

This patch adds a new abstract class for frontend actions: `PrescanAndSemaDebugAction`. It's almost identical to `PrescanAndSemaAction`, but in the presence of semantic errors it does not skip the corresponding `ExecuteAction` specialisation. Instead, it runs it as if there were no semantic errors. This class is for developer actions only (i.e.
front-end driver options).

The new behaviour does not affect the return code from `flang-new -fc1` when the input file is semantically incorrect. The return code is inferred from the number of driver diagnostics generated in `CompilerInstance::ExecuteAction` and this patch does not change that. More specifically, the semantic errors are still reported and hence the driver is able 
to correctly report that the compilation has failed (with a non-zero return code).

This new base class is meant for debug actions only and `DebugDumpAllAction` is updated to demonstrate the new behaviour. With this change, `flang-new -fc1 -fdebug-dump-all` dumps the parse tree and symbols for all input files, regardless of whether any semantic errors were found.

This patch addresses https://bugs.llvm.org/show_bug.cgi?id=52097.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D111308

Files:
  flang/include/flang/Frontend/FrontendActions.h
  flang/lib/Frontend/FrontendActions.cpp
  flang/test/Driver/dump-all-bad.f90


Index: flang/test/Driver/dump-all-bad.f90
===================================================================
--- /dev/null
+++ flang/test/Driver/dump-all-bad.f90
@@ -0,0 +1,21 @@
+! Verify that -fdebug-dump-all dumps both symbols and the parse tree, even when semantic errors are present
+
+!----------
+! RUN lines
+!----------
+! RUN: not %flang_fc1 -fdebug-dump-all %s 2>&1 | FileCheck %s
+
+!----------------
+! EXPECTED OUTPUT
+!----------------
+! CHECK: error: Semantic errors in
+! CHECK: Flang: parse tree dump
+! CHECK: Flang: symbols dump
+
+!-------
+! INPUT
+!-------
+program bad
+  real,pointer :: x
+  x = null()      ! Error - must be pointer assignment
+end
Index: flang/lib/Frontend/FrontendActions.cpp
===================================================================
--- flang/lib/Frontend/FrontendActions.cpp
+++ flang/lib/Frontend/FrontendActions.cpp
@@ -40,6 +40,11 @@
   return RunPrescan() & RunParse() && RunSemanticChecks();
 }
 
+bool PrescanAndSemaDebugAction::BeginSourceFileAction() {
+  // Semantic checks are made to succeed unconditionally.
+  return RunPrescan() & RunParse() && (RunSemanticChecks() || true);
+}
+
 //===----------------------------------------------------------------------===//
 // Custom ExecuteAction
 //===----------------------------------------------------------------------===//
Index: flang/include/flang/Frontend/FrontendActions.h
===================================================================
--- flang/include/flang/Frontend/FrontendActions.h
+++ flang/include/flang/Frontend/FrontendActions.h
@@ -84,6 +84,9 @@
 
 //===----------------------------------------------------------------------===//
 // PrescanAndSema Actions
+//
+// These actions will parse the input, run the semantic checks and execute
+// their actions provided that no parsing or semantic errors were found.
 //===----------------------------------------------------------------------===//
 class PrescanAndSemaAction : public FrontendAction {
 
@@ -107,10 +110,6 @@
   void ExecuteAction() override;
 };
 
-class DebugDumpAllAction : public PrescanAndSemaAction {
-  void ExecuteAction() override;
-};
-
 class DebugPreFIRTreeAction : public PrescanAndSemaAction {
   void ExecuteAction() override;
 };
@@ -131,6 +130,22 @@
   void ExecuteAction() override = 0;
 };
 
+//===----------------------------------------------------------------------===//
+// PrescanAndSemaDebug Actions
+//
+// These actions will parse the input, run the semantic checks and execute
+// their actions regardless of whether any semantic errors are found.
+//===----------------------------------------------------------------------===//
+class PrescanAndSemaDebugAction : public FrontendAction {
+
+  void ExecuteAction() override = 0;
+  bool BeginSourceFileAction() override;
+};
+
+class DebugDumpAllAction : public PrescanAndSemaDebugAction {
+  void ExecuteAction() override;
+};
+
 } // namespace Fortran::frontend
 
 #endif // LLVM_FLANG_FRONTEND_FRONTENDACTIONS_H


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111308.377811.patch
Type: text/x-patch
Size: 2993 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211007/f37966b6/attachment.bin>


More information about the llvm-commits mailing list