aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/Make-lang.in3
-rw-r--r--gcc/rust/backend/rust-constexpr.cc96
-rw-r--r--gcc/rust/expand/rust-macro-builtins.cc25
-rw-r--r--gcc/rust/expand/rust-macro-builtins.h47
-rw-r--r--gcc/rust/util/rust-hir-map.cc22
5 files changed, 97 insertions, 96 deletions
diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in
index 024fe23..58dbc09 100644
--- a/gcc/rust/Make-lang.in
+++ b/gcc/rust/Make-lang.in
@@ -331,8 +331,7 @@ CFLAGS-rust/rust-lex.o += $(RUST_INCLUDES)
CFLAGS-rust/rust-parse.o += $(RUST_INCLUDES)
CFLAGS-rust/rust-session-manager.o += $(RUST_INCLUDES)
-# TODO: possibly find a way to ensure C++11 compilation level here?
-RUST_CXXFLAGS = -std=c++11 -Wno-unused-parameter -Werror=overloaded-virtual
+RUST_CXXFLAGS = $(CXXFLAGS)
# build all rust/lex files in rust folder, add cross-folder includes
rust/%.o: rust/lex/%.cc
diff --git a/gcc/rust/backend/rust-constexpr.cc b/gcc/rust/backend/rust-constexpr.cc
index 790a8e9..21e8bed 100644
--- a/gcc/rust/backend/rust-constexpr.cc
+++ b/gcc/rust/backend/rust-constexpr.cc
@@ -3658,49 +3658,48 @@ eval_call_expression (const constexpr_ctx *ctx, tree t, bool lval,
whose constructor we are processing. Add the initializer to the vector
and return true to indicate success. */
-static bool
-build_anon_member_initialization (tree member, tree init,
- vec<constructor_elt, va_gc> **vec_outer)
-{
- /* MEMBER presents the relevant fields from the inside out, but we need
- to build up the initializer from the outside in so that we can reuse
- previously built CONSTRUCTORs if this is, say, the second field in an
- anonymous struct. So we use a vec as a stack. */
- auto_vec<tree, 2> fields;
- do
- {
- fields.safe_push (TREE_OPERAND (member, 1));
- member = TREE_OPERAND (member, 0);
- }
- while (ANON_AGGR_TYPE_P (TREE_TYPE (member))
- && TREE_CODE (member) == COMPONENT_REF);
-
- /* VEC has the constructor elements vector for the context of FIELD.
- If FIELD is an anonymous aggregate, we will push inside it. */
- vec<constructor_elt, va_gc> **vec = vec_outer;
- tree field;
- while (field = fields.pop (), ANON_AGGR_TYPE_P (TREE_TYPE (field)))
- {
- tree ctor;
- /* If there is already an outer constructor entry for the anonymous
- aggregate FIELD, use it; otherwise, insert one. */
- if (vec_safe_is_empty (*vec) || (*vec)->last ().index != field)
- {
- ctor = build_constructor (TREE_TYPE (field), NULL);
- CONSTRUCTOR_APPEND_ELT (*vec, field, ctor);
- }
- else
- ctor = (*vec)->last ().value;
- vec = &CONSTRUCTOR_ELTS (ctor);
- }
-
- /* Now we're at the innermost field, the one that isn't an anonymous
- aggregate. Add its initializer to the CONSTRUCTOR and we're done. */
- gcc_assert (fields.is_empty ());
- CONSTRUCTOR_APPEND_ELT (*vec, field, init);
-
- return true;
-}
+// static bool
+// build_anon_member_initialization (tree member, tree init,
+// vec<constructor_elt, va_gc> **vec_outer)
+// {
+// /* MEMBER presents the relevant fields from the inside out, but we need
+// to build up the initializer from the outside in so that we can reuse
+// previously built CONSTRUCTORs if this is, say, the second field in an
+// anonymous struct. So we use a vec as a stack. */
+// auto_vec<tree, 2> fields;
+// do
+// {
+// fields.safe_push (TREE_OPERAND (member, 1));
+// member = TREE_OPERAND (member, 0);
+// } while (ANON_AGGR_TYPE_P (TREE_TYPE (member))
+// && TREE_CODE (member) == COMPONENT_REF);
+//
+// /* VEC has the constructor elements vector for the context of FIELD.
+// If FIELD is an anonymous aggregate, we will push inside it. */
+// vec<constructor_elt, va_gc> **vec = vec_outer;
+// tree field;
+// while (field = fields.pop (), ANON_AGGR_TYPE_P (TREE_TYPE (field)))
+// {
+// tree ctor;
+// /* If there is already an outer constructor entry for the anonymous
+// aggregate FIELD, use it; otherwise, insert one. */
+// if (vec_safe_is_empty (*vec) || (*vec)->last ().index != field)
+// {
+// ctor = build_constructor (TREE_TYPE (field), NULL);
+// CONSTRUCTOR_APPEND_ELT (*vec, field, ctor);
+// }
+// else
+// ctor = (*vec)->last ().value;
+// vec = &CONSTRUCTOR_ELTS (ctor);
+// }
+//
+// /* Now we're at the innermost field, the one that isn't an anonymous
+// aggregate. Add its initializer to the CONSTRUCTOR and we're done. */
+// gcc_assert (fields.is_empty ());
+// CONSTRUCTOR_APPEND_ELT (*vec, field, init);
+//
+// return true;
+// }
///* V is a vector of constructor elements built up for the base and member
// initializers of a constructor for TYPE. They need to be in increasing
@@ -3750,7 +3749,7 @@ build_anon_member_initialization (tree member, tree init,
static bool
build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec)
{
- tree member, init;
+ tree member;
if (TREE_CODE (t) == CLEANUP_POINT_EXPR)
t = TREE_OPERAND (t, 0);
if (TREE_CODE (t) == EXPR_STMT)
@@ -3835,7 +3834,8 @@ build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec)
member = TREE_OPERAND (member, 1);
else if (ANON_AGGR_TYPE_P (TREE_TYPE (aggr)))
/* Initializing a member of an anonymous union. */
- return build_anon_member_initialization (member, init, vec);
+ rust_sorry_at (Location (), "cannot handle value initialization yet");
+ // return build_anon_member_initialization (member, init, vec);
else
/* We're initializing a vtable pointer in a base. Leave it as
COMPONENT_REF so we remember the path to get to the vfield. */
@@ -3845,9 +3845,11 @@ build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec)
/* Value-initialization can produce multiple initializers for the
same field; use the last one. */
if (!vec_safe_is_empty (*vec) && (*vec)->last ().index == member)
- (*vec)->last ().value = init;
+ rust_sorry_at (Location (), "cannot handle value initialization yet");
+ // (*vec)->last ().value = init;
else
- CONSTRUCTOR_APPEND_ELT (*vec, member, init);
+ rust_sorry_at (Location (), "cannot handle value initialization yet");
+ // CONSTRUCTOR_APPEND_ELT (*vec, member, init);
return true;
}
diff --git a/gcc/rust/expand/rust-macro-builtins.cc b/gcc/rust/expand/rust-macro-builtins.cc
index 14322d0..a00b5ed 100644
--- a/gcc/rust/expand/rust-macro-builtins.cc
+++ b/gcc/rust/expand/rust-macro-builtins.cc
@@ -265,7 +265,7 @@ load_file_bytes (const char *filename)
} // namespace
AST::Fragment
-MacroBuiltin::assert (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::assert_handler (Location invoc_locus, AST::MacroInvocData &invoc)
{
rust_debug ("assert!() called");
@@ -273,7 +273,7 @@ MacroBuiltin::assert (Location invoc_locus, AST::MacroInvocData &invoc)
}
AST::Fragment
-MacroBuiltin::file (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::file_handler (Location invoc_locus, AST::MacroInvocData &invoc)
{
auto current_file
= Session::get_instance ().linemap->location_file (invoc_locus);
@@ -283,7 +283,7 @@ MacroBuiltin::file (Location invoc_locus, AST::MacroInvocData &invoc)
}
AST::Fragment
-MacroBuiltin::column (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::column_handler (Location invoc_locus, AST::MacroInvocData &invoc)
{
auto current_column
= Session::get_instance ().linemap->location_to_column (invoc_locus);
@@ -300,7 +300,8 @@ MacroBuiltin::column (Location invoc_locus, AST::MacroInvocData &invoc)
&'static [u8; N]. */
AST::Fragment
-MacroBuiltin::include_bytes (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::include_bytes_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc)
{
/* Get target filename from the macro invocation, which is treated as a path
relative to the include!-ing file (currently being compiled). */
@@ -343,7 +344,8 @@ MacroBuiltin::include_bytes (Location invoc_locus, AST::MacroInvocData &invoc)
expression of type &'static str. */
AST::Fragment
-MacroBuiltin::include_str (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::include_str_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc)
{
/* Get target filename from the macro invocation, which is treated as a path
relative to the include!-ing file (currently being compiled). */
@@ -368,7 +370,8 @@ MacroBuiltin::include_str (Location invoc_locus, AST::MacroInvocData &invoc)
/* Expand builtin macro compile_error!("error"), which forces a compile error
during the compile time. */
AST::Fragment
-MacroBuiltin::compile_error (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::compile_error_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc)
{
auto lit_expr
= parse_single_string_literal (invoc.get_delim_tok_tree (), invoc_locus,
@@ -386,7 +389,7 @@ MacroBuiltin::compile_error (Location invoc_locus, AST::MacroInvocData &invoc)
into a string with no delimiter. */
AST::Fragment
-MacroBuiltin::concat (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::concat_handler (Location invoc_locus, AST::MacroInvocData &invoc)
{
auto invoc_token_tree = invoc.get_delim_tok_tree ();
MacroInvocLexer lex (invoc_token_tree.to_token_stream ());
@@ -437,7 +440,7 @@ MacroBuiltin::concat (Location invoc_locus, AST::MacroInvocData &invoc)
compile time. */
AST::Fragment
-MacroBuiltin::env (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::env_handler (Location invoc_locus, AST::MacroInvocData &invoc)
{
auto invoc_token_tree = invoc.get_delim_tok_tree ();
MacroInvocLexer lex (invoc_token_tree.to_token_stream ());
@@ -495,7 +498,7 @@ MacroBuiltin::env (Location invoc_locus, AST::MacroInvocData &invoc)
}
AST::Fragment
-MacroBuiltin::cfg (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::cfg_handler (Location invoc_locus, AST::MacroInvocData &invoc)
{
// only parse if not already parsed
if (!invoc.is_parsed ())
@@ -534,7 +537,7 @@ MacroBuiltin::cfg (Location invoc_locus, AST::MacroInvocData &invoc)
scope compile time. */
AST::Fragment
-MacroBuiltin::include (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::include_handler (Location invoc_locus, AST::MacroInvocData &invoc)
{
/* Get target filename from the macro invocation, which is treated as a path
relative to the include!-ing file (currently being compiled). */
@@ -588,7 +591,7 @@ MacroBuiltin::include (Location invoc_locus, AST::MacroInvocData &invoc)
}
AST::Fragment
-MacroBuiltin::line (Location invoc_locus, AST::MacroInvocData &invoc)
+MacroBuiltin::line_handler (Location invoc_locus, AST::MacroInvocData &invoc)
{
auto current_line
= Session::get_instance ().linemap->location_to_line (invoc_locus);
diff --git a/gcc/rust/expand/rust-macro-builtins.h b/gcc/rust/expand/rust-macro-builtins.h
index 79305e4..0f4b464 100644
--- a/gcc/rust/expand/rust-macro-builtins.h
+++ b/gcc/rust/expand/rust-macro-builtins.h
@@ -60,45 +60,42 @@
* of the `Mappings` class.
*/
-/* If assert is defined as a macro this file will not parse, so undefine this
- before continuing. */
-// TODO: Rename all functions here `*_handler`
-#ifdef assert
-#undef assert
-#endif
-
namespace Rust {
class MacroBuiltin
{
public:
- static AST::Fragment assert (Location invoc_locus,
- AST::MacroInvocData &invoc);
+ static AST::Fragment assert_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
- static AST::Fragment file (Location invoc_locus, AST::MacroInvocData &invoc);
+ static AST::Fragment file_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
- static AST::Fragment column (Location invoc_locus,
- AST::MacroInvocData &invoc);
+ static AST::Fragment column_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
- static AST::Fragment include_bytes (Location invoc_locus,
- AST::MacroInvocData &invoc);
+ static AST::Fragment include_bytes_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
- static AST::Fragment include_str (Location invoc_locus,
- AST::MacroInvocData &invoc);
+ static AST::Fragment include_str_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
- static AST::Fragment compile_error (Location invoc_locus,
- AST::MacroInvocData &invoc);
+ static AST::Fragment compile_error_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
- static AST::Fragment concat (Location invoc_locus,
- AST::MacroInvocData &invoc);
+ static AST::Fragment concat_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
- static AST::Fragment env (Location invoc_locus, AST::MacroInvocData &invoc);
+ static AST::Fragment env_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
- static AST::Fragment cfg (Location invoc_locus, AST::MacroInvocData &invoc);
+ static AST::Fragment cfg_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
- static AST::Fragment include (Location invoc_locus,
- AST::MacroInvocData &invoc);
+ static AST::Fragment include_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
- static AST::Fragment line (Location invoc_locus, AST::MacroInvocData &invoc);
+ static AST::Fragment line_handler (Location invoc_locus,
+ AST::MacroInvocData &invoc);
};
} // namespace Rust
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index a3073c0..2364b13 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -843,17 +843,17 @@ Mappings::insert_macro_def (AST::MacroRulesDefinition *macro)
static std::map<
std::string, std::function<AST::Fragment (Location, AST::MacroInvocData &)>>
builtin_macros = {
- {"assert", MacroBuiltin::assert},
- {"file", MacroBuiltin::file},
- {"line", MacroBuiltin::line},
- {"column", MacroBuiltin::column},
- {"include_bytes", MacroBuiltin::include_bytes},
- {"include_str", MacroBuiltin::include_str},
- {"compile_error", MacroBuiltin::compile_error},
- {"concat", MacroBuiltin::concat},
- {"env", MacroBuiltin::env},
- {"cfg", MacroBuiltin::cfg},
- {"include", MacroBuiltin::include},
+ {"assert", MacroBuiltin::assert_handler},
+ {"file", MacroBuiltin::file_handler},
+ {"line", MacroBuiltin::line_handler},
+ {"column", MacroBuiltin::column_handler},
+ {"include_bytes", MacroBuiltin::include_bytes_handler},
+ {"include_str", MacroBuiltin::include_str_handler},
+ {"compile_error", MacroBuiltin::compile_error_handler},
+ {"concat", MacroBuiltin::concat_handler},
+ {"env", MacroBuiltin::env_handler},
+ {"cfg", MacroBuiltin::cfg_handler},
+ {"include", MacroBuiltin::include_handler},
};
auto outer_attrs = macro->get_outer_attrs ();