public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] parser: Allow `LEFT_SHIFT` to start `parse_type`
@ 2023-02-22 7:22 Thomas Schwinge
0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2023-02-22 7:22 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:87e7c9dedacd4d12636e6c626aab14bcecf686f2
commit 87e7c9dedacd4d12636e6c626aab14bcecf686f2
Author: Arthur Cohen <arthur.cohen@embecosm.com>
Date: Fri Feb 17 14:24:07 2023 +0100
parser: Allow `LEFT_SHIFT` to start `parse_type`
Similarly to the last commit, we need to allow `LEFT_SHIFT` tokens to
start a qualified path type and split them into two `LEFT_ANGLE` tokens.
gcc/rust/ChangeLog:
* parse/rust-parse-impl.h (Parser::parse_type): Allow LEFT_SHIFT to
start a type and then split it in `parse_qualified_path_type`
gcc/testsuite/ChangeLog:
* rust/compile/parse_associated_type_as_generic_arg3.rs: New test.
Diff:
---
gcc/rust/parse/rust-parse-impl.h | 15 ++++--
.../parse_associated_type_as_generic_arg3.rs | 59 ++++++++++++++++++++++
2 files changed, 70 insertions(+), 4 deletions(-)
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 3bf26bc6fdc..2cb5e3e7849 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -6842,11 +6842,13 @@ Parser<ManagedTokenSource>::parse_qualified_path_type (
if (locus == Linemap::unknown_location ())
{
locus = lexer.peek_token ()->get_locus ();
+
+ if (lexer.peek_token ()->get_id () == LEFT_SHIFT)
+ lexer.split_current_token (LEFT_ANGLE, LEFT_ANGLE);
+
+ // skip after somewhere?
if (!skip_token (LEFT_ANGLE))
- {
- // skip after somewhere?
- return AST::QualifiedPathType::create_error ();
- }
+ return AST::QualifiedPathType::create_error ();
}
// parse type (required)
@@ -9218,6 +9220,7 @@ Parser<ManagedTokenSource>::parse_type (bool save_errors)
case LEFT_SQUARE:
// slice type or array type - requires further disambiguation
return parse_slice_or_array_type ();
+ case LEFT_SHIFT:
case LEFT_ANGLE: {
// qualified path in type
AST::QualifiedPathInType path = parse_qualified_path_in_type ();
@@ -10084,6 +10087,7 @@ Parser<ManagedTokenSource>::parse_type_no_bounds ()
case LEFT_SQUARE:
// slice type or array type - requires further disambiguation
return parse_slice_or_array_type ();
+ case LEFT_SHIFT:
case LEFT_ANGLE: {
// qualified path in type
AST::QualifiedPathInType path = parse_qualified_path_in_type ();
@@ -10597,6 +10601,7 @@ Parser<ManagedTokenSource>::parse_range_pattern_bound ()
return std::unique_ptr<AST::RangePatternBoundPath> (
new AST::RangePatternBoundPath (std::move (path)));
}
+ case LEFT_SHIFT:
case LEFT_ANGLE: {
// qualified path in expression
AST::QualifiedPathInExpression path
@@ -10727,6 +10732,7 @@ Parser<ManagedTokenSource>::parse_pattern_no_alt ()
case LEFT_SQUARE:
// slice pattern
return parse_slice_pattern ();
+ case LEFT_SHIFT:
case LEFT_ANGLE: {
// qualified path in expression or qualified range pattern bound
AST::QualifiedPathInExpression path
@@ -12760,6 +12766,7 @@ Parser<ManagedTokenSource>::null_denotation (const_TokenPtr tok,
* tokens and whatever. */
/* FIXME: could also be path expression (and hence macro expression,
* struct/enum expr) */
+ case LEFT_SHIFT:
case LEFT_ANGLE: {
// qualified path
// HACK: add outer attrs to path
diff --git a/gcc/testsuite/rust/compile/parse_associated_type_as_generic_arg3.rs b/gcc/testsuite/rust/compile/parse_associated_type_as_generic_arg3.rs
new file mode 100644
index 00000000000..f1cc9e7dcde
--- /dev/null
+++ b/gcc/testsuite/rust/compile/parse_associated_type_as_generic_arg3.rs
@@ -0,0 +1,59 @@
+// { dg-additional-options "-fsyntax-only" }
+
+trait Bar {
+ type B;
+
+ fn bar();
+}
+
+trait Foo {
+ type A;
+
+ fn foo();
+}
+
+trait Toto {
+ type C;
+
+ fn toto();
+}
+
+trait Tata {
+ type D;
+ fn tata();
+}
+
+impl Toto for u32 {
+ type C = f32;
+
+ fn toto() {}
+}
+
+impl Tata for f32 {
+ type D = u32;
+
+ fn tata() {}
+}
+
+struct S;
+
+impl Bar for i32 {
+ type B = u32;
+
+ fn bar() {}
+}
+
+impl Foo for S {
+ type A = i32;
+
+ fn foo() {}
+}
+
+enum Maybe<T> {
+ Something(T),
+ Nothing,
+}
+
+fn foo() -> Maybe<<<<<S as Foo>::A as Bar>::B as Toto>::C as Tata>::D> {
+ Maybe::Something(15)
+}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-02-22 7:22 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-22 7:22 [gcc/devel/rust/master] parser: Allow `LEFT_SHIFT` to start `parse_type` Thomas Schwinge
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).