From 076f53ea93e35e5a54830d534fcb492895e56d08 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 11:08:57 +0200 Subject: [PATCH 1/7] Go: Update to 1.27 --- MODULE.bazel | 2 +- go/actions/test/action.yml | 2 +- go/extractor/go.mod | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 8bdc850e3271..1ae226f0e89b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -273,7 +273,7 @@ use_repo( ) go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") -go_sdk.download(version = "1.26.4") +go_sdk.download(version = "1.27rc1") go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//go/extractor:go.mod") diff --git a/go/actions/test/action.yml b/go/actions/test/action.yml index 3cc3334d39ed..05184dae1d8e 100644 --- a/go/actions/test/action.yml +++ b/go/actions/test/action.yml @@ -4,7 +4,7 @@ inputs: go-test-version: description: Which Go version to use for running the tests required: false - default: "~1.26.4" + default: "1.27.0-rc.1" run-code-checks: description: Whether to run formatting, code and qhelp generation checks required: false diff --git a/go/extractor/go.mod b/go/extractor/go.mod index 5de56683a3e0..e986a0706d14 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -1,8 +1,8 @@ module github.com/github/codeql-go/extractor -go 1.26 +go 1.27 -toolchain go1.26.4 +toolchain go1.27rc1 // when updating this, run // bazel run @rules_go//go -- mod tidy From 36c7fba26d6a26d3deae4b15f235179cf91181ec Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 11:38:38 +0200 Subject: [PATCH 2/7] Go: Bump `maxGoVersion` to 1.27 --- go/extractor/autobuilder/build-environment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/extractor/autobuilder/build-environment.go b/go/extractor/autobuilder/build-environment.go index c660373205b2..bd7fc0adabe1 100644 --- a/go/extractor/autobuilder/build-environment.go +++ b/go/extractor/autobuilder/build-environment.go @@ -12,7 +12,7 @@ import ( ) var minGoVersion = util.NewSemVer("1.11") -var maxGoVersion = util.NewSemVer("1.26") +var maxGoVersion = util.NewSemVer("1.27") type versionInfo struct { goModVersion util.SemVer // The version of Go found in the go directive in the `go.mod` file. From f0d1d6525470b55dc4c45a3a6beff656b2908fa5 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 11:42:04 +0200 Subject: [PATCH 3/7] Go: Update test formatting --- go/extractor/toolchain/toolchain_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/extractor/toolchain/toolchain_test.go b/go/extractor/toolchain/toolchain_test.go index 8a6b38318cb9..a62c9016a700 100644 --- a/go/extractor/toolchain/toolchain_test.go +++ b/go/extractor/toolchain/toolchain_test.go @@ -8,9 +8,9 @@ import ( func TestParseGoVersion(t *testing.T) { tests := map[string]string{ - "go version go1.18.9 linux/amd64": "go1.18.9", - "go version go1.26.3-X:nodwarf5 linux/amd64": "go1.26.3", - "go version go1.26.3rc1 linux/amd64": "go1.26.3rc1", + "go version go1.18.9 linux/amd64": "go1.18.9", + "go version go1.26.3-X:nodwarf5 linux/amd64": "go1.26.3", + "go version go1.26.3rc1 linux/amd64": "go1.26.3rc1", "warning: GOPATH set to GOROOT (/usr/local/go) has no effect\ngo version go1.18.9 linux/amd64": "go1.18.9", } for input, expected := range tests { From 4af6feda68d01351836c384f5069e740f4b97ca3 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 12:37:39 +0200 Subject: [PATCH 4/7] Go: Add change note --- go/ql/lib/change-notes/2026-06-25-go-1.27.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 go/ql/lib/change-notes/2026-06-25-go-1.27.md diff --git a/go/ql/lib/change-notes/2026-06-25-go-1.27.md b/go/ql/lib/change-notes/2026-06-25-go-1.27.md new file mode 100644 index 000000000000..b1998aee7f54 --- /dev/null +++ b/go/ql/lib/change-notes/2026-06-25-go-1.27.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* Go 1.27 is now supported. From 0c12d920ab1d8a16031aab5736070e8465ced063 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 12:39:14 +0200 Subject: [PATCH 5/7] Go: Update supported versions to include 1.27 --- docs/codeql/reusables/supported-versions-compilers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index b73c9d7e6e97..814c39f90103 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -17,7 +17,7 @@ .NET 5, .NET 6, .NET 7, .NET 8, .NET 9, .NET 10","``.sln``, ``.slnx``, ``.csproj``, ``.cs``, ``.cshtml``, ``.xaml``" GitHub Actions,"Not applicable",Not applicable,"``.github/workflows/*.yml``, ``.github/workflows/*.yaml``, ``**/action.yml``, ``**/action.yaml``" - Go (aka Golang), "Go up to 1.26", "Go 1.11 or more recent", ``.go`` + Go (aka Golang), "Go up to 1.27", "Go 1.11 or more recent", ``.go`` Java,"Java 7 to 26 [6]_","javac (OpenJDK and Oracle JDK), Eclipse compiler for Java (ECJ) [7]_",``.java`` From 966f86ba5735f3a38d1c06b3ac8a8f8d3b1adbca Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 15:36:53 +0200 Subject: [PATCH 6/7] Go: Fix `findMethodOnTypeWithGivenReceiver` for Go 1.27 --- go/extractor/trap/labels.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/extractor/trap/labels.go b/go/extractor/trap/labels.go index 473e2e761f2e..ca43bc370252 100644 --- a/go/extractor/trap/labels.go +++ b/go/extractor/trap/labels.go @@ -187,7 +187,7 @@ func findMethodOnTypeWithGivenReceiver(tp types.Type, object types.Object) *type if definedType, ok := tp.(*types.Named); ok { for i := 0; i < definedType.NumMethods(); i++ { meth := definedType.Method(i) - if object == meth.Type().(*types.Signature).Recv() { + if object == meth.Type().(*types.Signature).Recv().Origin() { return meth } } From 6595e11aeb68fe1623beb5678e5b1e5badea1a60 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 30 Jun 2026 10:25:06 +0200 Subject: [PATCH 7/7] Go: Add generic method test --- .../GenericFunctionInstantiationExpr.expected | 1 + .../semmle/go/Function/TypeParamType.expected | 7 +++++++ .../semmle/go/Function/genericMethods.go | 19 +++++++++++++++++++ .../semmle/go/Function/getParameter.expected | 4 ++++ .../go/Function/getTypeParameter.expected | 3 +++ .../library-tests/semmle/go/Function/go.mod | 4 +++- 6 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 go/ql/test/library-tests/semmle/go/Function/genericMethods.go diff --git a/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected b/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected index 6528a0ae7f3d..d244960a5e09 100644 --- a/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected +++ b/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected @@ -6,3 +6,4 @@ | genericFunctions.go:45:6:45:50 | generic function instantiation expression | genericFunctions.go:45:6:45:33 | GenericFunctionTwoTypeParams | 1 | genericFunctions.go:45:43:45:49 | float64 | | genericFunctions.go:141:6:141:41 | generic function instantiation expression | genericFunctions.go:141:6:141:33 | GenericFunctionInAnotherFile | 0 | genericFunctions.go:141:35:141:40 | string | | genericFunctions.go:146:6:146:55 | generic function instantiation expression | genericFunctions.go:146:6:146:47 | selection of GenericFunctionInAnotherPackage | 0 | genericFunctions.go:146:49:146:54 | string | +| genericMethods.go:13:2:13:23 | generic function instantiation expression | genericMethods.go:13:2:13:18 | selection of GenericMethod1 | 0 | genericMethods.go:13:20:13:22 | int | diff --git a/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected b/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected index bda7c1517975..c3bd97c0d92c 100644 --- a/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected +++ b/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected @@ -19,6 +19,9 @@ numberOfTypeParameters | genericFunctions.go:150:6:150:36 | multipleAnonymousTypeParamsFunc | 3 | | genericFunctions.go:152:6:152:36 | multipleAnonymousTypeParamsType | 3 | | genericFunctions.go:154:51:154:51 | f | 3 | +| genericMethods.go:5:33:5:46 | GenericMethod1 | 1 | +| genericMethods.go:7:6:7:28 | StructForGenericMethod2 | 1 | +| genericMethods.go:9:36:9:49 | GenericMethod2 | 2 | #select | codeql-go-tests/function.EdgeConstraint | 0 | Node | interface { } | | codeql-go-tests/function.Element | 0 | S | interface { } | @@ -44,6 +47,10 @@ numberOfTypeParameters | codeql-go-tests/function.New | 0 | Node | NodeConstraint | | codeql-go-tests/function.New | 1 | Edge | EdgeConstraint | | codeql-go-tests/function.NodeConstraint | 0 | Edge | interface { } | +| codeql-go-tests/function.StructForGenericMethod1.GenericMethod1 | 0 | P | interface { } | +| codeql-go-tests/function.StructForGenericMethod2 | 0 | P | interface { } | +| codeql-go-tests/function.StructForGenericMethod2.GenericMethod2 | 0 | P | interface { } | +| codeql-go-tests/function.StructForGenericMethod2.GenericMethod2 | 0 | Q | interface { } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 0 | _ | interface { } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 1 | _ | interface { string } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 2 | _ | interface { } | diff --git a/go/ql/test/library-tests/semmle/go/Function/genericMethods.go b/go/ql/test/library-tests/semmle/go/Function/genericMethods.go new file mode 100644 index 000000000000..b6eb4d980e97 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/Function/genericMethods.go @@ -0,0 +1,19 @@ +package main + +type StructForGenericMethod1 struct{} + +func (*StructForGenericMethod1) GenericMethod1[P any](x P) {} + +type StructForGenericMethod2[P any] struct{} + +func (*StructForGenericMethod2[P]) GenericMethod2[Q any](x Q) {} + +func generic_methods(s1 StructForGenericMethod1, s2 StructForGenericMethod2[int]) { + // Call the generic method specifying the type + s1.GenericMethod1[int](1) + //s2.GenericMethod2[string]("hello") + + // Call the generic method without specifying the type + s1.GenericMethod1("hello") + //s2.GenericMethod2(42) +} diff --git a/go/ql/test/library-tests/semmle/go/Function/getParameter.expected b/go/ql/test/library-tests/semmle/go/Function/getParameter.expected index 80171d5e79a6..38b3d78b50df 100644 --- a/go/ql/test/library-tests/semmle/go/Function/getParameter.expected +++ b/go/ql/test/library-tests/semmle/go/Function/getParameter.expected @@ -11,6 +11,10 @@ | genericFunctions.go:138:29:138:40 | ShortestPath | 1 | genericFunctions.go:138:48:138:49 | to | | genericFunctions.go:138:29:138:40 | ShortestPath | -1 | genericFunctions.go:138:7:138:7 | g | | genericFunctions.go:154:51:154:51 | f | -1 | genericFunctions.go:154:7:154:7 | x | +| genericMethods.go:5:33:5:46 | GenericMethod1 | 0 | genericMethods.go:5:55:5:55 | x | +| genericMethods.go:9:36:9:49 | GenericMethod2 | 0 | genericMethods.go:9:58:9:58 | x | +| genericMethods.go:11:6:11:20 | generic_methods | 0 | genericMethods.go:11:22:11:23 | s1 | +| genericMethods.go:11:6:11:20 | generic_methods | 1 | genericMethods.go:11:50:11:51 | s2 | | main.go:7:6:7:7 | f1 | 0 | main.go:7:9:7:9 | x | | main.go:9:12:9:13 | f2 | 0 | main.go:9:15:9:15 | x | | main.go:9:12:9:13 | f2 | 1 | main.go:9:18:9:18 | y | diff --git a/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected b/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected index 27a89adf95e2..3605361d7dfa 100644 --- a/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected +++ b/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected @@ -19,3 +19,6 @@ | genericFunctions.go:152:6:152:69 | type declaration specifier | TypeSpec | 0 | genericFunctions.go:152:38:152:42 | type parameter declaration | 0 | genericFunctions.go:152:38:152:38 | _ | genericFunctions.go:152:40:152:42 | any | interface { } | | genericFunctions.go:152:6:152:69 | type declaration specifier | TypeSpec | 1 | genericFunctions.go:152:45:152:52 | type parameter declaration | 0 | genericFunctions.go:152:45:152:45 | _ | genericFunctions.go:152:47:152:52 | string | interface { string } | | genericFunctions.go:152:6:152:69 | type declaration specifier | TypeSpec | 2 | genericFunctions.go:152:55:152:59 | type parameter declaration | 0 | genericFunctions.go:152:55:152:55 | _ | genericFunctions.go:152:57:152:59 | any | interface { } | +| genericMethods.go:5:1:5:61 | function declaration | MethodDecl | 0 | genericMethods.go:5:48:5:52 | type parameter declaration | 0 | genericMethods.go:5:48:5:48 | P | genericMethods.go:5:50:5:52 | any | interface { } | +| genericMethods.go:7:6:7:45 | type declaration specifier | TypeSpec | 0 | genericMethods.go:7:30:7:34 | type parameter declaration | 0 | genericMethods.go:7:30:7:30 | P | genericMethods.go:7:32:7:34 | any | interface { } | +| genericMethods.go:9:1:9:65 | function declaration | MethodDecl | 0 | genericMethods.go:9:51:9:55 | type parameter declaration | 0 | genericMethods.go:9:51:9:51 | Q | genericMethods.go:9:53:9:55 | any | interface { } | diff --git a/go/ql/test/library-tests/semmle/go/Function/go.mod b/go/ql/test/library-tests/semmle/go/Function/go.mod index 85d3db5c5a37..9c06e02b0eda 100644 --- a/go/ql/test/library-tests/semmle/go/Function/go.mod +++ b/go/ql/test/library-tests/semmle/go/Function/go.mod @@ -1,6 +1,8 @@ module codeql-go-tests/function -go 1.18 +go 1.27 + +toolchain go1.27rc1 require github.com/anotherpkg v0.0.0-20200203000000-0000000000000