Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
d11bfba7
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,发现更多精彩内容 >>
提交
d11bfba7
编写于
1月 07, 2015
作者:
A
Alex Crichton
浏览文件
操作
浏览文件
下载
差异文件
rollup merge of #20720: nick29581/assoc-ice-missing
上级
66213256
68a783a8
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
105 addition
and
22 deletion
+105
-22
src/libcore/ops.rs
src/libcore/ops.rs
+33
-4
src/libsyntax/parse/parser.rs
src/libsyntax/parse/parser.rs
+20
-18
src/test/run-pass/ranges-precedence.rs
src/test/run-pass/ranges-precedence.rs
+52
-0
未找到文件。
src/libcore/ops.rs
浏览文件 @
d11bfba7
...
...
@@ -65,6 +65,7 @@
use
iter
::{
Step
,
Iterator
,
DoubleEndedIterator
,
ExactSizeIterator
};
use
marker
::
Sized
;
use
option
::
Option
::{
self
,
Some
,
None
};
use
fmt
;
/// The `Drop` trait is used to run some code when a value goes out of scope. This
/// is sometimes called a 'destructor'.
...
...
@@ -847,13 +848,20 @@ pub trait IndexMut<Index: ?Sized> {
}
/// An unbounded range.
#[derive(Copy)]
#[derive(Copy
,
PartialEq,
Eq
)]
#[lang=
"full_range"
]
#[unstable
=
"API still in development"
]
pub
struct
FullRange
;
#[unstable
=
"API still in development"
]
impl
fmt
::
Show
for
FullRange
{
fn
fmt
(
&
self
,
fmt
:
&
mut
fmt
::
Formatter
)
->
fmt
::
Result
{
fmt
::
Show
::
fmt
(
".."
,
fmt
)
}
}
/// A (half-open) range which is bounded at both ends.
#[derive(Copy)]
#[derive(Copy
,
PartialEq,
Eq
)]
#[lang=
"range"
]
#[unstable
=
"API still in development"
]
pub
struct
Range
<
Idx
>
{
...
...
@@ -904,8 +912,15 @@ fn next_back(&mut self) -> Option<Idx> {
#[unstable
=
"API still in development"
]
impl
<
Idx
:
Clone
+
Step
>
ExactSizeIterator
for
Range
<
Idx
>
{}
#[unstable
=
"API still in development"
]
impl
<
Idx
:
fmt
::
Show
>
fmt
::
Show
for
Range
<
Idx
>
{
fn
fmt
(
&
self
,
fmt
:
&
mut
fmt
::
Formatter
)
->
fmt
::
Result
{
write!
(
fmt
,
"{:?}..{:?}"
,
self
.start
,
self
.end
)
}
}
/// A range which is only bounded below.
#[derive(Copy)]
#[derive(Copy
,
PartialEq,
Eq
)]
#[lang=
"range_from"
]
#[unstable
=
"API still in development"
]
pub
struct
RangeFrom
<
Idx
>
{
...
...
@@ -926,8 +941,15 @@ fn next(&mut self) -> Option<Idx> {
}
}
#[unstable
=
"API still in development"
]
impl
<
Idx
:
fmt
::
Show
>
fmt
::
Show
for
RangeFrom
<
Idx
>
{
fn
fmt
(
&
self
,
fmt
:
&
mut
fmt
::
Formatter
)
->
fmt
::
Result
{
write!
(
fmt
,
"{:?}.."
,
self
.start
)
}
}
/// A range which is only bounded above.
#[derive(Copy)]
#[derive(Copy
,
PartialEq,
Eq
)]
#[lang=
"range_to"
]
#[unstable
=
"API still in development"
]
pub
struct
RangeTo
<
Idx
>
{
...
...
@@ -935,6 +957,13 @@ pub struct RangeTo<Idx> {
pub
end
:
Idx
,
}
#[unstable
=
"API still in development"
]
impl
<
Idx
:
fmt
::
Show
>
fmt
::
Show
for
RangeTo
<
Idx
>
{
fn
fmt
(
&
self
,
fmt
:
&
mut
fmt
::
Formatter
)
->
fmt
::
Result
{
write!
(
fmt
,
"..{:?}"
,
self
.end
)
}
}
/// The `Deref` trait is used to specify the functionality of dereferencing
/// operations like `*v`.
...
...
src/libsyntax/parse/parser.rs
浏览文件 @
d11bfba7
...
...
@@ -2535,7 +2535,7 @@ pub fn parse_dot_or_call_expr_with(&mut self, e0: P<Expr>) -> P<Expr> {
}
// expr[...]
//
An index
expression.
//
Could be either an index expression or a slicing
expression.
token
::
OpenDelim
(
token
::
Bracket
)
=>
{
let
bracket_pos
=
self
.span.lo
;
self
.bump
();
...
...
@@ -2575,22 +2575,6 @@ pub fn parse_dot_or_call_expr_with(&mut self, e0: P<Expr>) -> P<Expr> {
"use `&expr[]` to construct a slice of the whole of expr"
);
}
}
// A range expression, either `expr..expr` or `expr..`.
token
::
DotDot
if
!
self
.restrictions
.contains
(
RESTRICTION_NO_DOTS
)
=>
{
self
.bump
();
let
opt_end
=
if
self
.token
.can_begin_expr
()
{
let
end
=
self
.parse_expr_res
(
RESTRICTION_NO_DOTS
);
Some
(
end
)
}
else
{
None
};
let
hi
=
self
.span.hi
;
let
range
=
self
.mk_range
(
Some
(
e
),
opt_end
);
return
self
.mk_expr
(
lo
,
hi
,
range
);
}
_
=>
return
e
}
}
...
...
@@ -2833,7 +2817,7 @@ pub fn parse_prefix_expr(&mut self) -> P<Expr> {
token
::
DotDot
if
!
self
.restrictions
.contains
(
RESTRICTION_NO_DOTS
)
=>
{
// A range, closed above: `..expr`.
self
.bump
();
let
e
=
self
.parse_
prefix_
expr
();
let
e
=
self
.parse_expr
();
hi
=
e
.span.hi
;
ex
=
self
.mk_range
(
None
,
Some
(
e
));
}
...
...
@@ -2900,6 +2884,7 @@ pub fn parse_more_binops(&mut self, lhs: P<Expr>, min_prec: uint) -> P<Expr> {
self
.restrictions
.contains
(
RESTRICTION_NO_BAR_OP
)
{
return
lhs
;
}
self
.expected_tokens
.push
(
TokenType
::
Operator
);
let
cur_opt
=
self
.token
.to_binop
();
...
...
@@ -2991,6 +2976,23 @@ pub fn parse_assign_expr_with(&mut self, lhs: P<Expr>) -> P<Expr> {
let
assign_op
=
self
.mk_assign_op
(
aop
,
lhs
,
rhs
);
self
.mk_expr
(
span
.lo
,
rhs_span
.hi
,
assign_op
)
}
// A range expression, either `expr..expr` or `expr..`.
token
::
DotDot
if
!
self
.restrictions
.contains
(
RESTRICTION_NO_DOTS
)
=>
{
self
.bump
();
let
opt_end
=
if
self
.token
.can_begin_expr
()
{
let
end
=
self
.parse_expr_res
(
RESTRICTION_NO_DOTS
);
Some
(
end
)
}
else
{
None
};
let
lo
=
lhs
.span.lo
;
let
hi
=
self
.span.hi
;
let
range
=
self
.mk_range
(
Some
(
lhs
),
opt_end
);
return
self
.mk_expr
(
lo
,
hi
,
range
);
}
_
=>
{
lhs
}
...
...
src/test/run-pass/ranges-precedence.rs
0 → 100644
浏览文件 @
d11bfba7
// 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.
// Test that the precedence of ranges is correct
#![feature(slicing_syntax)]
struct
Foo
{
foo
:
uint
,
}
impl
Foo
{
fn
bar
(
&
self
)
->
uint
{
5
}
}
fn
main
()
{
let
x
=
1
+
3
..
4
+
5
;
assert
!
(
x
==
(
4
..
9
));
let
x
=
1
..
4
+
5
;
assert
!
(
x
==
(
1
..
9
));
let
x
=
1
+
3
..
4
;
assert
!
(
x
==
(
4
..
4
));
let
a
=
Foo
{
foo
:
3
};
let
x
=
a
.foo
..
a
.bar
();
assert
!
(
x
==
(
3
..
5
));
let
x
=
1
+
3
..
;
assert
!
(
x
==
(
4
..
));
let
x
=
..
1
+
3
;
assert
!
(
x
==
(
..
4
));
let
a
=
&
[
0i32
,
1
,
2
,
3
,
4
,
5
,
6
];
let
x
=
&
a
[
1
+
1
..
2
+
2
];
assert
!
(
x
==
&
a
[
2
..
4
]);
let
x
=
&
a
[
..
1
+
2
];
assert
!
(
x
==
&
a
[
..
3
]);
let
x
=
&
a
[
1
+
2
..
];
assert
!
(
x
==
&
a
[
3
..
]);
for
_
i
in
2
+
4
..
10
-
3
{}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录