@@ -3122,10 +3122,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3122
3122
}
3123
3123
3124
3124
pub fn check_struct_path ( & self ,
3125
- def : Def ,
3126
3125
path : & hir:: Path ,
3126
+ node_id : ast:: NodeId ,
3127
3127
span : Span )
3128
- -> Option < ty:: VariantDef < ' tcx > > {
3128
+ -> Option < ( ty:: VariantDef < ' tcx > , Ty < ' tcx > ) > {
3129
+ let def = self . finish_resolving_struct_path ( path, node_id, span) ;
3129
3130
let variant = match def {
3130
3131
Def :: Err => {
3131
3132
self . set_tainted_by_errors ( ) ;
@@ -3151,7 +3152,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3151
3152
pprust:: path_to_string( path) ) ;
3152
3153
return None ;
3153
3154
}
3154
- variant
3155
+
3156
+ let ty = self . instantiate_type_path ( def. def_id ( ) , path, node_id) ;
3157
+ Some ( ( variant. unwrap ( ) , ty) )
3155
3158
}
3156
3159
3157
3160
fn check_expr_struct ( & self ,
@@ -3161,16 +3164,14 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3161
3164
base_expr : & ' gcx Option < P < hir:: Expr > > )
3162
3165
{
3163
3166
// Find the relevant variant
3164
- let def = self . finish_resolving_struct_path ( path, expr. id , expr . span ) ;
3165
- let variant = if let Some ( variant ) = self . check_struct_path ( def , path , expr. span ) {
3166
- variant
3167
+ let ( variant , expr_ty ) = if let Some ( variant_ty ) = self . check_struct_path ( path, expr. id ,
3168
+ expr. span ) {
3169
+ variant_ty
3167
3170
} else {
3168
3171
self . check_struct_fields_on_error ( expr. id , fields, base_expr) ;
3169
3172
return ;
3170
3173
} ;
3171
3174
3172
- let expr_ty = self . instantiate_type_path ( def. def_id ( ) , path, expr. id ) ;
3173
-
3174
3175
self . check_expr_struct_fields ( expr_ty, path. span , variant, fields,
3175
3176
base_expr. is_none ( ) ) ;
3176
3177
if let & Some ( ref base_expr) = base_expr {
0 commit comments