aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-06-24 13:17:41 +0000
committerGitHub <noreply@github.com>2022-06-24 13:17:41 +0000
commitfa57ab9f13601b274160f6d9cda3a83b032906bb (patch)
tree0871910af6cb18634275b4d62e4c163f5d6606ad
parent991186154cf463dbcc2f6dc2f087c40e6de35c49 (diff)
parent7f5ea92bbbcd92aab3ea0692d12527eb7cac30db (diff)
downloadgcc-fa57ab9f13601b274160f6d9cda3a83b032906bb.zip
gcc-fa57ab9f13601b274160f6d9cda3a83b032906bb.tar.gz
gcc-fa57ab9f13601b274160f6d9cda3a83b032906bb.tar.bz2
Merge #1325
1325: Add const generic disambiguation r=CohenArthur a=CohenArthur Closes #1321 Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
-rw-r--r--gcc/rust/ast/rust-ast-full-test.cc38
-rw-r--r--gcc/rust/ast/rust-path.h6
-rw-r--r--gcc/rust/parse/rust-parse-impl.h8
3 files changed, 36 insertions, 16 deletions
diff --git a/gcc/rust/ast/rust-ast-full-test.cc b/gcc/rust/ast/rust-ast-full-test.cc
index 7f66ee4..0d4d36b 100644
--- a/gcc/rust/ast/rust-ast-full-test.cc
+++ b/gcc/rust/ast/rust-ast-full-test.cc
@@ -4096,10 +4096,10 @@ DelimTokenTree::parse_to_meta_item () const
/* assume top-level delim token tree in attribute - convert all nested ones
* to token stream */
- std::vector<std::unique_ptr<Token> > token_stream = to_token_stream ();
+ std::vector<std::unique_ptr<Token>> token_stream = to_token_stream ();
AttributeParser parser (std::move (token_stream));
- std::vector<std::unique_ptr<MetaItemInner> > meta_items (
+ std::vector<std::unique_ptr<MetaItemInner>> meta_items (
parser.parse_meta_item_seq ());
return new AttrInputMetaItemContainer (std::move (meta_items));
@@ -4282,7 +4282,7 @@ AttributeParser::parse_path_meta_item ()
switch (peek_token ()->get_id ())
{
case LEFT_PAREN: {
- std::vector<std::unique_ptr<MetaItemInner> > meta_items
+ std::vector<std::unique_ptr<MetaItemInner>> meta_items
= parse_meta_item_seq ();
return std::unique_ptr<MetaItemSeq> (
@@ -4320,11 +4320,11 @@ AttributeParser::parse_path_meta_item ()
/* Parses a parenthesised sequence of meta item inners. Parentheses are
* required here. */
-std::vector<std::unique_ptr<MetaItemInner> >
+std::vector<std::unique_ptr<MetaItemInner>>
AttributeParser::parse_meta_item_seq ()
{
int vec_length = token_stream.size ();
- std::vector<std::unique_ptr<MetaItemInner> > meta_items;
+ std::vector<std::unique_ptr<MetaItemInner>> meta_items;
if (peek_token ()->get_id () != LEFT_PAREN)
{
@@ -4364,13 +4364,13 @@ AttributeParser::parse_meta_item_seq ()
/* Collects any nested token trees into a flat token stream, suitable for
* parsing. */
-std::vector<std::unique_ptr<Token> >
+std::vector<std::unique_ptr<Token>>
DelimTokenTree::to_token_stream () const
{
- std::vector<std::unique_ptr<Token> > tokens;
+ std::vector<std::unique_ptr<Token>> tokens;
for (const auto &tree : token_trees)
{
- std::vector<std::unique_ptr<Token> > stream = tree->to_token_stream ();
+ std::vector<std::unique_ptr<Token>> stream = tree->to_token_stream ();
tokens.insert (tokens.end (), std::make_move_iterator (stream.begin ()),
std::make_move_iterator (stream.end ()));
@@ -4711,12 +4711,12 @@ MetaItemPathLit::check_cfg_predicate (const Session &session) const
lit.as_string ());
}
-std::vector<std::unique_ptr<Token> >
+std::vector<std::unique_ptr<Token>>
Token::to_token_stream () const
{
/* initialisation list doesn't work as it needs copy constructor, so have to
* do this */
- std::vector<std::unique_ptr<Token> > dummy_vector;
+ std::vector<std::unique_ptr<Token>> dummy_vector;
dummy_vector.reserve (1);
dummy_vector.push_back (std::unique_ptr<Token> (clone_token_impl ()));
return dummy_vector;
@@ -4744,7 +4744,7 @@ MetaItemPath::to_attribute () const
Attribute
MetaItemSeq::to_attribute () const
{
- std::vector<std::unique_ptr<MetaItemInner> > new_seq;
+ std::vector<std::unique_ptr<MetaItemInner>> new_seq;
new_seq.reserve (seq.size ());
for (const auto &e : seq)
new_seq.push_back (e->clone_meta_item_inner ());
@@ -4768,7 +4768,7 @@ MetaListPaths::to_attribute () const
* no longer known). If conversions back are required, might have to do a
* "check all are paths" pass or something. */
- std::vector<std::unique_ptr<MetaItemInner> > new_seq;
+ std::vector<std::unique_ptr<MetaItemInner>> new_seq;
new_seq.reserve (paths.size ());
for (const auto &e : paths)
new_seq.push_back (std::unique_ptr<MetaItemPath> (new MetaItemPath (e)));
@@ -4782,7 +4782,7 @@ MetaListPaths::to_attribute () const
Attribute
MetaListNameValueStr::to_attribute () const
{
- std::vector<std::unique_ptr<MetaItemInner> > new_seq;
+ std::vector<std::unique_ptr<MetaItemInner>> new_seq;
new_seq.reserve (strs.size ());
for (const auto &e : strs)
new_seq.push_back (
@@ -5792,5 +5792,17 @@ MetaWord::accept_vis (ASTVisitor &vis)
{
vis.visit (*this);
}
+
+ConstGenericArg
+ConstGenericArg::disambiguate_to_const () const
+{
+ rust_assert (get_kind () == Kind::Ambiguous);
+
+ // FIXME: is it fine to have no outer attributes?
+ return ConstGenericArg (std::unique_ptr<Expr> (
+ new IdentifierExpr (path, {}, locus)),
+ locus);
+}
+
} // namespace AST
} // namespace Rust
diff --git a/gcc/rust/ast/rust-path.h b/gcc/rust/ast/rust-path.h
index 6e2b020..d2d925a 100644
--- a/gcc/rust/ast/rust-path.h
+++ b/gcc/rust/ast/rust-path.h
@@ -208,6 +208,12 @@ public:
return "";
}
+ /**
+ * Disambiguate an amibguous const generic argument or generic type argument
+ * to a const generic argument, unequivocally
+ */
+ ConstGenericArg disambiguate_to_const () const;
+
private:
ConstGenericArg (std::unique_ptr<AST::Expr> expression, Identifier path,
Kind kind, Location locus)
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 708140a..a36107b 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -2892,9 +2892,11 @@ Parser<ManagedTokenSource>::parse_generic_param (EndTokenPred is_end_token)
"%<identifier%> or %<literal%>, got %qs",
token_id_to_str (tok->get_id ()));
- // TODO: At this point, we *know* that we are parsing a const
- // expression. We should figure out how to disambiguate the default
- // expr in the case of `const N: usize = M`
+ // At this point, we *know* that we are parsing a const
+ // expression
+ if (default_expr.get_kind ()
+ == AST::ConstGenericArg::Kind::Ambiguous)
+ default_expr = default_expr.disambiguate_to_const ();
}
param = std::unique_ptr<AST::ConstGenericParam> (