[Lldb-commits] [lldb] [lldb][Fortran] Added support for basic types in TypeSystemFortran (PR #223380)
Iasonas Karaprodromidis via lldb-commits
lldb-commits at lists.llvm.org
Fri Sep 18 07:55:51 PDT 2026
================
@@ -0,0 +1,237 @@
+//===-- TestTypeSystemFortran.cpp -----------------------------------------===//
+//
+// 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 "Plugins/TypeSystem/Fortran/FortranTypes.h"
+#include "Plugins/TypeSystem/Fortran/TypeSystemFortran.h"
+#include "TestingSupport/SubsystemRAII.h"
+#include "lldb/Core/Declaration.h"
+#include "lldb/Host/FileSystem.h"
+#include "lldb/Host/HostInfo.h"
+#include "lldb/lldb-enumerations.h"
+#include "llvm/Testing/Support/Error.h"
+#include "gtest/gtest.h"
+
+using namespace lldb;
+using namespace lldb_private;
+using namespace lldb_private::plugin::fortran;
+
+class TypeSystemFortranHolder {
+ std::shared_ptr<TypeSystemFortran> m_ast;
+
+public:
+ TypeSystemFortranHolder() : m_ast(std::make_shared<TypeSystemFortran>()) {}
+ TypeSystemFortran *GetAST() const { return m_ast.get(); }
+};
+
+class TestTypeSystemFortran : public testing::Test {
+public:
+ SubsystemRAII<FileSystem, HostInfo> subsystems;
+
+ void SetUp() override {
+ m_holder = std::make_unique<TypeSystemFortranHolder>();
+ m_ast = m_holder->GetAST();
+ }
+
+ void TearDown() override {
+ m_ast = nullptr;
+ m_holder.reset();
+ }
+
+protected:
+ TypeSystemFortran *m_ast = nullptr;
+ std::unique_ptr<TypeSystemFortranHolder> m_holder;
+};
+
+TEST_F(TestTypeSystemFortran, TestBaseTypes) {
+ CompilerType logical_type = m_ast->CreateBaseType(llvm::dwarf::DW_ATE_boolean,
+ 32, ConstString("Logical"));
+ EXPECT_TRUE(logical_type.IsValid());
+ auto bitsize_or_err = logical_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 32U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(logical_type.GetOpaqueQualType()),
+ eBasicTypeBool);
+
+ CompilerType int8_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_signed, 8, ConstString());
+ EXPECT_TRUE(int8_type.IsValid());
+ bitsize_or_err = int8_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 8U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(int8_type.GetOpaqueQualType()),
+ eBasicTypeSignedChar);
+
+ CompilerType int16_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_signed, 16, ConstString());
+ EXPECT_TRUE(int16_type.IsValid());
+ bitsize_or_err = int16_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 16U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(int16_type.GetOpaqueQualType()),
+ eBasicTypeShort);
+
+ CompilerType int32_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_signed, 32, ConstString());
+ EXPECT_TRUE(int32_type.IsValid());
+ bitsize_or_err = int32_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 32U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(int32_type.GetOpaqueQualType()),
+ eBasicTypeInt);
+
+ CompilerType int64_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_signed, 64, ConstString());
+ EXPECT_TRUE(int64_type.IsValid());
+ bitsize_or_err = int64_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 64U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(int64_type.GetOpaqueQualType()),
+ eBasicTypeLongLong);
+
+ CompilerType int128_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_signed, 128, ConstString());
+ EXPECT_TRUE(int128_type.IsValid());
+ bitsize_or_err = int128_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 128U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(int128_type.GetOpaqueQualType()),
+ eBasicTypeInt128);
+
+ CompilerType real16_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_float, 16, ConstString());
+ EXPECT_TRUE(real16_type.IsValid());
+ bitsize_or_err = real16_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 16U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(real16_type.GetOpaqueQualType()),
+ eBasicTypeHalf);
+
+ CompilerType real32_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_float, 32, ConstString());
+ EXPECT_TRUE(real32_type.IsValid());
+ bitsize_or_err = real32_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 32U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(real32_type.GetOpaqueQualType()),
+ eBasicTypeFloat);
+
+ CompilerType real64_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_float, 64, ConstString());
+ EXPECT_TRUE(real64_type.IsValid());
+ bitsize_or_err = real64_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 64U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(real64_type.GetOpaqueQualType()),
+ eBasicTypeDouble);
+
+ CompilerType real128_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_float, 128, ConstString());
+ EXPECT_TRUE(real128_type.IsValid());
+ bitsize_or_err = real128_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 128U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(real128_type.GetOpaqueQualType()),
+ eBasicTypeFloat128);
+
+ CompilerType complex64_type = m_ast->CreateBaseType(
+ llvm::dwarf::DW_ATE_complex_float, 64, ConstString());
+ EXPECT_TRUE(complex64_type.IsValid());
+ bitsize_or_err = complex64_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 64U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(complex64_type.GetOpaqueQualType()),
+ eBasicTypeFloatComplex);
+
+ CompilerType complex128_type = m_ast->CreateBaseType(
+ llvm::dwarf::DW_ATE_complex_float, 128, ConstString());
+ EXPECT_TRUE(complex128_type.IsValid());
+ bitsize_or_err = complex128_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 128U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(complex128_type.GetOpaqueQualType()),
+ eBasicTypeDoubleComplex);
+
+ CompilerType complex256_type = m_ast->CreateBaseType(
+ llvm::dwarf::DW_ATE_complex_float, 256, ConstString());
+ EXPECT_TRUE(complex256_type.IsValid());
+ bitsize_or_err = complex256_type.GetBitSize(nullptr);
+ ASSERT_THAT_EXPECTED(bitsize_or_err, llvm::Succeeded());
+ EXPECT_EQ(*bitsize_or_err, 256U);
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(complex256_type.GetOpaqueQualType()),
+ eBasicTypeLongDoubleComplex);
+
+ CompilerType invalid_int =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_signed, 42, ConstString());
+ EXPECT_EQ(m_ast->GetBasicTypeEnumeration(invalid_int.GetOpaqueQualType()),
+ eBasicTypeInvalid);
+}
+
+TEST_F(TestTypeSystemFortran, TestTypeClassifications) {
+ CompilerType logical_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_boolean, 32, ConstString());
+ CompilerType int_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_signed, 32, ConstString());
+ CompilerType real_type =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_float, 32, ConstString());
+ CompilerType complex_type = m_ast->CreateBaseType(
+ llvm::dwarf::DW_ATE_complex_float, 64, ConstString());
+
+ bool is_signed = false;
+
+ EXPECT_TRUE(int_type.IsIntegerType(is_signed));
+ EXPECT_TRUE(is_signed);
+ EXPECT_FALSE(logical_type.IsIntegerType(is_signed));
+ EXPECT_FALSE(real_type.IsIntegerType(is_signed));
+ EXPECT_FALSE(complex_type.IsIntegerType(is_signed));
+
+ EXPECT_TRUE(real_type.IsFloatingPointType());
+ EXPECT_FALSE(int_type.IsFloatingPointType());
+ EXPECT_FALSE(logical_type.IsFloatingPointType());
+ EXPECT_FALSE(complex_type.IsFloatingPointType());
+}
+
+TEST_F(TestTypeSystemFortran, TestTypeNameGeneration) {
+ CompilerType logical32 =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_boolean, 32, ConstString());
+ CompilerType int32 =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_signed, 32, ConstString());
+ CompilerType real32 =
+ m_ast->CreateBaseType(llvm::dwarf::DW_ATE_float, 32, ConstString());
+ CompilerType complex64 = m_ast->CreateBaseType(
+ llvm::dwarf::DW_ATE_complex_float, 64, ConstString());
+
+ EXPECT_STREQ(logical32.GetTypeName().GetCString(), "LOGICAL");
----------------
Iasonaskrpr wrote:
Changed CreateBaseType to always assign a default name if the caller does not provide one.
https://github.com/llvm/llvm-project/pull/223380
More information about the lldb-commits
mailing list