@@ -1917,6 +1917,88 @@ fn closure_return_inferred() {
19171917 ) ;
19181918}
19191919
1920+ #[ test]
1921+ fn generator_types_inferred ( ) {
1922+ check_infer (
1923+ r#"
1924+ //- minicore: generator, deref
1925+ use core::ops::{Generator, GeneratorState};
1926+ use core::pin::Pin;
1927+
1928+ fn f(v: i64) {}
1929+ fn test() {
1930+ let mut g = |r| {
1931+ let a = yield 0;
1932+ let a = yield 1;
1933+ let a = yield 2;
1934+ "return value"
1935+ };
1936+
1937+ match Pin::new(&mut g).resume(0usize) {
1938+ GeneratorState::Yielded(y) => { f(y); }
1939+ GeneratorState::Complete(r) => {}
1940+ }
1941+ }
1942+ "# ,
1943+ expect ! [ [ r#"
1944+ 70..71 'v': i64
1945+ 78..80 '{}': ()
1946+ 91..362 '{ ... } }': ()
1947+ 101..106 'mut g': {generator}
1948+ 109..218 '|r| { ... }': {generator}
1949+ 110..111 'r': usize
1950+ 113..218 '{ ... }': &str
1951+ 127..128 'a': usize
1952+ 131..138 'yield 0': usize
1953+ 137..138 '0': i64
1954+ 152..153 'a': usize
1955+ 156..163 'yield 1': usize
1956+ 162..163 '1': i64
1957+ 177..178 'a': usize
1958+ 181..188 'yield 2': usize
1959+ 187..188 '2': i64
1960+ 198..212 '"return value"': &str
1961+ 225..360 'match ... }': ()
1962+ 231..239 'Pin::new': fn new<&mut {generator}>(&mut {generator}) -> Pin<&mut {generator}>
1963+ 231..247 'Pin::n...mut g)': Pin<&mut {generator}>
1964+ 231..262 'Pin::n...usize)': GeneratorState<i64, &str>
1965+ 240..246 '&mut g': &mut {generator}
1966+ 245..246 'g': {generator}
1967+ 255..261 '0usize': usize
1968+ 273..299 'Genera...ded(y)': GeneratorState<i64, &str>
1969+ 297..298 'y': i64
1970+ 303..312 '{ f(y); }': ()
1971+ 305..306 'f': fn f(i64)
1972+ 305..309 'f(y)': ()
1973+ 307..308 'y': i64
1974+ 321..348 'Genera...ete(r)': GeneratorState<i64, &str>
1975+ 346..347 'r': &str
1976+ 352..354 '{}': ()
1977+ "# ] ] ,
1978+ ) ;
1979+ }
1980+
1981+ #[ test]
1982+ fn generator_resume_yield_return_unit ( ) {
1983+ check_no_mismatches (
1984+ r#"
1985+ //- minicore: generator, deref
1986+ use core::ops::{Generator, GeneratorState};
1987+ use core::pin::Pin;
1988+ fn test() {
1989+ let mut g = || {
1990+ let () = yield;
1991+ };
1992+
1993+ match Pin::new(&mut g).resume(()) {
1994+ GeneratorState::Yielded(()) => {}
1995+ GeneratorState::Complete(()) => {}
1996+ }
1997+ }
1998+ "# ,
1999+ ) ;
2000+ }
2001+
19202002#[ test]
19212003fn fn_pointer_return ( ) {
19222004 check_infer (
0 commit comments