aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-07-15 10:21:11 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-07-15 10:25:50 +0100
commit95aa351e65723ce1ff9aa568523b1d5173acacf4 (patch)
tree335a66022bc0c5b0472b5f3d98d17fc445c9adaa /gcc
parentab9f7f287ef0a775ac6a504d743e20c2f5488f6f (diff)
downloadgcc-95aa351e65723ce1ff9aa568523b1d5173acacf4.zip
gcc-95aa351e65723ce1ff9aa568523b1d5173acacf4.tar.gz
gcc-95aa351e65723ce1ff9aa568523b1d5173acacf4.tar.bz2
Support generics in check for valid types in arithmetic expressions
When we check for valid types we need to be sure to call destructure which will extract out any generics so that we are checking the actual concrete type that is being used here. Fixes #1383
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.h14
-rw-r--r--gcc/testsuite/rust/compile/issue-1383.rs8
2 files changed, 17 insertions, 5 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h
index a5f0a84..df07cb3 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h
@@ -1060,9 +1060,11 @@ private:
Location expr_locus);
bool
- validate_arithmetic_type (TyTy::BaseType *type,
+ validate_arithmetic_type (const TyTy::BaseType *tyty,
HIR::ArithmeticOrLogicalExpr::ExprType expr_type)
{
+ const TyTy::BaseType *type = tyty->destructure ();
+
// https://doc.rust-lang.org/reference/expressions/operator-expr.html#arithmetic-and-logical-binary-operators
// this will change later when traits are added
switch (expr_type)
@@ -1078,10 +1080,10 @@ private:
|| (type->get_kind () == TyTy::TypeKind::USIZE)
|| (type->get_kind () == TyTy::TypeKind::ISIZE)
|| (type->get_kind () == TyTy::TypeKind::INFER
- && (((TyTy::InferType *) type)->get_infer_kind ()
+ && (((const TyTy::InferType *) type)->get_infer_kind ()
== TyTy::InferType::INTEGRAL))
|| (type->get_kind () == TyTy::TypeKind::INFER
- && (((TyTy::InferType *) type)->get_infer_kind ()
+ && (((const TyTy::InferType *) type)->get_infer_kind ()
== TyTy::InferType::FLOAT));
// integers or bools
@@ -1094,7 +1096,7 @@ private:
|| (type->get_kind () == TyTy::TypeKind::ISIZE)
|| (type->get_kind () == TyTy::TypeKind::BOOL)
|| (type->get_kind () == TyTy::TypeKind::INFER
- && (((TyTy::InferType *) type)->get_infer_kind ()
+ && (((const TyTy::InferType *) type)->get_infer_kind ()
== TyTy::InferType::INTEGRAL));
// integers only
@@ -1105,10 +1107,12 @@ private:
|| (type->get_kind () == TyTy::TypeKind::USIZE)
|| (type->get_kind () == TyTy::TypeKind::ISIZE)
|| (type->get_kind () == TyTy::TypeKind::INFER
- && (((TyTy::InferType *) type)->get_infer_kind ()
+ && (((const TyTy::InferType *) type)->get_infer_kind ()
== TyTy::InferType::INTEGRAL));
}
+
gcc_unreachable ();
+ return false;
}
/* The return value of TypeCheckExpr::Resolve */
diff --git a/gcc/testsuite/rust/compile/issue-1383.rs b/gcc/testsuite/rust/compile/issue-1383.rs
new file mode 100644
index 0000000..cca12e8
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-1383.rs
@@ -0,0 +1,8 @@
+pub fn generic_function<X>(a: X) -> X {
+ a
+}
+
+fn main() -> i32 {
+ let a = generic_function(123);
+ a - 123
+}