Set NON_ZERO_SIZED
flag correctly for struct/union ctors
And for methods/functions as well, they are zero-sized now
This commit is contained in:
parent
c95b280d72
commit
64bdf1b74b
1 changed files with 8 additions and 16 deletions
|
@ -33,7 +33,7 @@ use rustc_const_eval::ErrKind::{ErroneousReferencedConstant, MiscBinaryOp, NonCo
|
|||
use rustc_const_eval::ErrKind::UnresolvedPath;
|
||||
use rustc_const_eval::EvalHint::ExprTypeChecked;
|
||||
use rustc_const_math::{ConstMathErr, Op};
|
||||
use rustc::hir::def::Def;
|
||||
use rustc::hir::def::{Def, CtorKind};
|
||||
use rustc::hir::def_id::DefId;
|
||||
use rustc::middle::expr_use_visitor as euv;
|
||||
use rustc::middle::mem_categorization as mc;
|
||||
|
@ -489,20 +489,12 @@ fn check_expr<'a, 'tcx>(v: &mut CheckCrateVisitor<'a, 'tcx>, e: &hir::Expr, node
|
|||
}
|
||||
hir::ExprPath(..) => {
|
||||
match v.tcx.expect_def(e.id) {
|
||||
Def::VariantCtor(..) => {
|
||||
// Count the discriminator or function pointer.
|
||||
v.add_qualif(ConstQualif::NON_ZERO_SIZED);
|
||||
}
|
||||
Def::StructCtor(..) => {
|
||||
if let ty::TyFnDef(..) = node_ty.sty {
|
||||
// Count the function pointer.
|
||||
v.add_qualif(ConstQualif::NON_ZERO_SIZED);
|
||||
}
|
||||
}
|
||||
Def::Fn(..) | Def::Method(..) => {
|
||||
// Count the function pointer.
|
||||
Def::VariantCtor(_, CtorKind::Const) => {
|
||||
// Size is determined by the whole enum, may be non-zero.
|
||||
v.add_qualif(ConstQualif::NON_ZERO_SIZED);
|
||||
}
|
||||
Def::VariantCtor(..) | Def::StructCtor(..) |
|
||||
Def::Fn(..) | Def::Method(..) => {}
|
||||
Def::Static(..) => {
|
||||
match v.mode {
|
||||
Mode::Static | Mode::StaticMut => {}
|
||||
|
@ -539,9 +531,9 @@ fn check_expr<'a, 'tcx>(v: &mut CheckCrateVisitor<'a, 'tcx>, e: &hir::Expr, node
|
|||
}
|
||||
// The callee is an arbitrary expression, it doesn't necessarily have a definition.
|
||||
let is_const = match v.tcx.expect_def_or_none(callee.id) {
|
||||
Some(Def::StructCtor(..)) => true,
|
||||
Some(Def::VariantCtor(..)) => {
|
||||
// Count the discriminator.
|
||||
Some(Def::StructCtor(_, CtorKind::Fn)) |
|
||||
Some(Def::VariantCtor(_, CtorKind::Fn)) => {
|
||||
// `NON_ZERO_SIZED` is about the call result, not about the ctor itself.
|
||||
v.add_qualif(ConstQualif::NON_ZERO_SIZED);
|
||||
true
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue