1  // Copyright (C) 2020-2023 Free Software Foundation, Inc.
       2  
       3  // This file is part of GCC.
       4  
       5  // GCC is free software; you can redistribute it and/or modify it under
       6  // the terms of the GNU General Public License as published by the Free
       7  // Software Foundation; either version 3, or (at your option) any later
       8  // version.
       9  
      10  // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      11  // WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12  // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      13  // for more details.
      14  
      15  // You should have received a copy of the GNU General Public License
      16  // along with GCC; see the file COPYING3.  If not see
      17  // <http://www.gnu.org/licenses/>.
      18  
      19  #ifndef RUST_FEATURE_GATE_H
      20  #define RUST_FEATURE_GATE_H
      21  
      22  #include "rust-ast-visitor.h"
      23  #include "rust-ast-full.h"
      24  #include "rust-feature.h"
      25  
      26  namespace Rust {
      27  
      28  struct Feature;
      29  
      30  class FeatureGate : public AST::ASTVisitor
      31  {
      32  public:
      33    FeatureGate () {}
      34  
      35    void check (AST::Crate &crate);
      36  
      37    void visit (AST::Token &tok) override {}
      38    void visit (AST::DelimTokenTree &delim_tok_tree) override {}
      39    void visit (AST::AttrInputMetaItemContainer &input) override {}
      40    void visit (AST::IdentifierExpr &ident_expr) override {}
      41    void visit (AST::Lifetime &lifetime) override {}
      42    void visit (AST::LifetimeParam &lifetime_param) override {}
      43    void visit (AST::ConstGenericParam &const_param) override {}
      44    void visit (AST::PathInExpression &path) override {}
      45    void visit (AST::TypePathSegment &segment) override {}
      46    void visit (AST::TypePathSegmentGeneric &segment) override {}
      47    void visit (AST::TypePathSegmentFunction &segment) override {}
      48    void visit (AST::TypePath &path) override {}
      49    void visit (AST::QualifiedPathInExpression &path) override {}
      50    void visit (AST::QualifiedPathInType &path) override {}
      51    void visit (AST::LiteralExpr &expr) override {}
      52    void visit (AST::AttrInputLiteral &attr_input) override {}
      53    void visit (AST::MetaItemLitExpr &meta_item) override {}
      54    void visit (AST::MetaItemPathLit &meta_item) override {}
      55    void visit (AST::BorrowExpr &expr) override {}
      56    void visit (AST::DereferenceExpr &expr) override {}
      57    void visit (AST::ErrorPropagationExpr &expr) override {}
      58    void visit (AST::NegationExpr &expr) override {}
      59    void visit (AST::ArithmeticOrLogicalExpr &expr) override {}
      60    void visit (AST::ComparisonExpr &expr) override {}
      61    void visit (AST::LazyBooleanExpr &expr) override {}
      62    void visit (AST::TypeCastExpr &expr) override {}
      63    void visit (AST::AssignmentExpr &expr) override {}
      64    void visit (AST::CompoundAssignmentExpr &expr) override {}
      65    void visit (AST::GroupedExpr &expr) override {}
      66    void visit (AST::ArrayElemsValues &elems) override {}
      67    void visit (AST::ArrayElemsCopied &elems) override {}
      68    void visit (AST::ArrayExpr &expr) override {}
      69    void visit (AST::ArrayIndexExpr &expr) override {}
      70    void visit (AST::TupleExpr &expr) override {}
      71    void visit (AST::TupleIndexExpr &expr) override {}
      72    void visit (AST::StructExprStruct &expr) override {}
      73    void visit (AST::StructExprFieldIdentifier &field) override {}
      74    void visit (AST::StructExprFieldIdentifierValue &field) override {}
      75    void visit (AST::StructExprFieldIndexValue &field) override {}
      76    void visit (AST::StructExprStructFields &expr) override {}
      77    void visit (AST::StructExprStructBase &expr) override {}
      78    void visit (AST::CallExpr &expr) override {}
      79    void visit (AST::MethodCallExpr &expr) override {}
      80    void visit (AST::FieldAccessExpr &expr) override {}
      81    void visit (AST::ClosureExprInner &expr) override {}
      82    void visit (AST::BlockExpr &expr) override {}
      83    void visit (AST::ClosureExprInnerTyped &expr) override {}
      84    void visit (AST::ContinueExpr &expr) override {}
      85    void visit (AST::BreakExpr &expr) override {}
      86    void visit (AST::RangeFromToExpr &expr) override {}
      87    void visit (AST::RangeFromExpr &expr) override {}
      88    void visit (AST::RangeToExpr &expr) override {}
      89    void visit (AST::RangeFullExpr &expr) override {}
      90    void visit (AST::RangeFromToInclExpr &expr) override {}
      91    void visit (AST::RangeToInclExpr &expr) override {}
      92    void visit (AST::ReturnExpr &expr) override {}
      93    void visit (AST::UnsafeBlockExpr &expr) override {}
      94    void visit (AST::LoopExpr &expr) override {}
      95    void visit (AST::WhileLoopExpr &expr) override {}
      96    void visit (AST::WhileLetLoopExpr &expr) override {}
      97    void visit (AST::ForLoopExpr &expr) override {}
      98    void visit (AST::IfExpr &expr) override {}
      99    void visit (AST::IfExprConseqElse &expr) override {}
     100    void visit (AST::IfExprConseqIf &expr) override {}
     101    void visit (AST::IfExprConseqIfLet &expr) override {}
     102    void visit (AST::IfLetExpr &expr) override {}
     103    void visit (AST::IfLetExprConseqElse &expr) override {}
     104    void visit (AST::IfLetExprConseqIf &expr) override {}
     105    void visit (AST::IfLetExprConseqIfLet &expr) override {}
     106    void visit (AST::MatchExpr &expr) override {}
     107    void visit (AST::AwaitExpr &expr) override {}
     108    void visit (AST::AsyncBlockExpr &expr) override {}
     109    void visit (AST::TypeParam ¶m) override {}
     110    void visit (AST::LifetimeWhereClauseItem &item) override {}
     111    void visit (AST::TypeBoundWhereClauseItem &item) override {}
     112    void visit (AST::Method &method) override {}
     113    void visit (AST::Module &module) override {}
     114    void visit (AST::ExternCrate &crate) override {}
     115    void visit (AST::UseTreeGlob &use_tree) override {}
     116    void visit (AST::UseTreeList &use_tree) override {}
     117    void visit (AST::UseTreeRebind &use_tree) override {}
     118    void visit (AST::UseDeclaration &use_decl) override {}
     119    void visit (AST::Function &function) override {}
     120    void visit (AST::TypeAlias &type_alias) override {}
     121    void visit (AST::StructStruct &struct_item) override {}
     122    void visit (AST::TupleStruct &tuple_struct) override {}
     123    void visit (AST::EnumItem &item) override {}
     124    void visit (AST::EnumItemTuple &item) override {}
     125    void visit (AST::EnumItemStruct &item) override {}
     126    void visit (AST::EnumItemDiscriminant &item) override {}
     127    void visit (AST::Enum &enum_item) override {}
     128    void visit (AST::Union &union_item) override {}
     129    void visit (AST::ConstantItem &const_item) override {}
     130    void visit (AST::StaticItem &static_item) override {}
     131    void visit (AST::TraitItemFunc &item) override {}
     132    void visit (AST::TraitItemMethod &item) override {}
     133    void visit (AST::TraitItemConst &item) override {}
     134    void visit (AST::TraitItemType &item) override {}
     135    void visit (AST::Trait &trait) override {}
     136    void visit (AST::InherentImpl &impl) override {}
     137    void visit (AST::TraitImpl &impl) override {}
     138    void visit (AST::ExternalStaticItem &item) override {}
     139    void visit (AST::ExternalFunctionItem &item) override {}
     140    void visit (AST::ExternBlock &block) override;
     141    void visit (AST::MacroMatchFragment &match) override {}
     142    void visit (AST::MacroMatchRepetition &match) override {}
     143    void visit (AST::MacroMatcher &matcher) override {}
     144    void visit (AST::MacroRulesDefinition &rules_def) override {}
     145    void visit (AST::MacroInvocation ¯o_invoc) override {}
     146    void visit (AST::MetaItemPath &meta_item) override {}
     147    void visit (AST::MetaItemSeq &meta_item) override {}
     148    void visit (AST::MetaWord &meta_item) override {}
     149    void visit (AST::MetaNameValueStr &meta_item) override {}
     150    void visit (AST::MetaListPaths &meta_item) override {}
     151    void visit (AST::MetaListNameValueStr &meta_item) override {}
     152    void visit (AST::LiteralPattern &pattern) override {}
     153    void visit (AST::IdentifierPattern &pattern) override {}
     154    void visit (AST::WildcardPattern &pattern) override {}
     155    void visit (AST::RangePatternBoundLiteral &bound) override {}
     156    void visit (AST::RangePatternBoundPath &bound) override {}
     157    void visit (AST::RangePatternBoundQualPath &bound) override {}
     158    void visit (AST::RangePattern &pattern) override {}
     159    void visit (AST::ReferencePattern &pattern) override {}
     160    void visit (AST::StructPatternFieldTuplePat &field) override {}
     161    void visit (AST::StructPatternFieldIdentPat &field) override {}
     162    void visit (AST::StructPatternFieldIdent &field) override {}
     163    void visit (AST::StructPattern &pattern) override {}
     164    void visit (AST::TupleStructItemsNoRange &tuple_items) override {}
     165    void visit (AST::TupleStructItemsRange &tuple_items) override {}
     166    void visit (AST::TupleStructPattern &pattern) override {}
     167    void visit (AST::TuplePatternItemsMultiple &tuple_items) override {}
     168    void visit (AST::TuplePatternItemsRanged &tuple_items) override {}
     169    void visit (AST::TuplePattern &pattern) override {}
     170    void visit (AST::GroupedPattern &pattern) override {}
     171    void visit (AST::SlicePattern &pattern) override {}
     172    void visit (AST::AltPattern &pattern) override {}
     173    void visit (AST::EmptyStmt &stmt) override {}
     174    void visit (AST::LetStmt &stmt) override {}
     175    void visit (AST::ExprStmtWithoutBlock &stmt) override {}
     176    void visit (AST::ExprStmtWithBlock &stmt) override {}
     177    void visit (AST::TraitBound &bound) override {}
     178    void visit (AST::ImplTraitType &type) override {}
     179    void visit (AST::TraitObjectType &type) override {}
     180    void visit (AST::ParenthesisedType &type) override {}
     181    void visit (AST::ImplTraitTypeOneBound &type) override {}
     182    void visit (AST::TraitObjectTypeOneBound &type) override {}
     183    void visit (AST::TupleType &type) override {}
     184    void visit (AST::NeverType &type) override {}
     185    void visit (AST::RawPointerType &type) override {}
     186    void visit (AST::ReferenceType &type) override {}
     187    void visit (AST::ArrayType &type) override {}
     188    void visit (AST::SliceType &type) override {}
     189    void visit (AST::InferredType &type) override {}
     190    void visit (AST::BareFunctionType &type) override {}
     191  
     192  private:
     193    void gate (Feature::Name name, Location loc, const std::string &error_msg);
     194    std::set<Feature::Name> valid_features;
     195  };
     196  } // namespace Rust
     197  #endif