Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
91bbc653
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
91bbc653
编写于
11月 28, 2018
作者:
N
Neal Gafter
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Don't write false into _mightAssignSomething while scanning.
上级
8f9f95c9
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
61 addition
and
15 deletion
+61
-15
src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_BasePatternSwitchLocalRewriter.cs
...lRewriter/LocalRewriter_BasePatternSwitchLocalRewriter.cs
+44
-14
src/Compilers/CSharp/Test/Emit/CodeGen/PatternTests.cs
src/Compilers/CSharp/Test/Emit/CodeGen/PatternTests.cs
+17
-1
未找到文件。
src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_BasePatternSwitchLocalRewriter.cs
浏览文件 @
91bbc653
...
...
@@ -151,12 +151,18 @@ public override BoundNode Visit(BoundNode node)
public
override
BoundNode
VisitCall
(
BoundCall
node
)
{
_mightAssignSomething
=
bool
mightMutate
=
// might be a call to a local function that assigns something
node
.
Method
.
MethodKind
==
MethodKind
.
LocalFunction
||
// or perhaps we are passing a variable by ref and mutating it that way
!
node
.
ArgumentRefKindsOpt
.
IsDefault
;
return
base
.
VisitCall
(
node
);
if
(
mightMutate
)
_mightAssignSomething
=
true
;
else
base
.
VisitCall
(
node
);
return
null
;
}
public
override
BoundNode
VisitAssignmentOperator
(
BoundAssignmentOperator
node
)
...
...
@@ -186,41 +192,65 @@ public override BoundNode VisitIncrementOperator(BoundIncrementOperator node)
public
override
BoundNode
VisitDynamicInvocation
(
BoundDynamicInvocation
node
)
{
// perhaps we are passing a variable by ref and mutating it that way
_mightAssignSomething
=
!
node
.
ArgumentRefKindsOpt
.
IsDefault
;
return
base
.
VisitDynamicInvocation
(
node
);
if
(!
node
.
ArgumentRefKindsOpt
.
IsDefault
)
_mightAssignSomething
=
true
;
else
base
.
VisitDynamicInvocation
(
node
);
return
null
;
}
public
override
BoundNode
VisitObjectCreationExpression
(
BoundObjectCreationExpression
node
)
{
// perhaps we are passing a variable by ref and mutating it that way
_mightAssignSomething
=
!
node
.
ArgumentRefKindsOpt
.
IsDefault
;
return
base
.
VisitObjectCreationExpression
(
node
);
if
(!
node
.
ArgumentRefKindsOpt
.
IsDefault
)
_mightAssignSomething
=
true
;
else
base
.
VisitObjectCreationExpression
(
node
);
return
null
;
}
public
override
BoundNode
VisitDynamicObjectCreationExpression
(
BoundDynamicObjectCreationExpression
node
)
{
_mightAssignSomething
=
!
node
.
ArgumentRefKindsOpt
.
IsDefault
;
return
base
.
VisitDynamicObjectCreationExpression
(
node
);
if
(!
node
.
ArgumentRefKindsOpt
.
IsDefault
)
_mightAssignSomething
=
true
;
else
base
.
VisitDynamicObjectCreationExpression
(
node
);
return
null
;
}
public
override
BoundNode
VisitObjectInitializerMember
(
BoundObjectInitializerMember
node
)
{
// Although ref indexers are not declarable in C#, they may be usable
_mightAssignSomething
=
!
node
.
ArgumentRefKindsOpt
.
IsDefault
;
return
base
.
VisitObjectInitializerMember
(
node
);
if
(!
node
.
ArgumentRefKindsOpt
.
IsDefault
)
_mightAssignSomething
=
true
;
else
base
.
VisitObjectInitializerMember
(
node
);
return
null
;
}
public
override
BoundNode
VisitIndexerAccess
(
BoundIndexerAccess
node
)
{
// Although property arguments with ref indexers are not declarable in C#, they may be usable
_mightAssignSomething
=
!
node
.
ArgumentRefKindsOpt
.
IsDefault
;
return
base
.
VisitIndexerAccess
(
node
);
if
(!
node
.
ArgumentRefKindsOpt
.
IsDefault
)
_mightAssignSomething
=
true
;
else
base
.
VisitIndexerAccess
(
node
);
return
null
;
}
public
override
BoundNode
VisitDynamicIndexerAccess
(
BoundDynamicIndexerAccess
node
)
{
_mightAssignSomething
=
!
node
.
ArgumentRefKindsOpt
.
IsDefault
;
return
base
.
VisitDynamicIndexerAccess
(
node
);
if
(!
node
.
ArgumentRefKindsOpt
.
IsDefault
)
_mightAssignSomething
=
true
;
else
base
.
VisitDynamicIndexerAccess
(
node
);
return
null
;
}
}
...
...
src/Compilers/CSharp/Test/Emit/CodeGen/PatternTests.cs
浏览文件 @
91bbc653
...
...
@@ -1985,6 +1985,9 @@ static void Main()
Console.Write(M4(1));
Console.Write(M5(1));
Console.Write(M6(1));
Console.Write(M7(1));
Console.Write(M8(1));
Console.Write(M9(1));
}
public static int M1(int x)
{
...
...
@@ -2013,6 +2016,19 @@ public static int M6(int x)
dynamic d = x;
return x switch { _ when new Program(d, ref x).P => 1, 1 => 2, _ => 3 };
}
public static int M7(int x)
{
return x switch { _ when new Program(ref x).P && new Program().P => 1, 1 => 2, _ => 3 };
}
public static int M8(int x)
{
dynamic d = x;
return x switch { _ when new Program(d, ref x).P && new Program().P => 1, 1 => 2, _ => 3 };
}
public static int M9(int x)
{
return x switch { _ when (x=100) == 1 => 1, 1 => 2, _ => 3 };
}
Program() { }
Program(ref int x) { x = 100; }
Program(int a, ref int x) { x = 100; }
...
...
@@ -2021,7 +2037,7 @@ public static int M6(int x)
"
;
var
compilation
=
CreateCompilation
(
source
,
options
:
TestOptions
.
ReleaseExe
,
references
:
new
[]
{
CSharpRef
});
compilation
.
VerifyDiagnostics
();
var
expectedOutput
=
@"222222"
;
var
expectedOutput
=
@"222222
222
"
;
var
compVerifier
=
CompileAndVerify
(
compilation
,
expectedOutput
:
expectedOutput
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录