aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-expr.h8
-rw-r--r--gcc/testsuite/rust.test/xfail_compile/method2.rs17
2 files changed, 25 insertions, 0 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.h b/gcc/rust/resolve/rust-ast-resolve-expr.h
index fbf05f2..f163ef5b 100644
--- a/gcc/rust/resolve/rust-ast-resolve-expr.h
+++ b/gcc/rust/resolve/rust-ast-resolve-expr.h
@@ -23,6 +23,7 @@
#include "rust-ast-full.h"
#include "rust-ast-resolve-struct-expr-field.h"
#include "rust-ast-verify-assignee.h"
+#include "rust-ast-resolve-type.h"
namespace Rust {
namespace Resolver {
@@ -92,6 +93,13 @@ public:
void visit (AST::MethodCallExpr &expr) override
{
ResolveExpr::go (expr.get_receiver_expr ().get (), expr.get_node_id ());
+
+ if (expr.get_method_name ().has_generic_args ())
+ {
+ AST::GenericArgs &args = expr.get_method_name ().get_generic_args ();
+ ResolveTypeToCanonicalPath::type_resolve_generic_args (args);
+ }
+
expr.iterate_params ([&] (AST::Expr *p) mutable -> bool {
ResolveExpr::go (p, expr.get_node_id ());
return true;
diff --git a/gcc/testsuite/rust.test/xfail_compile/method2.rs b/gcc/testsuite/rust.test/xfail_compile/method2.rs
new file mode 100644
index 0000000..be43b1a
--- /dev/null
+++ b/gcc/testsuite/rust.test/xfail_compile/method2.rs
@@ -0,0 +1,17 @@
+// { dg-excess-errors "Noisy error and debug" }
+struct Foo<A, B>(A, B);
+
+impl Foo<i32, f32> {
+ fn test<X>(self, a: X) -> X {
+ a
+ }
+}
+
+fn main() {
+ let a;
+ a = Foo(123, 456f32);
+
+ let b;
+ b = a.test::<asfasfr>(false);
+ // { dg-error "failed to resolve TypePath: asfasfr" "" { target *-*-* } .-1 }
+}