aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ccpp.yml2
-rw-r--r--gcc/rust/Make-lang.in1
-rw-r--r--gcc/rust/expand/rust-macro-expand.h47
-rw-r--r--gcc/rust/expand/rust-macro-invoc-lexer.cc29
-rw-r--r--gcc/rust/expand/rust-macro-invoc-lexer.h64
-rw-r--r--gcc/testsuite/rust/compile/inline_1.rs1
6 files changed, 97 insertions, 47 deletions
diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml
index 951aecb..50ef728 100644
--- a/.github/workflows/ccpp.yml
+++ b/.github/workflows/ccpp.yml
@@ -61,7 +61,7 @@ jobs:
- name: Check regressions
run: |
cd gccrs-build; \
- if grep "# of unexpected" gcc/testsuite/rust/rust.sum;\
+ if grep -e "unexpected" -e "unresolved" gcc/testsuite/rust/rust.sum;\
then \
echo "some tests are not correct"; \
exit 1; \
diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in
index 65c9bba..739b27d 100644
--- a/gcc/rust/Make-lang.in
+++ b/gcc/rust/Make-lang.in
@@ -74,6 +74,7 @@ GRS_OBJS = \
rust/rust-mangle.o \
rust/rust-compile-resolve-path.o \
rust/rust-macro-expand.o \
+ rust/rust-macro-invoc-lexer.o \
rust/rust-hir-full-test.o \
rust/rust-hir-map.o \
rust/rust-abi.o \
diff --git a/gcc/rust/expand/rust-macro-expand.h b/gcc/rust/expand/rust-macro-expand.h
index 94f495c..edb091d 100644
--- a/gcc/rust/expand/rust-macro-expand.h
+++ b/gcc/rust/expand/rust-macro-expand.h
@@ -26,6 +26,7 @@
#include "rust-macro.h"
#include "rust-hir-map.h"
#include "rust-name-resolver.h"
+#include "rust-macro-invoc-lexer.h"
// Provides objects and method prototypes for macro expansion
@@ -48,52 +49,6 @@ struct ExpansionCfg
std::string crate_name = "";
};
-class MacroInvocLexer
-{
-public:
- MacroInvocLexer (std::vector<std::unique_ptr<AST::Token>> stream)
- : offs (0), token_stream (std::move (stream))
- {}
-
- // Returns token n tokens ahead of current position.
- const_TokenPtr peek_token (int n)
- {
- if ((offs + n) >= token_stream.size ())
- return Token::make (END_OF_FILE, Location ());
-
- return token_stream.at (offs + n)->get_tok_ptr ();
- }
- // Peeks the current token.
- const_TokenPtr peek_token () { return peek_token (0); }
-
- // Advances current token to n + 1 tokens ahead of current position.
- void skip_token (int n) { offs += (n + 1); }
-
- // Skips the current token.
- void skip_token () { skip_token (0); }
-
- // Splits the current token into two. Intended for use with nested generics
- // closes (i.e. T<U<X>> where >> is wrongly lexed as one token). Note that
- // this will only work with "simple" tokens like punctuation.
- void split_current_token (TokenId /*new_left*/, TokenId /*new_right*/)
- {
- // FIXME
- gcc_unreachable ();
- }
-
- std::string get_filename () const
- {
- gcc_unreachable ();
- return "FIXME";
- }
-
- size_t get_offs () const { return offs; }
-
-private:
- size_t offs;
- std::vector<std::unique_ptr<AST::Token>> token_stream;
-};
-
struct MatchedFragment
{
std::string fragment_ident;
diff --git a/gcc/rust/expand/rust-macro-invoc-lexer.cc b/gcc/rust/expand/rust-macro-invoc-lexer.cc
new file mode 100644
index 0000000..8a43d29
--- /dev/null
+++ b/gcc/rust/expand/rust-macro-invoc-lexer.cc
@@ -0,0 +1,29 @@
+#include "rust-macro-invoc-lexer.h"
+
+namespace Rust {
+
+const_TokenPtr
+MacroInvocLexer::peek_token (int n)
+{
+ if ((offs + n) >= token_stream.size ())
+ return Token::make (END_OF_FILE, Location ());
+
+ return token_stream.at (offs + n)->get_tok_ptr ();
+}
+
+// Advances current token to n + 1 tokens ahead of current position.
+void
+MacroInvocLexer::skip_token (int n)
+{
+ offs += (n + 1);
+}
+
+void
+MacroInvocLexer::split_current_token (TokenId new_left __attribute__ ((unused)),
+ TokenId new_right
+ __attribute__ ((unused)))
+{
+ // FIXME
+ gcc_unreachable ();
+}
+} // namespace Rust
diff --git a/gcc/rust/expand/rust-macro-invoc-lexer.h b/gcc/rust/expand/rust-macro-invoc-lexer.h
new file mode 100644
index 0000000..0fd4554
--- /dev/null
+++ b/gcc/rust/expand/rust-macro-invoc-lexer.h
@@ -0,0 +1,64 @@
+// Copyright (C) 2020-2022 Free Software Foundation, Inc.
+
+// This file is part of GCC.
+
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#ifndef RUST_MACRO_INVOC_LEXER_H
+#define RUST_MACRO_INVOC_LEXER_H
+
+#include "rust-ast.h"
+
+namespace Rust {
+class MacroInvocLexer
+{
+public:
+ MacroInvocLexer (std::vector<std::unique_ptr<AST::Token>> stream)
+ : offs (0), token_stream (std::move (stream))
+ {}
+
+ // Returns token n tokens ahead of current position.
+ const_TokenPtr peek_token (int n);
+
+ // Peeks the current token.
+ const_TokenPtr peek_token () { return peek_token (0); }
+
+ // Advances current token to n + 1 tokens ahead of current position.
+ void skip_token (int n);
+
+ // Skips the current token.
+ void skip_token () { skip_token (0); }
+
+ // Splits the current token into two. Intended for use with nested generics
+ // closes (i.e. T<U<X>> where >> is wrongly lexed as one token). Note that
+ // this will only work with "simple" tokens like punctuation.
+ void split_current_token (TokenId new_left, TokenId new_right);
+
+ std::string get_filename () const
+ {
+ // FIXME
+ gcc_unreachable ();
+ return "FIXME";
+ }
+
+ size_t get_offs () const { return offs; }
+
+private:
+ size_t offs;
+ std::vector<std::unique_ptr<AST::Token>> token_stream;
+};
+} // namespace Rust
+
+#endif // RUST_MACRO_INVOC_LEXER_H
diff --git a/gcc/testsuite/rust/compile/inline_1.rs b/gcc/testsuite/rust/compile/inline_1.rs
index df2486f..4b0f991 100644
--- a/gcc/testsuite/rust/compile/inline_1.rs
+++ b/gcc/testsuite/rust/compile/inline_1.rs
@@ -1,3 +1,4 @@
+// { dg-additional-options "-fdump-tree-gimple" }
#[inline]
fn test_a() {}