Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
b0feb5be
R
Rust
项目概览
int
/
Rust
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
b0feb5be
编写于
3月 01, 2021
作者:
L
lcnr
提交者:
kadmin
3月 23, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
progress, stuff compiles now
上级
8ef81388
变更
25
隐藏空白更改
内联
并排
Showing
25 changed file
with
108 addition
and
76 deletion
+108
-76
compiler/rustc_ast_passes/src/ast_validation.rs
compiler/rustc_ast_passes/src/ast_validation.rs
+9
-17
compiler/rustc_error_codes/src/error_codes/E0128.md
compiler/rustc_error_codes/src/error_codes/E0128.md
+1
-1
compiler/rustc_hir/src/intravisit.rs
compiler/rustc_hir/src/intravisit.rs
+8
-1
compiler/rustc_middle/src/hir/map/collector.rs
compiler/rustc_middle/src/hir/map/collector.rs
+4
-0
compiler/rustc_middle/src/ty/consts.rs
compiler/rustc_middle/src/ty/consts.rs
+5
-1
compiler/rustc_resolve/src/lib.rs
compiler/rustc_resolve/src/lib.rs
+2
-2
compiler/rustc_typeck/src/astconv/generics.rs
compiler/rustc_typeck/src/astconv/generics.rs
+3
-1
compiler/rustc_typeck/src/astconv/mod.rs
compiler/rustc_typeck/src/astconv/mod.rs
+6
-23
compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs
compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs
+4
-5
compiler/rustc_typeck/src/check/wfcheck.rs
compiler/rustc_typeck/src/check/wfcheck.rs
+11
-1
compiler/rustc_typeck/src/collect.rs
compiler/rustc_typeck/src/collect.rs
+9
-1
compiler/rustc_typeck/src/collect/type_of.rs
compiler/rustc_typeck/src/collect/type_of.rs
+6
-0
src/test/ui/const-generics/defaults/const-default.rs
src/test/ui/const-generics/defaults/const-default.rs
+22
-4
src/test/ui/const-generics/defaults/wrong-order.full.stderr
src/test/ui/const-generics/defaults/wrong-order.full.stderr
+1
-1
src/test/ui/const-generics/defaults/wrong-order.min.stderr
src/test/ui/const-generics/defaults/wrong-order.min.stderr
+1
-1
src/test/ui/const-generics/defaults/wrong-order.rs
src/test/ui/const-generics/defaults/wrong-order.rs
+1
-1
src/test/ui/const-generics/min_const_generics/default_function_param.rs
...nst-generics/min_const_generics/default_function_param.rs
+1
-1
src/test/ui/const-generics/min_const_generics/default_function_param.stderr
...generics/min_const_generics/default_function_param.stderr
+4
-5
src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.full.stderr
...t-generics/params-in-ct-in-ty-param-lazy-norm.full.stderr
+1
-1
src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.min.stderr
...st-generics/params-in-ct-in-ty-param-lazy-norm.min.stderr
+1
-1
src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs
...t/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs
+1
-1
src/test/ui/generics/generic-non-trailing-defaults.rs
src/test/ui/generics/generic-non-trailing-defaults.rs
+3
-3
src/test/ui/generics/generic-non-trailing-defaults.stderr
src/test/ui/generics/generic-non-trailing-defaults.stderr
+2
-2
src/test/ui/generics/generic-type-params-forward-mention.rs
src/test/ui/generics/generic-type-params-forward-mention.rs
+1
-1
src/test/ui/issues/issue-26812.rs
src/test/ui/issues/issue-26812.rs
+1
-1
未找到文件。
compiler/rustc_ast_passes/src/ast_validation.rs
浏览文件 @
b0feb5be
...
...
@@ -1150,20 +1150,23 @@ fn visit_generic_args(&mut self, _: Span, generic_args: &'a GenericArgs) {
}
fn
visit_generics
(
&
mut
self
,
generics
:
&
'a
Generics
)
{
let
mut
prev_ty_default
=
None
;
let
cg_defaults
=
self
.session
.features_untracked
()
.const_generics_defaults
;
let
mut
prev_param_default
=
None
;
for
param
in
&
generics
.params
{
match
param
.kind
{
GenericParamKind
::
Lifetime
=>
(),
GenericParamKind
::
Type
{
default
:
Some
(
_
),
..
}
=>
{
prev_ty_default
=
Some
(
param
.ident.span
);
GenericParamKind
::
Type
{
default
:
Some
(
_
),
..
}
|
GenericParamKind
::
Const
{
default
:
Some
(
_
),
..
}
=>
{
prev_param_default
=
Some
(
param
.ident.span
);
}
GenericParamKind
::
Type
{
..
}
|
GenericParamKind
::
Const
{
..
}
=>
{
if
let
Some
(
span
)
=
prev_
ty
_default
{
if
let
Some
(
span
)
=
prev_
param
_default
{
let
mut
err
=
self
.err_handler
()
.struct_span_err
(
span
,
"
type
parameters with a default must be trailing"
,
"
generic
parameters with a default must be trailing"
,
);
if
matches!
(
param
.kind
,
GenericParamKind
::
Const
{
..
})
{
if
matches!
(
param
.kind
,
GenericParamKind
::
Const
{
..
})
&&
!
cg_defaults
{
err
.note
(
"using type defaults and const parameters
\
in the same parameter list is currently not permitted"
,
...
...
@@ -1174,17 +1177,6 @@ fn visit_generics(&mut self, generics: &'a Generics) {
}
}
}
if
!
self
.session
.features_untracked
()
.const_generics_defaults
{
if
let
GenericParamKind
::
Const
{
default
:
Some
(
ref
default
),
..
}
=
param
.kind
{
let
mut
err
=
self
.err_handler
()
.struct_span_err
(
default
.value.span
,
"default values for const generic parameters are unstable"
,
);
err
.help
(
"add `#![feature(const_generic_defaults)]` to the crate attributes to enable"
);
err
.emit
();
break
;
}
}
}
validate_generic_param_order
(
...
...
compiler/rustc_error_codes/src/error_codes/E0128.md
浏览文件 @
b0feb5be
...
...
@@ -7,7 +7,7 @@ struct Foo<T = U, U = ()> {
field1: T,
field2: U,
}
// error:
type
parameters with a default cannot use forward declared
// error:
generic
parameters with a default cannot use forward declared
// identifiers
```
...
...
compiler/rustc_hir/src/intravisit.rs
浏览文件 @
b0feb5be
...
...
@@ -366,6 +366,9 @@ fn visit_ty(&mut self, t: &'v Ty<'v>) {
fn
visit_generic_param
(
&
mut
self
,
p
:
&
'v
GenericParam
<
'v
>
)
{
walk_generic_param
(
self
,
p
)
}
fn
visit_const_param_default
(
&
mut
self
,
_
param
:
HirId
,
ct
:
&
'v
AnonConst
)
{
walk_const_param_default
(
self
,
ct
)
}
fn
visit_generics
(
&
mut
self
,
g
:
&
'v
Generics
<
'v
>
)
{
walk_generics
(
self
,
g
)
}
...
...
@@ -869,13 +872,17 @@ pub fn walk_generic_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v Generi
GenericParamKind
::
Const
{
ref
ty
,
ref
default
}
=>
{
visitor
.visit_ty
(
ty
);
if
let
Some
(
ref
default
)
=
default
{
visitor
.visit_
anon_const
(
default
);
visitor
.visit_
const_param_default
(
param
.hir_id
,
default
);
}
}
}
walk_list!
(
visitor
,
visit_param_bound
,
param
.bounds
);
}
pub
fn
walk_const_param_default
<
'v
,
V
:
Visitor
<
'v
>>
(
visitor
:
&
mut
V
,
ct
:
&
'v
AnonConst
)
{
visitor
.visit_anon_const
(
ct
)
}
pub
fn
walk_generics
<
'v
,
V
:
Visitor
<
'v
>>
(
visitor
:
&
mut
V
,
generics
:
&
'v
Generics
<
'v
>
)
{
walk_list!
(
visitor
,
visit_generic_param
,
generics
.params
);
walk_list!
(
visitor
,
visit_where_predicate
,
generics
.where_clause.predicates
);
...
...
compiler/rustc_middle/src/hir/map/collector.rs
浏览文件 @
b0feb5be
...
...
@@ -395,6 +395,10 @@ fn visit_generic_param(&mut self, param: &'hir GenericParam<'hir>) {
}
}
fn
visit_const_param_default
(
&
mut
self
,
param
:
HirId
,
ct
:
&
'hir
AnonConst
)
{
self
.with_parent
(
param
,
|
this
|
intravisit
::
walk_const_param_default
(
this
,
ct
))
}
fn
visit_trait_item
(
&
mut
self
,
ti
:
&
'hir
TraitItem
<
'hir
>
)
{
self
.with_dep_node_owner
(
ti
.def_id
,
ti
,
|
this
,
hash
|
{
this
.insert_with_hash
(
ti
.span
,
ti
.hir_id
(),
Node
::
TraitItem
(
ti
),
hash
);
...
...
compiler/rustc_middle/src/ty/consts.rs
浏览文件 @
b0feb5be
...
...
@@ -44,7 +44,11 @@ pub fn from_opt_const_arg_anon_const(
let
hir_id
=
tcx
.hir
()
.local_def_id_to_hir_id
(
def
.did
);
let
body_id
=
match
tcx
.hir
()
.get
(
hir_id
)
{
hir
::
Node
::
AnonConst
(
ac
)
=>
ac
.body
,
hir
::
Node
::
AnonConst
(
ac
)
|
hir
::
Node
::
GenericParam
(
hir
::
GenericParam
{
kind
:
hir
::
GenericParamKind
::
Const
{
ty
:
_
,
default
:
Some
(
ac
)
},
..
})
=>
ac
.body
,
_
=>
span_bug!
(
tcx
.def_span
(
def
.did
.to_def_id
()),
"from_anon_const can only process anonymous constants"
...
...
compiler/rustc_resolve/src/lib.rs
浏览文件 @
b0feb5be
...
...
@@ -228,7 +228,7 @@ enum ResolutionError<'a> {
),
/// Error E0530: `X` bindings cannot shadow `Y`s.
BindingShadowsSomethingUnacceptable
(
&
'static
str
,
Symbol
,
&
'a
NameBinding
<
'a
>
),
/// Error E0128:
type
parameters with a default cannot use forward-declared identifiers.
/// Error E0128:
generic
parameters with a default cannot use forward-declared identifiers.
ForwardDeclaredTyParam
,
// FIXME(const_generics_defaults)
/// ERROR E0770: the type of const parameters must not depend on other generic parameters.
ParamInTyOfConstParam
(
Symbol
),
...
...
@@ -238,7 +238,7 @@ enum ResolutionError<'a> {
///
/// This error is only emitted when using `min_const_generics`.
ParamInNonTrivialAnonConst
{
name
:
Symbol
,
is_type
:
bool
},
/// Error E0735:
type
parameters with a default cannot use `Self`
/// Error E0735:
generic
parameters with a default cannot use `Self`
SelfInTyParamDefault
,
/// Error E0767: use of unreachable label
UnreachableLabel
{
name
:
Symbol
,
definition_span
:
Span
,
suggestion
:
Option
<
LabelSuggestion
>
},
...
...
compiler/rustc_typeck/src/astconv/generics.rs
浏览文件 @
b0feb5be
...
...
@@ -499,7 +499,9 @@ pub(crate) fn check_generic_arg_count(
let
expected_min
=
if
infer_args
{
0
}
else
{
param_counts
.consts
+
named_type_param_count
-
default_counts
.types
param_counts
.consts
+
named_type_param_count
-
default_counts
.types
-
default_counts
.consts
};
check_generics
(
...
...
compiler/rustc_typeck/src/astconv/mod.rs
浏览文件 @
b0feb5be
...
...
@@ -505,34 +505,17 @@ fn inferred_kind(
}
}
GenericParamDefKind
::
Const
{
has_default
}
=>
{
let
ty
=
tcx
.at
(
self
.span
)
.type_of
(
param
.def_id
);
if
!
infer_args
&&
has_default
{
let
c
=
substs
.unwrap
()[
param
.index
as
usize
]
.expect_const
();
ty
::
subst
::
GenericArg
::
from
(
c
)
}
else
if
infer_args
{
self
.astconv
.ct_infer
(
ty
,
Some
(
param
),
self
.span
)
.into
()
ty
::
Const
::
from_anon_const
(
tcx
,
param
.def_id
.expect_local
())
.into
()
}
else
{
// We've already errored above about the mismatch.
tcx
.const_error
(
ty
)
.into
()
}
// FIXME(const_generic_defaults)
/*
if !infer_args && has_default {
/*
if default_needs_object_self(param) {
missing_type_params.push(param.name.to_string());
tcx.const_error(ty).into()
let
ty
=
tcx
.at
(
self
.span
)
.type_of
(
param
.def_id
);
if
infer_args
{
self
.astconv
.ct_infer
(
ty
,
Some
(
param
),
self
.span
)
.into
()
}
else
{
// We've already errored above about the mismatch.
tcx
.const_error
(
ty
)
.into
()
}
*/
}
else
if
infer_args
{
// No const parameters were provided, we can infer all.
self
.astconv
.ct_infer
(
ty
,
Some
(
param
),
self
.span
)
.into
()
}
else
{
// We've already errored above about the mismatch.
tcx
.const_error
(
ty
)
.into
()
}
*/
}
}
}
...
...
compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs
浏览文件 @
b0feb5be
...
...
@@ -1444,12 +1444,11 @@ fn inferred_kind(
}
}
GenericParamDefKind
::
Const
{
has_default
,
..
}
=>
{
if
infer_args
||
!
has_default
{
return
self
.fcx
.var_for_def
(
self
.span
,
param
);
if
!
infer_args
&&
has_default
{
ty
::
Const
::
from_anon_const
(
tcx
,
param
.def_id
.expect_local
())
.into
()
}
else
{
self
.fcx
.var_for_def
(
self
.span
,
param
)
}
// FIXME(const_generic_defaults)
// No const parameters were provided, we have to infer them.
todo!
()
}
}
}
...
...
compiler/rustc_typeck/src/check/wfcheck.rs
浏览文件 @
b0feb5be
...
...
@@ -759,7 +759,7 @@ fn check_where_clauses<'tcx, 'fcx>(
fcx
.tcx
.mk_param_from_def
(
param
)
}
GenericParamDefKind
::
Type
{
..
}
|
GenericParamDefKind
::
Const
{
..
}
=>
{
GenericParamDefKind
::
Type
{
..
}
=>
{
// If the param has a default, ...
if
is_our_default
(
param
)
{
let
default_ty
=
fcx
.tcx
.type_of
(
param
.def_id
);
...
...
@@ -772,6 +772,16 @@ fn check_where_clauses<'tcx, 'fcx>(
fcx
.tcx
.mk_param_from_def
(
param
)
}
GenericParamDefKind
::
Const
{
..
}
=>
{
if
is_our_default
(
param
)
{
let
default_ct
=
ty
::
Const
::
from_anon_const
(
tcx
,
param
.def_id
.expect_local
());
// Const params have to currently be concrete.
assert
!
(
!
default_ct
.needs_subst
());
default_ct
.into
()
}
else
{
fcx
.tcx
.mk_param_from_def
(
param
)
}
}
}
});
...
...
compiler/rustc_typeck/src/collect.rs
浏览文件 @
b0feb5be
...
...
@@ -1527,7 +1527,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
|
lint
|
{
lint
.build
(
"defaults for type parameters are only allowed in
\
`struct`, `enum`, `type`, or `trait` definitions
.
"
,
`struct`, `enum`, `type`, or `trait` definitions"
,
)
.emit
();
},
...
...
@@ -1554,6 +1554,14 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
Some
(
param_def
)
}
GenericParamKind
::
Const
{
default
,
..
}
=>
{
if
!
allow_defaults
&&
default
.is_some
()
{
tcx
.sess
.span_err
(
param
.span
,
"defaults for const parameters are only allowed in
\
`struct`, `enum`, `type`, or `trait` definitions"
,
);
}
let
param_def
=
ty
::
GenericParamDef
{
index
:
type_start
+
i
as
u32
,
name
:
param
.name
.ident
()
.name
,
...
...
compiler/rustc_typeck/src/collect/type_of.rs
浏览文件 @
b0feb5be
...
...
@@ -436,6 +436,12 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
.discr_type
()
.to_ty
(
tcx
),
Node
::
GenericParam
(
&
GenericParam
{
hir_id
:
param_hir_id
,
kind
:
GenericParamKind
::
Const
{
default
:
Some
(
ct
),
..
},
..
})
if
ct
.hir_id
==
hir_id
=>
tcx
.type_of
(
tcx
.hir
()
.local_def_id
(
param_hir_id
)),
x
=>
tcx
.ty_error_with_message
(
DUMMY_SP
,
&
format!
(
"unexpected const parent in type_of_def_id(): {:?}"
,
x
),
...
...
src/test/ui/const-generics/defaults/const-default.rs
浏览文件 @
b0feb5be
//
check
-pass
//
run
-pass
#![feature(const_generics)]
#![feature(const_generic_defaults)]
#![feature(const_generic
s
_defaults)]
#![allow(incomplete_features)]
pub
struct
ConstDefault
<
const
N
:
usize
=
3
>
{}
pub
struct
ConstDefault
<
const
N
:
usize
=
3
>
;
impl
<
const
N
:
usize
>
ConstDefault
<
N
>
{
fn
foo
(
self
)
->
usize
{
N
}
}
impl
ConstDefault
{
fn
new
()
->
Self
{
ConstDefault
}
fn
bar
(
self
)
{}
}
pub
fn
main
()
{
let
s
=
ConstDefault
::
default
();
let
s
=
ConstDefault
::
new
();
assert_eq!
(
s
.foo
(),
3
);
let
w
=
ConstDefault
::
<
3
>
;
w
.bar
();
}
src/test/ui/const-generics/defaults/wrong-order.full.stderr
浏览文件 @
b0feb5be
error:
type
parameters with a default must be trailing
error:
generic
parameters with a default must be trailing
--> $DIR/wrong-order.rs:4:10
|
LL | struct A<T = u32, const N: usize> {
...
...
src/test/ui/const-generics/defaults/wrong-order.min.stderr
浏览文件 @
b0feb5be
error:
type
parameters with a default must be trailing
error:
generic
parameters with a default must be trailing
--> $DIR/wrong-order.rs:4:10
|
LL | struct A<T = u32, const N: usize> {
...
...
src/test/ui/const-generics/defaults/wrong-order.rs
浏览文件 @
b0feb5be
...
...
@@ -2,7 +2,7 @@
#![cfg_attr(full,
feature(const_generics))]
//[full]~WARN the feature `const_generics` is incomplete
struct
A
<
T
=
u32
,
const
N
:
usize
>
{
//~^ ERROR
type
parameters with a default must be trailing
//~^ ERROR
generic
parameters with a default must be trailing
arg
:
T
,
}
...
...
src/test/ui/const-generics/min_const_generics/default_function_param.rs
浏览文件 @
b0feb5be
#![crate_type
=
"lib"
]
#![feature(const_generics_defaults)]
#![feature(min_const_generics)]
#![allow(incomplete_features)]
fn
foo
<
const
SIZE
:
usize
=
5u
size
>
()
{}
//~^ ERROR defaults for const parameters are
src/test/ui/const-generics/min_const_generics/default_function_param.stderr
浏览文件 @
b0feb5be
error
[E0282]: type annotations needed
--> $DIR/default_function_param.rs:
6:28
error
: defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions
--> $DIR/default_function_param.rs:
5:14
|
LL | fn foo<const SIZE: usize = 5>() {}
|
^ cannot infer type for type `{integer}`
LL | fn foo<const SIZE: usize = 5
usize
>() {}
|
^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0282`.
src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.full.stderr
浏览文件 @
b0feb5be
error:
type
parameters with a default must be trailing
error:
generic
parameters with a default must be trailing
--> $DIR/params-in-ct-in-ty-param-lazy-norm.rs:11:12
|
LL | struct Bar<T = [u8; N], const N: usize>(T);
...
...
src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.min.stderr
浏览文件 @
b0feb5be
error:
type
parameters with a default must be trailing
error:
generic
parameters with a default must be trailing
--> $DIR/params-in-ct-in-ty-param-lazy-norm.rs:11:12
|
LL | struct Bar<T = [u8; N], const N: usize>(T);
...
...
src/test/ui/const-generics/params-in-ct-in-ty-param-lazy-norm.rs
浏览文件 @
b0feb5be
...
...
@@ -10,6 +10,6 @@
// FIXME(const_generics_defaults): We still don't know how to deal with type defaults.
struct
Bar
<
T
=
[
u8
;
N
],
const
N
:
usize
>
(
T
);
//~^ ERROR constant values inside of type parameter defaults
//~| ERROR
type
parameters with a default
//~| ERROR
generic
parameters with a default
fn
main
()
{}
src/test/ui/generics/generic-non-trailing-defaults.rs
浏览文件 @
b0feb5be
struct
Heap
;
struct
Vec
<
A
=
Heap
,
T
>
(
A
,
T
);
//~^ ERROR
type
parameters with a default must be trailing
//~^ ERROR
generic
parameters with a default must be trailing
struct
Foo
<
A
,
B
=
Vec
<
C
>
,
C
>
(
A
,
B
,
C
);
//~^ ERROR
type
parameters with a default must be trailing
//~| ERROR
type
parameters with a default cannot use forward declared identifiers
//~^ ERROR
generic
parameters with a default must be trailing
//~| ERROR
generic
parameters with a default cannot use forward declared identifiers
fn
main
()
{}
src/test/ui/generics/generic-non-trailing-defaults.stderr
浏览文件 @
b0feb5be
error:
type
parameters with a default must be trailing
error:
generic
parameters with a default must be trailing
--> $DIR/generic-non-trailing-defaults.rs:3:12
|
LL | struct Vec<A = Heap, T>(A, T);
| ^
error:
type
parameters with a default must be trailing
error:
generic
parameters with a default must be trailing
--> $DIR/generic-non-trailing-defaults.rs:6:15
|
LL | struct Foo<A, B = Vec<C>, C>(A, B, C);
...
...
src/test/ui/generics/generic-type-params-forward-mention.rs
浏览文件 @
b0feb5be
// Ensure that we get an error and not an ICE for this problematic case.
struct
Foo
<
T
=
Option
<
U
>
,
U
=
bool
>
(
T
,
U
);
//~^ ERROR
type
parameters with a default cannot use forward declared identifiers
//~^ ERROR
generic
parameters with a default cannot use forward declared identifiers
fn
main
()
{
let
x
:
Foo
;
}
src/test/ui/issues/issue-26812.rs
浏览文件 @
b0feb5be
#![feature(default_type_parameter_fallback)]
fn
avg
<
T
=
T
::
Item
>
(
_
:
T
)
{}
//~^ ERROR
type
parameters with a default cannot use forward declared identifiers
//~^ ERROR
generic
parameters with a default cannot use forward declared identifiers
fn
main
()
{}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录