@@ -33,7 +33,7 @@ use rustc_const_eval::ErrKind::{ErroneousReferencedConstant, MiscBinaryOp, NonCo
33
33
use rustc_const_eval:: ErrKind :: UnresolvedPath ;
34
34
use rustc_const_eval:: EvalHint :: ExprTypeChecked ;
35
35
use rustc_const_math:: { ConstMathErr , Op } ;
36
- use rustc:: hir:: def:: Def ;
36
+ use rustc:: hir:: def:: { Def , CtorKind } ;
37
37
use rustc:: hir:: def_id:: DefId ;
38
38
use rustc:: middle:: expr_use_visitor as euv;
39
39
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
489
489
}
490
490
hir:: ExprPath ( ..) => {
491
491
match v. tcx . expect_def ( e. id ) {
492
- Def :: VariantCtor ( ..) => {
493
- // Count the discriminator or function pointer.
494
- v. add_qualif ( ConstQualif :: NON_ZERO_SIZED ) ;
495
- }
496
- Def :: StructCtor ( ..) => {
497
- if let ty:: TyFnDef ( ..) = node_ty. sty {
498
- // Count the function pointer.
499
- v. add_qualif ( ConstQualif :: NON_ZERO_SIZED ) ;
500
- }
501
- }
502
- Def :: Fn ( ..) | Def :: Method ( ..) => {
503
- // Count the function pointer.
492
+ Def :: VariantCtor ( _, CtorKind :: Const ) => {
493
+ // Size is determined by the whole enum, may be non-zero.
504
494
v. add_qualif ( ConstQualif :: NON_ZERO_SIZED ) ;
505
495
}
496
+ Def :: VariantCtor ( ..) | Def :: StructCtor ( ..) |
497
+ Def :: Fn ( ..) | Def :: Method ( ..) => { }
506
498
Def :: Static ( ..) => {
507
499
match v. mode {
508
500
Mode :: Static | Mode :: StaticMut => { }
@@ -539,9 +531,9 @@ fn check_expr<'a, 'tcx>(v: &mut CheckCrateVisitor<'a, 'tcx>, e: &hir::Expr, node
539
531
}
540
532
// The callee is an arbitrary expression, it doesn't necessarily have a definition.
541
533
let is_const = match v. tcx . expect_def_or_none ( callee. id ) {
542
- Some ( Def :: StructCtor ( .. ) ) => true ,
543
- Some ( Def :: VariantCtor ( .. ) ) => {
544
- // Count the discriminator .
534
+ Some ( Def :: StructCtor ( _ , CtorKind :: Fn ) ) |
535
+ Some ( Def :: VariantCtor ( _ , CtorKind :: Fn ) ) => {
536
+ // `NON_ZERO_SIZED` is about the call result, not about the ctor itself .
545
537
v. add_qualif ( ConstQualif :: NON_ZERO_SIZED ) ;
546
538
true
547
539
}
0 commit comments