Make empty arrays into just pointers

This commit is contained in:
Sofia 2026-04-14 15:20:14 +03:00
parent d70f6fffa0
commit 0400aa1d99
4 changed files with 15 additions and 20 deletions

View File

@ -293,9 +293,6 @@ namespace types {
}
llvm::Type* ArrayType::codegen(codegen::Builder& builder) {
if (this->m_size) {
return llvm::ArrayType::get(this->m_inner->codegen(builder), *this->m_size);
}
return llvm::PointerType::get(*builder.context, 0);
return llvm::ArrayType::get(this->m_inner->codegen(builder), this->m_size);
}
}

View File

@ -266,9 +266,16 @@ namespace parsing {
auto array_postfix = parse_array_postfix(inner);
while (array_postfix.ok()) {
auto postfix = array_postfix.unwrap();
if (postfix) {
ty = std::shared_ptr<types::Type>{
new types::ArrayType(ty, postfix)
new types::ArrayType(ty, *postfix)
};
}
else {
ty = std::shared_ptr<types::Type>{
new types::PointerType(ty)
};
}
array_postfix = parse_array_postfix(inner);
}

View File

@ -146,10 +146,7 @@ namespace types {
std::string ArrayType::formatted() {
std::stringstream out{ "" };
out << this->m_inner->formatted();
if (this->m_size)
out << "[" << *this->m_size << "]";
else
out << "[]";
out << "[" << this->m_size << "]";
return out.str();
}
@ -159,13 +156,7 @@ namespace types {
}
uint32_t ArrayType::size() {
if (this->m_size) {
return (*this->m_size) * this->m_inner->size();
}
else {
// Acts as a pointer type otherwise
return 64;
}
return this->m_size * this->m_inner->size();
}
bool types_equal(std::shared_ptr<types::Type> type1, std::shared_ptr<types::Type> type2) {

View File

@ -85,9 +85,9 @@ namespace types {
class ArrayType : public Type {
public:
std::shared_ptr<Type> m_inner;
std::optional<uint32_t> m_size;
uint32_t m_size;
ArrayType(std::shared_ptr<Type> inner, std::optional<uint32_t> size)
ArrayType(std::shared_ptr<Type> inner, uint32_t size)
: Type(TypeKind::Array), m_inner{ std::move(inner) }, m_size{ size } {
}
virtual ~ArrayType() override = default;