From 2526013a2266f6eb3ffa743895f84705727aef0d Mon Sep 17 00:00:00 2001 From: David Truby Date: Mon, 30 Jan 2023 15:48:45 +0000 Subject: [PATCH] [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 --- flang/include/flang/Runtime/magic-numbers.h | 7 +++++++ flang/runtime/allocatable.cpp | 3 ++- flang/runtime/stat.cpp | 3 +++ flang/runtime/stat.h | 2 ++ flang/unittests/Runtime/Allocatable.cpp | 4 ++-- 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/flang/include/flang/Runtime/magic-numbers.h b/flang/include/flang/Runtime/magic-numbers.h index e883637..4ee1fca 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 2e7e0e9..3ec9bda 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 3ddcb2b..63284bbe 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 a0307840..e5b49d6 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 919279a..11cb2f2 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"); } -- 2.7.4