Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
78130a46
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
78130a46
编写于
4月 29, 2015
作者:
F
Felix S. Klock II
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
lint for mixing `#[repr(C)]` with an impl of `Drop`.
上级
551a74dd
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
55 addition
and
0 deletion
+55
-0
src/librustc_lint/builtin.rs
src/librustc_lint/builtin.rs
+54
-0
src/librustc_lint/lib.rs
src/librustc_lint/lib.rs
+1
-0
未找到文件。
src/librustc_lint/builtin.rs
浏览文件 @
78130a46
...
...
@@ -2142,3 +2142,57 @@ fn check_attribute(&mut self, ctx: &Context, attr: &ast::Attribute) {
}
}
}
/// Lints for attempts to impl Drop on types that have `#[repr(C)]`
/// attribute (see issue #24585).
#[derive(Copy,
Clone)]
pub
struct
DropWithReprExtern
;
declare_lint!
{
DROP_WITH_REPR_EXTERN
,
Warn
,
"use of #[repr(C)] on a type that implements Drop"
}
impl
LintPass
for
DropWithReprExtern
{
fn
get_lints
(
&
self
)
->
LintArray
{
lint_array!
(
DROP_WITH_REPR_EXTERN
)
}
fn
check_crate
(
&
mut
self
,
ctx
:
&
Context
,
_
:
&
ast
::
Crate
)
{
for
dtor_did
in
ctx
.tcx.destructors
.borrow
()
.iter
()
{
let
(
drop_impl_did
,
dtor_self_type
)
=
if
dtor_did
.krate
==
ast
::
LOCAL_CRATE
{
let
impl_did
=
ctx
.tcx.map
.get_parent_did
(
dtor_did
.node
);
let
ty
=
ty
::
lookup_item_type
(
ctx
.tcx
,
impl_did
)
.ty
;
(
impl_did
,
ty
)
}
else
{
continue
;
};
match
dtor_self_type
.sty
{
ty
::
ty_enum
(
self_type_did
,
_
)
|
ty
::
ty_struct
(
self_type_did
,
_
)
|
ty
::
ty_closure
(
self_type_did
,
_
)
=>
{
let
hints
=
ty
::
lookup_repr_hints
(
ctx
.tcx
,
self_type_did
);
if
hints
.iter
()
.any
(|
attr
|
*
attr
==
attr
::
ReprExtern
)
&&
ty
::
ty_dtor
(
ctx
.tcx
,
self_type_did
)
.has_drop_flag
()
{
let
drop_impl_span
=
ctx
.tcx.map
.def_id_span
(
drop_impl_did
,
codemap
::
DUMMY_SP
);
let
self_defn_span
=
ctx
.tcx.map
.def_id_span
(
self_type_did
,
codemap
::
DUMMY_SP
);
ctx
.span_lint
(
DROP_WITH_REPR_EXTERN
,
drop_impl_span
,
"implementing Drop adds hidden state to types,
\
possibly conflicting with `#[repr(C)]`"
);
// FIXME #19668: could be span_lint_note instead of manual guard.
if
ctx
.current_level
(
DROP_WITH_REPR_EXTERN
)
!=
Level
::
Allow
{
ctx
.sess
()
.span_note
(
self_defn_span
,
"the `#[repr(C)]` attribute is attached here"
);
}
}
}
_
=>
{}
}
}
}
}
src/librustc_lint/lib.rs
浏览文件 @
78130a46
...
...
@@ -108,6 +108,7 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
UnconditionalRecursion
,
InvalidNoMangleItems
,
PluginAsLibrary
,
DropWithReprExtern
,
);
add_builtin_with_new!
(
sess
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录