diff --git a/flang/include/flang/Runtime/magic-numbers.h b/flang/include/flang/Runtime/magic-numbers.h index e883637b8c4b8..4ee1fca539bd2 100644 --- a/flang/include/flang/Runtime/magic-numbers.h +++ b/flang/include/flang/Runtime/magic-numbers.h @@ -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 diff --git a/flang/runtime/allocatable.cpp b/flang/runtime/allocatable.cpp index 2e7e0e9acacf8..3ec9bdaf63beb 100644 --- a/flang/runtime/allocatable.cpp +++ b/flang/runtime/allocatable.cpp @@ -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()) { diff --git a/flang/runtime/stat.cpp b/flang/runtime/stat.cpp index 3ddcb2ba7c8d3..63284bbea7f23 100644 --- a/flang/runtime/stat.cpp +++ b/flang/runtime/stat.cpp @@ -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; } diff --git a/flang/runtime/stat.h b/flang/runtime/stat.h index a030784090746..e5b49d625912d 100644 --- a/flang/runtime/stat.h +++ b/flang/runtime/stat.h @@ -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); diff --git a/flang/unittests/Runtime/Allocatable.cpp b/flang/unittests/Runtime/Allocatable.cpp index 919279a245f17..11cb2f2db33e8 100644 --- a/flang/unittests/Runtime/Allocatable.cpp +++ b/flang/unittests/Runtime/Allocatable.cpp @@ -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"); }