diff options
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-type.h | 10 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve.cc | 2 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.h | 11 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-type.h | 2 | ||||
-rw-r--r-- | gcc/testsuite/rust.test/fail_compilation/generics1.rs | 9 | ||||
-rw-r--r-- | gcc/testsuite/rust.test/fail_compilation/generics2.rs | 9 | ||||
-rw-r--r-- | gcc/testsuite/rust.test/fail_compilation/generics3.rs | 9 | ||||
-rw-r--r-- | gcc/testsuite/rust.test/fail_compilation/generics4.rs | 9 | ||||
-rw-r--r-- | gcc/testsuite/rust.test/fail_compilation/generics5.rs | 9 |
9 files changed, 63 insertions, 7 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h index 24090a0..9267e3b 100644 --- a/gcc/rust/resolve/rust-ast-resolve-type.h +++ b/gcc/rust/resolve/rust-ast-resolve-type.h @@ -112,9 +112,13 @@ public: { resolved_node = ResolveTypePath::go (path, parent); ok = resolved_node != UNKNOWN_NODEID; - resolver->insert_resolved_type (path.get_node_id (), resolved_node); - resolver->insert_new_definition (path.get_node_id (), - Definition{path.get_node_id (), parent}); + if (ok) + { + resolver->insert_resolved_type (path.get_node_id (), resolved_node); + resolver->insert_new_definition (path.get_node_id (), + Definition{path.get_node_id (), + parent}); + } } void visit (AST::ArrayType &type) diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc index 6bc356a..04fdad7 100644 --- a/gcc/rust/resolve/rust-ast-resolve.cc +++ b/gcc/rust/resolve/rust-ast-resolve.cc @@ -462,7 +462,7 @@ ResolvePath::resolve_path (AST::PathInExpression *expr) else { rust_error_at (expr->get_locus (), "unknown path %s", - expr->as_string ().c_str (), path_buf.c_str ()); + expr->as_string ().c_str ()); } } diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h index bcc8598..491d8aa 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.h +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h @@ -168,6 +168,15 @@ public: if (function_tyty == nullptr) return; + bool valid_tyty = function_tyty->get_kind () == TyTy::TypeKind::ADT + || function_tyty->get_kind () == TyTy::TypeKind::FNDEF; + if (!valid_tyty) + { + rust_error_at (expr.get_locus (), + "Failed to resolve expression of function call"); + return; + } + infered = TyTy::TypeCheckCallExpr::go (function_tyty, expr, context); if (infered == nullptr) { @@ -778,8 +787,6 @@ public: ? adt->handle_substitions (seg.get_generic_args ()) : adt->infer_substitions (); } - - context->insert_type (expr.get_mappings (), infered->clone ()); } void visit (HIR::LoopExpr &expr) diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.h b/gcc/rust/typecheck/rust-hir-type-check-type.h index 1592e22..1dbcd37 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-type.h +++ b/gcc/rust/typecheck/rust-hir-type-check-type.h @@ -232,7 +232,7 @@ public: } } - rust_error_at (path.get_locus (), "failed to resolve TypePath: %s", + rust_error_at (path.get_locus (), "failed to type-resolve TypePath: %s", path.as_string ().c_str ()); } diff --git a/gcc/testsuite/rust.test/fail_compilation/generics1.rs b/gcc/testsuite/rust.test/fail_compilation/generics1.rs new file mode 100644 index 0000000..71ff7d6 --- /dev/null +++ b/gcc/testsuite/rust.test/fail_compilation/generics1.rs @@ -0,0 +1,9 @@ +struct GenericStruct<T>(T, usize); + +fn main() { + let a2: GenericStruct<i8>; + a2 = GenericStruct::<_>(1, 456); + + let b2: i32 = a2.0; + let c2: usize = a2.1; +} diff --git a/gcc/testsuite/rust.test/fail_compilation/generics2.rs b/gcc/testsuite/rust.test/fail_compilation/generics2.rs new file mode 100644 index 0000000..7fe09e7 --- /dev/null +++ b/gcc/testsuite/rust.test/fail_compilation/generics2.rs @@ -0,0 +1,9 @@ +struct GenericStruct<T>(T, usize); + +fn main() { + let a2: GenericStruct<i8>; + a2 = GenericStruct(1, 456); + + let b2: i32 = a2.0; + let c2: usize = a2.1; +} diff --git a/gcc/testsuite/rust.test/fail_compilation/generics3.rs b/gcc/testsuite/rust.test/fail_compilation/generics3.rs new file mode 100644 index 0000000..80ccdec --- /dev/null +++ b/gcc/testsuite/rust.test/fail_compilation/generics3.rs @@ -0,0 +1,9 @@ +struct GenericStruct<T>(T, usize); + +fn main() { + let a2; + a2 = GenericStruct::<i8>(1, 456); + + let b2: i32 = a2.0; + let c2: usize = a2.1; +} diff --git a/gcc/testsuite/rust.test/fail_compilation/generics4.rs b/gcc/testsuite/rust.test/fail_compilation/generics4.rs new file mode 100644 index 0000000..2052ce6 --- /dev/null +++ b/gcc/testsuite/rust.test/fail_compilation/generics4.rs @@ -0,0 +1,9 @@ +struct GenericStruct<T>(T, usize); + +fn main() { + let a2; + a2 = GenericStruct::<i8, i32>(1, 456); + + let b2: i32 = a2.0; + let c2: usize = a2.1; +} diff --git a/gcc/testsuite/rust.test/fail_compilation/generics5.rs b/gcc/testsuite/rust.test/fail_compilation/generics5.rs new file mode 100644 index 0000000..ef8250b --- /dev/null +++ b/gcc/testsuite/rust.test/fail_compilation/generics5.rs @@ -0,0 +1,9 @@ +struct GenericStruct<T>(T, usize); + +fn main() { + let a2; + a2 = GenericStruct::<i8, T>(1, 456); + + let b2: i32 = a2.0; + let c2: usize = a2.1; +} |