aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-04-12 13:28:28 +0000
committerGitHub <noreply@github.com>2022-04-12 13:28:28 +0000
commitc494f30766b569f6bebaf715ae6368c0335b0025 (patch)
tree04143be929a7be634a3cdc2a899ca3a0a1ead5ff
parenta5b38698aa439a935f0c0f4c55611f2173a28b57 (diff)
parent2fe4048f7f1d10ce9928eb7611179ee8ff7f17f8 (diff)
downloadgcc-c494f30766b569f6bebaf715ae6368c0335b0025.zip
gcc-c494f30766b569f6bebaf715ae6368c0335b0025.tar.gz
gcc-c494f30766b569f6bebaf715ae6368c0335b0025.tar.bz2
Merge #1106
1106: macros: fix an infinite loop in `concat!` macro parser r=CohenArthur a=liushuyu - Fix concat macro parser issue which caused an infinite loop when invalid token is encountered Co-authored-by: liushuyu <liushuyu011@gmail.com>
-rw-r--r--gcc/rust/expand/rust-macro-builtins.cc5
-rw-r--r--gcc/testsuite/rust/compile/builtin_macro_concat.rs9
2 files changed, 9 insertions, 5 deletions
diff --git a/gcc/rust/expand/rust-macro-builtins.cc b/gcc/rust/expand/rust-macro-builtins.cc
index 85520ec..1f41545 100644
--- a/gcc/rust/expand/rust-macro-builtins.cc
+++ b/gcc/rust/expand/rust-macro-builtins.cc
@@ -287,9 +287,12 @@ MacroBuiltin::concat (Location invoc_locus, AST::MacroInvocData &invoc)
}
else
{
- rust_error_at (parser.peek_current_token ()->get_locus (),
+ auto current_token = parser.peek_current_token ();
+ rust_error_at (current_token->get_locus (),
"argument must be a constant literal");
has_error = true;
+ // Just crash if the current token can't be skipped
+ rust_assert (parser.skip_token (current_token->get_id ()));
}
parser.maybe_skip_token (COMMA);
}
diff --git a/gcc/testsuite/rust/compile/builtin_macro_concat.rs b/gcc/testsuite/rust/compile/builtin_macro_concat.rs
index 17c42e3..b37f80f 100644
--- a/gcc/testsuite/rust/compile/builtin_macro_concat.rs
+++ b/gcc/testsuite/rust/compile/builtin_macro_concat.rs
@@ -3,13 +3,14 @@ macro_rules! concat {
}
fn main() {
- // let not_literal = "identifier";
+ let not_literal = "identifier";
concat!();
- // concat! (,); // { error "argument must be a constant literal" }
- // concat!(not_literal); // { error "argument must be a constant literal" }
+ concat! (,); // { dg-error "argument must be a constant literal" }
+ concat!(not_literal); // { dg-error "argument must be a constant literal" }
concat!("message");
concat!("message",);
concat!("message", 1, true, false, 1.0, 10usize, 2000u64);
concat!("message", 1, true, false, 1.0, 10usize, 2000u64,);
- // concat! ("m", not_literal); // { error "argument must be a constant literal" }
+ concat! ("m", not_literal); // { dg-error "argument must be a constant literal" }
+ concat!(not_literal invalid 'm' !!,); // { dg-error "argument must be a constant literal" }
}