Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
6db969b4
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,发现更多精彩内容 >>
未验证
提交
6db969b4
编写于
4月 03, 2020
作者:
R
Rikki Gibson
提交者:
GitHub
4月 03, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix crash for Equals analysis of types with bad base clauses (#42968)
上级
f2742863
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
62 addition
and
6 deletion
+62
-6
src/Compilers/CSharp/Portable/FlowAnalysis/NullableWalker.cs
src/Compilers/CSharp/Portable/FlowAnalysis/NullableWalker.cs
+10
-6
src/Compilers/CSharp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs
...rp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs
+52
-0
未找到文件。
src/Compilers/CSharp/Portable/FlowAnalysis/NullableWalker.cs
浏览文件 @
6db969b4
...
...
@@ -3958,12 +3958,14 @@ private void ReinferMethodAndVisitArguments(BoundCall node, TypeWithState receiv
SetUpdatedSymbol
(
node
,
node
.
Method
,
method
);
}
#
nullable
enable
private
void
LearnFromEqualsMethod
(
MethodSymbol
method
,
BoundCall
node
,
TypeWithState
receiverType
,
ImmutableArray
<
VisitArgumentResult
>
results
)
{
// easy out
var
parameterCount
=
method
.
ParameterCount
;
var
arguments
=
node
.
Arguments
;
if
((
parameterCount
!=
1
&&
parameterCount
!=
2
)
if
(
node
.
HasErrors
||
(
parameterCount
!=
1
&&
parameterCount
!=
2
)
||
parameterCount
!=
arguments
.
Length
||
method
.
MethodKind
!=
MethodKind
.
Ordinary
||
method
.
ReturnType
.
SpecialType
!=
SpecialType
.
System_Boolean
...
...
@@ -3986,11 +3988,12 @@ private void LearnFromEqualsMethod(MethodSymbol method, BoundCall node, TypeWith
var
isObjectEqualsMethodOrOverride
=
method
.
GetLeastOverriddenMethod
(
accessingTypeOpt
:
null
)
.
Equals
(
compilation
.
GetSpecialTypeMember
(
SpecialMember
.
System_Object__Equals
));
if
(
isObjectEqualsMethodOrOverride
||
isWellKnownEqualityMethodOrImplementation
(
compilation
,
method
,
receiverType
.
Type
,
WellKnownMember
.
System_IEquatable_T__Equals
))
if
(
node
.
ReceiverOpt
is
BoundExpression
receiver
&&
(
isObjectEqualsMethodOrOverride
||
isWellKnownEqualityMethodOrImplementation
(
compilation
,
method
,
receiverType
.
Type
,
WellKnownMember
.
System_IEquatable_T__Equals
)))
{
Debug
.
Assert
(
arguments
.
Length
==
1
);
learnFromEqualsMethodArguments
(
node
.
ReceiverOpt
,
receiverType
,
arguments
[
0
],
results
[
0
].
RValueType
);
learnFromEqualsMethodArguments
(
receiver
,
receiverType
,
arguments
[
0
],
results
[
0
].
RValueType
);
return
;
}
...
...
@@ -4007,9 +4010,9 @@ static bool anyOverriddenMethodHasExplicitImplementation(MethodSymbol method)
return
false
;
}
static
bool
isWellKnownEqualityMethodOrImplementation
(
CSharpCompilation
compilation
,
MethodSymbol
method
,
TypeSymbol
receiverType
,
WellKnownMember
wellKnownMember
)
static
bool
isWellKnownEqualityMethodOrImplementation
(
CSharpCompilation
compilation
,
MethodSymbol
method
,
TypeSymbol
?
receiverType
,
WellKnownMember
wellKnownMember
)
{
var
wellKnownMethod
=
(
MethodSymbol
)
compilation
.
GetWellKnownTypeMember
(
wellKnownMember
);
var
wellKnownMethod
=
(
MethodSymbol
?
)
compilation
.
GetWellKnownTypeMember
(
wellKnownMember
);
if
(
wellKnownMethod
is
null
||
receiverType
is
null
)
{
return
false
;
...
...
@@ -4120,6 +4123,7 @@ void learnFromEqualsMethodArguments(BoundExpression left, TypeWithState leftType
}
}
}
#
nullable
restore
private
bool
IsCompareExchangeMethod
(
MethodSymbol
method
)
{
...
...
src/Compilers/CSharp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs
浏览文件 @
6db969b4
...
...
@@ -123946,6 +123946,58 @@ static void M1(C c, string? s)
Diagnostic(ErrorCode.WRN_NullReferenceReceiver, "s").WithLocation(18, 15));
}
[Fact, WorkItem(42960, "https://github.com/dotnet/roslyn/issues/42960")]
public void EqualsMethod_IncompleteBaseClause()
{
var source = @"
class C :
{
void M(C? other)
{
if (Equals(other)) { other.ToString(); }
if (this.Equals(other)) { other.ToString(); }
}
}
";
var comp = CreateNullableCompilation(source);
comp.VerifyDiagnostics(
// (2,10): error CS1031: Type expected
// class C :
Diagnostic(ErrorCode.ERR_TypeExpected, "").WithLocation(2, 10),
// (6,13): error CS0120: An object reference is required for the non-static field, method, or property 'object.Equals(object)'
// if (Equals(other)) { other.ToString(); }
Diagnostic(ErrorCode.ERR_ObjectRequired, "Equals").WithArguments("object.Equals(object)").WithLocation(6, 13),
// (6,30): warning CS8602: Dereference of a possibly null reference.
// if (Equals(other)) { other.ToString(); }
Diagnostic(ErrorCode.WRN_NullReferenceReceiver, "other").WithLocation(6, 30));
}
[Fact, WorkItem(42960, "https://github.com/dotnet/roslyn/issues/42960")]
public void EqualsMethod_ErrorBaseClause()
{
var source = @"
class C : ERROR
{
void M(C? other)
{
if (Equals(other)) { other.ToString(); }
if (this.Equals(other)) { other.ToString(); }
}
}
";
var comp = CreateNullableCompilation(source);
comp.VerifyDiagnostics(
// (2,11): error CS0246: The type or namespace name 'ERROR' could not be found (are you missing a using directive or an assembly reference?)
// class C : ERROR
Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "ERROR").WithArguments("ERROR").WithLocation(2, 11),
// (6,13): error CS0120: An object reference is required for the non-static field, method, or property 'object.Equals(object)'
// if (Equals(other)) { other.ToString(); }
Diagnostic(ErrorCode.ERR_ObjectRequired, "Equals").WithArguments("object.Equals(object)").WithLocation(6, 13),
// (6,30): warning CS8602: Dereference of a possibly null reference.
// if (Equals(other)) { other.ToString(); }
Diagnostic(ErrorCode.WRN_NullReferenceReceiver, "other").WithLocation(6, 30));
}
[Fact]
[WorkItem(36131, "https://github.com/dotnet/roslyn/issues/36131")]
public void ShouldRunNullableWalker_GlobalDirective()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录