diff --git a/.github/workflows/check_release_notes.yml b/.github/workflows/check_release_notes.yml
new file mode 100644
index 000000000000..f8073d10cd77
--- /dev/null
+++ b/.github/workflows/check_release_notes.yml
@@ -0,0 +1,200 @@
+name: Check release notes
+on:
+ pull_request:
+ types: [opened, synchronize, reopened]
+ branches:
+ - 'main'
+ - 'release/*'
+permissions:
+ contents: write
+ pull-requests: write
+
+jobs:
+ check_release_notes:
+ #if: github.event.issue.pull_request != ''
+ runs-on: ubuntu-22.04
+ steps:
+ - name: Get github ref
+ uses: actions/github-script@v3
+ id: get-pr
+ with:
+ script: |
+ const result = await github.pulls.get({
+ pull_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ });
+ return { "pr_number": context.issue.number, "ref": result.data.head.ref, "repository": result.data.head.repo.full_name};
+ - name: Checkout repo
+ uses: actions/checkout@v2
+ with:
+ repository: ${{ fromJson(steps.get-pr.outputs.result).repository }}
+ ref: ${{ fromJson(steps.get-pr.outputs.result).ref }}
+ fetch-depth: 0
+ - name: Check for release notes changes
+ id: release_notes_changes
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ set -e
+ EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
+
+ # Parse version from eng/Versions.props
+ # For FSarp.Core:
+ # 8
+ # 0
+ # 100
+ # For FCS:
+ # FCSMajorVersion>43
+ # 8
+ # $(FSBuildVersion)
+ # For VS:
+ # 17
+ # 8
+
+ _fs_major_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props)
+ _fs_minor_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props)
+ _fs_build_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props)
+ _fcs_major_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props)
+ _fcs_minor_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props)
+ _fcs_build_version=$_fs_build_version
+ _vs_major_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props)
+ _vs_minor_version=$(grep -oPm1 "(?<=)[^<]+" eng/Versions.props)
+
+ FSHARP_CORE_VERSION="$_fs_major_version.$_fs_minor_version.$_fs_build_version"
+ FCS_VERSION="$_fcs_major_version.$_fcs_minor_version.$_fcs_build_version"
+ VISUAL_STUDIO_VERSION="$_vs_major_version.$_vs_minor_version"
+
+ echo "Found F# version: ${FSHARP_CORE_VERSION}"
+ echo "Found FCS version: ${FCS_VERSION}"
+ echo "Found Visual Studio version: ${VISUAL_STUDIO_VERSION}"
+
+ [[ "$FSHARP_CORE_VERSION" =~ ^[0-9]+\.[0-9]+.[0-9]+$ ]] || (echo "Invalid FSharp.Core Version parsed"; exit 1)
+ [[ "$FCS_VERSION" =~ ^[0-9]+\.[0-9]+.[0-9]+$ ]] || (echo "Invalid FCS Version parsed"; exit 1)
+ [[ "$VISUAL_STUDIO_VERSION" =~ ^[0-9]+\.[0-9]+$ ]] || (echo "Invalid Visual Studio Version parsed"; exit 1)
+
+ _release_notes_base_path='docs/release-notes'
+ _fsharp_core_release_notes_path="${_release_notes_base_path}/FSharp.Core/${FSHARP_CORE_VERSION}.md"
+ _fsharp_compiler_release_notes_path="${_release_notes_base_path}/FSharp.Compiler.Service/${FSHARP_CORE_VERSION}.md"
+ _fsharp_language_release_notes_path="${_release_notes_base_path}/Language/preview.md"
+ _fsharp_vs_release_notes_path="${_release_notes_base_path}/VisualStudio/${VISUAL_STUDIO_VERSION}.md"
+
+ readonly paths=(
+ "src/FSharp.Core|${_fsharp_core_release_notes_path}"
+ "src/Compiler|${_fsharp_compiler_release_notes_path}"
+ "src/Compiler/Facilities/LanguageFeatures.fsi|${_fsharp_language_release_notes_path}"
+ "vsintegration/src|${_fsharp_vs_release_notes_path}"
+ ".github|NONEXISTING_NOTES_FOR_TESTING.md"
+ )
+
+ # Check all changed paths
+ RELEASE_NOTES_MESSAGE=""
+ RELEASE_NOTES_MESSAGE_DETAILS=""
+ RELEASE_NOTES_FOUND=""
+ RELEASE_NOTES_CHANGES_SUMMARY=""
+ RELEASE_NOTES_NOT_FOUND=""
+
+ _modified_paths=`gh pr view ${PR_NUMBER} --json files --jq '.files.[].path'`
+
+ for fields in ${paths[@]}
+ do
+ IFS=$'|' read -r path release_notes <<< "$fields"
+ echo "Checking for changed files in: $path"
+
+ # Check if path is in modified files:
+ if [[ "${_modified_paths[@]}" =~ "${path}" ]]; then
+ echo "Found $path in modified files"
+ echo "Checking if release notes modified in: $release_notes"
+ if [[ "${_modified_paths[@]}" =~ "${release_notes}" ]]; then
+ echo "Found $release_notes in modified files"
+ RELEASE_NOTES_FOUND+="| \`$path\` | \`$release_notes\` |"
+ RELEASE_NOTES_FOUND+=$'\n'
+ else
+ echo "Did not find $release_notes in modified files"
+ RELEASE_NOTES_NOT_FOUND+="| \`$path\` | \`$release_notes\` |"
+ RELEASE_NOTES_NOT_FOUND+=$'\n'
+ fi
+ else
+ echo "Nothing found, no release notes required"
+ fi
+
+ done
+
+ if [[ $RELEASE_NOTES_NOT_FOUND != "" ]]; then
+ RELEASE_NOTES_MESSAGE_DETAILS+=$"> [!CAUTION]"
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$"> No release notes found for the following paths:"
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$">"
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$"> Please add an entry with short description of the change to the release notes file as well as link to this pull request."
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+='| Change path | Release notes path |'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+='| ---------------- | ------------------ |'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+="${RELEASE_NOTES_NOT_FOUND}"
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ fi
+
+ if [[ $RELEASE_NOTES_FOUND != "" ]]; then
+ RELEASE_NOTES_MESSAGE_DETAILS+=$"> :white_check_mark: Found changes and release notes in following paths:"
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+='| Change path | Release notes path |'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+='| ---------------- | ------------------ |'
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ RELEASE_NOTES_MESSAGE_DETAILS+="${RELEASE_NOTES_FOUND}"
+ RELEASE_NOTES_MESSAGE_DETAILS+=$'\n'
+ fi
+
+ RELEASE_NOTES_MESSAGE+=$'## Release notes check\n\n'
+
+ if [[ $RELEASE_NOTES_MESSAGE_DETAILS == "" ]]; then
+ RELEASE_NOTES_MESSAGE+=$'### No release notes required.'
+ else
+ RELEASE_NOTES_MESSAGE+=$'### Release notes required.\n\n'
+ RELEASE_NOTES_MESSAGE+=$RELEASE_NOTES_MESSAGE_DETAILS
+ fi
+
+ echo "release-notes-check-message<<$EOF" >>$GITHUB_OUTPUT
+ echo "${RELEASE_NOTES_MESSAGE}" >>$GITHUB_OUTPUT
+ echo "$EOF" >>$GITHUB_OUTPUT
+
+ if [[ $RELEASE_NOTES_NOT_FOUND != "" ]]; then
+ exit 1
+ fi
+ # Did bot already commented the PR?
+ - name: Find Comment
+ if: success() || failure()
+ uses: peter-evans/find-comment@v2.4.0
+ id: fc
+ with:
+ issue-number: ${{ github.event.pull_request.number }}
+ comment-author: 'github-actions[bot]'
+ body-includes: ''
+ # If not, create a new comment
+ - name: Create comment
+ if: steps.fc.outputs.comment-id == '' && (success() || failure())
+ uses: peter-evans/create-or-update-comment@v3.1.0
+ with:
+ issue-number: ${{ github.event.pull_request.number }}
+ body: |
+
+ ${{steps.release_notes_changes.outputs.release-notes-check-message}}
+ #reactions: rocket
+ # If yes, update the comment
+ - name: Update comment
+ if: steps.fc.outputs.comment-id != '' && (success() || failure())
+ uses: peter-evans/create-or-update-comment@v3.1.0
+ with:
+ comment-id: ${{ steps.fc.outputs.comment-id }}
+ edit-mode: replace
+ body: |
+
+ ${{steps.release_notes_changes.outputs.release-notes-check-message}}
+ #reactions: hooray
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index d16b15a6ed02..248476682100 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -283,7 +283,7 @@ stages:
# We will try to restore both FSharp.Core and FCS and if restore is _successful_, package version needs to be bumped.
# NOTE: This CI check should only run on the release branches.
- job: Check_Published_Package_Versions
- condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), or(startsWith(variables['System.PullRequest.SourceBranch'], 'release/dev'), startsWith(variables['System.PullRequest.TargetBranch'], 'release/dev')))
+ # condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), or(startsWith(variables['System.PullRequest.SourceBranch'], 'release/dev'), startsWith(variables['System.PullRequest.TargetBranch'], 'release/dev')))
pool:
vmImage: $(UbuntuMachineQueueName)
strategy:
diff --git a/docs/release-notes/FSharp.Compiler.Service/8.0.200.md b/docs/release-notes/FSharp.Compiler.Service/8.0.200.md
new file mode 100644
index 000000000000..33e811413027
--- /dev/null
+++ b/docs/release-notes/FSharp.Compiler.Service/8.0.200.md
@@ -0,0 +1 @@
+- Miscellaneous fixes to parens analysis - https://github.com/dotnet/fsharp/pull/16262
\ No newline at end of file
diff --git a/docs/release-notes/FSharp.Core/8.0.200.md b/docs/release-notes/FSharp.Core/8.0.200.md
new file mode 100644
index 000000000000..8bed6454108f
--- /dev/null
+++ b/docs/release-notes/FSharp.Core/8.0.200.md
@@ -0,0 +1 @@
+- More inlines for Result module - https://github.com/dotnet/fsharp/pull/16106
\ No newline at end of file
diff --git a/docs/release-notes/Language/preview.md b/docs/release-notes/Language/preview.md
new file mode 100644
index 000000000000..7d9996a870e4
--- /dev/null
+++ b/docs/release-notes/Language/preview.md
@@ -0,0 +1 @@
+- Feature: Better unmanaged structs handling - https://github.com/dotnet/fsharp/pull/12154
\ No newline at end of file
diff --git a/docs/release-notes/VisualStudio/17.9.md b/docs/release-notes/VisualStudio/17.9.md
new file mode 100644
index 000000000000..7adc4118f71c
--- /dev/null
+++ b/docs/release-notes/VisualStudio/17.9.md
@@ -0,0 +1 @@
+- Respect line limit in quick info popup - https://github.com/dotnet/fsharp/pull/16208
\ No newline at end of file
diff --git a/eng/Versions.props b/eng/Versions.props
index c96ae7ba9995..d09ec8ccaf66 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -12,10 +12,11 @@
beta
+
8
0
- 100
+ 200
0
@@ -55,8 +56,9 @@
$(FSToolsMajorVersion).$(FSToolsMinorVersion).$(FSToolsBuildVersion).$(FSToolsRevisionVersion)
+
17
- 8
+ 9
$(VSMajorVersion).0
$(VSMajorVersion).$(VSMinorVersion).0
$(VSAssemblyVersionPrefix).0
diff --git a/src/Compiler/Facilities/LanguageFeatures.fsi b/src/Compiler/Facilities/LanguageFeatures.fsi
index e3d7e7232bc1..a9b1c35db545 100644
--- a/src/Compiler/Facilities/LanguageFeatures.fsi
+++ b/src/Compiler/Facilities/LanguageFeatures.fsi
@@ -111,3 +111,4 @@ type LanguageVersion =
static member GetFeatureVersionString: feature: LanguageFeature -> string
static member Default: LanguageVersion
+
diff --git a/src/FSharp.Core/prim-types-prelude.fs b/src/FSharp.Core/prim-types-prelude.fs
index 63c370ba332e..9a002450382d 100644
--- a/src/FSharp.Core/prim-types-prelude.fs
+++ b/src/FSharp.Core/prim-types-prelude.fs
@@ -119,3 +119,4 @@ namespace Microsoft.FSharp.Core
type voidptr = (# "void*" #)
type ilsigptr<'T> = (# "!0*" #)
+
diff --git a/vsintegration/src/Directory.Build.props b/vsintegration/src/Directory.Build.props
index f7a21adf80c9..af52f02d17bb 100644
--- a/vsintegration/src/Directory.Build.props
+++ b/vsintegration/src/Directory.Build.props
@@ -10,3 +10,4 @@
+