@@ -12,7 +12,7 @@ use hir_def::{
12
12
ArithOp , Array , BinaryOp , ClosureKind , Expr , ExprId , LabelId , Literal , Statement , UnaryOp ,
13
13
} ,
14
14
lang_item:: { LangItem , LangItemTarget } ,
15
- path:: { GenericArgs , Path } ,
15
+ path:: { GenericArg , GenericArgs , Path } ,
16
16
BlockId , FieldId , GenericDefId , GenericParamId , ItemContainerId , Lookup , TupleFieldId , TupleId ,
17
17
} ;
18
18
use hir_expand:: name:: Name ;
@@ -1851,29 +1851,45 @@ impl InferenceContext<'_> {
1851
1851
if let Some ( generic_args) = generic_args {
1852
1852
// if args are provided, it should be all of them, but we can't rely on that
1853
1853
let self_params = type_params + const_params + lifetime_params;
1854
- for ( arg, kind_id) in
1855
- generic_args. args . iter ( ) . zip ( def_generics. iter_self_id ( ) ) . take ( self_params)
1856
- {
1857
- let arg = generic_arg_to_chalk (
1858
- self . db ,
1859
- kind_id,
1860
- arg,
1861
- self ,
1862
- |this, type_ref| this. make_ty ( type_ref) ,
1863
- |this, c, ty| {
1864
- const_or_path_to_chalk (
1865
- this. db ,
1866
- & this. resolver ,
1867
- this. owner . into ( ) ,
1868
- ty,
1869
- c,
1870
- ParamLoweringMode :: Placeholder ,
1871
- || this. generics ( ) ,
1872
- DebruijnIndex :: INNERMOST ,
1873
- )
1874
- } ,
1875
- |this, lt_ref| this. make_lifetime ( lt_ref) ,
1876
- ) ;
1854
+
1855
+ let mut args = generic_args. args . iter ( ) . peekable ( ) ;
1856
+ for kind_id in def_generics. iter_self_id ( ) . take ( self_params) {
1857
+ let arg = args. peek ( ) ;
1858
+ let arg = match ( kind_id, arg) {
1859
+ // Lifetimes can be elided.
1860
+ // Once we have implemented lifetime elision correctly,
1861
+ // this should be handled in a proper way.
1862
+ (
1863
+ GenericParamId :: LifetimeParamId ( _) ,
1864
+ None | Some ( GenericArg :: Type ( _) | GenericArg :: Const ( _) ) ,
1865
+ ) => error_lifetime ( ) . cast ( Interner ) ,
1866
+
1867
+ // If we run out of `generic_args`, stop pushing substs
1868
+ ( _, None ) => break ,
1869
+
1870
+ // Normal cases
1871
+ ( _, Some ( _) ) => generic_arg_to_chalk (
1872
+ self . db ,
1873
+ kind_id,
1874
+ args. next ( ) . unwrap ( ) , // `peek()` is `Some(_)`, so guaranteed no panic
1875
+ self ,
1876
+ |this, type_ref| this. make_ty ( type_ref) ,
1877
+ |this, c, ty| {
1878
+ const_or_path_to_chalk (
1879
+ this. db ,
1880
+ & this. resolver ,
1881
+ this. owner . into ( ) ,
1882
+ ty,
1883
+ c,
1884
+ ParamLoweringMode :: Placeholder ,
1885
+ || this. generics ( ) ,
1886
+ DebruijnIndex :: INNERMOST ,
1887
+ )
1888
+ } ,
1889
+ |this, lt_ref| this. make_lifetime ( lt_ref) ,
1890
+ ) ,
1891
+ } ;
1892
+
1877
1893
substs. push ( arg) ;
1878
1894
}
1879
1895
} ;
0 commit comments