Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
fsharp
提交
90a36db4
F
fsharp
项目概览
dotNET Platform
/
fsharp
11 个月 前同步成功
通知
0
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
fsharp
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
90a36db4
编写于
4月 13, 2017
作者:
D
Don Syme
提交者:
Kevin Ransom (msft)
4月 12, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix 2730 while maintaining regression compat (#2843)
上级
b779e06f
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
115 addition
and
1 deletion
+115
-1
src/fsharp/TypeChecker.fs
src/fsharp/TypeChecker.fs
+73
-1
tests/fsharp/core/syntax/test.fsx
tests/fsharp/core/syntax/test.fsx
+42
-0
未找到文件。
src/fsharp/TypeChecker.fs
浏览文件 @
90a36db4
...
...
@@ -8681,15 +8681,87 @@ and TcItemThen cenv overallTy env tpenv (item,mItem,rest,afterOverloadResolution
let expr = Expr.Op(TOp.TraitCall(traitInfo), [], ves, mItem)
let expr = mkLambdas mItem [] vs (expr,retTy)
let rec isSimpleArgument e =
match e with
| SynExpr.New(_, _, synExpr, _)
| SynExpr.Paren(synExpr, _, _, _)
| SynExpr.Typed(synExpr, _, _)
| SynExpr.TypeApp (synExpr, _, _, _, _, _, _)
| SynExpr.TypeTest (synExpr, _, _)
| SynExpr.Upcast(synExpr, _, _)
| SynExpr.DotGet(synExpr, _, _, _)
| SynExpr.Downcast(synExpr, _, _)
| SynExpr.InferredUpcast(synExpr, _)
| SynExpr.InferredDowncast(synExpr, _)
| SynExpr.AddressOf(_, synExpr, _, _)
| SynExpr.Quote(_, _, synExpr, _, _) -> isSimpleArgument synExpr
| SynExpr.Null _
| SynExpr.Ident _
| SynExpr.Const _
| SynExpr.LongIdent _ -> true
| SynExpr.Tuple(synExprs, _, _)
| SynExpr.StructTuple(synExprs, _, _)
| SynExpr.ArrayOrList(_, synExprs, _) -> synExprs |> List.forall isSimpleArgument
| SynExpr.Record(_,copyOpt,fields, _) -> copyOpt |> Option.forall (fst >> isSimpleArgument) && fields |> List.forall (p23 >> Option.forall isSimpleArgument)
| SynExpr.App (_, _, synExpr, synExpr2, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2
| SynExpr.IfThenElse(synExpr, synExpr2, synExprOpt, _, _, _, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 && Option.forall isSimpleArgument synExprOpt
| SynExpr.DotIndexedGet(synExpr, _, _, _) -> isSimpleArgument synExpr
| SynExpr.ObjExpr _
| SynExpr.While _
| SynExpr.For _
| SynExpr.ForEach _
| SynExpr.ArrayOrListOfSeqExpr _
| SynExpr.CompExpr _
| SynExpr.Lambda _
| SynExpr.MatchLambda _
| SynExpr.Match _
| SynExpr.Do _
| SynExpr.Assert _
| SynExpr.Fixed _
| SynExpr.TryWith _
| SynExpr.TryFinally _
| SynExpr.Lazy _
| SynExpr.Sequential _
| SynExpr.LetOrUse _
| SynExpr.DotSet _
| SynExpr.DotIndexedSet _
| SynExpr.LongIdentSet _
| SynExpr.JoinIn _
| SynExpr.NamedIndexedPropertySet _
| SynExpr.DotNamedIndexedPropertySet _
| SynExpr.LibraryOnlyILAssembly _
| SynExpr.LibraryOnlyStaticOptimization _
| SynExpr.LibraryOnlyUnionCaseFieldGet _
| SynExpr.LibraryOnlyUnionCaseFieldSet _
| SynExpr.ArbitraryAfterError(_, _)
| SynExpr.FromParseError(_, _)
| SynExpr.DiscardAfterMissingQualificationAfterDot(_, _)
| SynExpr.ImplicitZero _
| SynExpr.YieldOrReturn _
| SynExpr.YieldOrReturnFrom _
| SynExpr.LetOrUseBang _
| SynExpr.DoBang _
| SynExpr.TraitCall _
-> false
// Propagte the known application structure into function types
Propagate cenv overallTy env tpenv (MakeApplicableExprNoFlex cenv expr) (tyOfExpr cenv.g expr) delayed
let delayed1, delayed2 = List.takeWhile (function (DelayedApp _) -> true | _ -> false) delayed, List.skipWhile (function (DelayedApp _) -> true | _ -> false) delayed
// Take all simple arguments and process them before applying the constraint.
let delayed1, delayed2 =
let pred = (function (DelayedApp (_,arg,_)) -> isSimpleArgument arg | _ -> false)
List.takeWhile pred delayed, List.skipWhile pred delayed
let intermediateTy = if isNil delayed2 then overallTy else NewInferenceType ()
let resultExpr, tpenv = TcDelayed cenv intermediateTy env tpenv mItem (MakeApplicableExprNoFlex cenv expr) (tyOfExpr cenv.g expr) ExprAtomicFlag.NonAtomic delayed1
// Add the constraint after the application arguments have been checked to allow annotations to kick in on rigid type parameters
AddCxMethodConstraint env.DisplayEnv cenv.css mItem NoTrace traitInfo
// Process all remaining arguments after the constraint is asserted
let resultExpr2, tpenv2 = TcDelayed cenv overallTy env tpenv mItem (MakeApplicableExprNoFlex cenv resultExpr) intermediateTy ExprAtomicFlag.NonAtomic delayed2
resultExpr2, tpenv2
...
...
tests/fsharp/core/syntax/test.fsx
浏览文件 @
90a36db4
...
...
@@ -63,6 +63,48 @@ module CheckDynamicOperatorsOnTypesUnconstrained =
let
op
=
OpDynamic
()
op
?
Hello
.
Prop
module
MoreDynamicOpTests
=
module
Test1
=
type
'
a
Doge
()
=
class
end
with
static
member
(|~>)
(_
:
'
b
Doge
,
_
:
'
b
->
'
c
)
:
'
c
Doge
=
Doge
()
let
x
:
System
.
DateTime
Doge
=
Doge
()
let
y
=
x
|~>
(
fun
dt
->
dt
.
Year
)
// error on this line around 'dt.Year'
module
Test2
=
type
OpDynamic
()
=
static
member
(
?
)
(
x
,
n
)
=
x
member
x
.
Prop
=
1
let
f
()
=
let
op
=
OpDynamic
()
op
?
Hello
.
Prop
module
Test3
=
type
M
()
=
static
member
($)
(
x
:
string
,
M
)
=
""
static
member
($)
(
x
:
int
,
M
)
=
0
static
member
($)
(
x
:
float
,
M
)
=
0
.
0
let
inline
empty
<
^
R
,
^
M
when
(^
R
or
^
M
)
:
(
static
member
($)
:
^
R
*
M
->
^
R
)
and
^
M
:>
M
>
=
let
m
=
M
()
((^
R
or
^
M
)
:
(
static
member
($):
^
R
*
M
->
^
R
)
(
Unchecked
.
defaultof
<
'
R
>,
m
))
let
a
:
int
=
empty
<
_
,
M
>
let
b
:
string
=
empty
<
_
,
M
>
module
Test4
=
type
M
()
=
static
member
($)
(
x
:
string
,
M
)
=
""
static
member
($)
(
x
:
int
,
M
)
=
0
static
member
($)
(
x
:
float
,
M
)
=
0
.
0
let
inline
empty
<
^
R
when
(
^
R
or
M
)
:
(
static
member
(
$
)
:
^
R
*
M
->
^
R
)>
=
let
m
=
M
()
Unchecked
.
defaultof
<
^
R
>
$
m
:
^
R
// Copyright (c) Microsoft Corporation 2005-2006. .
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录