public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-7927] gccrs: [E0164] Neither tuple struct nor tuple variant used as a pattern
@ 2024-01-16 18:08 Arthur Cohen
  0 siblings, 0 replies; only message in thread
From: Arthur Cohen @ 2024-01-16 18:08 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:cdddf7baff74af1542788868d1cfab6dc435f2ef

commit r14-7927-gcdddf7baff74af1542788868d1cfab6dc435f2ef
Author: Muhammad Mahad <mahadtxt@gmail.com>
Date:   Wed Aug 16 17:40:09 2023 +0500

    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>

Diff:
---
 gcc/rust/ast/rust-pattern.h                       |  7 +------
 gcc/rust/resolve/rust-early-name-resolver.cc      | 10 ++++++++++
 gcc/rust/typecheck/rust-hir-type-check-pattern.cc |  6 ++++--
 gcc/testsuite/rust/compile/match5.rs              |  2 +-
 gcc/testsuite/rust/compile/pattern-struct.rs      | 18 ++++++++++++++++++
 5 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/gcc/rust/ast/rust-pattern.h b/gcc/rust/ast/rust-pattern.h
index 95655f5c097..18fe9995790 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 47d4e1b7bd1..5b701f5c0c1 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 97370454bbd..18e9b3442ac 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 a5f934d6aeb..6741ee8664f 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 00000000000..17275098cd2
--- /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 }
+            _ => {}
+        }
+    }
+}

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-01-16 18:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-16 18:08 [gcc r14-7927] gccrs: [E0164] Neither tuple struct nor tuple variant used as a pattern Arthur Cohen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).