aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/rust/ast/rust-ast-dump.cc36
-rw-r--r--gcc/rust/backend/rust-compile-intrinsic.cc16
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.h14
-rw-r--r--gcc/testsuite/rust/compile/issue-1383.rs8
4 files changed, 64 insertions, 10 deletions
diff --git a/gcc/rust/ast/rust-ast-dump.cc b/gcc/rust/ast/rust-ast-dump.cc
index 9af8fa8..3b02d84 100644
--- a/gcc/rust/ast/rust-ast-dump.cc
+++ b/gcc/rust/ast/rust-ast-dump.cc
@@ -177,8 +177,40 @@ Dump::visit (ArithmeticOrLogicalExpr &expr)
stream << "+";
break;
- default:
- gcc_unreachable ();
+ case ArithmeticOrLogicalOperator::SUBTRACT:
+ stream << "-";
+ break;
+
+ case ArithmeticOrLogicalOperator::MULTIPLY:
+ stream << "*";
+ break;
+
+ case ArithmeticOrLogicalOperator::DIVIDE:
+ stream << "/";
+ break;
+
+ case ArithmeticOrLogicalOperator::MODULUS:
+ stream << "%";
+ break;
+
+ case ArithmeticOrLogicalOperator::BITWISE_AND:
+ stream << "&";
+ break;
+
+ case ArithmeticOrLogicalOperator::BITWISE_OR:
+ stream << "|";
+ break;
+
+ case ArithmeticOrLogicalOperator::BITWISE_XOR:
+ stream << "^";
+ break;
+
+ case ArithmeticOrLogicalOperator::LEFT_SHIFT:
+ stream << "<<";
+ break;
+
+ case ArithmeticOrLogicalOperator::RIGHT_SHIFT:
+ stream << ">>";
break;
}
diff --git a/gcc/rust/backend/rust-compile-intrinsic.cc b/gcc/rust/backend/rust-compile-intrinsic.cc
index 57a952f..65eddfa 100644
--- a/gcc/rust/backend/rust-compile-intrinsic.cc
+++ b/gcc/rust/backend/rust-compile-intrinsic.cc
@@ -542,9 +542,19 @@ transmute_intrinsic_handler (Context *ctx, TyTy::BaseType *fntype_tyty)
// BUILTIN transmute FN BODY BEGIN
tree result_type_tree = TREE_TYPE (DECL_RESULT (fndecl));
- tree result_expr
- = ctx->get_backend ()->convert_expression (result_type_tree,
- convert_me_expr, Location ());
+ tree result_expr = error_mark_node;
+ if (AGGREGATE_TYPE_P (TREE_TYPE (convert_me_expr)))
+ {
+ result_expr = fold_build1_loc (Location ().gcc_location (), CONVERT_EXPR,
+ result_type_tree, convert_me_expr);
+ }
+ else
+ {
+ result_expr = ctx->get_backend ()->convert_expression (result_type_tree,
+ convert_me_expr,
+ Location ());
+ }
+
auto return_statement
= ctx->get_backend ()->return_statement (fndecl, {result_expr},
Location ());
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
+}