[flang][driver] Add actions that execute despite semantic errors

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.

Differential Revision: https://reviews.llvm.org/D111308
This commit is contained in:
Andrzej Warzynski 2021-10-07 11:33:07 +00:00
parent 3256aa8fe6
commit 6f8ef1d6e8
3 changed files with 45 additions and 4 deletions

View File

@ -84,6 +84,9 @@ class DebugDumpParseTreeNoSemaAction : public PrescanAndParseAction {
//===----------------------------------------------------------------------===//
// 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 @@ class DebugDumpParseTreeAction : public PrescanAndSemaAction {
void ExecuteAction() override;
};
class DebugDumpAllAction : public PrescanAndSemaAction {
void ExecuteAction() override;
};
class DebugPreFIRTreeAction : public PrescanAndSemaAction {
void ExecuteAction() override;
};
@ -131,6 +130,22 @@ class PluginParseTreeAction : public PrescanAndSemaAction {
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

View File

@ -40,6 +40,11 @@ bool PrescanAndSemaAction::BeginSourceFileAction() {
return RunPrescan() && RunParse() && RunSemanticChecks();
}
bool PrescanAndSemaDebugAction::BeginSourceFileAction() {
// Semantic checks are made to succeed unconditionally.
return RunPrescan() && RunParse() && (RunSemanticChecks() || true);
}
//===----------------------------------------------------------------------===//
// Custom ExecuteAction
//===----------------------------------------------------------------------===//

View File

@ -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