diff options
author | Philip Herron <herron.philip@googlemail.com> | 2025-01-21 17:20:06 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2025-01-29 17:41:24 +0000 |
commit | ad46f0871d80966a1dd1adf7bf444c99f094d42a (patch) | |
tree | 03c536936fbec0fe96f514aa2cad8bcd69025e0f /gcc | |
parent | 3c21102b7378b9a4d61c36689063f6104e751ff6 (diff) | |
download | gcc-ad46f0871d80966a1dd1adf7bf444c99f094d42a.zip gcc-ad46f0871d80966a1dd1adf7bf444c99f094d42a.tar.gz gcc-ad46f0871d80966a1dd1adf7bf444c99f094d42a.tar.bz2 |
gccrs: add support for ref literal patterns
Fixes Rust-GCC#3174
gcc/rust/ChangeLog:
* backend/rust-compile-pattern.cc (CompilePatternBindings::visit): make recursive
* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): handle ref flag
gcc/testsuite/ChangeLog:
* rust/compile/nr2/exclude: nr2 cant handle this
* rust/compile/issue-3174.rs: New test.
Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/backend/rust-compile-pattern.cc | 18 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 13 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-3174.rs | 28 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/nr2/exclude | 1 |
4 files changed, 52 insertions, 8 deletions
diff --git a/gcc/rust/backend/rust-compile-pattern.cc b/gcc/rust/backend/rust-compile-pattern.cc index 726ade6..1e33c48 100644 --- a/gcc/rust/backend/rust-compile-pattern.cc +++ b/gcc/rust/backend/rust-compile-pattern.cc @@ -481,8 +481,7 @@ CompilePatternBindings::visit (HIR::TupleStructPattern &pattern) tuple_field_index++, pattern->get_locus ()); - ctx->insert_pattern_binding ( - pattern->get_mappings ().get_hirid (), binding); + CompilePatternBindings::Compile (*pattern, binding, ctx); } } else @@ -497,8 +496,7 @@ CompilePatternBindings::visit (HIR::TupleStructPattern &pattern) tuple_field_index++, pattern->get_locus ()); - ctx->insert_pattern_binding ( - pattern->get_mappings ().get_hirid (), binding); + CompilePatternBindings::Compile (*pattern, binding, ctx); } } } @@ -607,8 +605,16 @@ CompilePatternBindings::visit (HIR::ReferencePattern &pattern) void CompilePatternBindings::visit (HIR::IdentifierPattern &pattern) { - ctx->insert_pattern_binding (pattern.get_mappings ().get_hirid (), - match_scrutinee_expr); + if (!pattern.get_is_ref ()) + { + ctx->insert_pattern_binding (pattern.get_mappings ().get_hirid (), + match_scrutinee_expr); + return; + } + + tree ref = address_expression (match_scrutinee_expr, + EXPR_LOCATION (match_scrutinee_expr)); + ctx->insert_pattern_binding (pattern.get_mappings ().get_hirid (), ref); } void diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc index 52d1253..765504f 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc @@ -519,9 +519,18 @@ TypeCheckPattern::visit (HIR::RangePattern &pattern) } void -TypeCheckPattern::visit (HIR::IdentifierPattern &) +TypeCheckPattern::visit (HIR::IdentifierPattern &pattern) { - infered = parent; + if (!pattern.get_is_ref ()) + { + infered = parent; + return; + } + + infered = new TyTy::ReferenceType (pattern.get_mappings ().get_hirid (), + TyTy::TyVar (parent->get_ref ()), + pattern.is_mut () ? Mutability::Mut + : Mutability::Imm); } void diff --git a/gcc/testsuite/rust/compile/issue-3174.rs b/gcc/testsuite/rust/compile/issue-3174.rs new file mode 100644 index 0000000..87588e1 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-3174.rs @@ -0,0 +1,28 @@ +extern "C" { + fn printf(s: *const i8, ...); +} + +enum Option { + Some(i32), + None, +} + +impl Option { + fn add(&mut self) { + match *self { + Option::Some(ref mut a) => *a += 1, + Option::None => {} + } + } +} + +fn main() { + unsafe { + let mut a = Option::None; + a.add(); + let _s = "%d\n\0"; + let _s = _s as *const str; + let s = _s as *const i8; + printf(s, a); + } +} diff --git a/gcc/testsuite/rust/compile/nr2/exclude b/gcc/testsuite/rust/compile/nr2/exclude index c5c7326..e5e5c12 100644 --- a/gcc/testsuite/rust/compile/nr2/exclude +++ b/gcc/testsuite/rust/compile/nr2/exclude @@ -150,4 +150,5 @@ issue-2953-1.rs issue-3030.rs traits12.rs try-trait.rs +issue-3174.rs # please don't delete the trailing newline |