aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMuhammad Mahad <mahadtxt@gmail.com>2023-08-16 17:40:09 +0500
committerPhilip Herron <philip.herron@embecosm.com>2023-08-17 10:00:47 +0000
commit294c5906d7b6e9f7a89e58c334f0072f98b679c6 (patch)
tree7c25d54307ecc276d83dbb9413e2855e0dac82be /gcc
parentb9ae3541a16fef4f60daeee90dbbc7861f1b9584 (diff)
downloadgcc-294c5906d7b6e9f7a89e58c334f0072f98b679c6.zip
gcc-294c5906d7b6e9f7a89e58c334f0072f98b679c6.tar.gz
gcc-294c5906d7b6e9f7a89e58c334f0072f98b679c6.tar.bz2
gccrs: [E0164] Neither tuple struct nor tuple variant used as a pattern
Checking if pattern has items, before returing solves ICE. Added error code and rich location. Also, fixes https://github.com/Rust-GCC/gccrs/issues/2430 gcc/rust/ChangeLog: * ast/rust-pattern.h: No need of assertion, we are handling it. * resolve/rust-early-name-resolver.cc (EarlyNameResolver::visit): Added check which emits error instead of using assertion. * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): Added rich location and error code. gcc/testsuite/ChangeLog: * rust/compile/match5.rs: Updated comment for dejagnu. * rust/compile/pattern-struct.rs: New test for ICE. Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/ast/rust-pattern.h7
-rw-r--r--gcc/rust/resolve/rust-early-name-resolver.cc10
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-pattern.cc6
-rw-r--r--gcc/testsuite/rust/compile/match5.rs2
-rw-r--r--gcc/testsuite/rust/compile/pattern-struct.rs18
5 files changed, 34 insertions, 9 deletions
diff --git a/gcc/rust/ast/rust-pattern.h b/gcc/rust/ast/rust-pattern.h
index 63ad0c5..85ab627 100644
--- a/gcc/rust/ast/rust-pattern.h
+++ b/gcc/rust/ast/rust-pattern.h
@@ -1176,12 +1176,7 @@ public:
void accept_vis (ASTVisitor &vis) override;
- // TODO: seems kinda dodgy. Think of better way.
- std::unique_ptr<TupleStructItems> &get_items ()
- {
- rust_assert (has_items ());
- return items;
- }
+ std::unique_ptr<TupleStructItems> &get_items () { return items; }
PathInExpression &get_path () { return path; }
const PathInExpression &get_path () const { return path; }
diff --git a/gcc/rust/resolve/rust-early-name-resolver.cc b/gcc/rust/resolve/rust-early-name-resolver.cc
index e460e6e..b642832 100644
--- a/gcc/rust/resolve/rust-early-name-resolver.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver.cc
@@ -1105,6 +1105,16 @@ EarlyNameResolver::visit (AST::TupleStructItemsRange &tuple_items)
void
EarlyNameResolver::visit (AST::TupleStructPattern &pattern)
{
+ if (!pattern.has_items ())
+ {
+ rich_location rich_locus (line_table, pattern.get_locus ());
+ rich_locus.add_fixit_replace (
+ "function calls are not allowed in patterns");
+ rust_error_at (
+ rich_locus, ErrorCode::E0164,
+ "expected tuple struct or tuple variant, found associated function");
+ return;
+ }
pattern.get_items ()->accept_vis (*this);
}
diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index df1c205..66641b4 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -76,14 +76,16 @@ TypeCheckPattern::visit (HIR::TupleStructPattern &pattern)
}
// error[E0532]: expected tuple struct or tuple variant, found struct variant
- // `Foo::D`
+ // `Foo::D`, E0532 by rustc 1.49.0 , E0164 by rustc 1.71.0
if (variant->get_variant_type () != TyTy::VariantDef::VariantType::TUPLE)
{
std::string variant_type
= TyTy::VariantDef::variant_type_string (variant->get_variant_type ());
+ rich_location rich_locus (line_table, pattern.get_locus ());
+ rich_locus.add_fixit_replace ("not a tuple struct or tuple variant");
rust_error_at (
- pattern.get_locus (),
+ rich_locus, ErrorCode::E0164,
"expected tuple struct or tuple variant, found %s variant %<%s::%s%>",
variant_type.c_str (), adt->get_name ().c_str (),
variant->get_identifier ().c_str ());
diff --git a/gcc/testsuite/rust/compile/match5.rs b/gcc/testsuite/rust/compile/match5.rs
index a5f934d..6741ee8 100644
--- a/gcc/testsuite/rust/compile/match5.rs
+++ b/gcc/testsuite/rust/compile/match5.rs
@@ -10,6 +10,6 @@ fn inspect(f: Foo) {
Foo::A => {}
Foo::B => {}
Foo::C(a) => {}
- Foo::D(x, y) => {} // { dg-error "expected tuple struct or tuple variant, found struct variant 'Foo::D'" }
+ Foo::D(x, y) => {} // { dg-error "expected tuple struct or tuple variant, found struct variant .Foo::D." }
}
}
diff --git a/gcc/testsuite/rust/compile/pattern-struct.rs b/gcc/testsuite/rust/compile/pattern-struct.rs
new file mode 100644
index 0000000..1727509
--- /dev/null
+++ b/gcc/testsuite/rust/compile/pattern-struct.rs
@@ -0,0 +1,18 @@
+fn main() {
+ enum A {
+ B,
+ C,
+ }
+
+ impl A {
+ fn new() {}
+ }
+
+ fn bar(foo: A) {
+ match foo {
+ A::new() => (),
+ // { dg-error "expected tuple struct or tuple variant, found associated function" "" { target *-*-* } .-1 }
+ _ => {}
+ }
+ }
+}