@@ -1204,6 +1204,10 @@ HIRCompileBase::resolve_adjustements (
12041204 case Resolver::Adjustment::AdjustmentType::INDIRECTION:
12051205 e = resolve_indirection_adjustment (adjustment, e, locus);
12061206 break ;
1207+
1208+ case Resolver::Adjustment::AdjustmentType::UNSIZE:
1209+ e = resolve_unsized_adjustment (adjustment, e, locus);
1210+ break ;
12071211 }
12081212 }
12091213
@@ -1257,6 +1261,32 @@ HIRCompileBase::resolve_indirection_adjustment (
12571261 locus);
12581262}
12591263
1264+ tree
1265+ HIRCompileBase::resolve_unsized_adjustment (Resolver::Adjustment &adjustment,
1266+ tree expression, Location locus)
1267+ {
1268+ // assumes this is an array
1269+ tree expr_type = TREE_TYPE (expression);
1270+ rust_assert (TREE_CODE (expr_type) == ARRAY_TYPE);
1271+
1272+ // takes an array and returns a fat-pointer so this becomes a constructor
1273+ // expression
1274+ rust_assert (adjustment.get_expected ()->get_kind ()
1275+ == TyTy::TypeKind::SLICE);
1276+ tree fat_pointer
1277+ = TyTyResolveCompile::compile (ctx, adjustment.get_expected ());
1278+
1279+ // make a constructor for this
1280+ tree data = address_expression (expression, locus);
1281+
1282+ // fetch the size from the domain
1283+ tree domain = TYPE_DOMAIN (expr_type);
1284+ tree size = TYPE_MAX_VALUE (domain);
1285+
1286+ return ctx->get_backend ()->constructor_expression (fat_pointer, false ,
1287+ {data, size}, -1 , locus);
1288+ }
1289+
12601290void
12611291CompileExpr::visit (HIR::IdentifierExpr &expr)
12621292{
0 commit comments