[flang] Improve error message for move_alloc

This patch improves the error message when MOVE_ALLOC is passed the same
allocated allocatable as both the to and from arguments.

Differential Revision: https://reviews.llvm.org/D142899
This commit is contained in:
David Truby 2023-01-30 15:48:45 +00:00
parent ab0116e2f0
commit 2526013a22
5 changed files with 16 additions and 3 deletions

View File

@ -52,4 +52,11 @@ Status codes for GET_ENVIRONMENT_VARIABLE. Values mandated by the standard.
#endif
#define FORTRAN_RUNTIME_STAT_MISSING_ENV_VAR 1
#define FORTRAN_RUNTIME_STAT_ENV_VARS_UNSUPPORTED 2
#if 0
Processor-defined status code for MOVE_ALLOC where arguments are the
same allocatable.
#endif
#define FORTRAN_RUNTIME_STAT_MOVE_ALLOC_SAME_ALLOCATABLE 109
#endif

View File

@ -51,7 +51,8 @@ std::int32_t RTNAME(MoveAlloc)(Descriptor &to, Descriptor &from, bool hasStat,
// If to and from are the same allocatable they must not be allocated
// and nothing should be done.
if (from.raw().base_addr == to.raw().base_addr && from.IsAllocated()) {
return ReturnError(terminator, StatInvalidDescriptor, errMsg, hasStat);
return ReturnError(
terminator, StatMoveAllocSameAllocatable, errMsg, hasStat);
}
if (to.IsAllocated()) {

View File

@ -60,6 +60,9 @@ const char *StatErrorString(int stat) {
case StatMissingEnvVariable:
return "Missing environment variable";
case StatMoveAllocSameAllocatable:
return "MOVE_ALLOC passed the same address as to and from";
default:
return nullptr;
}

View File

@ -48,6 +48,8 @@ enum Stat {
StatInvalidArgumentNumber = FORTRAN_RUNTIME_STAT_INVALID_ARG_NUMBER,
StatMissingArgument = FORTRAN_RUNTIME_STAT_MISSING_ARG,
StatValueTooShort = FORTRAN_RUNTIME_STAT_VALUE_TOO_SHORT,
StatMoveAllocSameAllocatable =
FORTRAN_RUNTIME_STAT_MOVE_ALLOC_SAME_ALLOCATABLE,
};
const char *StatErrorString(int);

View File

@ -64,10 +64,10 @@ TEST(AllocatableTest, MoveAlloc) {
// move_alloc with the same allocated array should fail
stat = RTNAME(MoveAlloc)(*a, *a, true, errMsg.get(), __FILE__, __LINE__);
EXPECT_EQ(stat, 18);
EXPECT_EQ(stat, 109);
std::string_view errStr{errMsg->OffsetElement(), errMsg->ElementBytes()};
auto trim_pos = errStr.find_last_not_of(' ');
if (trim_pos != errStr.npos)
errStr.remove_suffix(errStr.size() - trim_pos - 1);
EXPECT_EQ(errStr, "Invalid descriptor");
EXPECT_EQ(errStr, "MOVE_ALLOC passed the same address as to and from");
}