[flang] Improve error message for move_alloc
authorDavid Truby <david.truby@arm.com>
Mon, 30 Jan 2023 15:48:45 +0000 (15:48 +0000)
committerDavid Truby <david.truby@arm.com>
Tue, 31 Jan 2023 14:59:02 +0000 (14:59 +0000)
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

flang/include/flang/Runtime/magic-numbers.h
flang/runtime/allocatable.cpp
flang/runtime/stat.cpp
flang/runtime/stat.h
flang/unittests/Runtime/Allocatable.cpp

index e883637..4ee1fca 100644 (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
index 2e7e0e9..3ec9bda 100644 (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()) {
index 3ddcb2b..63284bb 100644 (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;
   }
index a030784..e5b49d6 100644 (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);
index 919279a..11cb2f2 100644 (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");
 }