aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/rust/ast/rust-ast-dump.cc4
-rw-r--r--gcc/rust/ast/rust-ast-dump.h1
-rw-r--r--gcc/rust/ast/rust-ast-full-decls.h1
-rw-r--r--gcc/rust/ast/rust-ast-visitor.h1
-rw-r--r--gcc/rust/ast/rust-ast.cc16
-rw-r--r--gcc/rust/ast/rust-item.h75
-rw-r--r--gcc/rust/checks/errors/rust-feature-gate.h1
-rw-r--r--gcc/rust/expand/rust-attribute-visitor.cc8
-rw-r--r--gcc/rust/expand/rust-attribute-visitor.h1
-rw-r--r--gcc/rust/hir/rust-ast-lower-base.cc3
-rw-r--r--gcc/rust/hir/rust-ast-lower-base.h1
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-base.cc4
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-base.h1
-rw-r--r--gcc/rust/resolve/rust-early-name-resolver.cc6
-rw-r--r--gcc/rust/resolve/rust-early-name-resolver.h1
-rw-r--r--gcc/rust/util/rust-attributes.cc4
-rw-r--r--gcc/rust/util/rust-attributes.h1
17 files changed, 129 insertions, 0 deletions
diff --git a/gcc/rust/ast/rust-ast-dump.cc b/gcc/rust/ast/rust-ast-dump.cc
index a581c02..a5fce67 100644
--- a/gcc/rust/ast/rust-ast-dump.cc
+++ b/gcc/rust/ast/rust-ast-dump.cc
@@ -1433,6 +1433,10 @@ Dump::visit (TraitImpl &impl)
}
void
+Dump::visit (ExternalTypeItem &type)
+{}
+
+void
Dump::visit (ExternalStaticItem &)
{}
diff --git a/gcc/rust/ast/rust-ast-dump.h b/gcc/rust/ast/rust-ast-dump.h
index ea3e6f3..a6adab9 100644
--- a/gcc/rust/ast/rust-ast-dump.h
+++ b/gcc/rust/ast/rust-ast-dump.h
@@ -251,6 +251,7 @@ private:
void visit (Trait &trait);
void visit (InherentImpl &impl);
void visit (TraitImpl &impl);
+ void visit (ExternalTypeItem &item);
void visit (ExternalStaticItem &item);
void visit (ExternalFunctionItem &item);
void visit (ExternBlock &block);
diff --git a/gcc/rust/ast/rust-ast-full-decls.h b/gcc/rust/ast/rust-ast-full-decls.h
index 96a6f22..352c1b9 100644
--- a/gcc/rust/ast/rust-ast-full-decls.h
+++ b/gcc/rust/ast/rust-ast-full-decls.h
@@ -203,6 +203,7 @@ class Impl;
class InherentImpl;
class TraitImpl;
class ExternalItem;
+class ExternalTypeItem;
class ExternalStaticItem;
struct NamedFunctionParam;
class ExternalFunctionItem;
diff --git a/gcc/rust/ast/rust-ast-visitor.h b/gcc/rust/ast/rust-ast-visitor.h
index 9cde911..776e1e2 100644
--- a/gcc/rust/ast/rust-ast-visitor.h
+++ b/gcc/rust/ast/rust-ast-visitor.h
@@ -161,6 +161,7 @@ public:
virtual void visit (InherentImpl &impl) = 0;
virtual void visit (TraitImpl &impl) = 0;
// virtual void visit(ExternalItem& item) = 0;
+ virtual void visit (ExternalTypeItem &type) = 0;
virtual void visit (ExternalStaticItem &item) = 0;
virtual void visit (ExternalFunctionItem &item) = 0;
virtual void visit (ExternBlock &block) = 0;
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index 6692505..13d31cf 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -3407,6 +3407,16 @@ EnumItemDiscriminant::as_string () const
}
std::string
+ExternalTypeItem::as_string () const
+{
+ auto str = append_attributes (outer_attrs, OUTER);
+
+ str += "type " + item_name + ";";
+
+ return str;
+}
+
+std::string
ExternalStaticItem::as_string () const
{
// outer attributes
@@ -5493,6 +5503,12 @@ TraitImpl::accept_vis (ASTVisitor &vis)
}
void
+ExternalTypeItem::accept_vis (ASTVisitor &vis)
+{
+ vis.visit (*this);
+}
+
+void
ExternalStaticItem::accept_vis (ASTVisitor &vis)
{
vis.visit (*this);
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index 4385323..2abf781 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -3907,6 +3907,81 @@ protected:
};
#endif
+// A foreign type defined outside the current crate.
+// https://rust-lang.github.io/rfcs/1861-extern-types.html
+class ExternalTypeItem : public ExternalItem
+{
+ std::vector<Attribute> outer_attrs;
+
+ Visibility visibility;
+ Identifier item_name;
+ Location locus;
+
+ bool marked_for_strip;
+
+public:
+ ExternalTypeItem (Identifier item_name, Visibility vis,
+ std::vector<Attribute> outer_attrs, Location locus)
+ : ExternalItem (), outer_attrs (std::move (outer_attrs)), visibility (vis),
+ item_name (std::move (item_name)), locus (locus), marked_for_strip (false)
+ {}
+
+ ExternalTypeItem (ExternalTypeItem const &other)
+ : outer_attrs (other.outer_attrs), visibility (other.visibility),
+ item_name (other.item_name), locus (other.locus),
+ marked_for_strip (other.marked_for_strip)
+ {
+ node_id = other.node_id;
+ }
+
+ ExternalTypeItem &operator= (ExternalTypeItem const &other)
+ {
+ node_id = other.node_id;
+ outer_attrs = other.outer_attrs;
+ visibility = other.visibility;
+ item_name = other.item_name;
+ locus = other.locus;
+ marked_for_strip = other.marked_for_strip;
+
+ return *this;
+ }
+
+ // move constructors
+ ExternalTypeItem (ExternalTypeItem &&other) = default;
+ ExternalTypeItem &operator= (ExternalTypeItem &&other) = default;
+
+ std::string as_string () const override;
+
+ void accept_vis (ASTVisitor &vis) override;
+
+ // Returns whether item has outer attributes.
+ bool has_outer_attrs () const { return !outer_attrs.empty (); }
+
+ // Returns whether item has non-default visibility.
+ bool has_visibility () const { return !visibility.is_error (); }
+
+ Location get_locus () const { return locus; }
+
+ void mark_for_strip () override { marked_for_strip = true; };
+ bool is_marked_for_strip () const override { return marked_for_strip; };
+
+ // TODO: this mutable getter seems really dodgy. Think up better way.
+ std::vector<Attribute> &get_outer_attrs () { return outer_attrs; }
+ const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
+
+ Identifier get_identifier () const { return item_name; }
+
+ const Visibility &get_visibility () const { return visibility; }
+
+protected:
+ /* Use covariance to implement clone function as returning this object
+ * rather than base */
+ ExternalTypeItem *clone_external_item_impl () const override
+ {
+ return new ExternalTypeItem (*this);
+ }
+};
+
// A static item used in an extern block
class ExternalStaticItem : public ExternalItem
{
diff --git a/gcc/rust/checks/errors/rust-feature-gate.h b/gcc/rust/checks/errors/rust-feature-gate.h
index 5200155..0adc4c0 100644
--- a/gcc/rust/checks/errors/rust-feature-gate.h
+++ b/gcc/rust/checks/errors/rust-feature-gate.h
@@ -133,6 +133,7 @@ public:
void visit (AST::Trait &trait) override {}
void visit (AST::InherentImpl &impl) override;
void visit (AST::TraitImpl &impl) override;
+ void visit (AST::ExternalTypeItem &item) override {}
void visit (AST::ExternalStaticItem &item) override {}
void visit (AST::ExternalFunctionItem &item) override {}
void visit (AST::ExternBlock &block) override;
diff --git a/gcc/rust/expand/rust-attribute-visitor.cc b/gcc/rust/expand/rust-attribute-visitor.cc
index cbcfe30..e628927 100644
--- a/gcc/rust/expand/rust-attribute-visitor.cc
+++ b/gcc/rust/expand/rust-attribute-visitor.cc
@@ -2734,6 +2734,13 @@ AttrVisitor::visit (AST::TraitImpl &impl)
expand_macro_children (MacroExpander::TRAIT_IMPL, impl.get_impl_items (),
extractor);
}
+
+void
+AttrVisitor::visit (AST::ExternalTypeItem &item)
+{
+ // TODO: ARTHUR
+}
+
void
AttrVisitor::visit (AST::ExternalStaticItem &item)
{
@@ -2757,6 +2764,7 @@ AttrVisitor::visit (AST::ExternalStaticItem &item)
expander.pop_context ();
}
+
void
AttrVisitor::visit (AST::ExternalFunctionItem &item)
{
diff --git a/gcc/rust/expand/rust-attribute-visitor.h b/gcc/rust/expand/rust-attribute-visitor.h
index 1d36d5f..1b8546e 100644
--- a/gcc/rust/expand/rust-attribute-visitor.h
+++ b/gcc/rust/expand/rust-attribute-visitor.h
@@ -223,6 +223,7 @@ public:
void visit (AST::Trait &trait) override;
void visit (AST::InherentImpl &impl) override;
void visit (AST::TraitImpl &impl) override;
+ void visit (AST::ExternalTypeItem &item) override;
void visit (AST::ExternalStaticItem &item) override;
void visit (AST::ExternalFunctionItem &item) override;
void visit (AST::ExternBlock &block) override;
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc
index a6012f9..7b0c48f 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -352,6 +352,9 @@ ASTLoweringBase::visit (AST::TraitImpl &)
{}
// void ASTLoweringBase::visit(ExternalItemitem) {}
void
+ASTLoweringBase::visit (AST::ExternalTypeItem &)
+{}
+void
ASTLoweringBase::visit (AST::ExternalStaticItem &)
{}
void
diff --git a/gcc/rust/hir/rust-ast-lower-base.h b/gcc/rust/hir/rust-ast-lower-base.h
index 79985d9..95d75d1 100644
--- a/gcc/rust/hir/rust-ast-lower-base.h
+++ b/gcc/rust/hir/rust-ast-lower-base.h
@@ -189,6 +189,7 @@ public:
virtual void visit (AST::InherentImpl &impl);
virtual void visit (AST::TraitImpl &impl);
// virtual void visit(ExternalItem& item);
+ virtual void visit (AST::ExternalTypeItem &item);
virtual void visit (AST::ExternalStaticItem &item);
virtual void visit (AST::ExternalFunctionItem &item);
virtual void visit (AST::ExternBlock &block);
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.cc b/gcc/rust/resolve/rust-ast-resolve-base.cc
index 1eb6644..7bc9802 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-base.cc
@@ -447,6 +447,10 @@ ResolverBase::visit (AST::TraitImpl &)
{}
void
+ResolverBase::visit (AST::ExternalTypeItem &)
+{}
+
+void
ResolverBase::visit (AST::ExternalStaticItem &)
{}
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.h b/gcc/rust/resolve/rust-ast-resolve-base.h
index 9132f43..f4de7c6 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.h
+++ b/gcc/rust/resolve/rust-ast-resolve-base.h
@@ -138,6 +138,7 @@ public:
void visit (AST::InherentImpl &);
void visit (AST::TraitImpl &);
+ void visit (AST::ExternalTypeItem &);
void visit (AST::ExternalStaticItem &);
void visit (AST::ExternalFunctionItem &);
void visit (AST::ExternBlock &);
diff --git a/gcc/rust/resolve/rust-early-name-resolver.cc b/gcc/rust/resolve/rust-early-name-resolver.cc
index fd3e81a..4078586 100644
--- a/gcc/rust/resolve/rust-early-name-resolver.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver.cc
@@ -771,6 +771,12 @@ EarlyNameResolver::visit (AST::TraitImpl &impl)
}
void
+EarlyNameResolver::visit (AST::ExternalTypeItem &item)
+{
+ // nothing to do?
+}
+
+void
EarlyNameResolver::visit (AST::ExternalStaticItem &item)
{
item.get_type ()->accept_vis (*this);
diff --git a/gcc/rust/resolve/rust-early-name-resolver.h b/gcc/rust/resolve/rust-early-name-resolver.h
index 6d97309..7390cb1 100644
--- a/gcc/rust/resolve/rust-early-name-resolver.h
+++ b/gcc/rust/resolve/rust-early-name-resolver.h
@@ -215,6 +215,7 @@ private:
virtual void visit (AST::Trait &trait);
virtual void visit (AST::InherentImpl &impl);
virtual void visit (AST::TraitImpl &impl);
+ virtual void visit (AST::ExternalTypeItem &item);
virtual void visit (AST::ExternalStaticItem &item);
virtual void visit (AST::ExternalFunctionItem &item);
virtual void visit (AST::ExternBlock &block);
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc
index d1c86dd..4ef1ea0 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -622,6 +622,10 @@ AttributeChecker::visit (AST::TraitImpl &)
{}
void
+AttributeChecker::visit (AST::ExternalTypeItem &)
+{}
+
+void
AttributeChecker::visit (AST::ExternalStaticItem &)
{}
diff --git a/gcc/rust/util/rust-attributes.h b/gcc/rust/util/rust-attributes.h
index a33b677..cc01afc 100644
--- a/gcc/rust/util/rust-attributes.h
+++ b/gcc/rust/util/rust-attributes.h
@@ -200,6 +200,7 @@ private:
void visit (AST::Trait &trait);
void visit (AST::InherentImpl &impl);
void visit (AST::TraitImpl &impl);
+ void visit (AST::ExternalTypeItem &item);
void visit (AST::ExternalStaticItem &item);
void visit (AST::ExternalFunctionItem &item);
void visit (AST::ExternBlock &block);