aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAyke van Laethem <[email protected]>2022-06-11 17:24:54 +0200
committerRon Evans <[email protected]>2022-08-30 12:38:06 +0200
commit4695da83b71c291bc89a14dc41c9b9a91a3c6210 (patch)
tree3b4ed26f336833d4e80f1963e598714c66575bd7
parentf094e895c55204730b0230b3b2f6fc3bb32f325a (diff)
downloadtinygo-4695da83b71c291bc89a14dc41c9b9a91a3c6210.tar.gz
tinygo-4695da83b71c291bc89a14dc41c9b9a91a3c6210.zip
all: drop support for Go 1.16 and Go 1.17
-rw-r--r--.circleci/config.yml6
-rw-r--r--BUILDING.md2
-rw-r--r--builder/config.go4
-rw-r--r--cgo/cgo_test.go15
-rw-r--r--compiler/compiler.go10
-rw-r--r--compiler/compiler_go118.go18
-rw-r--r--compiler/compiler_test.go13
-rw-r--r--compiler/testdata/go1.17.go41
-rw-r--r--compiler/testdata/go1.17.ll161
-rw-r--r--compiler/testdata/slice.go35
-rw-r--r--compiler/testdata/slice.ll143
-rw-r--r--go.mod14
-rw-r--r--go.sum21
-rw-r--r--loader/goroot.go1
-rw-r--r--loader/loader.go6
-rw-r--r--loader/loader_go118.go18
-rw-r--r--main_test.go17
-rw-r--r--src/internal/itoa/README.md2
-rw-r--r--src/internal/itoa/itoa.go33
-rw-r--r--src/internal/itoa/itoa_test.go40
-rw-r--r--src/runtime/timer.go (renamed from src/runtime/timer_go118.go)3
-rw-r--r--src/runtime/timer_go116.go36
-rw-r--r--src/testing/testing.go12
-rw-r--r--src/testing/testing_go118.go16
-rw-r--r--src/testing/testing_other.go16
-rw-r--r--testdata/go1.17.go34
-rw-r--r--testdata/go1.17.txt3
-rw-r--r--testdata/slice.go26
-rw-r--r--testdata/slice.txt3
-rw-r--r--testdata/testing.go4
-rw-r--r--testdata/testing_go118.go100
-rw-r--r--testdata/testing_go118.txt21
-rw-r--r--tests/text/template/smoke/smoke_test.go3
33 files changed, 249 insertions, 628 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index c7bb37917..8756f6992 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -112,9 +112,9 @@ commands:
- /go/pkg/mod
jobs:
- test-llvm14-go116:
+ test-llvm14-go118:
docker:
- - image: golang:1.16-buster
+ - image: golang:1.18-buster
steps:
- test-linux:
llvm: "14"
@@ -131,7 +131,7 @@ workflows:
jobs:
# This tests our lowest supported versions of Go and LLVM, to make sure at
# least the smoke tests still pass.
- - test-llvm14-go116
+ - test-llvm14-go118
# This tests a beta version of Go. It should be removed once regular
# release builds are built using this version.
- test-llvm14-go119
diff --git a/BUILDING.md b/BUILDING.md
index 1c1b79455..6c320c541 100644
--- a/BUILDING.md
+++ b/BUILDING.md
@@ -18,7 +18,7 @@ tarball. If you want to help with development of TinyGo itself, you should follo
LLVM, Clang and LLD are quite light on dependencies, requiring only standard
build tools to be built. Go is of course necessary to build TinyGo itself.
- * Go (1.16+)
+ * Go (1.18+)
* Standard build tools (gcc/clang)
* git
* CMake
diff --git a/builder/config.go b/builder/config.go
index 8ff6dafc6..c55ce1a21 100644
--- a/builder/config.go
+++ b/builder/config.go
@@ -33,8 +33,8 @@ func NewConfig(options *compileopts.Options) (*compileopts.Config, error) {
if err != nil {
return nil, fmt.Errorf("could not read version from GOROOT (%v): %v", goroot, err)
}
- if major != 1 || minor < 16 || minor > 19 {
- return nil, fmt.Errorf("requires go version 1.16 through 1.19, got go%d.%d", major, minor)
+ if major != 1 || minor < 18 || minor > 19 {
+ return nil, fmt.Errorf("requires go version 1.18 through 1.19, got go%d.%d", major, minor)
}
clangHeaderPath := getClangHeaderPath(goenv.Get("TINYGOROOT"))
diff --git a/cgo/cgo_test.go b/cgo/cgo_test.go
index c542df7fd..ffc8bb01f 100644
--- a/cgo/cgo_test.go
+++ b/cgo/cgo_test.go
@@ -5,7 +5,6 @@ import (
"flag"
"fmt"
"go/ast"
- "go/build"
"go/format"
"go/parser"
"go/token"
@@ -40,20 +39,6 @@ func TestCGo(t *testing.T) {
} {
name := name // avoid a race condition
t.Run(name, func(t *testing.T) {
- // Skip tests that require specific Go version.
- if name == "errors" {
- ok := false
- for _, version := range build.Default.ReleaseTags {
- if version == "go1.16" {
- ok = true
- break
- }
- }
- if !ok {
- t.Skip("Results for errors test are only valid for Go 1.16+")
- }
- }
-
// Read the AST in memory.
path := filepath.Join("testdata", name+".go")
fset := token.NewFileSet()
diff --git a/compiler/compiler.go b/compiler/compiler.go
index 021755e8a..a1101b715 100644
--- a/compiler/compiler.go
+++ b/compiler/compiler.go
@@ -22,10 +22,6 @@ import (
"tinygo.org/x/go-llvm"
)
-var typeParamUnderlyingType = func(t types.Type) types.Type {
- return t
-}
-
func init() {
llvm.InitializeAllTargets()
llvm.InitializeAllTargetMCs()
@@ -345,7 +341,6 @@ func (c *compilerContext) getLLVMType(goType types.Type) llvm.Type {
// makeLLVMType creates a LLVM type for a Go type. Don't call this, use
// getLLVMType instead.
func (c *compilerContext) makeLLVMType(goType types.Type) llvm.Type {
- goType = typeParamUnderlyingType(goType)
switch typ := goType.(type) {
case *types.Array:
elemType := c.getLLVMType(typ.Elem())
@@ -420,6 +415,8 @@ func (c *compilerContext) makeLLVMType(goType types.Type) llvm.Type {
members[i] = c.getLLVMType(typ.Field(i).Type())
}
return c.ctx.StructType(members, false)
+ case *types.TypeParam:
+ return c.getLLVMType(typ.Underlying())
case *types.Tuple:
members := make([]llvm.Type, typ.Len())
for i := 0; i < typ.Len(); i++ {
@@ -455,7 +452,6 @@ func (c *compilerContext) getDIType(typ types.Type) llvm.Metadata {
// createDIType creates a new DWARF type. Don't call this function directly,
// call getDIType instead.
func (c *compilerContext) createDIType(typ types.Type) llvm.Metadata {
- typ = typeParamUnderlyingType(typ)
llvmType := c.getLLVMType(typ)
sizeInBytes := c.targetData.TypeAllocSize(llvmType)
switch typ := typ.(type) {
@@ -619,6 +615,8 @@ func (c *compilerContext) createDIType(typ types.Type) llvm.Metadata {
})
temporaryMDNode.ReplaceAllUsesWith(md)
return md
+ case *types.TypeParam:
+ return c.getDIType(typ.Underlying())
default:
panic("unknown type while generating DWARF debug type: " + typ.String())
}
diff --git a/compiler/compiler_go118.go b/compiler/compiler_go118.go
deleted file mode 100644
index 799970d76..000000000
--- a/compiler/compiler_go118.go
+++ /dev/null
@@ -1,18 +0,0 @@
-//go:build go1.18
-// +build go1.18
-
-package compiler
-
-// Workaround for Go 1.17 support. Should be removed once we drop Go 1.17
-// support.
-
-import "go/types"
-
-func init() {
- typeParamUnderlyingType = func(t types.Type) types.Type {
- if t, ok := t.(*types.TypeParam); ok {
- return t.Underlying()
- }
- return t
- }
-}
diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go
index e115cf958..3d9dd8686 100644
--- a/compiler/compiler_test.go
+++ b/compiler/compiler_test.go
@@ -9,7 +9,6 @@ import (
"testing"
"github.com/tinygo-org/tinygo/compileopts"
- "github.com/tinygo-org/tinygo/goenv"
"github.com/tinygo-org/tinygo/loader"
"tinygo.org/x/go-llvm"
)
@@ -34,12 +33,6 @@ func TestCompiler(t *testing.T) {
t.Fatal("could not parse LLVM version:", llvm.Version)
}
- // Determine Go minor version (e.g. 16 in go1.16.3).
- _, goMinor, err := goenv.GetGorootVersion(goenv.Get("GOROOT"))
- if err != nil {
- t.Fatal("could not read Go version:", err)
- }
-
// Determine which tests to run, depending on the Go and LLVM versions.
tests := []testCase{
{"basic.go", "", ""},
@@ -62,12 +55,6 @@ func TestCompiler(t *testing.T) {
tests = append(tests, testCase{"intrinsics.go", "cortex-m-qemu", ""})
tests = append(tests, testCase{"intrinsics.go", "wasm", ""})
}
- if goMinor >= 17 {
- tests = append(tests, testCase{"go1.17.go", "", ""})
- }
- if goMinor >= 18 {
- tests = append(tests, testCase{"generics.go", "", ""})
- }
for _, tc := range tests {
name := tc.file
diff --git a/compiler/testdata/go1.17.go b/compiler/testdata/go1.17.go
deleted file mode 100644
index 076dded4c..000000000
--- a/compiler/testdata/go1.17.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package main
-
-// Test changes to the language introduced in Go 1.17.
-// For details, see: https://tip.golang.org/doc/go1.17#language
-// These tests should be merged into the regular slice tests once Go 1.17 is the
-// minimun Go version for TinyGo.
-
-import "unsafe"
-
-func Add32(p unsafe.Pointer, len int) unsafe.Pointer {
- return unsafe.Add(p, len)
-}
-
-func Add64(p unsafe.Pointer, len int64) unsafe.Pointer {
- return unsafe.Add(p, len)
-}
-
-func SliceToArray(s []int) *[4]int {
- return (*[4]int)(s)
-}
-
-func SliceToArrayConst() *[4]int {
- s := make([]int, 6)
- return (*[4]int)(s)
-}
-
-func SliceInt(ptr *int, len int) []int {
- return unsafe.Slice(ptr, len)
-}
-
-func SliceUint16(ptr *byte, len uint16) []byte {
- return unsafe.Slice(ptr, len)
-}
-
-func SliceUint64(ptr *int, len uint64) []int {
- return unsafe.Slice(ptr, len)
-}
-
-func SliceInt64(ptr *int, len int64) []int {
- return unsafe.Slice(ptr, len)
-}
diff --git a/compiler/testdata/go1.17.ll b/compiler/testdata/go1.17.ll
deleted file mode 100644
index e30674288..000000000
--- a/compiler/testdata/go1.17.ll
+++ /dev/null
@@ -1,161 +0,0 @@
-; ModuleID = 'go1.17.go'
-source_filename = "go1.17.go"
-target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20"
-target triple = "wasm32-unknown-wasi"
-
-declare noalias nonnull i8* @runtime.alloc(i32, i8*, i8*) #0
-
-declare void @runtime.trackPointer(i8* nocapture readonly, i8*) #0
-
-; Function Attrs: nounwind
-define hidden void @main.init(i8* %context) unnamed_addr #1 {
-entry:
- ret void
-}
-
-; Function Attrs: nounwind
-define hidden i8* @main.Add32(i8* %p, i32 %len, i8* %context) unnamed_addr #1 {
-entry:
- %0 = getelementptr i8, i8* %p, i32 %len
- call void @runtime.trackPointer(i8* %0, i8* undef) #2
- ret i8* %0
-}
-
-; Function Attrs: nounwind
-define hidden i8* @main.Add64(i8* %p, i64 %len, i8* %context) unnamed_addr #1 {
-entry:
- %0 = trunc i64 %len to i32
- %1 = getelementptr i8, i8* %p, i32 %0
- call void @runtime.trackPointer(i8* %1, i8* undef) #2
- ret i8* %1
-}
-
-; Function Attrs: nounwind
-define hidden [4 x i32]* @main.SliceToArray(i32* %s.data, i32 %s.len, i32 %s.cap, i8* %context) unnamed_addr #1 {
-entry:
- %0 = icmp ult i32 %s.len, 4
- br i1 %0, label %slicetoarray.throw, label %slicetoarray.next
-
-slicetoarray.next: ; preds = %entry
- %1 = bitcast i32* %s.data to [4 x i32]*
- ret [4 x i32]* %1
-
-slicetoarray.throw: ; preds = %entry
- call void @runtime.sliceToArrayPointerPanic(i8* undef) #2
- unreachable
-}
-
-declare void @runtime.sliceToArrayPointerPanic(i8*) #0
-
-; Function Attrs: nounwind
-define hidden [4 x i32]* @main.SliceToArrayConst(i8* %context) unnamed_addr #1 {
-entry:
- %makeslice = call i8* @runtime.alloc(i32 24, i8* nonnull inttoptr (i32 3 to i8*), i8* undef) #2
- call void @runtime.trackPointer(i8* nonnull %makeslice, i8* undef) #2
- br i1 false, label %slicetoarray.throw, label %slicetoarray.next
-
-slicetoarray.next: ; preds = %entry
- %0 = bitcast i8* %makeslice to [4 x i32]*
- ret [4 x i32]* %0
-
-slicetoarray.throw: ; preds = %entry
- unreachable
-}
-
-; Function Attrs: nounwind
-define hidden { i32*, i32, i32 } @main.SliceInt(i32* dereferenceable_or_null(4) %ptr, i32 %len, i8* %context) unnamed_addr #1 {
-entry:
- %0 = icmp ugt i32 %len, 1073741823
- %1 = icmp eq i32* %ptr, null
- %2 = icmp ne i32 %len, 0
- %3 = and i1 %1, %2
- %4 = or i1 %3, %0
- br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next
-
-unsafe.Slice.next: ; preds = %entry
- %5 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
- %6 = insertvalue { i32*, i32, i32 } %5, i32 %len, 1
- %7 = insertvalue { i32*, i32, i32 } %6, i32 %len, 2
- %8 = bitcast i32* %ptr to i8*
- call void @runtime.trackPointer(i8* %8, i8* undef) #2
- ret { i32*, i32, i32 } %7
-
-unsafe.Slice.throw: ; preds = %entry
- call void @runtime.unsafeSlicePanic(i8* undef) #2
- unreachable
-}
-
-declare void @runtime.unsafeSlicePanic(i8*) #0
-
-; Function Attrs: nounwind
-define hidden { i8*, i32, i32 } @main.SliceUint16(i8* dereferenceable_or_null(1) %ptr, i16 %len, i8* %context) unnamed_addr #1 {
-entry:
- %0 = icmp eq i8* %ptr, null
- %1 = icmp ne i16 %len, 0
- %2 = and i1 %0, %1
- br i1 %2, label %unsafe.Slice.throw, label %unsafe.Slice.next
-
-unsafe.Slice.next: ; preds = %entry
- %3 = zext i16 %len to i32
- %4 = insertvalue { i8*, i32, i32 } undef, i8* %ptr, 0
- %5 = insertvalue { i8*, i32, i32 } %4, i32 %3, 1
- %6 = insertvalue { i8*, i32, i32 } %5, i32 %3, 2
- call void @runtime.trackPointer(i8* %ptr, i8* undef) #2
- ret { i8*, i32, i32 } %6
-
-unsafe.Slice.throw: ; preds = %entry
- call void @runtime.unsafeSlicePanic(i8* undef) #2
- unreachable
-}
-
-; Function Attrs: nounwind
-define hidden { i32*, i32, i32 } @main.SliceUint64(i32* dereferenceable_or_null(4) %ptr, i64 %len, i8* %context) unnamed_addr #1 {
-entry:
- %0 = icmp ugt i64 %len, 1073741823
- %1 = icmp eq i32* %ptr, null
- %2 = icmp ne i64 %len, 0
- %3 = and i1 %1, %2
- %4 = or i1 %3, %0
- br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next
-
-unsafe.Slice.next: ; preds = %entry
- %5 = trunc i64 %len to i32
- %6 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
- %7 = insertvalue { i32*, i32, i32 } %6, i32 %5, 1
- %8 = insertvalue { i32*, i32, i32 } %7, i32 %5, 2
- %9 = bitcast i32* %ptr to i8*
- call void @runtime.trackPointer(i8* %9, i8* undef) #2
- ret { i32*, i32, i32 } %8
-
-unsafe.Slice.throw: ; preds = %entry
- call void @runtime.unsafeSlicePanic(i8* undef) #2
- unreachable
-}
-
-; Function Attrs: nounwind
-define hidden { i32*, i32, i32 } @main.SliceInt64(i32* dereferenceable_or_null(4) %ptr, i64 %len, i8* %context) unnamed_addr #1 {
-entry:
- %0 = icmp ugt i64 %len, 1073741823
- %1 = icmp eq i32* %ptr, null
- %2 = icmp ne i64 %len, 0
- %3 = and i1 %1, %2
- %4 = or i1 %3, %0
- br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next
-
-unsafe.Slice.next: ; preds = %entry
- %5 = trunc i64 %len to i32
- %6 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
- %7 = insertvalue { i32*, i32, i32 } %6, i32 %5, 1
- %8 = insertvalue { i32*, i32, i32 } %7, i32 %5, 2
- %9 = bitcast i32* %ptr to i8*
- call void @runtime.trackPointer(i8* %9, i8* undef) #2
- ret { i32*, i32, i32 } %8
-
-unsafe.Slice.throw: ; preds = %entry
- call void @runtime.unsafeSlicePanic(i8* undef) #2
- unreachable
-}
-
-attributes #0 = { "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" }
-attributes #1 = { nounwind "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" }
-attributes #2 = { nounwind }
diff --git a/compiler/testdata/slice.go b/compiler/testdata/slice.go
index 2e6dffb5d..ffe1dd45d 100644
--- a/compiler/testdata/slice.go
+++ b/compiler/testdata/slice.go
@@ -1,5 +1,7 @@
package main
+import "unsafe"
+
func sliceLen(ints []int) int {
return len(ints)
}
@@ -41,3 +43,36 @@ func makeArraySlice(len int) [][3]byte {
func makeInt32Slice(len int) []int32 {
return make([]int32, len)
}
+
+func Add32(p unsafe.Pointer, len int) unsafe.Pointer {
+ return unsafe.Add(p, len)
+}
+
+func Add64(p unsafe.Pointer, len int64) unsafe.Pointer {
+ return unsafe.Add(p, len)
+}
+
+func SliceToArray(s []int) *[4]int {
+ return (*[4]int)(s)
+}
+
+func SliceToArrayConst() *[4]int {
+ s := make([]int, 6)
+ return (*[4]int)(s)
+}
+
+func SliceInt(ptr *int, len int) []int {
+ return unsafe.Slice(ptr, len)
+}
+
+func SliceUint16(ptr *byte, len uint16) []byte {
+ return unsafe.Slice(ptr, len)
+}
+
+func SliceUint64(ptr *int, len uint64) []int {
+ return unsafe.Slice(ptr, len)
+}
+
+func SliceInt64(ptr *int, len int64) []int {
+ return unsafe.Slice(ptr, len)
+}
diff --git a/compiler/testdata/slice.ll b/compiler/testdata/slice.ll
index c7a4d7977..c2e3ebd91 100644
--- a/compiler/testdata/slice.ll
+++ b/compiler/testdata/slice.ll
@@ -183,6 +183,149 @@ slice.throw: ; preds = %entry
unreachable
}
+; Function Attrs: nounwind
+define hidden i8* @main.Add32(i8* %p, i32 %len, i8* %context) unnamed_addr #1 {
+entry:
+ %0 = getelementptr i8, i8* %p, i32 %len
+ call void @runtime.trackPointer(i8* %0, i8* undef) #2
+ ret i8* %0
+}
+
+; Function Attrs: nounwind
+define hidden i8* @main.Add64(i8* %p, i64 %len, i8* %context) unnamed_addr #1 {
+entry:
+ %0 = trunc i64 %len to i32
+ %1 = getelementptr i8, i8* %p, i32 %0
+ call void @runtime.trackPointer(i8* %1, i8* undef) #2
+ ret i8* %1
+}
+
+; Function Attrs: nounwind
+define hidden [4 x i32]* @main.SliceToArray(i32* %s.data, i32 %s.len, i32 %s.cap, i8* %context) unnamed_addr #1 {
+entry:
+ %0 = icmp ult i32 %s.len, 4
+ br i1 %0, label %slicetoarray.throw, label %slicetoarray.next
+
+slicetoarray.next: ; preds = %entry
+ %1 = bitcast i32* %s.data to [4 x i32]*
+ ret [4 x i32]* %1
+
+slicetoarray.throw: ; preds = %entry
+ call void @runtime.sliceToArrayPointerPanic(i8* undef) #2
+ unreachable
+}
+
+declare void @runtime.sliceToArrayPointerPanic(i8*) #0
+
+; Function Attrs: nounwind
+define hidden [4 x i32]* @main.SliceToArrayConst(i8* %context) unnamed_addr #1 {
+entry:
+ %makeslice = call i8* @runtime.alloc(i32 24, i8* nonnull inttoptr (i32 3 to i8*), i8* undef) #2
+ call void @runtime.trackPointer(i8* nonnull %makeslice, i8* undef) #2
+ br i1 false, label %slicetoarray.throw, label %slicetoarray.next
+
+slicetoarray.next: ; preds = %entry
+ %0 = bitcast i8* %makeslice to [4 x i32]*
+ ret [4 x i32]* %0
+
+slicetoarray.throw: ; preds = %entry
+ unreachable
+}
+
+; Function Attrs: nounwind
+define hidden { i32*, i32, i32 } @main.SliceInt(i32* dereferenceable_or_null(4) %ptr, i32 %len, i8* %context) unnamed_addr #1 {
+entry:
+ %0 = icmp ugt i32 %len, 1073741823
+ %1 = icmp eq i32* %ptr, null
+ %2 = icmp ne i32 %len, 0
+ %3 = and i1 %1, %2
+ %4 = or i1 %3, %0
+ br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next
+
+unsafe.Slice.next: ; preds = %entry
+ %5 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
+ %6 = insertvalue { i32*, i32, i32 } %5, i32 %len, 1
+ %7 = insertvalue { i32*, i32, i32 } %6, i32 %len, 2
+ %8 = bitcast i32* %ptr to i8*
+ call void @runtime.trackPointer(i8* %8, i8* undef) #2
+ ret { i32*, i32, i32 } %7
+
+unsafe.Slice.throw: ; preds = %entry
+ call void @runtime.unsafeSlicePanic(i8* undef) #2
+ unreachable
+}
+
+declare void @runtime.unsafeSlicePanic(i8*) #0
+
+; Function Attrs: nounwind
+define hidden { i8*, i32, i32 } @main.SliceUint16(i8* dereferenceable_or_null(1) %ptr, i16 %len, i8* %context) unnamed_addr #1 {
+entry:
+ %0 = icmp eq i8* %ptr, null
+ %1 = icmp ne i16 %len, 0
+ %2 = and i1 %0, %1
+ br i1 %2, label %unsafe.Slice.throw, label %unsafe.Slice.next
+
+unsafe.Slice.next: ; preds = %entry
+ %3 = zext i16 %len to i32
+ %4 = insertvalue { i8*, i32, i32 } undef, i8* %ptr, 0
+ %5 = insertvalue { i8*, i32, i32 } %4, i32 %3, 1
+ %6 = insertvalue { i8*, i32, i32 } %5, i32 %3, 2
+ call void @runtime.trackPointer(i8* %ptr, i8* undef) #2
+ ret { i8*, i32, i32 } %6
+
+unsafe.Slice.throw: ; preds = %entry
+ call void @runtime.unsafeSlicePanic(i8* undef) #2
+ unreachable
+}
+
+; Function Attrs: nounwind
+define hidden { i32*, i32, i32 } @main.SliceUint64(i32* dereferenceable_or_null(4) %ptr, i64 %len, i8* %context) unnamed_addr #1 {
+entry:
+ %0 = icmp ugt i64 %len, 1073741823
+ %1 = icmp eq i32* %ptr, null
+ %2 = icmp ne i64 %len, 0
+ %3 = and i1 %1, %2
+ %4 = or i1 %3, %0
+ br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next
+
+unsafe.Slice.next: ; preds = %entry
+ %5 = trunc i64 %len to i32
+ %6 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
+ %7 = insertvalue { i32*, i32, i32 } %6, i32 %5, 1
+ %8 = insertvalue { i32*, i32, i32 } %7, i32 %5, 2
+ %9 = bitcast i32* %ptr to i8*
+ call void @runtime.trackPointer(i8* %9, i8* undef) #2
+ ret { i32*, i32, i32 } %8
+
+unsafe.Slice.throw: ; preds = %entry
+ call void @runtime.unsafeSlicePanic(i8* undef) #2
+ unreachable
+}
+
+; Function Attrs: nounwind
+define hidden { i32*, i32, i32 } @main.SliceInt64(i32* dereferenceable_or_null(4) %ptr, i64 %len, i8* %context) unnamed_addr #1 {
+entry:
+ %0 = icmp ugt i64 %len, 1073741823
+ %1 = icmp eq i32* %ptr, null
+ %2 = icmp ne i64 %len, 0
+ %3 = and i1 %1, %2
+ %4 = or i1 %3, %0
+ br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next
+
+unsafe.Slice.next: ; preds = %entry
+ %5 = trunc i64 %len to i32
+ %6 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
+ %7 = insertvalue { i32*, i32, i32 } %6, i32 %5, 1
+ %8 = insertvalue { i32*, i32, i32 } %7, i32 %5, 2
+ %9 = bitcast i32* %ptr to i8*
+ call void @runtime.trackPointer(i8* %9, i8* undef) #2
+ ret { i32*, i32, i32 } %8
+
+unsafe.Slice.throw: ; preds = %entry
+ call void @runtime.unsafeSlicePanic(i8* undef) #2
+ unreachable
+}
+
attributes #0 = { "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" }
attributes #1 = { nounwind "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" }
attributes #2 = { nounwind }
diff --git a/go.mod b/go.mod
index 758185d2b..7f734a668 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
module github.com/tinygo-org/tinygo
-go 1.16
+go 1.18
require (
github.com/aykevl/go-wasm v0.0.2-0.20220616010729-4a0a888aebdc
@@ -17,3 +17,15 @@ require (
gopkg.in/yaml.v2 v2.4.0
tinygo.org/x/go-llvm v0.0.0-20220802112859-5bb0b77907a7
)
+
+require (
+ github.com/chromedp/sysutil v1.0.0 // indirect
+ github.com/creack/goselect v0.1.2 // indirect
+ github.com/gobwas/httphead v0.1.0 // indirect
+ github.com/gobwas/pool v0.2.1 // indirect
+ github.com/gobwas/ws v1.1.0 // indirect
+ github.com/josharian/intern v1.0.0 // indirect
+ github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mattn/go-isatty v0.0.12 // indirect
+ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
+)
diff --git a/go.sum b/go.sum
index 7aad8257f..d673c76f4 100644
--- a/go.sum
+++ b/go.sum
@@ -40,40 +40,19 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.bug.st/serial v1.1.3 h1:YEBxJa9pKS9Wdg46B/jiaKbvvbUrjhZZZITfJHEJhaE=
go.bug.st/serial v1.1.3/go.mod h1:8TT7u/SwwNIpJ8QaG4s+HTjFt9ReXs2cdOU7ZEk50Dk=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY=
golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/loader/goroot.go b/loader/goroot.go
index f1d28b0ea..1a16acf0a 100644
--- a/loader/goroot.go
+++ b/loader/goroot.go
@@ -235,7 +235,6 @@ func pathsToOverride(needsSyscallPackage bool) map[string]bool {
"internal/bytealg/": false,
"internal/reflectlite/": false,
"internal/task/": false,
- "internal/itoa/": false, // TODO: Remove when we drop support for go 1.16
"machine/": false,
"net/": true,
"os/": true,
diff --git a/loader/loader.go b/loader/loader.go
index 6f49982db..6ced36dcd 100644
--- a/loader/loader.go
+++ b/loader/loader.go
@@ -27,8 +27,6 @@ import (
"github.com/tinygo-org/tinygo/goenv"
)
-var addInstances func(*types.Info)
-
// Program holds all packages and some metadata about the program as a whole.
type Program struct {
config *compileopts.Config
@@ -158,6 +156,7 @@ func Load(config *compileopts.Config, inputPkg string, clangHeaders string, type
EmbedGlobals: make(map[string][]*EmbedFile),
info: types.Info{
Types: make(map[ast.Expr]types.TypeAndValue),
+ Instances: make(map[*ast.Ident]types.Instance),
Defs: make(map[*ast.Ident]types.Object),
Uses: make(map[*ast.Ident]types.Object),
Implicits: make(map[ast.Node]types.Object),
@@ -165,9 +164,6 @@ func Load(config *compileopts.Config, inputPkg string, clangHeaders string, type
Selections: make(map[*ast.SelectorExpr]*types.Selection),
},
}
- if addInstances != nil {
- addInstances(&pkg.info)
- }
err := decoder.Decode(&pkg.PackageJSON)
if err != nil {
if err == io.EOF {
diff --git a/loader/loader_go118.go b/loader/loader_go118.go
deleted file mode 100644
index d545160e7..000000000
--- a/loader/loader_go118.go
+++ /dev/null
@@ -1,18 +0,0 @@
-//go:build go1.18
-// +build go1.18
-
-package loader
-
-// Workaround for Go 1.17 support. Should be removed once we drop Go 1.17
-// support.
-
-import (
- "go/ast"
- "go/types"
-)
-
-func init() {
- addInstances = func(info *types.Info) {
- info.Instances = make(map[*ast.Ident]types.Instance)
- }
-}
diff --git a/main_test.go b/main_test.go
index a6925cea9..9ddbe52f7 100644
--- a/main_test.go
+++ b/main_test.go
@@ -51,6 +51,7 @@ func TestBuild(t *testing.T) {
"embed/",
"float.go",
"gc.go",
+ "generics.go",
"goroutines.go",
"init.go",
"init_multi.go",
@@ -65,22 +66,10 @@ func TestBuild(t *testing.T) {
"stdlib.go",
"string.go",
"structs.go",
+ "testing.go",
"timers.go",
"zeroalloc.go",
}
- _, minor, err := goenv.GetGorootVersion(goenv.Get("GOROOT"))
- if err != nil {
- t.Fatal("could not read version from GOROOT:", err)
- }
- if minor >= 17 {
- tests = append(tests, "go1.17.go")
- }
- if minor >= 18 {
- tests = append(tests, "generics.go")
- tests = append(tests, "testing_go118.go")
- } else {
- tests = append(tests, "testing.go")
- }
if *testTarget != "" {
// This makes it possible to run one specific test (instead of all),
@@ -201,7 +190,7 @@ func runPlatTests(options compileopts.Options, tests []string, t *testing.T) {
// Does not pass due to high mark false positive rate.
continue
- case "json.go", "stdlib.go", "testing.go", "testing_go118.go":
+ case "json.go", "stdlib.go", "testing.go":
// Breaks interp.
continue
diff --git a/src/internal/itoa/README.md b/src/internal/itoa/README.md
deleted file mode 100644
index 6b666d121..000000000
--- a/src/internal/itoa/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-internal/itoa is new to go as of 1.17.
-This directory should be removed when tinygo drops support for go 1.16.
diff --git a/src/internal/itoa/itoa.go b/src/internal/itoa/itoa.go
deleted file mode 100644
index c6062d9fe..000000000
--- a/src/internal/itoa/itoa.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Simple conversions to avoid depending on strconv.
-
-package itoa
-
-// Itoa converts val to a decimal string.
-func Itoa(val int) string {
- if val < 0 {
- return "-" + Uitoa(uint(-val))
- }
- return Uitoa(uint(val))
-}
-
-// Uitoa converts val to a decimal string.
-func Uitoa(val uint) string {
- if val == 0 { // avoid string allocation
- return "0"
- }
- var buf [20]byte // big enough for 64bit value base 10
- i := len(buf) - 1
- for val >= 10 {
- q := val / 10
- buf[i] = byte('0' + val - q*10)
- i--
- val = q
- }
- // val < 10
- buf[i] = byte('0' + val)
- return string(buf[i:])
-}
diff --git a/src/internal/itoa/itoa_test.go b/src/internal/itoa/itoa_test.go
deleted file mode 100644
index 71931c1e3..000000000
--- a/src/internal/itoa/itoa_test.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package itoa_test
-
-import (
- "fmt"
- "internal/itoa"
- "math"
- "testing"
-)
-
-var (
- minInt64 int64 = math.MinInt64
- maxInt64 int64 = math.MaxInt64
- maxUint64 uint64 = math.MaxUint64
-)
-
-func TestItoa(t *testing.T) {
- tests := []int{int(minInt64), math.MinInt32, -999, -100, -1, 0, 1, 100, 999, math.MaxInt32, int(maxInt64)}
- for _, tt := range tests {
- got := itoa.Itoa(tt)
- want := fmt.Sprint(tt)
- if want != got {
- t.Fatalf("Itoa(%d) = %s, want %s", tt, got, want)
- }
- }
-}
-
-func TestUitoa(t *testing.T) {
- tests := []uint{0, 1, 100, 999, math.MaxUint32, uint(maxUint64)}
- for _, tt := range tests {
- got := itoa.Uitoa(tt)
- want := fmt.Sprint(tt)
- if want != got {
- t.Fatalf("Uitoa(%d) = %s, want %s", tt, got, want)
- }
- }
-}
diff --git a/src/runtime/timer_go118.go b/src/runtime/timer.go
index 894ed8495..134f9b9ac 100644
--- a/src/runtime/timer_go118.go
+++ b/src/runtime/timer.go
@@ -1,6 +1,3 @@
-//go:build go1.18
-// +build go1.18
-
// Portions copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
diff --git a/src/runtime/timer_go116.go b/src/runtime/timer_go116.go
deleted file mode 100644
index 9ff1625a8..000000000
--- a/src/runtime/timer_go116.go
+++ /dev/null
@@ -1,36 +0,0 @@
-//go:build !go1.18
-// +build !go1.18
-
-// Portions copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-
-type puintptr uintptr
-
-// Package time knows the layout of this structure.
-// If this struct changes, adjust ../time/sleep.go:/runtimeTimer.
-type timer struct {
- // If this timer is on a heap, which P's heap it is on.
- // puintptr rather than *p to match uintptr in the versions
- // of this struct defined in other packages.
- pp puintptr
-
- // Timer wakes up at when, and then at when+period, ... (period > 0 only)
- // each time calling f(arg, now) in the timer goroutine, so f must be
- // a well-behaved function and not block.
- //
- // when must be positive on an active timer.
- when int64
- period int64
- f func(interface{}, uintptr)
- arg interface{}
- seq uintptr
-
- // What to set the when field to in timerModifiedXX status.
- nextwhen int64
-
- // The status field holds one of the values below.
- status uint32
-}
diff --git a/src/testing/testing.go b/src/testing/testing.go
index 27b1df54b..a458f2678 100644
--- a/src/testing/testing.go
+++ b/src/testing/testing.go
@@ -511,3 +511,15 @@ type InternalExample struct {
Output string
Unordered bool
}
+
+// MainStart is meant for use by tests generated by 'go test'.
+// It is not meant to be called directly and is not subject to the Go 1 compatibility document.
+// It may change signature from release to release.
+func MainStart(deps interface{}, tests []InternalTest, benchmarks []InternalBenchmark, fuzzTargets []InternalFuzzTarget, examples []InternalExample) *M {
+ Init()
+ return &M{
+ Tests: tests,
+ Benchmarks: benchmarks,
+ deps: deps.(testDeps),
+ }
+}
diff --git a/src/testing/testing_go118.go b/src/testing/testing_go118.go
deleted file mode 100644
index 1c2c835be..000000000
--- a/src/testing/testing_go118.go
+++ /dev/null
@@ -1,16 +0,0 @@
-//go:build go1.18
-// +build go1.18
-
-package testing
-
-// MainStart is meant for use by tests generated by 'go test'.
-// It is not meant to be called directly and is not subject to the Go 1 compatibility document.
-// It may change signature from release to release.
-func MainStart(deps interface{}, tests []InternalTest, benchmarks []InternalBenchmark, fuzzTargets []InternalFuzzTarget, examples []InternalExample) *M {
- Init()
- return &M{
- Tests: tests,
- Benchmarks: benchmarks,
- deps: deps.(testDeps),
- }
-}
diff --git a/src/testing/testing_other.go b/src/testing/testing_other.go
deleted file mode 100644
index 875115e96..000000000
--- a/src/testing/testing_other.go
+++ /dev/null
@@ -1,16 +0,0 @@
-//go:build !go1.18
-// +build !go1.18
-
-package testing
-
-// MainStart is meant for use by tests generated by 'go test'.
-// It is not meant to be called directly and is not subject to the Go 1 compatibility document.
-// It may change signature from release to release.
-func MainStart(deps interface{}, tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) *M {
- Init()
- return &M{
- Tests: tests,
- Benchmarks: benchmarks,
- deps: deps.(testDeps),
- }
-}
diff --git a/testdata/go1.17.go b/testdata/go1.17.go
deleted file mode 100644
index 2a9fba75c..000000000
--- a/testdata/go1.17.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package main
-
-// Test new language features introduced in Go 1.17:
-// https://tip.golang.org/doc/go1.17#language
-// Once this becomes the minimum Go version of TinyGo, these tests should be
-// merged with the regular slice tests.
-
-import "unsafe"
-
-func main() {
- // Test conversion from array to slice.
- slice1 := []int{1, 2, 3, 4}
- arr1 := (*[4]int)(slice1)
- arr1[1] = -2
- arr1[2] = 20
- println("slice to array pointer:", arr1[0], arr1[1], arr1[2], arr1[3])
-
- // Test unsafe.Add.
- arr2 := [...]int{1, 2, 3, 4}
- *(*int)(unsafe.Add(unsafe.Pointer(&arr2[0]), unsafe.Sizeof(int(1))*1)) = 5
- *addInt(&arr2[0], 2) = 8
- println("unsafe.Add array:", arr2[0], arr2[1], arr2[2], arr2[3])
-
- // Test unsafe.Slice.
- arr3 := [...]int{1, 2, 3, 4}
- slice3 := unsafe.Slice(&arr3[1], 3)
- slice3[0] = 9
- slice3[1] = 15
- println("unsafe.Slice array:", len(slice3), cap(slice3), slice3[0], slice3[1], slice3[2])
-}
-
-func addInt(ptr *int, index uintptr) *int {
- return (*int)(unsafe.Add(unsafe.Pointer(ptr), unsafe.Sizeof(int(1))*index))
-}
diff --git a/testdata/go1.17.txt b/testdata/go1.17.txt
deleted file mode 100644
index eafc1b45a..000000000
--- a/testdata/go1.17.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-slice to array pointer: 1 -2 20 4
-unsafe.Add array: 1 5 8 4
-unsafe.Slice array: 3 3 9 15 4
diff --git a/testdata/slice.go b/testdata/slice.go
index cb7eb1bc7..18b80b7c4 100644
--- a/testdata/slice.go
+++ b/testdata/slice.go
@@ -1,5 +1,7 @@
package main
+import "unsafe"
+
type MySlice [32]byte
type myUint8 uint8
@@ -130,6 +132,26 @@ func main() {
}
println()
+ // Test conversion from array to slice.
+ slice1 := []int{1, 2, 3, 4}
+ arr1 := (*[4]int)(slice1)
+ arr1[1] = -2
+ arr1[2] = 20
+ println("slice to array pointer:", arr1[0], arr1[1], arr1[2], arr1[3])
+
+ // Test unsafe.Add.
+ arr2 := [...]int{1, 2, 3, 4}
+ *(*int)(unsafe.Add(unsafe.Pointer(&arr2[0]), unsafe.Sizeof(int(1))*1)) = 5
+ *addInt(&arr2[0], 2) = 8
+ println("unsafe.Add array:", arr2[0], arr2[1], arr2[2], arr2[3])
+
+ // Test unsafe.Slice.
+ arr3 := [...]int{1, 2, 3, 4}
+ slice3 := unsafe.Slice(&arr3[1], 3)
+ slice3[0] = 9
+ slice3[1] = 15
+ println("unsafe.Slice array:", len(slice3), cap(slice3), slice3[0], slice3[1], slice3[2])
+
// Verify the fix in https://github.com/tinygo-org/tinygo/pull/119
var unnamed [32]byte
var named MySlice
@@ -177,3 +199,7 @@ func makeUint32(x uint32) uint32 { return x }
func makeUint64(x uint64) uint64 { return x }
func makeUintptr(x uintptr) uintptr { return x }
func makeMyUint8(x myUint8) myUint8 { return x }
+
+func addInt(ptr *int, index uintptr) *int {
+ return (*int)(unsafe.Add(unsafe.Pointer(ptr), unsafe.Sizeof(int(1))*index))
+}
diff --git a/testdata/slice.txt b/testdata/slice.txt
index 75a32d10e..ea8d4491a 100644
--- a/testdata/slice.txt
+++ b/testdata/slice.txt
@@ -13,3 +13,6 @@ grow: len=7 cap=8 data: 42 -1 -2 1 2 4 5
grow: len=7 cap=8 data: 42 -1 -2 1 2 4 5
grow: len=14 cap=16 data: 42 -1 -2 1 2 4 5 42 -1 -2 1 2 4 5
bytes: len=6 cap=6 data: 1 2 3 102 111 111
+slice to array pointer: 1 -2 20 4
+unsafe.Add array: 1 5 8 4
+unsafe.Slice array: 3 3 9 15 4
diff --git a/testdata/testing.go b/testdata/testing.go
index 2c090da1b..4c1cf44ef 100644
--- a/testdata/testing.go
+++ b/testdata/testing.go
@@ -55,6 +55,8 @@ var tests = []testing.InternalTest{
var benchmarks = []testing.InternalBenchmark{}
+var fuzzes = []testing.InternalFuzzTarget{}
+
var examples = []testing.InternalExample{}
// A fake regexp matcher.
@@ -73,7 +75,7 @@ func fakeMatchString(pat, str string) (bool, error) {
func main() {
testing.Init()
flag.Set("test.run", ".*/B")
- m := testing.MainStart(matchStringOnly(fakeMatchString /*regexp.MatchString*/), tests, benchmarks, examples)
+ m := testing.MainStart(matchStringOnly(fakeMatchString /*regexp.MatchString*/), tests, benchmarks, fuzzes, examples)
exitcode := m.Run()
if exitcode != 0 {
diff --git a/testdata/testing_go118.go b/testdata/testing_go118.go
deleted file mode 100644
index 4c1cf44ef..000000000
--- a/testdata/testing_go118.go
+++ /dev/null
@@ -1,100 +0,0 @@
-package main
-
-// TODO: also test the verbose version.
-
-import (
- "errors"
- "flag"
- "io"
- "strings"
- "testing"
-)
-
-func TestFoo(t *testing.T) {
- t.Log("log Foo.a")
- t.Log("log Foo.b")
-}
-
-func TestBar(t *testing.T) {
- t.Log("log Bar")
- t.Log("log g\nh\ni\n")
- t.Run("Bar1", func(t *testing.T) {})
- t.Run("Bar2", func(t *testing.T) {
- t.Log("log Bar2\na\nb\nc")
- t.Error("failed")
- t.Log("after failed")
- })
- t.Run("Bar3", func(t *testing.T) {})
- t.Log("log Bar end")
-}
-
-func TestAllLowercase(t *testing.T) {
- names := []string {
- "alpha",
- "BETA",
- "gamma",
- "BELTA",
- }
-
- for _, name := range names {
- t.Run(name, func(t *testing.T) {
- if 'a' <= name[0] && name[0] <= 'a' {
- t.Logf("expected lowercase name, and got one, so I'm happy")
- } else {
- t.Errorf("expected lowercase name, got %s", name)
- }
- })
- }
-}
-
-var tests = []testing.InternalTest{
- {"TestFoo", TestFoo},
- {"TestBar", TestBar},
- {"TestAllLowercase", TestAllLowercase},
-}
-
-var benchmarks = []testing.InternalBenchmark{}
-
-var fuzzes = []testing.InternalFuzzTarget{}
-
-var examples = []testing.InternalExample{}
-
-// A fake regexp matcher.
-// Inflexible, but saves 50KB of flash and 50KB of RAM per -size full,
-// and lets tests pass on cortex-m.
-// Must match the one in src/testing/match.go that is substituted on bare-metal platforms,
-// or "make test" will fail there.
-func fakeMatchString(pat, str string) (bool, error) {
- if pat == ".*" {
- return true, nil
- }
- matched := strings.Contains(str, pat)
- return matched, nil
-}
-
-func main() {
- testing.Init()
- flag.Set("test.run", ".*/B")
- m := testing.MainStart(matchStringOnly(fakeMatchString /*regexp.MatchString*/), tests, benchmarks, fuzzes, examples)
-
- exitcode := m.Run()
- if exitcode != 0 {
- println("exitcode:", exitcode)
- }
-}
-
-var errMain = errors.New("testing: unexpected use of func Main")
-
-// matchStringOnly is part of upstream, and is used below to provide a dummy deps to pass to MainStart
-// so it can be run with go (tested with go 1.16) to provide a baseline for the regression test.
-// See c56cc9b3b57276. Unfortunately, testdeps is internal, so we can't just use &testdeps.TestDeps{}.
-type matchStringOnly func(pat, str string) (bool, error)
-
-func (f matchStringOnly) MatchString(pat, str string) (bool, error) { return f(pat, str) }
-func (f matchStringOnly) StartCPUProfile(w io.Writer) error { return errMain }
-func (f matchStringOnly) StopCPUProfile() {}
-func (f matchStringOnly) WriteProfileTo(string, io.Writer, int) error { return errMain }
-func (f matchStringOnly) ImportPath() string { return "" }
-func (f matchStringOnly) StartTestLog(io.Writer) {}
-func (f matchStringOnly) StopTestLog() error { return errMain }
-func (f matchStringOnly) SetPanicOnExit0(bool) {}
diff --git a/testdata/testing_go118.txt b/testdata/testing_go118.txt
deleted file mode 100644
index 6a8ee0591..000000000
--- a/testdata/testing_go118.txt
+++ /dev/null
@@ -1,21 +0,0 @@
---- FAIL: TestBar (0.00s)
- log Bar
- log g
- h
- i
-
- --- FAIL: TestBar/Bar2 (0.00s)
- log Bar2
- a
- b
- c
- failed
- after failed
- log Bar end
---- FAIL: TestAllLowercase (0.00s)
- --- FAIL: TestAllLowercase/BETA (0.00s)
- expected lowercase name, got BETA
- --- FAIL: TestAllLowercase/BELTA (0.00s)
- expected lowercase name, got BELTA
-FAIL
-exitcode: 1
diff --git a/tests/text/template/smoke/smoke_test.go b/tests/text/template/smoke/smoke_test.go
index c097f9e9a..78c33706b 100644
--- a/tests/text/template/smoke/smoke_test.go
+++ b/tests/text/template/smoke/smoke_test.go
@@ -1,6 +1,3 @@
-//go:build go1.16
-// +build go1.16
-
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.