Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
bf7cde44
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,发现更多精彩内容 >>
提交
bf7cde44
编写于
2月 23, 2015
作者:
M
Manish Goregaokar
提交者:
Alex Crichton
2月 23, 2015
浏览文件
操作
浏览文件
下载
差异文件
Rollup merge of #22538 - nagisa:properise-trans-asserts, r=nikomatsakis
上级
f1a6d67e
9be8ec82
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
58 addition
and
12 deletion
+58
-12
src/librustc_trans/trans/base.rs
src/librustc_trans/trans/base.rs
+23
-12
src/test/run-pass/extern-methods.rs
src/test/run-pass/extern-methods.rs
+35
-0
未找到文件。
src/librustc_trans/trans/base.rs
浏览文件 @
bf7cde44
...
...
@@ -301,7 +301,7 @@ pub fn decl_rust_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
self_type
.repr
(
ccx
.tcx
()));
(
&
function_type
.sig
,
RustCall
,
Some
(
llenvironment_type
))
}
_
=>
panic!
(
"expected closure or fn"
)
_
=>
ccx
.sess
()
.bug
(
"expected closure or fn"
)
};
let
sig
=
ty
::
erase_late_bound_regions
(
ccx
.tcx
(),
sig
);
...
...
@@ -2410,12 +2410,15 @@ fn register_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
node_id
:
ast
::
NodeId
,
node_type
:
Ty
<
'tcx
>
)
->
ValueRef
{
match
node_type
.sty
{
ty
::
ty_bare_fn
(
_
,
ref
f
)
=>
{
assert
!
(
f
.abi
==
Rust
||
f
.abi
==
RustCall
);
if
let
ty
::
ty_bare_fn
(
_
,
ref
f
)
=
node_type
.sty
{
if
f
.abi
!=
Rust
&&
f
.abi
!=
RustCall
{
ccx
.sess
()
.span_bug
(
sp
,
&
format!
(
"only the `{}` or `{}` calling conventions are valid
\
for this function; `{}` was specified"
,
Rust
.name
(),
RustCall
.name
(),
f
.abi
.name
()));
}
}
else
{
ccx
.sess
()
.span_bug
(
sp
,
"expected bare rust function"
)
}
_
=>
panic!
(
"expected bare rust fn"
)
};
let
llfn
=
decl_rust_fn
(
ccx
,
node_type
,
&
sym
[
..
]);
finish_register_fn
(
ccx
,
sp
,
sym
,
node_id
,
llfn
);
...
...
@@ -2802,7 +2805,7 @@ pub fn get_item_val(ccx: &CrateContext, id: ast::NodeId) -> ValueRef {
llfn
}
_
=>
panic!
(
"get_item_val: weird result in table"
)
_
=>
ccx
.sess
()
.bug
(
"get_item_val: weird result in table"
)
};
match
attr
::
first_attr_value_str_by_name
(
&
i
.attrs
,
...
...
@@ -2866,7 +2869,7 @@ pub fn get_item_val(ccx: &CrateContext, id: ast::NodeId) -> ValueRef {
let
args
=
match
v
.node.kind
{
ast
::
TupleVariantKind
(
ref
args
)
=>
args
,
ast
::
StructVariantKind
(
_
)
=>
{
panic!
(
"struct variant kind unexpected in get_item_val"
)
ccx
.sess
()
.bug
(
"struct variant kind unexpected in get_item_val"
)
}
};
assert
!
(
args
.len
()
!=
0
);
...
...
@@ -2882,7 +2885,7 @@ pub fn get_item_val(ccx: &CrateContext, id: ast::NodeId) -> ValueRef {
ast
::
ItemEnum
(
_
,
_
)
=>
{
register_fn
(
ccx
,
(
*
v
)
.span
,
sym
,
id
,
ty
)
}
_
=>
panic!
(
"NodeVariant, shouldn't happen"
)
_
=>
ccx
.sess
()
.bug
(
"NodeVariant, shouldn't happen"
)
};
set_inline_hint
(
llfn
);
llfn
...
...
@@ -2935,9 +2938,17 @@ fn register_method(ccx: &CrateContext, id: ast::NodeId,
let
sym
=
exported_name
(
ccx
,
id
,
mty
,
&
m
.attrs
);
let
llfn
=
register_fn
(
ccx
,
m
.span
,
sym
,
id
,
mty
);
if
let
ty
::
ty_bare_fn
(
_
,
ref
f
)
=
mty
.sty
{
let
llfn
=
if
f
.abi
==
Rust
||
f
.abi
==
RustCall
{
register_fn
(
ccx
,
m
.span
,
sym
,
id
,
mty
)
}
else
{
foreign
::
register_rust_fn_with_foreign_abi
(
ccx
,
m
.span
,
sym
,
id
)
};
set_llvm_fn_attrs
(
ccx
,
&
m
.attrs
,
llfn
);
llfn
return
llfn
;
}
else
{
ccx
.sess
()
.span_bug
(
m
.span
,
"expected bare rust function"
);
}
}
pub
fn
crate_ctxt_to_encode_parms
<
'a
,
'tcx
>
(
cx
:
&
'a
SharedCrateContext
<
'tcx
>
,
...
...
src/test/run-pass/extern-methods.rs
0 → 100644
浏览文件 @
bf7cde44
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
trait
A
{
extern
"fastcall"
fn
test1
(
i
:
i32
);
extern
fn
test2
(
i
:
i32
);
}
struct
S
;
impl
S
{
extern
"stdcall"
fn
test3
(
i
:
i32
)
{
assert_eq!
(
i
,
3
);
}
}
impl
A
for
S
{
extern
"fastcall"
fn
test1
(
i
:
i32
)
{
assert_eq!
(
i
,
1
);
}
extern
fn
test2
(
i
:
i32
)
{
assert_eq!
(
i
,
2
);
}
}
fn
main
()
{
<
S
as
A
>
::
test1
(
1
);
<
S
as
A
>
::
test2
(
2
);
S
::
test3
(
3
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录