Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit87b9548

Browse files
dsymeKevinRansom
authored andcommitted
fix 1611 - type parameters for intrinsic augmentations should be checked (#3242)
1 parent6523766 commit87b9548

File tree

3 files changed

+45
-16
lines changed

3 files changed

+45
-16
lines changed

‎src/fsharp/TypeChecker.fs‎

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6419,7 +6419,7 @@ and TcObjectExprBinding cenv (env: TcEnv) implty tpenv (absSlotInfo,bind) =
64196419
bindingRhs,logicalMethId,memberFlags
64206420

64216421
| SynPat.InstanceMember(thisId,memberId,_,_,_),Some memberFlags ->
6422-
CheckMemberFlagscenv.gNone NewSlotsOK OverridesOK memberFlags mBinding
6422+
CheckMemberFlags None NewSlotsOK OverridesOK memberFlags mBinding
64236423
let bindingRhs = PushOnePatternToRhs cenv true (mkSynThisPatVar thisId) bindingRhs
64246424
let logicalMethId = ident (ComputeLogicalName memberId memberFlags,memberId.idRange)
64256425
bindingRhs,logicalMethId,memberFlags
@@ -10750,7 +10750,7 @@ and TcLetBindings cenv env containerInfo declKind tpenv (binds,bindsm,scopem) =
1075010750
let binds = stripLets [] expr
1075110751
binds,env,tpenv
1075210752

10753-
and CheckMemberFlags_goptIntfSlotTy newslotsOK overridesOK memberFlags m =
10753+
and CheckMemberFlags optIntfSlotTy newslotsOK overridesOK memberFlags m =
1075410754
if newslotsOK = NoNewSlots && memberFlags.IsDispatchSlot then
1075510755
errorR(Error(FSComp.SR.tcAbstractMembersIllegalInAugmentation(),m))
1075610756
if overridesOK = ErrorOnOverrides && memberFlags.MemberKind = MemberKind.Constructor then
@@ -10969,7 +10969,7 @@ and AnalyzeRecursiveStaticMemberOrValDecl (cenv, envinner: TcEnv, tpenv, declKin
1096910969
| (Some(MemberOrValContainerInfo(tcref, optIntfSlotTy, baseValOpt, _safeInitInfo, declaredTyconTypars)),Some memberFlags) ->
1097010970
assert (Option.isNone optIntfSlotTy)
1097110971

10972-
CheckMemberFlagscenv.gNone newslotsOK overridesOK memberFlags id.idRange
10972+
CheckMemberFlags None newslotsOK overridesOK memberFlags id.idRange
1097310973
CheckForNonAbstractInterface declKind tcref memberFlags id.idRange
1097410974

1097510975
if memberFlags.MemberKind = MemberKind.Constructor && tcref.Deref.IsExceptionDecl then
@@ -11031,7 +11031,7 @@ and AnalyzeRecursiveInstanceMemberDecl (cenv,envinner: TcEnv, tpenv, declKind, s
1103111031
// Normal instance members.
1103211032
| Some(MemberOrValContainerInfo(tcref, optIntfSlotTy, baseValOpt, _safeInitInfo, declaredTyconTypars)), Some memberFlags ->
1103311033

11034-
CheckMemberFlagscenv.goptIntfSlotTy newslotsOK overridesOK memberFlags mBinding
11034+
CheckMemberFlags optIntfSlotTy newslotsOK overridesOK memberFlags mBinding
1103511035

1103611036
if Option.isSome vis && memberFlags.IsOverrideOrExplicitImpl then
1103711037
errorR(Error(FSComp.SR.tcOverridesCannotHaveVisibilityDeclarations(),memberId.idRange))
@@ -15263,7 +15263,7 @@ module EstablishTypeDefinitionCores =
1526315263

1526415264
let (ValSpfn(_, _, _, _, _valSynData, _, _, _, _,_, m)) = valSpfn
1526515265

15266-
CheckMemberFlagscenv.gNone NewSlotsOK OverridesOK memberFlags m
15266+
CheckMemberFlags None NewSlotsOK OverridesOK memberFlags m
1526715267

1526815268
let slots = fst (TcAndPublishValSpec (cenv,envinner,containerInfo,ModuleOrMemberBinding,Some memberFlags,tpenv,valSpfn))
1526915269
// Multiple slots may be returned, e.g. for
@@ -15685,22 +15685,22 @@ module TcDeclarations =
1568515685

1568615686
/// Given a type definition, compute whether its members form an extension of an existing type, and if so if it is an
1568715687
/// intrinsic or extrinsic extension
15688-
let private ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls inSig m (typars:SynTyparDecl list)cs longPath =
15688+
let private ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls inSig m (synTypars:SynTyparDecl list)synTyparCxs longPath =
1568915689
let ad = envForDecls.eAccessRights
1569015690

1569115691
let tcref =
1569215692
match tyconOpt with
1569315693
| Some tycon when isAtOriginalTyconDefn ->
1569415694

1569515695
// This records a name resolution of the type at the location
15696-
let resInfo = TypeNameResolutionStaticArgsInfo.FromTyArgstypars.Length
15696+
let resInfo = TypeNameResolutionStaticArgsInfo.FromTyArgssynTypars.Length
1569715697
ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Binding OpenQualified envForDecls.eNameResEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No
1569815698
|> ignore
1569915699

1570015700
mkLocalTyconRef tycon
1570115701

1570215702
| _ ->
15703-
let resInfo = TypeNameResolutionStaticArgsInfo.FromTyArgstypars.Length
15703+
let resInfo = TypeNameResolutionStaticArgsInfo.FromTyArgssynTypars.Length
1570415704
match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Binding OpenQualified envForDecls.eNameResEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No with
1570515705
| Result res -> res
1570615706
| res when inSig && longPath.Length = 1 ->
@@ -15732,20 +15732,26 @@ module TcDeclarations =
1573215732
// There is a special case we allow when compiling FSharp.Core.dll which permits interface implementations across namespace fragments
1573315733
(cenv.g.compilingFslib && tcref.LogicalName.StartsWith("Tuple`"))
1573415734

15735+
let nReqTypars = reqTypars.Length
15736+
15737+
let declaredTypars = TcTyparDecls cenv envForDecls synTypars
15738+
let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTypars envForDecls
15739+
let _tpenv = TcTyparConstraints cenv NoNewTypars CheckCxs ItemOccurence.UseInType envForTycon emptyUnscopedTyparEnv synTyparCxs
15740+
declaredTypars |> List.iter (SetTyparRigid cenv.g envForDecls.DisplayEnv m)
15741+
1573515742
if isInSameModuleOrNamespace && not isInterfaceOrDelegateOrEnum then
15743+
// For historical reasons we only give a warning for incorrect type parameters on intrinsic extensions
15744+
if nReqTypars <> synTypars.Length then
15745+
warning(Error(FSComp.SR.tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m))
15746+
if not (typarsAEquiv cenv.g TypeEquivEnv.Empty reqTypars declaredTypars) then
15747+
warning(Error(FSComp.SR.tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m))
15748+
// Note we return 'reqTypars' for intrinsic extensions since we may only have given warnings
1573615749
IntrinsicExtensionBinding, reqTypars
1573715750
else
1573815751
if isInSameModuleOrNamespace && isInterfaceOrDelegateOrEnum then
1573915752
errorR(Error(FSComp.SR.tcMembersThatExtendInterfaceMustBePlacedInSeparateModule(),tcref.Range))
15740-
let nReqTypars = reqTypars.Length
15741-
if nReqTypars <> typars.Length then
15742-
// not recoverable
15753+
if nReqTypars <> synTypars.Length then
1574315754
error(Error(FSComp.SR.tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m))
15744-
15745-
let declaredTypars = TcTyparDecls cenv envForDecls typars
15746-
let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTypars envForDecls
15747-
let _tpenv = TcTyparConstraints cenv NoNewTypars CheckCxs ItemOccurence.UseInType envForTycon emptyUnscopedTyparEnv cs
15748-
declaredTypars |> List.iter (SetTyparRigid cenv.g envForDecls.DisplayEnv m)
1574915755
if not (typarsAEquiv cenv.g TypeEquivEnv.Empty reqTypars declaredTypars) then
1575015756
errorR(Error(FSComp.SR.tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m))
1575115757
ExtrinsicExtensionBinding, declaredTypars

‎tests/fsharp/typecheck/sigs/neg97.bsl‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,13 @@ neg97.fs(25,9,25,10): typecheck error FS3207: Invalid use of 'fixed'. 'fixed' ma
1616
neg97.fs(30,9,30,10): typecheck error FS0009: Uses of this construct may resultin the generation of unverifiable .NET IL code. This warning can be disabled using '--nowarn:9'or '#nowarn"9"'.
1717

1818
neg97.fs(30,9,30,10): typecheck error FS3207: Invalid use of 'fixed'. 'fixed' may only be usedin a declaration of the form 'use x= fixed expr' where the expression is an array, the address of a field, the address of an array elementor a string'
19+
20+
neg97.fs(36,20,36,32): typecheck error FS0698: Invalid constraint: the type usedfor the constraint is sealed, which means the constraint could only be satisfied by at most one solution
21+
22+
neg97.fs(36,20,36,32): typecheck error FS0064: This construct causes codeto be less generic than indicated by the type annotations. The type variable 'T has been constrainedto be type 'string'.
23+
24+
neg97.fs(36,12,36,14): typecheck error FS0663: This type parameter has been usedin a way that constrains itto always be 'string'
25+
26+
neg97.fs(42,20,42,22): typecheck error FS0039: The type parameter 'T isnot defined. Maybe you want one of the following:
27+
28+
'U

‎tests/fsharp/typecheck/sigs/neg97.fs‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,16 @@ let pinStructAddressNotAllowed(x: 'T) =
2929
let mutablev={ X=1.0; Y=1.0}
3030
use p=fixed&v.Y
3131
()
32+
33+
34+
moduleExample1=
35+
typeX<'T>= Yof'T
36+
typeX<'Twhen'T:>string>with
37+
static memberX=2
38+
static membertake(s:'T)= s
39+
40+
moduleExample2=
41+
typeX<'T>= Yof'T
42+
typeX<'Uwhen'T:>string>with
43+
static memberX=2
44+
static membertake(s:'T)= s

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp