@@ -1973,47 +1973,51 @@ impl<'a, 'b> ExprTyper<'a, 'b> {
19731973 compiled_case : _,
19741974 } = assignment;
19751975 let value = self . expr_in_new_scope ( |this| this. infer ( value) ) ;
1976- let type_ = value. type_ ( ) ;
1976+ let value_type = value. type_ ( ) ;
19771977 let kind = self . infer_assignment_kind ( kind. clone ( ) ) ;
19781978
1979- // Ensure the pattern matches the type of the value
1980- let mut pattern_typer = pattern:: PatternTyper :: new (
1981- self . environment ,
1982- & self . implementations ,
1983- & self . current_function_definition ,
1984- & self . hydrator ,
1985- self . problems ,
1986- PatternPosition :: LetAssignment ,
1987- ) ;
1979+ let mut annotation_type_override = None ;
19881980
1989- let pattern = pattern_typer. infer_single_pattern ( pattern, & value) ;
1990-
1991- let minimum_required_version = pattern_typer. minimum_required_version ;
1992- if minimum_required_version > self . minimum_required_version {
1993- self . minimum_required_version = minimum_required_version;
1994- }
1995-
1996- let pattern_typechecked_successfully = !pattern_typer. error_encountered ;
1997-
1998- // Check that any type annotation is accurate.
19991981 if let Some ( annotation) = & annotation {
20001982 match self
20011983 . type_from_ast ( annotation)
20021984 . map ( |type_| self . instantiate ( type_, & mut hashmap ! [ ] ) )
20031985 {
20041986 Ok ( annotated_type) => {
2005- if let Err ( error) = unify ( annotated_type, type_. clone ( ) )
1987+ let annotation_type_for_pattern = annotated_type. clone ( ) ;
1988+ if let Err ( error) = unify ( annotated_type, value_type. clone ( ) )
20061989 . map_err ( |e| convert_unify_error ( e, value. type_defining_location ( ) ) )
20071990 {
20081991 self . problems . error ( error) ;
20091992 }
1993+ annotation_type_override = Some ( annotation_type_for_pattern) ;
20101994 }
20111995 Err ( error) => {
20121996 self . problems . error ( error) ;
20131997 }
20141998 }
20151999 }
20162000
2001+ // Ensure the pattern matches the type of the value
2002+ let mut pattern_typer = pattern:: PatternTyper :: new (
2003+ self . environment ,
2004+ & self . implementations ,
2005+ & self . current_function_definition ,
2006+ & self . hydrator ,
2007+ self . problems ,
2008+ PatternPosition :: LetAssignment ,
2009+ ) ;
2010+
2011+ let pattern =
2012+ pattern_typer. infer_single_pattern ( pattern, & value, annotation_type_override. clone ( ) ) ;
2013+
2014+ let minimum_required_version = pattern_typer. minimum_required_version ;
2015+ if minimum_required_version > self . minimum_required_version {
2016+ self . minimum_required_version = minimum_required_version;
2017+ }
2018+
2019+ let pattern_typechecked_successfully = !pattern_typer. error_encountered ;
2020+
20172021 // The exhaustiveness checker expects patterns to be valid and to type check;
20182022 // if they are invalid, it will crash. Therefore, if any errors were found
20192023 // when type checking the pattern, we don't perform the exhaustiveness check.
@@ -2029,7 +2033,7 @@ impl<'a, 'b> ExprTyper<'a, 'b> {
20292033 }
20302034
20312035 let ( output, not_exhaustive_error) =
2032- self . check_let_exhaustiveness ( location, value . type_ ( ) , & pattern) ;
2036+ self . check_let_exhaustiveness ( location, value_type . clone ( ) , & pattern) ;
20332037
20342038 match ( & kind, not_exhaustive_error) {
20352039 // The pattern is exhaustive in a let assignment, there's no problem here.
0 commit comments