Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Changes made to ensure that '=>' token is parsed properly #3292

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions gcc/rust/parse/rust-parse-impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -12023,6 +12023,11 @@ Parser<ManagedTokenSource>::parse_expr (int right_binding_power,
if (restrictions.expr_can_be_null)
{
TokenId id = current_token->get_id ();
if (restrictions.stop_on_token && (id == MATCH_ARROW || id == COMMA))
{
rust_debug ("Stopping Parsing at special token");
return nullptr;
}
if (id == SEMICOLON || id == RIGHT_PAREN || id == RIGHT_CURLY
|| id == RIGHT_SQUARE || id == COMMA || id == LEFT_CURLY)
return nullptr;
Expand Down Expand Up @@ -12078,6 +12083,14 @@ Parser<ManagedTokenSource>::left_denotations (std::unique_ptr<AST::Expr> expr,
while (right_binding_power < left_binding_power (current_token))
{
lexer.skip_token ();
if (restrictions.stop_on_token
&& (current_token->get_id () == MATCH_ARROW
|| current_token->get_id () == COMMA))
{
rust_debug (
"Stopping parsing at restricted token in left_denotations");
return expr;
}

// FIXME attributes should generally be applied to the null denotation.
expr = left_denotation (current_token, std::move (expr),
Expand Down Expand Up @@ -12116,6 +12129,13 @@ Parser<ManagedTokenSource>::null_denotation (const_TokenPtr tok,
/* note: tok is previous character in input stream, not current one, as
* parse_expr skips it before passing it in */

if (restrictions.stop_on_token
&& (tok->get_id () == MATCH_ARROW || tok->get_id () == COMMA))
{
rust_debug ("Stopping parsing at restricted token in null_denotation");
return nullptr;
}

/* as a Pratt parser (which works by decomposing expressions into a null
* denotation and then a left denotation), null denotations handle primaries
* and unary operands (but only prefix unary operands) */
Expand Down
2 changes: 2 additions & 0 deletions gcc/rust/parse/rust-parse.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ struct ParseRestrictions
bool entered_from_unary = false;
bool expr_can_be_null = false;
bool expr_can_be_stmt = false;
bool stop_on_token
= false; // This is for stopping parsing at a specific token
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this mean? It seems like a hack

bool consume_semi = true;
/* Macro invocations that are statements can expand without a semicolon after
* the final statement, if it's an expression statement. */
Expand Down
16 changes: 16 additions & 0 deletions gcc/testsuite/rust/compile/issue-3099.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
extern "C" {
fn printf(s: *const i8, ...);
}

pub fn main() {
unsafe {
let value = 10;
let result = match value {
10 => 15,
_ => 20,
};

let format = "Result: %d\n\0" as *const str as *const i8;
printf(format, result);
}
}
Loading