From ea17d9d4adf8a3c54f74e64b911d24981ee8a153 Mon Sep 17 00:00:00 2001 From: Richardas Kuchinskas Date: Wed, 13 Mar 2024 18:09:09 +0300 Subject: [PATCH 1/6] fixed unboxing from null for arrays --- src/tests/regression/issue1214_test.go | 17 +++++++++++++++++ src/types/map.go | 5 ++++- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/tests/regression/issue1214_test.go diff --git a/src/tests/regression/issue1214_test.go b/src/tests/regression/issue1214_test.go new file mode 100644 index 000000000..4512c408b --- /dev/null +++ b/src/tests/regression/issue1214_test.go @@ -0,0 +1,17 @@ +package regression_test + +import ( + "testing" + + "github.com/VKCOM/noverify/src/linttest" +) + +func TestIssue1214(t *testing.T) { + linttest.SimpleNegativeTest(t, ` Date: Wed, 24 Jul 2024 17:55:59 +0300 Subject: [PATCH 2/6] more tests and fix format --- src/tests/exprtype/exprtype_test.go | 65 ++++++++++++++++++++++++++ src/tests/regression/issue1214_test.go | 17 ------- src/types/map.go | 2 + 3 files changed, 67 insertions(+), 17 deletions(-) delete mode 100644 src/tests/regression/issue1214_test.go diff --git a/src/tests/exprtype/exprtype_test.go b/src/tests/exprtype/exprtype_test.go index 6d2df4ad5..73017201e 100644 --- a/src/tests/exprtype/exprtype_test.go +++ b/src/tests/exprtype/exprtype_test.go @@ -2201,6 +2201,71 @@ function f() { runExprTypeTest(t, &exprTypeTestParams{code: code}) } +func TestArrayTypesWithUnpack_Primitives(t *testing.T) { + code := ` Date: Wed, 24 Jul 2024 18:14:27 +0300 Subject: [PATCH 3/6] declare --- src/tests/exprtype/exprtype_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/exprtype/exprtype_test.go b/src/tests/exprtype/exprtype_test.go index 73017201e..16aaef9a7 100644 --- a/src/tests/exprtype/exprtype_test.go +++ b/src/tests/exprtype/exprtype_test.go @@ -2203,6 +2203,7 @@ function f() { func TestArrayTypesWithUnpack_Primitives(t *testing.T) { code := ` Date: Wed, 24 Jul 2024 19:22:55 +0300 Subject: [PATCH 4/6] todo fix --- src/types/map.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/map.go b/src/types/map.go index 91943717d..c25c0487a 100644 --- a/src/types/map.go +++ b/src/types/map.go @@ -410,7 +410,7 @@ func (m Map) LazyArrayElemType() Map { mm := make(map[string]struct{}, m.Len()) for typ := range m.m { - //TODO: Remove this todo after creating rule for array unpacking (inspection iterable types) + // TODO: https://github.com/VKCOM/noverify/issues/1227 if typ == "null" { break } From 8794e126bce005c57d27a43162e345f970227d17 Mon Sep 17 00:00:00 2001 From: Richardas Kuchinskas Date: Wed, 24 Jul 2024 20:43:10 +0300 Subject: [PATCH 5/6] 1000iq fix --- src/solver/solver.go | 8 ++-- src/tests/exprtype/exprtype_test.go | 72 +++++++++-------------------- src/types/lazy.go | 6 ++- src/types/map.go | 2 +- 4 files changed, 33 insertions(+), 55 deletions(-) diff --git a/src/solver/solver.go b/src/solver/solver.go index edb275bf7..db7a712d5 100644 --- a/src/solver/solver.go +++ b/src/solver/solver.go @@ -20,14 +20,16 @@ func mixedType() map[string]struct{} { } // resolveType resolves function calls, method calls and global variables. -// curStaticClass is current class name (if inside the class, otherwise "") +// +// curStaticClass is current class name (if inside the class, otherwise "") func resolveType(info *meta.Info, curStaticClass, typ string, visitedMap ResolverMap) (result map[string]struct{}) { r := resolver{info: info, visited: visitedMap} return r.resolveType(curStaticClass, typ) } // ResolveTypes resolves function calls, method calls and global variables. -// curStaticClass is current class name (if inside the class, otherwise "") +// +// curStaticClass is current class name (if inside the class, otherwise "") func ResolveTypes(info *meta.Info, curStaticClass string, m types.Map, visitedMap ResolverMap) map[string]struct{} { r := resolver{info: info, visited: visitedMap} return r.resolveTypes(curStaticClass, m) @@ -76,7 +78,7 @@ func (r *resolver) resolveTypeNoLateStaticBinding(class, typ string) map[string] return result } - if typ == "" || typ[0] >= types.WMax { + if types.IsAfterWMaxed(typ) { return identityType(typ) } diff --git a/src/tests/exprtype/exprtype_test.go b/src/tests/exprtype/exprtype_test.go index 16aaef9a7..47bd564b1 100644 --- a/src/tests/exprtype/exprtype_test.go +++ b/src/tests/exprtype/exprtype_test.go @@ -2201,72 +2201,44 @@ function f() { runExprTypeTest(t, &exprTypeTestParams{code: code}) } -func TestArrayTypesWithUnpack_Primitives(t *testing.T) { +func TestArrayTypesWithUnpackPrimitives(t *testing.T) { code := `= WMax +} + func FormatType(s string) (res string) { - if s == "" || s[0] >= WMax { + if IsAfterWMaxed(s) { return FormatSimpleType(s) } diff --git a/src/types/map.go b/src/types/map.go index c25c0487a..e7ba69579 100644 --- a/src/types/map.go +++ b/src/types/map.go @@ -411,7 +411,7 @@ func (m Map) LazyArrayElemType() Map { mm := make(map[string]struct{}, m.Len()) for typ := range m.m { // TODO: https://github.com/VKCOM/noverify/issues/1227 - if typ == "null" { + if IsAfterWMaxed(typ) { break } From 99484bec38186ab652293efbe69fc4af6eb8d59c Mon Sep 17 00:00:00 2001 From: Richardas Kuchinskas Date: Wed, 24 Jul 2024 23:26:42 +0300 Subject: [PATCH 6/6] 1000iq fix --- src/tests/exprtype/exprtype_test.go | 61 +++++++++++++++-------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/src/tests/exprtype/exprtype_test.go b/src/tests/exprtype/exprtype_test.go index 47bd564b1..0206dee7c 100644 --- a/src/tests/exprtype/exprtype_test.go +++ b/src/tests/exprtype/exprtype_test.go @@ -2204,36 +2204,37 @@ function f() { func TestArrayTypesWithUnpackPrimitives(t *testing.T) { code := `