@@ -29,14 +29,15 @@ pub struct CheckCrateVisitor {
2929
3030impl Visitor < bool > for CheckCrateVisitor {
3131 fn visit_item ( & mut self , i : & Item , env : bool ) {
32- check_item ( self , self . sess , self . def_map , i, env) ;
32+ check_item ( self , self . sess , self . def_map , self . method_map ,
33+ self . tcx , i, env)
3334 }
3435 fn visit_pat ( & mut self , p : & Pat , env : bool ) {
3536 check_pat ( self , p, env) ;
3637 }
3738 fn visit_expr ( & mut self , ex : & Expr , env : bool ) {
3839 check_expr ( self , self . sess , self . def_map , self . method_map ,
39- self . tcx , ex, env) ;
40+ self . tcx , ex, env, false ) ;
4041 }
4142}
4243
@@ -58,11 +59,13 @@ pub fn check_crate(sess: Session,
5859pub fn check_item ( v : & mut CheckCrateVisitor ,
5960 sess : Session ,
6061 def_map : resolve:: DefMap ,
62+ method_map : typeck:: method_map ,
63+ tcx : ty:: ctxt ,
6164 it : & Item ,
6265 _is_const : bool ) {
6366 match it. node {
64- ItemStatic ( _, _ , ex) => {
65- v . visit_expr ( ex, true ) ;
67+ ItemStatic ( _, mut_ , ex) => {
68+ check_expr ( v , sess , def_map , method_map , tcx , ex, true , mut_ == MutMutable ) ;
6669 check_item_recursion ( sess, & v. tcx . map , def_map, it) ;
6770 }
6871 ItemEnum ( ref enum_definition, _) => {
@@ -105,7 +108,8 @@ pub fn check_expr(v: &mut CheckCrateVisitor,
105108 method_map : typeck:: MethodMap ,
106109 tcx : ty:: ctxt ,
107110 e : & Expr ,
108- is_const : bool ) {
111+ is_const : bool ,
112+ is_static_mut : bool ) {
109113 if is_const {
110114 match e. node {
111115 ExprUnary ( UnDeref , _) => { }
@@ -187,6 +191,11 @@ pub fn check_expr(v: &mut CheckCrateVisitor,
187191 e. span ,
188192 "references in constants may only refer to \
189193 immutable values") ;
194+ }
195+ ExprVstore ( _, ExprVstoreMutSlice ) => {
196+ if !is_static_mut {
197+ sess. span_err ( e. span , "mutable slice is not allowed in immutable constants" )
198+ }
190199 } ,
191200 ExprVstore ( _, ExprVstoreUniq ) => {
192201 sess. span_err ( e. span , "cannot allocate vectors in constant expressions" )
0 commit comments