summaryrefslogtreecommitdiff
path: root/flang-rt
diff options
context:
space:
mode:
authorCarlos Seo <carlos.seo@linaro.org>2025-11-20 11:34:43 -0300
committerGitHub <noreply@github.com>2025-11-20 11:34:43 -0300
commita9a14d64d20bfb28abdd7a63cac459b5f6b5ee91 (patch)
tree682bade80b3b62b6d804af8d0f8242f782bda7d7 /flang-rt
parent0e8222b84b60c022b2cee308f79a185a943ff514 (diff)
[flang-rt] Fix TypeCategory for quad-precision COMPLEX (#168090)
Modify the TypeCategory for quad-precision COMPLEX to CFI_type_float128_Complex so it matches the TypeCode returned by SELECT TYPE lowering. Fixes #134565
Diffstat (limited to 'flang-rt')
-rw-r--r--flang-rt/lib/runtime/type-code.cpp2
-rw-r--r--flang-rt/unittests/Runtime/CMakeLists.txt1
-rw-r--r--flang-rt/unittests/Runtime/TypeCode.cpp43
3 files changed, 45 insertions, 1 deletions
diff --git a/flang-rt/lib/runtime/type-code.cpp b/flang-rt/lib/runtime/type-code.cpp
index 9ecde012e7d1..68093decbb34 100644
--- a/flang-rt/lib/runtime/type-code.cpp
+++ b/flang-rt/lib/runtime/type-code.cpp
@@ -92,7 +92,7 @@ RT_API_ATTRS TypeCode::TypeCode(TypeCategory f, int kind) {
raw_ = CFI_type_extended_double_Complex;
break;
case 16:
- raw_ = CFI_type_long_double_Complex;
+ raw_ = CFI_type_float128_Complex;
break;
}
break;
diff --git a/flang-rt/unittests/Runtime/CMakeLists.txt b/flang-rt/unittests/Runtime/CMakeLists.txt
index e51bc2441577..fca064b22620 100644
--- a/flang-rt/unittests/Runtime/CMakeLists.txt
+++ b/flang-rt/unittests/Runtime/CMakeLists.txt
@@ -40,6 +40,7 @@ add_flangrt_unittest(RuntimeTests
Time.cpp
TemporaryStack.cpp
Transformational.cpp
+ TypeCode.cpp
LINK_LIBS
flang_rt.runtime.unittest
diff --git a/flang-rt/unittests/Runtime/TypeCode.cpp b/flang-rt/unittests/Runtime/TypeCode.cpp
new file mode 100644
index 000000000000..5e694055ffc2
--- /dev/null
+++ b/flang-rt/unittests/Runtime/TypeCode.cpp
@@ -0,0 +1,43 @@
+//===-- unittests/Runtime/TypeCode.cpp --------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "gtest/gtest.h"
+#include "flang-rt/runtime/type-code.h"
+
+using namespace Fortran::runtime;
+using namespace Fortran::common;
+
+TEST(TypeCode, ComplexTypes) {
+ // Test all Complex type kinds to ensure they map correctly
+ struct ComplexTypeMapping {
+ int kind;
+ Fortran::ISO::CFI_type_t expectedType;
+ };
+
+ ComplexTypeMapping mappings[] = {
+ {2, CFI_type_half_float_Complex},
+ {3, CFI_type_bfloat_Complex},
+ {4, CFI_type_float_Complex},
+ {8, CFI_type_double_Complex},
+ {10, CFI_type_extended_double_Complex},
+ {16, CFI_type_float128_Complex},
+ };
+
+ for (const auto &mapping : mappings) {
+ TypeCode tc(TypeCategory::Complex, mapping.kind);
+ EXPECT_EQ(tc.raw(), mapping.expectedType)
+ << "Complex kind " << mapping.kind << " should map to CFI type "
+ << mapping.expectedType;
+ EXPECT_TRUE(tc.IsComplex());
+
+ auto categoryAndKind = tc.GetCategoryAndKind();
+ ASSERT_TRUE(categoryAndKind.has_value());
+ EXPECT_EQ(categoryAndKind->first, TypeCategory::Complex);
+ EXPECT_EQ(categoryAndKind->second, mapping.kind);
+ }
+}