From: Yap Zhi Heng <yapz...@gmail.com>

This change is made to ensure that LiteralPatterns in SlicePattern are 
type-checked
against the scrutinee array/slice's element type properly.

gcc/rust/ChangeLog:

        * 
typecheck/rust-hir-type-check-pattern.cc(TypeCheckPattern::visit(LiteralPattern)):
                Check LiteralPattern's type against its parent.

Signed-off-by: Yap Zhi Heng <yapz...@gmail.com>
---
 gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc 
b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index c60d7868fda..5608030db72 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -563,8 +563,18 @@ TypeCheckPattern::visit (HIR::TuplePattern &pattern)
 void
 TypeCheckPattern::visit (HIR::LiteralPattern &pattern)
 {
-  infered = resolve_literal (pattern.get_mappings (), pattern.get_literal (),
-                            pattern.get_locus ());
+  TyTy::BaseType *resolved
+    = resolve_literal (pattern.get_mappings (), pattern.get_literal (),
+                      pattern.get_locus ());
+  if (resolved->get_kind () == TyTy::TypeKind::ERROR)
+    {
+      infered = resolved;
+      return;
+    }
+
+  infered = unify_site (pattern.get_mappings ().get_hirid (),
+                       TyTy::TyWithLocation (parent),
+                       TyTy::TyWithLocation (resolved), pattern.get_locus ());
 }
 
 void
-- 
2.49.0

Reply via email to