forked from OSchip/llvm-project
[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:
parent
3256aa8fe6
commit
6f8ef1d6e8
|
@ -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
|
||||
|
|
|
@ -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
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue