[flang-commits] [flang] 4064c0e - [flang] Implemented a warning about contiguity of compile time constant values (#161084)
via flang-commits
flang-commits at lists.llvm.org
Tue Sep 30 11:40:39 PDT 2025
Author: Eugene Epshteyn
Date: 2025-09-30T14:40:35-04:00
New Revision: 4064c0eab46e34fd07dbca4b2f665582f4528afb
URL: https://github.com/llvm/llvm-project/commit/4064c0eab46e34fd07dbca4b2f665582f4528afb
DIFF: https://github.com/llvm/llvm-project/commit/4064c0eab46e34fd07dbca4b2f665582f4528afb.diff
LOG: [flang] Implemented a warning about contiguity of compile time constant values (#161084)
Implemented `common::UsageWarning::ConstantIsContiguous` to warn about
the
following case:
```
integer, parameter :: num = 3
integer, parameter :: arr(num)=[(i, i=1,num)]
logical, parameter :: result=is_contiguous(arr(num:1:-1))
end
```
Here, while array section is discontiguous, `arr` is a compile time
constant,
so array section created at compile time will end up being contiguous
and
`result` will be "true". If `arr` wasn't a constant, the result at
runtime
would have been "false".
Added:
flang/test/Semantics/contiguous-warn.f90
Modified:
flang/include/flang/Support/Fortran-features.h
flang/lib/Evaluate/fold-logical.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Support/Fortran-features.h b/flang/include/flang/Support/Fortran-features.h
index 2bbc2385777da..51364d552be64 100644
--- a/flang/include/flang/Support/Fortran-features.h
+++ b/flang/include/flang/Support/Fortran-features.h
@@ -76,7 +76,7 @@ ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable,
IndexVarRedefinition, IncompatibleImplicitInterfaces, CdefinedInit,
VectorSubscriptFinalization, UndefinedFunctionResult, UselessIomsg,
MismatchingDummyProcedure, SubscriptedEmptyArray, UnsignedLiteralTruncation,
- CompatibleDeclarationsFromDistinctModules,
+ CompatibleDeclarationsFromDistinctModules, ConstantIsContiguous,
NullActualForDefaultIntentAllocatable, UseAssociationIntoSameNameSubprogram,
HostAssociatedIntentOutInSpecExpr, NonVolatilePointerToVolatile,
RealConstantWidening, VolatileOrAsynchronousTemporary)
diff --git a/flang/lib/Evaluate/fold-logical.cpp b/flang/lib/Evaluate/fold-logical.cpp
index c64f79e06a8ac..449c316802d6a 100644
--- a/flang/lib/Evaluate/fold-logical.cpp
+++ b/flang/lib/Evaluate/fold-logical.cpp
@@ -799,12 +799,20 @@ Expr<Type<TypeCategory::Logical, KIND>> FoldIntrinsicFunction(
}
} else if (name == "is_contiguous") {
if (args.at(0)) {
+ auto warnContiguous{[&]() {
+ if (auto source{args[0]->sourceLocation()}) {
+ context.Warn(common::UsageWarning::ConstantIsContiguous, *source,
+ "is_contiguous() is always true for named constants and subobjects of named constants"_warn_en_US);
+ }
+ }};
if (auto *expr{args[0]->UnwrapExpr()}) {
if (auto contiguous{IsContiguous(*expr, context)}) {
+ warnContiguous();
return Expr<T>{*contiguous};
}
} else if (auto *assumedType{args[0]->GetAssumedTypeDummy()}) {
if (auto contiguous{IsContiguous(*assumedType, context)}) {
+ warnContiguous();
return Expr<T>{*contiguous};
}
}
diff --git a/flang/test/Semantics/contiguous-warn.f90 b/flang/test/Semantics/contiguous-warn.f90
new file mode 100644
index 0000000000000..2eb1f1c0857f7
--- /dev/null
+++ b/flang/test/Semantics/contiguous-warn.f90
@@ -0,0 +1,6 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic -Werror
+integer, parameter :: num = 3
+integer, parameter :: arr(num)=[(i, i=1,num)]
+!WARNING: is_contiguous() is always true for named constants and subobjects of named constants [-Wconstant-is-contiguous]
+logical, parameter :: result=is_contiguous(arr(num:1:-1))
+end
More information about the flang-commits
mailing list