Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
f34d3e4d
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,发现更多精彩内容 >>
提交
f34d3e4d
编写于
4月 03, 2019
作者:
R
Rikki Gibson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix unconditional binding of pointer types
上级
38650ea9
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
34 addition
and
9 deletion
+34
-9
src/Compilers/CSharp/Portable/Symbols/BaseTypeAnalysis.cs
src/Compilers/CSharp/Portable/Symbols/BaseTypeAnalysis.cs
+12
-8
src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs
...rp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs
+1
-1
src/Compilers/CSharp/Test/Semantic/Semantics/UnsafeTests.cs
src/Compilers/CSharp/Test/Semantic/Semantics/UnsafeTests.cs
+21
-0
未找到文件。
src/Compilers/CSharp/Portable/Symbols/BaseTypeAnalysis.cs
浏览文件 @
f34d3e4d
...
...
@@ -79,12 +79,13 @@ private static void StructDependsClosure(NamedTypeSymbol type, HashSet<Symbol> p
foreach
(
var
member
in
type
.
GetMembersUnordered
())
{
var
field
=
member
as
FieldSymbol
;
if
((
object
)
field
==
null
||
field
.
Type
.
TypeKind
!=
TypeKind
.
Struct
||
field
.
IsStatic
)
var
fieldType
=
field
?.
NonPointerType
();
if
(
fieldType
is
null
||
fieldType
.
TypeKind
!=
TypeKind
.
Struct
||
field
.
IsStatic
)
{
continue
;
}
StructDependsClosure
((
NamedTypeSymbol
)
field
.
Type
,
partialClosure
,
on
);
StructDependsClosure
((
NamedTypeSymbol
)
fieldType
,
partialClosure
,
on
);
}
}
}
...
...
@@ -134,6 +135,12 @@ internal static ManagedKind GetManagedKind(NamedTypeSymbol type)
}
}
// NOTE: If we do not check HasPointerType, we will unconditionally
// bind Type and that may cause infinite recursion.
// HasPointerType can use syntax directly and break recursion.
internal
static
TypeSymbol
NonPointerType
(
this
FieldSymbol
field
)
=>
field
.
HasPointerType
?
null
:
field
.
Type
;
private
static
(
bool
definitelyManaged
,
bool
hasGenerics
)
DependsOnDefinitelyManagedType
(
NamedTypeSymbol
type
,
HashSet
<
Symbol
>
partialClosure
)
{
Debug
.
Assert
((
object
)
type
!=
null
);
...
...
@@ -164,16 +171,13 @@ private static (bool definitelyManaged, bool hasGenerics) DependsOnDefinitelyMan
continue
;
}
// pointers are unmanaged
// NOTE: If we do not check HasPointerType, we will unconditionally
// bind Type and that may cause infinite recursion.
// HasPointerType can use syntax directly and break recursion.
if
(
field
.
HasPointerType
)
TypeSymbol
fieldType
=
field
.
NonPointerType
();
if
(
fieldType
is
null
)
{
// pointers are unmanaged
continue
;
}
TypeSymbol
fieldType
=
field
.
Type
;
NamedTypeSymbol
fieldNamedType
=
fieldType
as
NamedTypeSymbol
;
if
((
object
)
fieldNamedType
==
null
)
{
...
...
src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs
浏览文件 @
f34d3e4d
...
...
@@ -1889,7 +1889,7 @@ private bool HasStructCircularity(DiagnosticBag diagnostics)
{
continue
;
}
var
type
=
field
.
Type
;
var
type
=
field
.
NonPointerType
()
;
if
(((
object
)
type
!=
null
)
&&
(
type
.
TypeKind
==
TypeKind
.
Struct
)
&&
BaseTypeAnalysis
.
StructDependsOn
((
NamedTypeSymbol
)
type
,
this
)
&&
...
...
src/Compilers/CSharp/Test/Semantic/Semantics/UnsafeTests.cs
浏览文件 @
f34d3e4d
...
...
@@ -9193,5 +9193,26 @@ void M(S s)
// int* f = &(s_f.Buf[0]);
Diagnostic
(
ErrorCode
.
ERR_FixedNeeded
,
"&(s_f.Buf[0])"
).
WithLocation
(
17
,
18
));
}
[
Fact
,
WorkItem
(
34693
,
"https://github.com/dotnet/roslyn/issues/34693"
)]
public
void
Repro_34693
()
{
var
csharp
=
@"
namespace Interop
{
public unsafe struct PROPVARIANT
{
public CAPROPVARIANT ca;
}
public unsafe struct CAPROPVARIANT
{
public uint cElems;
public PROPVARIANT* pElems;
}
}"
;
var
comp
=
CreateCompilation
(
csharp
,
options
:
TestOptions
.
UnsafeDebugDll
);
comp
.
VerifyDiagnostics
();
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录