rustc: turn mir::LocalDecl's visibility_source_info into a SourceScope.
This commit is contained in:
parent
3da186b67f
commit
6c53972478
18 changed files with 44 additions and 55 deletions
|
@ -26,7 +26,7 @@ impl_stable_hash_for!(struct mir::LocalDecl<'tcx> {
|
||||||
ty,
|
ty,
|
||||||
name,
|
name,
|
||||||
syntactic_source_info,
|
syntactic_source_info,
|
||||||
visibility_source_info,
|
visibility_scope,
|
||||||
internal,
|
internal,
|
||||||
is_user_variable
|
is_user_variable
|
||||||
});
|
});
|
||||||
|
|
|
@ -558,7 +558,7 @@ pub struct LocalDecl<'tcx> {
|
||||||
/// To allow both uses to work, we need to have more than a single scope
|
/// To allow both uses to work, we need to have more than a single scope
|
||||||
/// for a local. We have the `syntactic_source_info.scope` represent the
|
/// for a local. We have the `syntactic_source_info.scope` represent the
|
||||||
/// "syntactic" lint scope (with a variable being under its let
|
/// "syntactic" lint scope (with a variable being under its let
|
||||||
/// block) while the `visibility_source_info.scope` represents the "local variable"
|
/// block) while the `visibility_scope` represents the "local variable"
|
||||||
/// scope (where the "rest" of a block is under all prior let-statements).
|
/// scope (where the "rest" of a block is under all prior let-statements).
|
||||||
///
|
///
|
||||||
/// The end result looks like this:
|
/// The end result looks like this:
|
||||||
|
@ -577,18 +577,18 @@ pub struct LocalDecl<'tcx> {
|
||||||
/// │ │
|
/// │ │
|
||||||
/// │ │ │{ let y: u32 }
|
/// │ │ │{ let y: u32 }
|
||||||
/// │ │ │
|
/// │ │ │
|
||||||
/// │ │ │← y.visibility_source_info.scope
|
/// │ │ │← y.visibility_scope
|
||||||
/// │ │ │← `y + 2`
|
/// │ │ │← `y + 2`
|
||||||
/// │
|
/// │
|
||||||
/// │ │{ let x: u32 }
|
/// │ │{ let x: u32 }
|
||||||
/// │ │← x.visibility_source_info.scope
|
/// │ │← x.visibility_scope
|
||||||
/// │ │← `drop(x)` // this accesses `x: u32`
|
/// │ │← `drop(x)` // this accesses `x: u32`
|
||||||
/// ```
|
/// ```
|
||||||
pub syntactic_source_info: SourceInfo,
|
pub syntactic_source_info: SourceInfo,
|
||||||
|
|
||||||
/// Source info of the local. The `SourceScope` is the *visibility* one,
|
/// Source scope within which the local is visible (for debuginfo)
|
||||||
/// not the the *syntactic* one (see `syntactic_source_info` for more details).
|
/// (see `syntactic_source_info` for more details).
|
||||||
pub visibility_source_info: SourceInfo,
|
pub visibility_scope: SourceScope,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> LocalDecl<'tcx> {
|
impl<'tcx> LocalDecl<'tcx> {
|
||||||
|
@ -603,10 +603,7 @@ impl<'tcx> LocalDecl<'tcx> {
|
||||||
span,
|
span,
|
||||||
scope: OUTERMOST_SOURCE_SCOPE
|
scope: OUTERMOST_SOURCE_SCOPE
|
||||||
},
|
},
|
||||||
visibility_source_info: SourceInfo {
|
visibility_scope: OUTERMOST_SOURCE_SCOPE,
|
||||||
span,
|
|
||||||
scope: OUTERMOST_SOURCE_SCOPE
|
|
||||||
},
|
|
||||||
internal: false,
|
internal: false,
|
||||||
is_user_variable: false
|
is_user_variable: false
|
||||||
}
|
}
|
||||||
|
@ -623,10 +620,7 @@ impl<'tcx> LocalDecl<'tcx> {
|
||||||
span,
|
span,
|
||||||
scope: OUTERMOST_SOURCE_SCOPE
|
scope: OUTERMOST_SOURCE_SCOPE
|
||||||
},
|
},
|
||||||
visibility_source_info: SourceInfo {
|
visibility_scope: OUTERMOST_SOURCE_SCOPE,
|
||||||
span,
|
|
||||||
scope: OUTERMOST_SOURCE_SCOPE
|
|
||||||
},
|
|
||||||
internal: true,
|
internal: true,
|
||||||
is_user_variable: false
|
is_user_variable: false
|
||||||
}
|
}
|
||||||
|
@ -644,10 +638,7 @@ impl<'tcx> LocalDecl<'tcx> {
|
||||||
span,
|
span,
|
||||||
scope: OUTERMOST_SOURCE_SCOPE
|
scope: OUTERMOST_SOURCE_SCOPE
|
||||||
},
|
},
|
||||||
visibility_source_info: SourceInfo {
|
visibility_scope: OUTERMOST_SOURCE_SCOPE,
|
||||||
span,
|
|
||||||
scope: OUTERMOST_SOURCE_SCOPE
|
|
||||||
},
|
|
||||||
internal: false,
|
internal: false,
|
||||||
name: None, // FIXME maybe we do want some name here?
|
name: None, // FIXME maybe we do want some name here?
|
||||||
is_user_variable: false
|
is_user_variable: false
|
||||||
|
@ -2201,7 +2192,7 @@ BraceStructTypeFoldableImpl! {
|
||||||
ty,
|
ty,
|
||||||
name,
|
name,
|
||||||
syntactic_source_info,
|
syntactic_source_info,
|
||||||
visibility_source_info,
|
visibility_scope,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -715,7 +715,7 @@ macro_rules! make_mir_visitor {
|
||||||
ref $($mutability)* ty,
|
ref $($mutability)* ty,
|
||||||
name: _,
|
name: _,
|
||||||
ref $($mutability)* syntactic_source_info,
|
ref $($mutability)* syntactic_source_info,
|
||||||
ref $($mutability)* visibility_source_info,
|
ref $($mutability)* visibility_scope,
|
||||||
internal: _,
|
internal: _,
|
||||||
is_user_variable: _,
|
is_user_variable: _,
|
||||||
} = *local_decl;
|
} = *local_decl;
|
||||||
|
@ -725,7 +725,7 @@ macro_rules! make_mir_visitor {
|
||||||
source_info: *syntactic_source_info,
|
source_info: *syntactic_source_info,
|
||||||
});
|
});
|
||||||
self.visit_source_info(syntactic_source_info);
|
self.visit_source_info(syntactic_source_info);
|
||||||
self.visit_source_info(visibility_source_info);
|
self.visit_source_scope(visibility_scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn super_source_scope(&mut self,
|
fn super_source_scope(&mut self,
|
||||||
|
|
|
@ -65,7 +65,7 @@ pub fn create_mir_scopes(cx: &CodegenCx, mir: &Mir, debug_context: &FunctionDebu
|
||||||
let mut has_variables = BitVector::new(mir.source_scopes.len());
|
let mut has_variables = BitVector::new(mir.source_scopes.len());
|
||||||
for var in mir.vars_iter() {
|
for var in mir.vars_iter() {
|
||||||
let decl = &mir.local_decls[var];
|
let decl = &mir.local_decls[var];
|
||||||
has_variables.insert(decl.visibility_source_info.scope.index());
|
has_variables.insert(decl.visibility_scope.index());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Instantiate all scopes.
|
// Instantiate all scopes.
|
||||||
|
|
|
@ -265,7 +265,7 @@ pub fn codegen_mir<'a, 'tcx: 'a>(
|
||||||
|
|
||||||
if let Some(name) = decl.name {
|
if let Some(name) = decl.name {
|
||||||
// User variable
|
// User variable
|
||||||
let debug_scope = fx.scopes[decl.visibility_source_info.scope];
|
let debug_scope = fx.scopes[decl.visibility_scope];
|
||||||
let dbg = debug_scope.is_valid() && bx.sess().opts.debuginfo == FullDebugInfo;
|
let dbg = debug_scope.is_valid() && bx.sess().opts.debuginfo == FullDebugInfo;
|
||||||
|
|
||||||
if !memory_locals.contains(local.index()) && !dbg {
|
if !memory_locals.contains(local.index()) && !dbg {
|
||||||
|
@ -276,7 +276,10 @@ pub fn codegen_mir<'a, 'tcx: 'a>(
|
||||||
debug!("alloc: {:?} ({}) -> place", local, name);
|
debug!("alloc: {:?} ({}) -> place", local, name);
|
||||||
let place = PlaceRef::alloca(&bx, layout, &name.as_str());
|
let place = PlaceRef::alloca(&bx, layout, &name.as_str());
|
||||||
if dbg {
|
if dbg {
|
||||||
let (scope, span) = fx.debug_loc(decl.visibility_source_info);
|
let (scope, span) = fx.debug_loc(mir::SourceInfo {
|
||||||
|
span: decl.syntactic_source_info.span,
|
||||||
|
scope: decl.visibility_scope,
|
||||||
|
});
|
||||||
declare_local(&bx, &fx.debug_context, name, layout.ty, scope,
|
declare_local(&bx, &fx.debug_context, name, layout.ty, scope,
|
||||||
VariableAccess::DirectVariable { alloca: place.llval },
|
VariableAccess::DirectVariable { alloca: place.llval },
|
||||||
VariableKind::LocalVariable, span);
|
VariableKind::LocalVariable, span);
|
||||||
|
|
|
@ -398,7 +398,7 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
|
||||||
|
|
||||||
let borrow_span = self.mir.source_info(borrow.reserve_location).span;
|
let borrow_span = self.mir.source_info(borrow.reserve_location).span;
|
||||||
let proper_span = match *root_place {
|
let proper_span = match *root_place {
|
||||||
Place::Local(local) => self.mir.local_decls[local].visibility_source_info.span,
|
Place::Local(local) => self.mir.local_decls[local].syntactic_source_info.span,
|
||||||
_ => drop_span,
|
_ => drop_span,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -306,13 +306,13 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>(
|
||||||
None => continue,
|
None => continue,
|
||||||
}
|
}
|
||||||
|
|
||||||
let source_info = local_decl.visibility_source_info;
|
let span = local_decl.syntactic_source_info.span;
|
||||||
let mut_span = tcx.sess.codemap().span_until_non_whitespace(source_info.span);
|
let mut_span = tcx.sess.codemap().span_until_non_whitespace(span);
|
||||||
|
|
||||||
tcx.struct_span_lint_node(
|
tcx.struct_span_lint_node(
|
||||||
UNUSED_MUT,
|
UNUSED_MUT,
|
||||||
vsi[local_decl.syntactic_source_info.scope].lint_root,
|
vsi[local_decl.syntactic_source_info.scope].lint_root,
|
||||||
source_info.span,
|
span,
|
||||||
"variable does not need to be mutable"
|
"variable does not need to be mutable"
|
||||||
)
|
)
|
||||||
.span_suggestion_short(mut_span, "remove this `mut`", "".to_owned())
|
.span_suggestion_short(mut_span, "remove this `mut`", "".to_owned())
|
||||||
|
|
|
@ -67,7 +67,7 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
err.span_label(
|
err.span_label(
|
||||||
mir.local_decls[local].visibility_source_info.span,
|
mir.local_decls[local].syntactic_source_info.span,
|
||||||
"borrow may end up in a temporary, created here",
|
"borrow may end up in a temporary, created here",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -1201,7 +1201,7 @@ impl<'a, 'gcx, 'tcx> TypeChecker<'a, 'gcx, 'tcx> {
|
||||||
LocalKind::Var | LocalKind::Temp => {}
|
LocalKind::Var | LocalKind::Temp => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
let span = local_decl.visibility_source_info.span;
|
let span = local_decl.syntactic_source_info.span;
|
||||||
let ty = local_decl.ty;
|
let ty = local_decl.ty;
|
||||||
|
|
||||||
// Erase the regions from `ty` to get a global type. The
|
// Erase the regions from `ty` to get a global type. The
|
||||||
|
|
|
@ -247,7 +247,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||||
ty: ptr_ty,
|
ty: ptr_ty,
|
||||||
name: None,
|
name: None,
|
||||||
syntactic_source_info: source_info,
|
syntactic_source_info: source_info,
|
||||||
visibility_source_info: source_info,
|
visibility_scope: source_info.scope,
|
||||||
internal: true,
|
internal: true,
|
||||||
is_user_variable: false
|
is_user_variable: false
|
||||||
});
|
});
|
||||||
|
|
|
@ -324,11 +324,8 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||||
span,
|
span,
|
||||||
scope: syntactic_scope,
|
scope: syntactic_scope,
|
||||||
};
|
};
|
||||||
let visibility_source_info = SourceInfo {
|
let visibility_scope = visibility_scope.unwrap();
|
||||||
span,
|
this.declare_binding(syntactic_source_info, visibility_scope, mutability, name, var,
|
||||||
scope: visibility_scope.unwrap()
|
|
||||||
};
|
|
||||||
this.declare_binding(syntactic_source_info, visibility_source_info, mutability, name, var,
|
|
||||||
ty, has_guard);
|
ty, has_guard);
|
||||||
});
|
});
|
||||||
visibility_scope
|
visibility_scope
|
||||||
|
@ -1118,16 +1115,16 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||||
/// in the arm body, which will have type `T`.
|
/// in the arm body, which will have type `T`.
|
||||||
fn declare_binding(&mut self,
|
fn declare_binding(&mut self,
|
||||||
syntactic_source_info: SourceInfo,
|
syntactic_source_info: SourceInfo,
|
||||||
visibility_source_info: SourceInfo,
|
visibility_scope: SourceScope,
|
||||||
mutability: Mutability,
|
mutability: Mutability,
|
||||||
name: Name,
|
name: Name,
|
||||||
var_id: NodeId,
|
var_id: NodeId,
|
||||||
var_ty: Ty<'tcx>,
|
var_ty: Ty<'tcx>,
|
||||||
has_guard: ArmHasGuard)
|
has_guard: ArmHasGuard)
|
||||||
{
|
{
|
||||||
debug!("declare_binding(var_id={:?}, name={:?}, var_ty={:?}, visibility_source_info={:?}, \
|
debug!("declare_binding(var_id={:?}, name={:?}, var_ty={:?}, visibility_scope={:?}, \
|
||||||
syntactic_source_info={:?})",
|
syntactic_source_info={:?})",
|
||||||
var_id, name, var_ty, visibility_source_info, syntactic_source_info);
|
var_id, name, var_ty, visibility_scope, syntactic_source_info);
|
||||||
|
|
||||||
let tcx = self.hir.tcx();
|
let tcx = self.hir.tcx();
|
||||||
let local = LocalDecl::<'tcx> {
|
let local = LocalDecl::<'tcx> {
|
||||||
|
@ -1135,7 +1132,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||||
ty: var_ty.clone(),
|
ty: var_ty.clone(),
|
||||||
name: Some(name),
|
name: Some(name),
|
||||||
syntactic_source_info,
|
syntactic_source_info,
|
||||||
visibility_source_info,
|
visibility_scope,
|
||||||
internal: false,
|
internal: false,
|
||||||
is_user_variable: true,
|
is_user_variable: true,
|
||||||
};
|
};
|
||||||
|
@ -1147,7 +1144,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||||
ty: tcx.mk_imm_ref(tcx.types.re_empty, var_ty),
|
ty: tcx.mk_imm_ref(tcx.types.re_empty, var_ty),
|
||||||
name: Some(name),
|
name: Some(name),
|
||||||
syntactic_source_info,
|
syntactic_source_info,
|
||||||
visibility_source_info,
|
visibility_scope,
|
||||||
internal: false,
|
internal: false,
|
||||||
is_user_variable: true,
|
is_user_variable: true,
|
||||||
});
|
});
|
||||||
|
|
|
@ -665,7 +665,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||||
mutability: Mutability::Mut,
|
mutability: Mutability::Mut,
|
||||||
ty,
|
ty,
|
||||||
syntactic_source_info: source_info,
|
syntactic_source_info: source_info,
|
||||||
visibility_source_info: source_info,
|
visibility_scope: source_info.scope,
|
||||||
name,
|
name,
|
||||||
internal: false,
|
internal: false,
|
||||||
is_user_variable: false,
|
is_user_variable: false,
|
||||||
|
|
|
@ -233,7 +233,7 @@ impl<'a, 'gcx, 'tcx> MoveDataBuilder<'a, 'gcx, 'tcx> {
|
||||||
fn gather_args(&mut self) {
|
fn gather_args(&mut self) {
|
||||||
for arg in self.mir.args_iter() {
|
for arg in self.mir.args_iter() {
|
||||||
let path = self.data.rev_lookup.locals[arg];
|
let path = self.data.rev_lookup.locals[arg];
|
||||||
let span = self.mir.local_decls[arg].visibility_source_info.span;
|
let span = self.mir.local_decls[arg].syntactic_source_info.span;
|
||||||
|
|
||||||
let init = self.data.inits.push(Init {
|
let init = self.data.inits.push(Init {
|
||||||
path, span, kind: InitKind::Deep
|
path, span, kind: InitKind::Deep
|
||||||
|
|
|
@ -142,7 +142,7 @@ fn temp_decl(mutability: Mutability, ty: Ty, span: Span) -> LocalDecl {
|
||||||
LocalDecl {
|
LocalDecl {
|
||||||
mutability, ty, name: None,
|
mutability, ty, name: None,
|
||||||
syntactic_source_info: source_info,
|
syntactic_source_info: source_info,
|
||||||
visibility_source_info: source_info,
|
visibility_scope: source_info.scope,
|
||||||
internal: false,
|
internal: false,
|
||||||
is_user_variable: false
|
is_user_variable: false
|
||||||
}
|
}
|
||||||
|
|
|
@ -301,7 +301,7 @@ fn replace_result_variable<'tcx>(ret_ty: Ty<'tcx>,
|
||||||
ty: ret_ty,
|
ty: ret_ty,
|
||||||
name: None,
|
name: None,
|
||||||
syntactic_source_info: source_info,
|
syntactic_source_info: source_info,
|
||||||
visibility_source_info: source_info,
|
visibility_scope: source_info.scope,
|
||||||
internal: false,
|
internal: false,
|
||||||
is_user_variable: false,
|
is_user_variable: false,
|
||||||
};
|
};
|
||||||
|
@ -642,7 +642,7 @@ fn create_generator_drop_shim<'a, 'tcx>(
|
||||||
ty: tcx.mk_nil(),
|
ty: tcx.mk_nil(),
|
||||||
name: None,
|
name: None,
|
||||||
syntactic_source_info: source_info,
|
syntactic_source_info: source_info,
|
||||||
visibility_source_info: source_info,
|
visibility_scope: source_info.scope,
|
||||||
internal: false,
|
internal: false,
|
||||||
is_user_variable: false,
|
is_user_variable: false,
|
||||||
};
|
};
|
||||||
|
@ -658,7 +658,7 @@ fn create_generator_drop_shim<'a, 'tcx>(
|
||||||
}),
|
}),
|
||||||
name: None,
|
name: None,
|
||||||
syntactic_source_info: source_info,
|
syntactic_source_info: source_info,
|
||||||
visibility_source_info: source_info,
|
visibility_scope: source_info.scope,
|
||||||
internal: false,
|
internal: false,
|
||||||
is_user_variable: false,
|
is_user_variable: false,
|
||||||
};
|
};
|
||||||
|
|
|
@ -401,9 +401,7 @@ impl<'a, 'tcx> Inliner<'a, 'tcx> {
|
||||||
local.syntactic_source_info.scope =
|
local.syntactic_source_info.scope =
|
||||||
scope_map[local.syntactic_source_info.scope];
|
scope_map[local.syntactic_source_info.scope];
|
||||||
local.syntactic_source_info.span = callsite.location.span;
|
local.syntactic_source_info.span = callsite.location.span;
|
||||||
local.visibility_source_info.scope =
|
local.visibility_scope = scope_map[local.visibility_scope];
|
||||||
scope_map[local.visibility_source_info.scope];
|
|
||||||
local.visibility_source_info.span = callsite.location.span;
|
|
||||||
|
|
||||||
let idx = caller_mir.local_decls.push(local);
|
let idx = caller_mir.local_decls.push(local);
|
||||||
local_map.push(idx);
|
local_map.push(idx);
|
||||||
|
|
|
@ -210,7 +210,7 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> {
|
||||||
let no_stmts = self.source[loc.block].statements.len();
|
let no_stmts = self.source[loc.block].statements.len();
|
||||||
let new_temp = self.promoted.local_decls.push(
|
let new_temp = self.promoted.local_decls.push(
|
||||||
LocalDecl::new_temp(self.source.local_decls[temp].ty,
|
LocalDecl::new_temp(self.source.local_decls[temp].ty,
|
||||||
self.source.local_decls[temp].visibility_source_info.span));
|
self.source.local_decls[temp].syntactic_source_info.span));
|
||||||
|
|
||||||
debug!("promote({:?} @ {:?}/{:?}, {:?})",
|
debug!("promote({:?} @ {:?}/{:?}, {:?})",
|
||||||
temp, loc, no_stmts, self.keep_original);
|
temp, loc, no_stmts, self.keep_original);
|
||||||
|
@ -335,7 +335,7 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> {
|
||||||
// otherwise we would use the `promoted` directly.
|
// otherwise we would use the `promoted` directly.
|
||||||
let mut promoted_ref = LocalDecl::new_temp(ref_ty, span);
|
let mut promoted_ref = LocalDecl::new_temp(ref_ty, span);
|
||||||
promoted_ref.syntactic_source_info = statement.source_info;
|
promoted_ref.syntactic_source_info = statement.source_info;
|
||||||
promoted_ref.visibility_source_info = statement.source_info;
|
promoted_ref.visibility_scope = statement.source_info.scope;
|
||||||
let promoted_ref = local_decls.push(promoted_ref);
|
let promoted_ref = local_decls.push(promoted_ref);
|
||||||
assert_eq!(self.temps.push(TempState::Unpromotable), promoted_ref);
|
assert_eq!(self.temps.push(TempState::Unpromotable), promoted_ref);
|
||||||
self.extra_statements.push((loc, Statement {
|
self.extra_statements.push((loc, Statement {
|
||||||
|
|
|
@ -1046,7 +1046,7 @@ This does not pose a problem by itself because they can't be accessed directly."
|
||||||
// conservatively, that drop elaboration will do.
|
// conservatively, that drop elaboration will do.
|
||||||
let needs_drop = if let Place::Local(local) = *place {
|
let needs_drop = if let Place::Local(local) = *place {
|
||||||
if self.local_qualif[local].map_or(true, |q| q.intersects(Qualif::NEEDS_DROP)) {
|
if self.local_qualif[local].map_or(true, |q| q.intersects(Qualif::NEEDS_DROP)) {
|
||||||
Some(self.mir.local_decls[local].visibility_source_info.span)
|
Some(self.mir.local_decls[local].syntactic_source_info.span)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
@ -1102,7 +1102,7 @@ This does not pose a problem by itself because they can't be accessed directly."
|
||||||
let mut err = feature_err(
|
let mut err = feature_err(
|
||||||
&self.tcx.sess.parse_sess,
|
&self.tcx.sess.parse_sess,
|
||||||
"const_let",
|
"const_let",
|
||||||
decl.visibility_source_info.span,
|
decl.syntactic_source_info.span,
|
||||||
GateIssue::Language,
|
GateIssue::Language,
|
||||||
"arguments of constant functions can only be immutable by-value bindings"
|
"arguments of constant functions can only be immutable by-value bindings"
|
||||||
);
|
);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue