From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id E52343858C62; Tue, 28 Feb 2023 22:36:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E52343858C62 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677623778; bh=i5o2eD8wiLZBYzx4DI3qejPMKLxnPu5ou4K/XD3nfvQ=; h=From:To:Subject:Date:From; b=GCUu9EduR9xzH0zL5M+BdqxDwmO1PM1b0oKsZzChHbqnyVKCtNNLqjThdVOxIG9fd a+Qv1L5Ju3Jm3/cwT1mtP84ivFcKlgDVXp1x+Y1EVWUEvDSMXVY6bCIUxb3QZXWdLP EEHONxcX/WWtQ5GEnH/o1BAeuHvI9NxgEBbINUQY= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/rust/master] ast: Add ExternalTypeItem node X-Act-Checkin: gcc X-Git-Author: Arthur Cohen X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: cda1d7852d6a82df6eea53deb73aab3d459b4443 X-Git-Newrev: 782d6d062dddb6821ff492b316c7cb02eb6aff52 Message-Id: <20230228223618.E52343858C62@sourceware.org> Date: Tue, 28 Feb 2023 22:36:18 +0000 (GMT) List-Id: https://gcc.gnu.org/g:782d6d062dddb6821ff492b316c7cb02eb6aff52 commit 782d6d062dddb6821ff492b316c7cb02eb6aff52 Author: Arthur Cohen Date: Thu Feb 23 16:50:39 2023 +0100 ast: Add ExternalTypeItem node gcc/rust/ChangeLog: * ast/rust-item.h (class ExternalTypeItem): New class. * ast/rust-ast.cc (ExternalTypeItem::as_string): New function. (ExternalTypeItem::accept_vis): Likewise. * ast/rust-ast-full-decls.h (class ExternalTypeItem): Declare class. * ast/rust-ast-dump.cc (Dump::visit): Add base visitor for ExternalTypeItem. * ast/rust-ast-dump.h: Likewise. * ast/rust-ast-visitor.h: Likewise. * checks/errors/rust-feature-gate.h: Likewise. * expand/rust-attribute-visitor.cc (AttrVisitor::visit): Likewise. * expand/rust-attribute-visitor.h: Likewise. * hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Likewise. * hir/rust-ast-lower-base.h: Likewise. * resolve/rust-ast-resolve-base.cc (ResolverBase::visit): Likewise. * resolve/rust-ast-resolve-base.h: Likewise. * resolve/rust-early-name-resolver.cc (EarlyNameResolver::visit): Likewise. * resolve/rust-early-name-resolver.h: Likewise. * util/rust-attributes.cc (AttributeChecker::visit): Likewise. * util/rust-attributes.h: Likewise. Diff: --- gcc/rust/ast/rust-ast-dump.cc | 4 ++ gcc/rust/ast/rust-ast-dump.h | 1 + gcc/rust/ast/rust-ast-full-decls.h | 1 + gcc/rust/ast/rust-ast-visitor.h | 1 + gcc/rust/ast/rust-ast.cc | 16 ++++++ gcc/rust/ast/rust-item.h | 75 ++++++++++++++++++++++++++++ gcc/rust/checks/errors/rust-feature-gate.h | 1 + gcc/rust/expand/rust-attribute-visitor.cc | 8 +++ gcc/rust/expand/rust-attribute-visitor.h | 1 + gcc/rust/hir/rust-ast-lower-base.cc | 3 ++ gcc/rust/hir/rust-ast-lower-base.h | 1 + gcc/rust/resolve/rust-ast-resolve-base.cc | 4 ++ gcc/rust/resolve/rust-ast-resolve-base.h | 1 + gcc/rust/resolve/rust-early-name-resolver.cc | 6 +++ gcc/rust/resolve/rust-early-name-resolver.h | 1 + gcc/rust/util/rust-attributes.cc | 4 ++ gcc/rust/util/rust-attributes.h | 1 + 17 files changed, 129 insertions(+) diff --git a/gcc/rust/ast/rust-ast-dump.cc b/gcc/rust/ast/rust-ast-dump.cc index 10fb313c2c7..1fd312a5b94 100644 --- a/gcc/rust/ast/rust-ast-dump.cc +++ b/gcc/rust/ast/rust-ast-dump.cc @@ -1432,6 +1432,10 @@ Dump::visit (TraitImpl &impl) stream << "\n}\n"; } +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 dfe6db0dd96..c0082aa8314 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 64341d32641..0514eecec06 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 1083e834770..d60a68691ac 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 68a7dfdc662..b67a5390f2f 100644 --- a/gcc/rust/ast/rust-ast.cc +++ b/gcc/rust/ast/rust-ast.cc @@ -3406,6 +3406,16 @@ EnumItemDiscriminant::as_string () const return str; } +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 { @@ -5492,6 +5502,12 @@ TraitImpl::accept_vis (ASTVisitor &vis) vis.visit (*this); } +void +ExternalTypeItem::accept_vis (ASTVisitor &vis) +{ + vis.visit (*this); +} + void ExternalStaticItem::accept_vis (ASTVisitor &vis) { diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h index f66a8c54032..4be4ca1666f 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 outer_attrs; + + Visibility visibility; + Identifier item_name; + Location locus; + + bool marked_for_strip; + +public: + ExternalTypeItem (Identifier item_name, Visibility vis, + std::vector 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 &get_outer_attrs () { return outer_attrs; } + const std::vector &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 2bdf4196a37..22c1501cef6 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 3a94699558d..a5aa8f0e6e9 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 2d10735436f..a7ab42e47ec 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 5d7b5d21340..1651b00b05f 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 85343aacdab..60ed3a964d9 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 5b3f4a0ae11..2f82f911922 100644 --- a/gcc/rust/resolve/rust-ast-resolve-base.cc +++ b/gcc/rust/resolve/rust-ast-resolve-base.cc @@ -446,6 +446,10 @@ void 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 aab1324c454..994f61e92b8 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 f5054f964c7..584d430a014 100644 --- a/gcc/rust/resolve/rust-early-name-resolver.cc +++ b/gcc/rust/resolve/rust-early-name-resolver.cc @@ -770,6 +770,12 @@ EarlyNameResolver::visit (AST::TraitImpl &impl) }); } +void +EarlyNameResolver::visit (AST::ExternalTypeItem &item) +{ + // nothing to do? +} + void EarlyNameResolver::visit (AST::ExternalStaticItem &item) { diff --git a/gcc/rust/resolve/rust-early-name-resolver.h b/gcc/rust/resolve/rust-early-name-resolver.h index 84ee518e23b..4f51533131a 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 4f63dd09dac..ccabeb8f345 100644 --- a/gcc/rust/util/rust-attributes.cc +++ b/gcc/rust/util/rust-attributes.cc @@ -621,6 +621,10 @@ void 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 805e3a8f40a..39961bd1535 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);