diff options
author | goar5670 <mahadelr19@gmail.com> | 2023-03-04 22:13:18 +0300 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-03-06 13:25:08 +0000 |
commit | bdd36f1de036c7ab94c46f50015a88655ee1cbf8 (patch) | |
tree | 2999b9c6e98b19f8fd36ea21bb974a7ff4937f9a | |
parent | 136c765c748ab283eb95868b05da1269694e60be (diff) | |
download | gcc-bdd36f1de036c7ab94c46f50015a88655ee1cbf8.zip gcc-bdd36f1de036c7ab94c46f50015a88655ee1cbf8.tar.gz gcc-bdd36f1de036c7ab94c46f50015a88655ee1cbf8.tar.bz2 |
parser: Fix handling of multiple left angles in null denotation
gcc/rust/ChangeLog:
* parse/rust-parse-impl.h (Parser::parse_expr):
split LEFT_SHIFT before null_denotation.
gcc/testsuite/ChangeLog:
* rust/compile/complex_qualified_path_in_expr.rs : New test.
Signed-off-by: Mahmoud Mohamed <mahadelr19@gmail.com>
-rw-r--r-- | gcc/rust/parse/rust-parse-impl.h | 7 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/complex_qualified_path_in_expr.rs | 34 |
2 files changed, 41 insertions, 0 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 9b2bea7..79dd4e2 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -12650,6 +12650,13 @@ Parser<ManagedTokenSource>::parse_expr (int right_binding_power, || id == RIGHT_SQUARE) return nullptr; } + + if (current_token->get_id () == LEFT_SHIFT) + { + lexer.split_current_token (LEFT_ANGLE, LEFT_ANGLE); + current_token = lexer.peek_token (); + } + lexer.skip_token (); // parse null denotation (unary part of expression) diff --git a/gcc/testsuite/rust/compile/complex_qualified_path_in_expr.rs b/gcc/testsuite/rust/compile/complex_qualified_path_in_expr.rs new file mode 100644 index 0000000..6244a6b --- /dev/null +++ b/gcc/testsuite/rust/compile/complex_qualified_path_in_expr.rs @@ -0,0 +1,34 @@ +struct S; // { dg-warning "struct is never constructed" "" { target *-*-* } .-1 } +impl S { + fn f() -> i32 { return 0; } + // { dg-warning "associated function is never used" "" { target *-*-* } .-1 } +} + +trait T1 { + type A; + fn f() -> i32 { return 0; } +} + +impl T1 for S { + type A = S; +} + +trait T2 { + type B; + fn f() -> i32 { return 0; } +} + +impl T2 for S { + type B = S; +} + +trait T3 { + fn f() -> i32 { return 0; } +} + +impl T3 for S {} + +fn main() { + let _ = <<S as T1>::A as T2>::f(); + let _ = <<<S as T1>::A as T2>::B as T3>::f(); +} |