[flang-commits] [flang] [flang] Fix two bugs with new warnings (PR #174153)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Thu Jan 1 10:15:14 PST 2026
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/174153
The new Severity::ErrorUnlessDeadCode message severity isn't always considered to be fatal. Consolidate the "is this severity fatal?" logic into one place.
Some instances in semantics that note variable definitions were conditional on the symbol being a function result, since only the "function result was never defined" warning needed to know about them. Make them note all defined symbols.
>From bd8c06a8e2bc131f6240416442958388cbe0ec95 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Thu, 1 Jan 2026 10:11:35 -0800
Subject: [PATCH] [flang] Fix two bugs with new warnings
The new Severity::ErrorUnlessDeadCode message severity isn't always
considered to be fatal. Consolidate the "is this severity fatal?"
logic into one place.
Some instances in semantics that note variable definitions were
conditional on the symbol being a function result, since only
the "function result was never defined" warning needed to know
about them. Make them note all defined symbols.
---
flang/include/flang/Parser/message.h | 19 +++++++++++--------
flang/lib/Evaluate/check-expression.cpp | 2 +-
flang/lib/Parser/message.cpp | 17 +++++------------
flang/lib/Semantics/check-call.cpp | 10 ++--------
flang/lib/Semantics/resolve-names.cpp | 2 +-
flang/test/Semantics/bug171844.f90 | 4 ++--
6 files changed, 22 insertions(+), 32 deletions(-)
diff --git a/flang/include/flang/Parser/message.h b/flang/include/flang/Parser/message.h
index c50320513567d..45cc3f3d86ba7 100644
--- a/flang/include/flang/Parser/message.h
+++ b/flang/include/flang/Parser/message.h
@@ -44,6 +44,15 @@ enum class Severity {
None // everything else, common for attachments with source locations
};
+inline constexpr bool IsFatalSeverity(Severity severity) {
+ return severity == Severity::Error ||
+ severity == Severity::ErrorUnlessDeadCode || severity == Severity::Todo;
+}
+
+inline constexpr bool IsWarningSeverity(Severity severity) {
+ return severity == Severity::Warning || severity == Severity::Portability;
+}
+
class MessageFixedText {
public:
constexpr MessageFixedText() {}
@@ -62,11 +71,7 @@ class MessageFixedText {
severity_ = severity;
return *this;
}
- bool IsFatal() const {
- return severity_ == Severity::Error ||
- severity_ == Severity::ErrorUnlessDeadCode ||
- severity_ == Severity::Todo;
- }
+ bool IsFatal() const { return IsFatalSeverity(severity_); }
static const MessageFixedText endOfFileMessage; // "end of file"_err_en_US
@@ -122,9 +127,7 @@ class MessageFormattedText {
MessageFormattedText &operator=(const MessageFormattedText &) = default;
MessageFormattedText &operator=(MessageFormattedText &&) = default;
const std::string &string() const { return string_; }
- bool IsFatal() const {
- return severity_ == Severity::Error || severity_ == Severity::Todo;
- }
+ bool IsFatal() const { return IsFatalSeverity(severity_); }
Severity severity() const { return severity_; }
MessageFormattedText &set_severity(Severity severity) {
severity_ = severity;
diff --git a/flang/lib/Evaluate/check-expression.cpp b/flang/lib/Evaluate/check-expression.cpp
index e07076e42ec88..f7636ecacfb78 100644
--- a/flang/lib/Evaluate/check-expression.cpp
+++ b/flang/lib/Evaluate/check-expression.cpp
@@ -1376,7 +1376,7 @@ class StmtFunctionChecker
Result Return(parser::Message &&msg) const {
if (severity_) {
msg.set_severity(*severity_);
- if (*severity_ != parser::Severity::Error) {
+ if (parser::IsWarningSeverity(*severity_)) {
msg.set_languageFeature(feature);
}
}
diff --git a/flang/lib/Parser/message.cpp b/flang/lib/Parser/message.cpp
index 0ae0e64914afa..cc4ff9a93c7e0 100644
--- a/flang/lib/Parser/message.cpp
+++ b/flang/lib/Parser/message.cpp
@@ -165,9 +165,7 @@ bool Message::SortBefore(const Message &that) const {
location_, that.location_);
}
-bool Message::IsFatal() const {
- return severity() == Severity::Error || severity() == Severity::Todo;
-}
+bool Message::IsFatal() const { return IsFatalSeverity(severity()); }
Severity Message::severity() const {
return common::visit(
@@ -277,18 +275,13 @@ static std::string Prefix(Severity severity) {
}
static llvm::raw_ostream::Colors PrefixColor(Severity severity) {
- switch (severity) {
- case Severity::Error:
- case Severity::Todo:
+ if (IsFatalSeverity(severity)) {
return llvm::raw_ostream::RED;
- case Severity::Warning:
- case Severity::Portability:
+ } else if (IsWarningSeverity(severity)) {
return llvm::raw_ostream::MAGENTA;
- default:
- // TODO: Set the color.
- break;
+ } else {
+ return llvm::raw_ostream::SAVEDCOLOR;
}
- return llvm::raw_ostream::SAVEDCOLOR;
}
static std::string HintLanguageControlFlag(
diff --git a/flang/lib/Semantics/check-call.cpp b/flang/lib/Semantics/check-call.cpp
index 5f276d9b9f4f8..6470c3d0d09a9 100644
--- a/flang/lib/Semantics/check-call.cpp
+++ b/flang/lib/Semantics/check-call.cpp
@@ -57,10 +57,7 @@ static void CheckImplicitInterfaceArg(evaluate::ActualArgument &arg,
}
if (const auto *expr{arg.UnwrapExpr()}) {
if (const Symbol *base{GetFirstSymbol(*expr)}) {
- const Symbol &symbol{GetAssociationRoot(*base)};
- if (IsFunctionResult(symbol)) {
- context.NoteDefinedSymbol(symbol);
- }
+ context.NoteDefinedSymbol(GetAssociationRoot(*base));
}
if (IsBOZLiteral(*expr)) {
messages.Say("BOZ argument %s requires an explicit interface"_err_en_US,
@@ -781,10 +778,7 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
} else if (dummy.intent != common::Intent::In ||
(dummyIsPointer && !actualIsPointer)) {
if (auto named{evaluate::ExtractNamedEntity(actual)}) {
- if (const Symbol & base{named->GetFirstSymbol()};
- IsFunctionResult(base)) {
- context.NoteDefinedSymbol(base);
- }
+ context.NoteDefinedSymbol(named->GetFirstSymbol());
}
}
}
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index d744cceffe80f..ea2a3e4fb053d 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -7744,7 +7744,7 @@ bool DeclarationVisitor::OkToAddComponent(
if (msg) {
auto &said{Say2(name, std::move(*msg), *prev,
"Previous declaration of '%s'"_en_US)};
- if (msg->severity() == parser::Severity::Error) {
+ if (msg->IsFatal()) {
Resolve(name, *prev);
return false;
}
diff --git a/flang/test/Semantics/bug171844.f90 b/flang/test/Semantics/bug171844.f90
index de775c83302ca..2dd4bfbf8625f 100644
--- a/flang/test/Semantics/bug171844.f90
+++ b/flang/test/Semantics/bug171844.f90
@@ -1,5 +1,5 @@
-! RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck --check-prefix=CHECK-WARNING %s
-! RUN: %flang_fc1 -fsyntax-only -Wno-bad-value-in-dead-code %s 2>&1 | FileCheck %s
+! RUN: not %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck --check-prefix=CHECK-WARNING %s
+! RUN: not %flang_fc1 -fsyntax-only -Wno-bad-value-in-dead-code %s 2>&1 | FileCheck %s
real a(2)
More information about the flang-commits
mailing list