Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/release-notes/.FSharp.Compiler.Service/11.0.100.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
* Preserve source range for type errors on empty-bodied computation expressions (e.g. `foo {}`) in pipelines, function arguments, and type-annotated contexts, instead of reporting `unknown(1,1)`. ([Issue #19550](https://github.com/dotnet/fsharp/issues/19550), [PR #19849](https://github.com/dotnet/fsharp/pull/19849))
* Fix multiline nested type arguments failing to parse when the closing `>` aligns with the opening type name's column. ([Issue #15171](https://github.com/dotnet/fsharp/issues/15171))
* Tooltip "Full name" now shows demangled companion module names (e.g. `MyType.func` instead of `MyTypeModule.func`). ([Issue #17335](https://github.com/dotnet/fsharp/issues/17335), [PR #19867](https://github.com/dotnet/fsharp/pull/19867))
* Fix spurious FS0410 accessibility error when tuple-deconstructing bindings use private types in the same module scope. ([Issue #4161](https://github.com/dotnet/fsharp/issues/4161), [PR #19947](https://github.com/dotnet/fsharp/pull/19947))
* Fix internal error (FS0193) when calling an indexed property setter with a named argument that matches an indexer parameter. ([Issue #16034](https://github.com/dotnet/fsharp/issues/16034), [PR #19851](https://github.com/dotnet/fsharp/pull/19851))
* Fix missing FS1182 ("unused binding") warning for unused `let` function bindings inside class types. ([Issue #13849](https://github.com/dotnet/fsharp/issues/13849), [PR #19805](https://github.com/dotnet/fsharp/pull/19805))
* Fix internal compiler error FS1110 in `task { let! }` (and other computation expressions) when a generic IL extension method whose `this`-parameter is a method-level type variable is in scope (e.g. `open ReactiveUI`). Regression from PR #19536. ([Issue #19936](https://github.com/dotnet/fsharp/issues/19936))
Expand Down
13 changes: 8 additions & 5 deletions src/Compiler/Checking/PostInferenceChecks.fs
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ let isLessAccessibleWithVisibility (cenv: cenv) itemAccess refAccess =
let thisCompPath = compPathOfCcu cenv.viewCcu
isLessAccessible (itemAccess |> AccessInternalsVisibleToAsInternal thisCompPath cenv.internalsVisibleToPaths) refAccess

let CheckTypeForAccess (cenv: cenv) env objName valAcc m ty =
let CheckTypeForAccess (cenv: cenv) env objName valAcc skipAccessibilityCheckForCompilerGeneratedVal m ty =
if cenv.reportErrors then

let visitType ty =
Expand All @@ -534,7 +534,7 @@ let CheckTypeForAccess (cenv: cenv) env objName valAcc m ty =
match tryTcrefOfAppTy cenv.g ty with
| ValueNone -> ()
| ValueSome tcref ->
if isLessAccessibleWithVisibility cenv tcref.Accessibility valAcc then
if not skipAccessibilityCheckForCompilerGeneratedVal && isLessAccessibleWithVisibility cenv tcref.Accessibility valAcc then
errorR(Error(FSComp.SR.chkTypeLessAccessibleThanType(tcref.DisplayName, objName()), m))

CheckTypeDeep cenv (visitType, None, None, None, None) cenv.g env NoInfo ty
Expand Down Expand Up @@ -2135,7 +2135,10 @@ and CheckBinding cenv env alwaysCheckNoReraise ctxt (TBind(v, bindRhs, _) as bin
// Check accessibility
if (v.IsMemberOrModuleBinding || v.IsMember) && not v.IsIncrClassGeneratedMember then
let access = AdjustAccess (IsHiddenVal env.sigToImplRemapInfo v) (fun () -> v.DeclaringEntity.CompilationPath) v.Accessibility
CheckTypeForAccess cenv env (fun () -> NicePrint.stringOfQualifiedValOrMember cenv.denv cenv.infoReader vref) access v.Range v.Type
// Compiler-generated patternInput temps are module-init scaffolding; their promoted
// accessibility does not reflect the enclosing binding scope (dotnet/fsharp#4161).
let skipAccessibilityCheck = v.IsCompilerGenerated && v.LogicalName.StartsWith("patternInput")
CheckTypeForAccess cenv env (fun () -> NicePrint.stringOfQualifiedValOrMember cenv.denv cenv.infoReader vref) access skipAccessibilityCheck v.Range v.Type

CheckInlineValueIsSufficientlyAccessible cenv env v bindRhs

Expand Down Expand Up @@ -2362,7 +2365,7 @@ let CheckRecdField isUnion cenv env (tycon: Tycon) (rfield: RecdField) =
IsHiddenTyconRepr env.sigToImplRemapInfo tycon ||
(not isUnion && IsHiddenRecdField env.sigToImplRemapInfo (tcref.MakeNestedRecdFieldRef rfield))
let access = AdjustAccess isHidden (fun () -> tycon.CompilationPath) rfield.Accessibility
CheckTypeForAccess cenv env (fun () -> rfield.LogicalName) access m fieldTy
CheckTypeForAccess cenv env (fun () -> rfield.LogicalName) access false m fieldTy

if isByrefLikeTyconRef g m tcref then
// Permit Span fields in IsByRefLike types
Expand Down Expand Up @@ -2642,7 +2645,7 @@ let CheckEntityDefn cenv env (tycon: Entity) =

// Access checks
let access = AdjustAccess (IsHiddenTycon env.sigToImplRemapInfo tycon) (fun () -> tycon.CompilationPath) tycon.Accessibility
let visitType ty = CheckTypeForAccess cenv env (fun () -> tycon.DisplayNameWithStaticParametersAndUnderscoreTypars) access tycon.Range ty
let visitType ty = CheckTypeForAccess cenv env (fun () -> tycon.DisplayNameWithStaticParametersAndUnderscoreTypars) access false tycon.Range ty

abstractSlotValsOfTycons [tycon] |> List.iter (typeOfVal >> visitType)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,38 @@ module Tuple =
|> withOptions ["--test:ErrorRanges"]
|> typecheck
|> shouldSucceed

[<Theory; Directory(__SOURCE_DIRECTORY__, Includes = [|"tuples02.fs"|])>]
let ``Tuple - tuples02_fs - --test:ErrorRanges`` compilation =
compilation
|> asFs
|> withOptions ["--test:ErrorRanges"]
|> compileExeAndRun
|> shouldSucceed

[<Theory; Directory(__SOURCE_DIRECTORY__, Includes = [|"tuples03.fs"|])>]
let ``Tuple - tuples03_fs - --test:ErrorRanges`` compilation =
compilation
|> asFs
|> withOptions ["--test:ErrorRanges"]
|> typecheck
|> shouldFail
|> withDiagnostics [
Error 410, Line 6, Col 12, Line 6, Col 14, "The type 'T' is less accessible than the value, member or type 'val t': T' it is used in."
Error 410, Line 6, Col 9, Line 6, Col 10, "The type 'T' is less accessible than the value, member or type 'val t: T' it is used in."
]

[<Theory; Directory(__SOURCE_DIRECTORY__, Includes = [|"tuples04.fs"|])>]
let ``Tuple - tuples04_fs - --test:ErrorRanges`` compilation =
compilation
|> asFs
|> withOptions ["--test:ErrorRanges"]
|> typecheck
|> shouldFail
|> withDiagnostics [
Error 410, Line 6, Col 12, Line 6, Col 14, "The type 'T' is less accessible than the value, member or type 'val internal t': T' it is used in."
Error 410, Line 6, Col 9, Line 6, Col 10, "The type 'T' is less accessible than the value, member or type 'val internal t: T' it is used in."
]

// This test was automatically generated (moved from FSharpQA suite - Conformance/PatternMatching/Tuple)
[<Theory; Directory(__SOURCE_DIRECTORY__, Includes = [|"W_IncompleteMatches01.fs"|])>]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module PM =
type PT =
abstract A : int
let a = { new PT with member __.A = 1 }
let b, c =
{ new PT with member __.A = 1 }
, { new PT with member __.A = 1 }

module private PM2 =
type PT =
abstract A : int
let a = { new PT with member __.A = 1 }
let b, c =
{ new PT with member __.A = 1 }
, { new PT with member __.A = 1 }
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace N

type internal T = T

module public M =
let t, t' = T, T
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace N

type private T = T

module internal M =
let t, t' = T, T
Loading