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> 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{*contiguous}; } } else if (auto *assumedType{args[0]->GetAssumedTypeDummy()}) { if (auto contiguous{IsContiguous(*assumedType, context)}) { + warnContiguous(); return Expr{*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