Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
50886115
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,发现更多精彩内容 >>
提交
50886115
编写于
8月 04, 2018
作者:
V
Vadim Petrochenkov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Address review comments
Adjust a few fulldeps and pretty-printing tests Fix rebase
上级
cb64672e
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
60 addition
and
84 deletion
+60
-84
src/librustc_resolve/macros.rs
src/librustc_resolve/macros.rs
+8
-2
src/libsyntax/ext/expand.rs
src/libsyntax/ext/expand.rs
+12
-22
src/libsyntax/feature_gate.rs
src/libsyntax/feature_gate.rs
+0
-8
src/test/compile-fail-fulldeps/proc-macro/issue-41211.rs
src/test/compile-fail-fulldeps/proc-macro/issue-41211.rs
+1
-1
src/test/compile-fail-fulldeps/proc-macro/macros-in-extern.rs
...test/compile-fail-fulldeps/proc-macro/macros-in-extern.rs
+3
-3
src/test/compile-fail/macros-in-extern.rs
src/test/compile-fail/macros-in-extern.rs
+3
-3
src/test/pretty/attr-literals.rs
src/test/pretty/attr-literals.rs
+1
-1
src/test/ui-fulldeps/resolve-error.rs
src/test/ui-fulldeps/resolve-error.rs
+3
-5
src/test/ui-fulldeps/resolve-error.stderr
src/test/ui-fulldeps/resolve-error.stderr
+8
-20
src/test/ui/custom-attribute-multisegment.rs
src/test/ui/custom-attribute-multisegment.rs
+6
-13
src/test/ui/custom-attribute-multisegment.stderr
src/test/ui/custom-attribute-multisegment.stderr
+9
-0
src/test/ui/feature-gate-macros_in_extern.rs
src/test/ui/feature-gate-macros_in_extern.rs
+3
-3
src/test/ui/feature-gate-macros_in_extern.stderr
src/test/ui/feature-gate-macros_in_extern.stderr
+3
-3
未找到文件。
src/librustc_resolve/macros.rs
浏览文件 @
50886115
...
...
@@ -329,6 +329,9 @@ fn resolve_invoc(&mut self, invoc: &Invocation, scope: Mark, force: bool)
self
.report_proc_macro_stub
(
invoc
.span
());
return
Err
(
Determinacy
::
Determined
);
}
else
if
let
Def
::
NonMacroAttr
(
attr_kind
)
=
def
{
// Note that not only attributes, but anything in macro namespace can result in a
// `Def::NonMacroAttr` definition (e.g. `inline!()`), so we must report the error
// below for these cases.
let
is_attr_invoc
=
if
let
InvocationKind
::
Attr
{
..
}
=
invoc
.kind
{
true
}
else
{
false
};
let
path
=
invoc
.path
()
.expect
(
"no path for non-macro attr"
);
...
...
@@ -604,7 +607,7 @@ pub fn resolve_lexical_macro_path_segment(&mut self,
// 3. Builtin attributes (closed, controlled).
assert
!
(
ns
==
TypeNS
||
ns
==
MacroNS
);
let
force
=
force
||
record_used
;
assert
!
(
force
||
!
record_used
);
// `record_used` implies `force`
ident
=
ident
.modern
();
// Names from inner scope that can't shadow names from outer scopes, e.g.
...
...
@@ -789,7 +792,10 @@ enum WhereToResolve<'a> {
let
determinacy
=
Determinacy
::
determined
(
force
);
if
determinacy
==
Determinacy
::
Determined
&&
is_attr
{
// For attributes interpret determinate "no solution" as a custom attribute.
// For single-segment attributes interpret determinate "no resolution" as a custom
// attribute. (Lexical resolution implies the first segment and is_attr should imply
// the last segment, so we are certainly working with a single-segment attribute here.)
assert
!
(
ns
==
MacroNS
);
let
binding
=
(
Def
::
NonMacroAttr
(
NonMacroAttrKind
::
Custom
),
ty
::
Visibility
::
Public
,
ident
.span
,
Mark
::
root
())
.to_name_binding
(
self
.arenas
);
...
...
src/libsyntax/ext/expand.rs
浏览文件 @
50886115
...
...
@@ -516,6 +516,15 @@ fn fully_configure(&mut self, item: Annotatable) -> Annotatable {
}
fn
expand_invoc
(
&
mut
self
,
invoc
:
Invocation
,
ext
:
&
SyntaxExtension
)
->
Option
<
AstFragment
>
{
if
invoc
.fragment_kind
==
AstFragmentKind
::
ForeignItems
&&
!
self
.cx.ecfg
.macros_in_extern_enabled
()
{
if
let
SyntaxExtension
::
NonMacroAttr
{
..
}
=
*
ext
{}
else
{
emit_feature_err
(
&
self
.cx.parse_sess
,
"macros_in_extern"
,
invoc
.span
(),
GateIssue
::
Language
,
"macro invocations in `extern {}` blocks are experimental"
);
}
}
let
result
=
match
invoc
.kind
{
InvocationKind
::
Bang
{
..
}
=>
self
.expand_bang_invoc
(
invoc
,
ext
)
?
,
InvocationKind
::
Attr
{
..
}
=>
self
.expand_attr_invoc
(
invoc
,
ext
)
?
,
...
...
@@ -549,6 +558,8 @@ fn expand_attr_invoc(&mut self,
};
if
let
NonMacroAttr
{
mark_used
:
false
}
=
*
ext
{}
else
{
// Macro attrs are always used when expanded,
// non-macro attrs are considered used when the field says so.
attr
::
mark_used
(
&
attr
);
}
invoc
.expansion_data.mark
.set_expn_info
(
ExpnInfo
{
...
...
@@ -1482,21 +1493,7 @@ fn fold_foreign_item(&mut self,
foreign_item
:
ast
::
ForeignItem
)
->
SmallVector
<
ast
::
ForeignItem
>
{
let
(
attr
,
traits
,
foreign_item
)
=
self
.classify_item
(
foreign_item
);
let
explain
=
if
self
.cx.ecfg
.use_extern_macros_enabled
()
{
feature_gate
::
EXPLAIN_PROC_MACROS_IN_EXTERN
}
else
{
feature_gate
::
EXPLAIN_MACROS_IN_EXTERN
};
if
attr
.is_some
()
||
!
traits
.is_empty
()
{
if
!
self
.cx.ecfg
.macros_in_extern_enabled
()
&&
!
self
.cx.ecfg
.custom_attribute_enabled
()
{
if
let
Some
(
ref
attr
)
=
attr
{
emit_feature_err
(
&
self
.cx.parse_sess
,
"macros_in_extern"
,
attr
.span
,
GateIssue
::
Language
,
explain
);
}
}
if
attr
.is_some
()
||
!
traits
.is_empty
()
{
let
item
=
Annotatable
::
ForeignItem
(
P
(
foreign_item
));
return
self
.collect_attr
(
attr
,
traits
,
item
,
AstFragmentKind
::
ForeignItems
)
.make_foreign_items
();
...
...
@@ -1504,12 +1501,6 @@ fn fold_foreign_item(&mut self,
if
let
ast
::
ForeignItemKind
::
Macro
(
mac
)
=
foreign_item
.node
{
self
.check_attributes
(
&
foreign_item
.attrs
);
if
!
self
.cx.ecfg
.macros_in_extern_enabled
()
{
emit_feature_err
(
&
self
.cx.parse_sess
,
"macros_in_extern"
,
foreign_item
.span
,
GateIssue
::
Language
,
explain
);
}
return
self
.collect_bang
(
mac
,
foreign_item
.span
,
AstFragmentKind
::
ForeignItems
)
.make_foreign_items
();
}
...
...
@@ -1671,7 +1662,6 @@ fn enable_allow_internal_unstable = allow_internal_unstable,
fn
enable_custom_derive
=
custom_derive
,
fn
enable_format_args_nl
=
format_args_nl
,
fn
macros_in_extern_enabled
=
macros_in_extern
,
fn
custom_attribute_enabled
=
custom_attribute
,
fn
proc_macro_mod
=
proc_macro_mod
,
fn
proc_macro_gen
=
proc_macro_gen
,
fn
proc_macro_expr
=
proc_macro_expr
,
...
...
src/libsyntax/feature_gate.rs
浏览文件 @
50886115
...
...
@@ -1354,13 +1354,6 @@ fn leveled_feature_err<'a>(sess: &'a ParseSess, feature: &str, span: Span, issue
pub
const
EXPLAIN_MACRO_AT_MOST_ONCE_REP
:
&
'static
str
=
"using the `?` macro Kleene operator for
\"
at most one
\"
repetition is unstable"
;
pub
const
EXPLAIN_MACROS_IN_EXTERN
:
&
'static
str
=
"macro invocations in `extern {}` blocks are experimental."
;
// mention proc-macros when enabled
pub
const
EXPLAIN_PROC_MACROS_IN_EXTERN
:
&
'static
str
=
"macro and proc-macro invocations in `extern {}` blocks are experimental."
;
struct
PostExpansionVisitor
<
'a
>
{
context
:
&
'a
Context
<
'a
>
,
}
...
...
@@ -1969,7 +1962,6 @@ fn feature_removed(span_handler: &Handler, span: Span, reason: Option<&str>) {
)
.emit
();
}
else
{
set
(
&
mut
features
,
mi
.span
);
feature_checker
.collect
(
&
features
,
mi
.span
);
features
.declared_lang_features
.push
((
name
,
mi
.span
,
None
));
}
continue
...
...
src/test/compile-fail-fulldeps/proc-macro/issue-41211.rs
浏览文件 @
50886115
...
...
@@ -15,7 +15,7 @@
#![feature(use_extern_macros)]
#![emit_unchanged]
//~^ ERROR
: cannot find attribute macro `emit_unchanged` in this scope
//~^ ERROR
attribute `emit_unchanged` is currently unknown to the compiler
extern
crate
issue_41211
;
use
issue_41211
::
emit_unchanged
;
...
...
src/test/compile-fail-fulldeps/proc-macro/macros-in-extern.rs
浏览文件 @
50886115
...
...
@@ -26,13 +26,13 @@ fn main() {
#[link(name
=
"rust_test_helpers"
,
kind
=
"static"
)]
extern
{
#[no_output]
//~^ ERROR macro
and proc-macro invocations in `extern {}` blocks are experimental.
//~^ ERROR macro
invocations in `extern {}` blocks are experimental
fn
some_definitely_unknown_symbol_which_should_be_removed
();
#[nop_attr]
//~^ ERROR macro
and proc-macro invocations in `extern {}` blocks are experimental.
//~^ ERROR macro
invocations in `extern {}` blocks are experimental
fn
rust_get_test_int
()
->
isize
;
emit_input!
(
fn
rust_dbg_extern_identity_u32
(
arg
:
u32
)
->
u32
;);
//~^ ERROR macro
and proc-macro invocations in `extern {}` blocks are experimental.
//~^ ERROR macro
invocations in `extern {}` blocks are experimental
}
src/test/compile-fail/macros-in-extern.rs
浏览文件 @
50886115
...
...
@@ -34,9 +34,9 @@ fn main() {
#[link(name
=
"rust_test_helpers"
,
kind
=
"static"
)]
extern
{
returns_isize!
(
rust_get_test_int
);
//~^ ERROR macro invocations in `extern {}` blocks are experimental
.
//~^ ERROR macro invocations in `extern {}` blocks are experimental
takes_u32_returns_u32!
(
rust_dbg_extern_identity_u32
);
//~^ ERROR macro invocations in `extern {}` blocks are experimental
.
//~^ ERROR macro invocations in `extern {}` blocks are experimental
emits_nothing!
();
//~^ ERROR macro invocations in `extern {}` blocks are experimental
.
//~^ ERROR macro invocations in `extern {}` blocks are experimental
}
src/test/pretty/attr-literals.rs
浏览文件 @
50886115
...
...
@@ -18,6 +18,6 @@ fn main() {
#[align
=
8
]
fn
f
()
{
}
#[vec(
1
,
2
,
3
)]
#[vec
tor
(
1
,
2
,
3
)]
fn
g
()
{
}
}
src/test/ui-fulldeps/resolve-error.rs
浏览文件 @
50886115
...
...
@@ -13,7 +13,7 @@
// aux-build:attr_proc_macro.rs
// aux-build:bang_proc_macro.rs
#![feature(
use_extern_macros
)]
#![feature(
custom_attribute
)]
#[macro_use]
extern
crate
derive_foo
;
...
...
@@ -37,12 +37,10 @@
//~^ ERROR cannot find
struct
Foo
;
#[attr_proc_macra]
//~^ ERROR cannot find
#[attr_proc_macra]
// OK, interpreted as a custom attribute
struct
Bar
;
#[FooWithLongNan]
//~^ ERROR cannot find
#[FooWithLongNan]
// OK, interpreted as a custom attribute
struct
Asdf
;
#[derive(Dlone)]
...
...
src/test/ui-fulldeps/resolve-error.stderr
浏览文件 @
50886115
...
...
@@ -4,59 +4,47 @@ error: cannot find derive macro `FooWithLongNan` in this scope
LL | #[derive(FooWithLongNan)]
| ^^^^^^^^^^^^^^ help: try: `FooWithLongName`
error: cannot find attribute macro `attr_proc_macra` in this scope
--> $DIR/resolve-error.rs:40:3
|
LL | #[attr_proc_macra]
| ^^^^^^^^^^^^^^^ help: try: `attr_proc_macro`
error: cannot find attribute macro `FooWithLongNan` in this scope
--> $DIR/resolve-error.rs:44:3
|
LL | #[FooWithLongNan]
| ^^^^^^^^^^^^^^
error: cannot find derive macro `Dlone` in this scope
--> $DIR/resolve-error.rs:4
8
:10
--> $DIR/resolve-error.rs:4
6
:10
|
LL | #[derive(Dlone)]
| ^^^^^ help: try: `Clone`
error: cannot find derive macro `Dlona` in this scope
--> $DIR/resolve-error.rs:5
2
:10
--> $DIR/resolve-error.rs:5
0
:10
|
LL | #[derive(Dlona)]
| ^^^^^ help: try: `Clona`
error: cannot find derive macro `attr_proc_macra` in this scope
--> $DIR/resolve-error.rs:5
6
:10
--> $DIR/resolve-error.rs:5
4
:10
|
LL | #[derive(attr_proc_macra)]
| ^^^^^^^^^^^^^^^
error: cannot find macro `FooWithLongNama!` in this scope
--> $DIR/resolve-error.rs:
61
:5
--> $DIR/resolve-error.rs:
59
:5
|
LL | FooWithLongNama!();
| ^^^^^^^^^^^^^^^ help: you could try the macro: `FooWithLongNam`
error: cannot find macro `attr_proc_macra!` in this scope
--> $DIR/resolve-error.rs:6
4
:5
--> $DIR/resolve-error.rs:6
2
:5
|
LL | attr_proc_macra!();
| ^^^^^^^^^^^^^^^ help: you could try the macro: `attr_proc_mac`
error: cannot find macro `Dlona!` in this scope
--> $DIR/resolve-error.rs:6
7
:5
--> $DIR/resolve-error.rs:6
5
:5
|
LL | Dlona!();
| ^^^^^
error: cannot find macro `bang_proc_macrp!` in this scope
--> $DIR/resolve-error.rs:
70
:5
--> $DIR/resolve-error.rs:
68
:5
|
LL | bang_proc_macrp!();
| ^^^^^^^^^^^^^^^ help: you could try the macro: `bang_proc_macro`
error: aborting due to
10
previous errors
error: aborting due to
8
previous errors
src/test/
compile-fail-fulldeps/proc-macro/proc-macro-custom-attr-mutex
.rs
→
src/test/
ui/custom-attribute-multisegment
.rs
浏览文件 @
50886115
// Copyright 201
6
The Rust Project Developers. See the COPYRIGHT
// Copyright 201
8
The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
...
...
@@ -8,18 +8,11 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// aux-build:attr_proc_macro.rs
// ignore-tidy-linelength
// Unresolved multi-segment attributes are not treated as custom.
#![feature(custom_attribute)]
//~^ ERROR Cannot use `#![feature(use_extern_macros)]` and `#![feature(custom_attribute)] at the same time
#![feature(custom_attribute,
proc_macro_path_invoc)]
extern
crate
attr_proc_macro
;
use
attr_proc_macro
::
attr_proc_macro
;
mod
existent
{}
#[attr_proc_macro]
fn
foo
()
{}
fn
main
()
{
foo
();
}
#[existent::nonexistent]
//~ ERROR failed to resolve. Could not find `nonexistent` in `existent`
fn
main
()
{}
src/test/ui/custom-attribute-multisegment.stderr
0 → 100644
浏览文件 @
50886115
error[E0433]: failed to resolve. Could not find `nonexistent` in `existent`
--> $DIR/custom-attribute-multisegment.rs:17:13
|
LL | #[existent::nonexistent] //~ ERROR failed to resolve. Could not find `nonexistent` in `existent`
| ^^^^^^^^^^^ Could not find `nonexistent` in `existent`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0433`.
src/test/ui/feature-gate-macros_in_extern.rs
浏览文件 @
50886115
...
...
@@ -27,9 +27,9 @@
#[link(name
=
"rust_test_helpers"
,
kind
=
"static"
)]
extern
{
returns_isize!
(
rust_get_test_int
);
//~^ ERROR macro invocations in `extern {}` blocks are experimental
.
//~^ ERROR macro invocations in `extern {}` blocks are experimental
takes_u32_returns_u32!
(
rust_dbg_extern_identity_u32
);
//~^ ERROR macro invocations in `extern {}` blocks are experimental
.
//~^ ERROR macro invocations in `extern {}` blocks are experimental
emits_nothing!
();
//~^ ERROR macro invocations in `extern {}` blocks are experimental
.
//~^ ERROR macro invocations in `extern {}` blocks are experimental
}
src/test/ui/feature-gate-macros_in_extern.stderr
浏览文件 @
50886115
error[E0658]: macro
and proc-macro invocations in `extern {}` blocks are experimental.
(see issue #49476)
error[E0658]: macro
invocations in `extern {}` blocks are experimental
(see issue #49476)
--> $DIR/feature-gate-macros_in_extern.rs:29:5
|
LL | returns_isize!(rust_get_test_int);
...
...
@@ -6,7 +6,7 @@ LL | returns_isize!(rust_get_test_int);
|
= help: add #![feature(macros_in_extern)] to the crate attributes to enable
error[E0658]: macro
and proc-macro invocations in `extern {}` blocks are experimental.
(see issue #49476)
error[E0658]: macro
invocations in `extern {}` blocks are experimental
(see issue #49476)
--> $DIR/feature-gate-macros_in_extern.rs:31:5
|
LL | takes_u32_returns_u32!(rust_dbg_extern_identity_u32);
...
...
@@ -14,7 +14,7 @@ LL | takes_u32_returns_u32!(rust_dbg_extern_identity_u32);
|
= help: add #![feature(macros_in_extern)] to the crate attributes to enable
error[E0658]: macro
and proc-macro invocations in `extern {}` blocks are experimental.
(see issue #49476)
error[E0658]: macro
invocations in `extern {}` blocks are experimental
(see issue #49476)
--> $DIR/feature-gate-macros_in_extern.rs:33:5
|
LL | emits_nothing!();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录