diff --git a/src/front/check.ts b/src/front/check.ts index 6c9b9eb..0246e6d 100644 --- a/src/front/check.ts +++ b/src/front/check.ts @@ -205,7 +205,9 @@ class ExprChecker { case "IntExpr": return this.checkIntExpr(node.as(tag)); case "StrExpr": - return Ty.create("Ptr", { ty: Ty.Str }); + return Ty.create("Ptr", { + ty: Ty.create("Slice", { ty: Ty.U8 }), + }); case "ArrayExpr": return this.checkArrayExpr(node.as(tag)); case "IndexExpr": @@ -300,12 +302,6 @@ class ExprChecker { ) { return Ty.create("Slice", { ty: exprTy.kind.ty }); } - if ( - exprTy.is("Str") && - argTy.compatibleWith(Ty.I32) - ) { - return Ty.I32; - } this.cx.error( node.loc, `cannot use index operator on '${exprTy.pretty()}' with '${argTy.pretty()}'`, @@ -386,8 +382,7 @@ class ExprChecker { !(argTy.is("Array") || argTy.is("Ptr") && (argTy.kind.ty.is("Array") || - argTy.kind.ty.is("Slice") || - argTy.kind.ty.is("Str"))) + argTy.kind.ty.is("Slice"))) ) { this.reportArgTypeNotCompatible( node, @@ -530,8 +525,6 @@ class TyChecker { return Ty.Void; case "bool": return Ty.Bool; - case "str": - return Ty.Str; case "i8": return Ty.I8; case "i16": diff --git a/src/middle.ts b/src/middle.ts index 8f29fbe..410a472 100644 --- a/src/middle.ts +++ b/src/middle.ts @@ -248,17 +248,6 @@ class FnLowerer { ); } } - if (valueTy.is("Str")) { - const valueInst = this.lowerPlace(place.kind.value); - if (argTy.is("Int")) { - const argInst = this.lowerExpr(arg); - return this.pushInst( - Ty.create("Ptr", { ty: Ty.I32 }), - "GetElemPtr", - { base: valueInst, offset: argInst }, - ); - } - } throw new Error( `${place.kind.tag} with arg ${argTy.pretty()} not handled`, ); diff --git a/src/mir.ts b/src/mir.ts index 5b498ec..683557b 100644 --- a/src/mir.ts +++ b/src/mir.ts @@ -199,12 +199,13 @@ export type InstKind = | { tag: "Jump"; target: BasicBlock } | { tag: "Branch"; cond: Inst; truthy: BasicBlock; falsy: BasicBlock } | { tag: "Return"; source: Inst } - | { tag: "Not"; source: Inst } - | { tag: "Negate"; source: Inst } + | { tag: UnaryOp; source: Inst } | { tag: BinaryOp; left: Inst; right: Inst } | { tag: "Len"; source: Inst } | { tag: "DebugPrint"; args: Inst[] }; +export type UnaryOp = "Not" | "Negate"; + export type BinaryOp = | "Eq" | "Ne" diff --git a/src/ty.ts b/src/ty.ts index 52c8f1f..9bb5ba9 100644 --- a/src/ty.ts +++ b/src/ty.ts @@ -35,7 +35,6 @@ export class Ty { static U64 = Ty.create("Int", { intTy: "u64" }); static USize = Ty.create("Int", { intTy: "usize" }); static Bool = Ty.create("Bool", {}); - static Str = Ty.create("Str", {}); private internHash(): string { return JSON.stringify(this.kind); @@ -75,9 +74,6 @@ export class Ty { if (this.is("Bool")) { return other.is("Bool"); } - if (this.is("Str")) { - return other.is("Str"); - } if (this.is("Ptr")) { if (!other.is("Ptr")) { return false; @@ -142,7 +138,7 @@ export class Ty { } isSized(): boolean { - if (this.is("Slice") || this.is("Str")) { + if (this.is("Slice")) { return false; } return true; @@ -160,8 +156,6 @@ export class Ty { return `${this.kind.intTy}`; case "Bool": return "bool"; - case "Str": - return "str"; case "Ptr": return `*${this.kind.ty.pretty()}`; case "PtrMut": @@ -199,7 +193,6 @@ export type TyKind = | { tag: "IntLiteral" } | { tag: "Int"; intTy: ast.IntTy } | { tag: "Bool" } - | { tag: "Str" } | { tag: "Ptr"; ty: Ty } | { tag: "PtrMut"; ty: Ty } | { tag: "Array"; ty: Ty; length: number } diff --git a/tests/string.ethlang b/tests/string.ethlang index f58587e..9d393ef 100644 --- a/tests/string.ethlang +++ b/tests/string.ethlang @@ -1,7 +1,7 @@ fn main() { - let my_string: *str = "hello world"; + let my_string: *[u8] = "hello world"; // expect: hello world print(my_string); // expect: 104