Allow &[ty; _] to be cast into *ty
This commit is contained in:
parent
baa068a371
commit
7234cad5f0
@ -2,7 +2,8 @@ import std::String;
|
||||
import std::print;
|
||||
|
||||
fn main() -> u8 {
|
||||
// - TODO possibly allow to cast between &[ty] and *ty
|
||||
let bytes = test_macro!("./macro_easy_file.txt");
|
||||
print(String::new() + bytes.length());
|
||||
return *bytes[0];
|
||||
return (bytes as *u8)[0];
|
||||
}
|
||||
|
@ -1313,7 +1313,7 @@ impl mir::Expression {
|
||||
Some(val)
|
||||
} else {
|
||||
match (&val.1, type_kind) {
|
||||
(TypeKind::CodegenPtr(inner), TypeKind::UserPtr(_)) => match *inner.clone() {
|
||||
(TypeKind::CodegenPtr(inner), TypeKind::UserPtr(ty2)) => match *inner.clone() {
|
||||
TypeKind::UserPtr(_) => Some(StackValue(
|
||||
val.0.derive(
|
||||
scope
|
||||
@ -1326,6 +1326,27 @@ impl mir::Expression {
|
||||
),
|
||||
TypeKind::CodegenPtr(Box::new(type_kind.clone())),
|
||||
)),
|
||||
TypeKind::Borrow(ty1, _) => match *ty1.clone() {
|
||||
TypeKind::Array(ty1, _) => {
|
||||
if ty1 == *ty2 {
|
||||
Some(StackValue(
|
||||
val.0.derive(
|
||||
scope
|
||||
.block
|
||||
.build(Instr::BitCast(
|
||||
val.instr(),
|
||||
Type::Ptr(Box::new(type_kind.get_type(scope.type_values))),
|
||||
))
|
||||
.unwrap(),
|
||||
),
|
||||
TypeKind::CodegenPtr(Box::new(type_kind.clone())),
|
||||
))
|
||||
} else {
|
||||
return Err(ErrorKind::Null);
|
||||
}
|
||||
}
|
||||
_ => return Err(ErrorKind::Null),
|
||||
},
|
||||
_ => panic!(),
|
||||
},
|
||||
(TypeKind::UserPtr(_), TypeKind::UserPtr(_))
|
||||
|
@ -244,7 +244,6 @@ impl MacroFunction for TestMacro {
|
||||
.parent()
|
||||
.expect("Module path has no parent!")
|
||||
.join(path);
|
||||
dbg!(&path);
|
||||
|
||||
let contents = match std::fs::read(path) {
|
||||
Ok(content) => content,
|
||||
|
@ -256,6 +256,16 @@ impl TypeKind {
|
||||
let other_cat = other.category();
|
||||
match (self, other) {
|
||||
(TypeKind::UserPtr(_), TypeKind::UserPtr(_)) => Ok(other.clone()),
|
||||
(TypeKind::Borrow(ty1, _), TypeKind::UserPtr(ty2)) => match *ty1.clone() {
|
||||
TypeKind::Array(ty1, _) => {
|
||||
if ty1 == *ty2 {
|
||||
Ok(other.clone())
|
||||
} else {
|
||||
Err(ErrorKind::NotCastableTo(self.clone(), other.clone()))
|
||||
}
|
||||
}
|
||||
_ => Err(ErrorKind::NotCastableTo(self.clone(), other.clone())),
|
||||
},
|
||||
(TypeKind::Char, TypeKind::U8) => Ok(other.clone()),
|
||||
(TypeKind::U8, TypeKind::Char) => Ok(other.clone()),
|
||||
_ => match (&self_cat, &other_cat) {
|
||||
|
Loading…
Reference in New Issue
Block a user