From 19a6b73f0ed4bd6edf01d6576fe81ae96db86c6c Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Wed, 29 Nov 2023 18:52:27 -0500 Subject: [PATCH] Analyzer does light upward type inference for location expressions --- analyzer/assignment_test.go | 14 ++++++++++++++ analyzer/expression.go | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/analyzer/assignment_test.go b/analyzer/assignment_test.go index fd26bab..79d93fa 100644 --- a/analyzer/assignment_test.go +++ b/analyzer/assignment_test.go @@ -155,6 +155,17 @@ Bird: ([fly distance:F64] [land]) `) } +func TestAssignmentLiteralErrDerefByteFloat (test *testing.T) { +testStringErr (test, +"cannot use float literal as Byte", 4, 17, +` +[main] = { + buffer:8:Byte + [. buffer 7] = 0.0 +} +`) +} + func TestAssignmentLiteral (test *testing.T) { testString (test, ` @@ -175,6 +186,9 @@ testString (test, struct:(x:Int y:Int) = ( x: 9 y: 10) + + [.[.arr 1] 0] = 6 + [.slice 4] = 5 } `) } diff --git a/analyzer/expression.go b/analyzer/expression.go index c57b748..a68715a 100644 --- a/analyzer/expression.go +++ b/analyzer/expression.go @@ -184,6 +184,13 @@ func (this *Tree) analyzeSubscript ( if err != nil { return nil, err } subscript.Offset = offset + if subscript.Ty == nil { + switch ty := subscript.Slice.Type().(type) { + case *entity.TypeSlice: subscript.Ty = ty.Element + case *entity.TypeArray: subscript.Ty = ty.Element + } + } + return subscript, nil } @@ -235,7 +242,13 @@ func (this *Tree) analyzeDereference ( if err != nil { return nil, err } dereference.Pointer = pointer dereference.Ty = into - + + if dereference.Ty == nil { + switch ty := dereference.Pointer.Type().(type) { + case *entity.TypePointer: dereference.Ty = ty.Referenced + } + } + return dereference, nil }