1 // Copyright (C) 2020-2023 Free Software Foundation, Inc.
3 // This file is part of GCC.
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
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
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/>.
19 #ifndef RUST_UNSAFE_CHECKER_H
20 #define RUST_UNSAFE_CHECKER_H
22 #include "rust-hir-visitor.h"
23 #include "rust-name-resolver.h"
24 #include "rust-hir-type-check.h"
25 #include "rust-stacked-contexts.h"
29 class UnsafeChecker
: public HIRFullVisitor
34 void go (HIR::Crate
&crate
);
38 * Check if a mutable static or external static item is used outside of an
41 void check_use_of_static (HirId node_id
, Location locus
);
44 * Check if a call to an unsafe or external function is outside of an unsafe
47 void check_function_call (HirId node_id
, Location locus
);
49 StackedContexts
<HirId
> unsafe_context
;
51 Resolver::TypeCheckContext
&context
;
52 Resolver::Resolver
&resolver
;
53 Analysis::Mappings
&mappings
;
55 virtual void visit (Lifetime
&lifetime
) override
;
56 virtual void visit (LifetimeParam
&lifetime_param
) override
;
57 virtual void visit (PathInExpression
&path
) override
;
58 virtual void visit (TypePathSegment
&segment
) override
;
59 virtual void visit (TypePathSegmentGeneric
&segment
) override
;
60 virtual void visit (TypePathSegmentFunction
&segment
) override
;
61 virtual void visit (TypePath
&path
) override
;
62 virtual void visit (QualifiedPathInExpression
&path
) override
;
63 virtual void visit (QualifiedPathInType
&path
) override
;
64 virtual void visit (LiteralExpr
&expr
) override
;
65 virtual void visit (BorrowExpr
&expr
) override
;
66 virtual void visit (DereferenceExpr
&expr
) override
;
67 virtual void visit (ErrorPropagationExpr
&expr
) override
;
68 virtual void visit (NegationExpr
&expr
) override
;
69 virtual void visit (ArithmeticOrLogicalExpr
&expr
) override
;
70 virtual void visit (ComparisonExpr
&expr
) override
;
71 virtual void visit (LazyBooleanExpr
&expr
) override
;
72 virtual void visit (TypeCastExpr
&expr
) override
;
73 virtual void visit (AssignmentExpr
&expr
) override
;
74 virtual void visit (CompoundAssignmentExpr
&expr
) override
;
75 virtual void visit (GroupedExpr
&expr
) override
;
76 virtual void visit (ArrayElemsValues
&elems
) override
;
77 virtual void visit (ArrayElemsCopied
&elems
) override
;
78 virtual void visit (ArrayExpr
&expr
) override
;
79 virtual void visit (ArrayIndexExpr
&expr
) override
;
80 virtual void visit (TupleExpr
&expr
) override
;
81 virtual void visit (TupleIndexExpr
&expr
) override
;
82 virtual void visit (StructExprStruct
&expr
) override
;
83 virtual void visit (StructExprFieldIdentifier
&field
) override
;
84 virtual void visit (StructExprFieldIdentifierValue
&field
) override
;
85 virtual void visit (StructExprFieldIndexValue
&field
) override
;
86 virtual void visit (StructExprStructFields
&expr
) override
;
87 virtual void visit (StructExprStructBase
&expr
) override
;
88 virtual void visit (CallExpr
&expr
) override
;
89 virtual void visit (MethodCallExpr
&expr
) override
;
90 virtual void visit (FieldAccessExpr
&expr
) override
;
91 virtual void visit (ClosureExprInner
&expr
) override
;
92 virtual void visit (BlockExpr
&expr
) override
;
93 virtual void visit (ClosureExprInnerTyped
&expr
) override
;
94 virtual void visit (ContinueExpr
&expr
) override
;
95 virtual void visit (BreakExpr
&expr
) override
;
96 virtual void visit (RangeFromToExpr
&expr
) override
;
97 virtual void visit (RangeFromExpr
&expr
) override
;
98 virtual void visit (RangeToExpr
&expr
) override
;
99 virtual void visit (RangeFullExpr
&expr
) override
;
100 virtual void visit (RangeFromToInclExpr
&expr
) override
;
101 virtual void visit (RangeToInclExpr
&expr
) override
;
102 virtual void visit (ReturnExpr
&expr
) override
;
103 virtual void visit (UnsafeBlockExpr
&expr
) override
;
104 virtual void visit (LoopExpr
&expr
) override
;
105 virtual void visit (WhileLoopExpr
&expr
) override
;
106 virtual void visit (WhileLetLoopExpr
&expr
) override
;
107 virtual void visit (ForLoopExpr
&expr
) override
;
108 virtual void visit (IfExpr
&expr
) override
;
109 virtual void visit (IfExprConseqElse
&expr
) override
;
110 virtual void visit (IfExprConseqIf
&expr
) override
;
111 virtual void visit (IfExprConseqIfLet
&expr
) override
;
112 virtual void visit (IfLetExpr
&expr
) override
;
113 virtual void visit (IfLetExprConseqElse
&expr
) override
;
114 virtual void visit (IfLetExprConseqIf
&expr
) override
;
115 virtual void visit (IfLetExprConseqIfLet
&expr
) override
;
116 virtual void visit (MatchExpr
&expr
) override
;
117 virtual void visit (AwaitExpr
&expr
) override
;
118 virtual void visit (AsyncBlockExpr
&expr
) override
;
119 virtual void visit (TypeParam
¶m
) override
;
120 virtual void visit (ConstGenericParam
¶m
) override
;
121 virtual void visit (LifetimeWhereClauseItem
&item
) override
;
122 virtual void visit (TypeBoundWhereClauseItem
&item
) override
;
123 virtual void visit (Module
&module
) override
;
124 virtual void visit (ExternCrate
&crate
) override
;
125 virtual void visit (UseTreeGlob
&use_tree
) override
;
126 virtual void visit (UseTreeList
&use_tree
) override
;
127 virtual void visit (UseTreeRebind
&use_tree
) override
;
128 virtual void visit (UseDeclaration
&use_decl
) override
;
129 virtual void visit (Function
&function
) override
;
130 virtual void visit (TypeAlias
&type_alias
) override
;
131 virtual void visit (StructStruct
&struct_item
) override
;
132 virtual void visit (TupleStruct
&tuple_struct
) override
;
133 virtual void visit (EnumItem
&item
) override
;
134 virtual void visit (EnumItemTuple
&item
) override
;
135 virtual void visit (EnumItemStruct
&item
) override
;
136 virtual void visit (EnumItemDiscriminant
&item
) override
;
137 virtual void visit (Enum
&enum_item
) override
;
138 virtual void visit (Union
&union_item
) override
;
139 virtual void visit (ConstantItem
&const_item
) override
;
140 virtual void visit (StaticItem
&static_item
) override
;
141 virtual void visit (TraitItemFunc
&item
) override
;
142 virtual void visit (TraitItemConst
&item
) override
;
143 virtual void visit (TraitItemType
&item
) override
;
144 virtual void visit (Trait
&trait
) override
;
145 virtual void visit (ImplBlock
&impl
) override
;
146 virtual void visit (ExternalStaticItem
&item
) override
;
147 virtual void visit (ExternalFunctionItem
&item
) override
;
148 virtual void visit (ExternBlock
&block
) override
;
149 virtual void visit (LiteralPattern
&pattern
) override
;
150 virtual void visit (IdentifierPattern
&pattern
) override
;
151 virtual void visit (WildcardPattern
&pattern
) override
;
152 virtual void visit (RangePatternBoundLiteral
&bound
) override
;
153 virtual void visit (RangePatternBoundPath
&bound
) override
;
154 virtual void visit (RangePatternBoundQualPath
&bound
) override
;
155 virtual void visit (RangePattern
&pattern
) override
;
156 virtual void visit (ReferencePattern
&pattern
) override
;
157 virtual void visit (StructPatternFieldTuplePat
&field
) override
;
158 virtual void visit (StructPatternFieldIdentPat
&field
) override
;
159 virtual void visit (StructPatternFieldIdent
&field
) override
;
160 virtual void visit (StructPattern
&pattern
) override
;
161 virtual void visit (TupleStructItemsNoRange
&tuple_items
) override
;
162 virtual void visit (TupleStructItemsRange
&tuple_items
) override
;
163 virtual void visit (TupleStructPattern
&pattern
) override
;
164 virtual void visit (TuplePatternItemsMultiple
&tuple_items
) override
;
165 virtual void visit (TuplePatternItemsRanged
&tuple_items
) override
;
166 virtual void visit (TuplePattern
&pattern
) override
;
167 virtual void visit (GroupedPattern
&pattern
) override
;
168 virtual void visit (SlicePattern
&pattern
) override
;
169 virtual void visit (EmptyStmt
&stmt
) override
;
170 virtual void visit (LetStmt
&stmt
) override
;
171 virtual void visit (ExprStmtWithoutBlock
&stmt
) override
;
172 virtual void visit (ExprStmtWithBlock
&stmt
) override
;
173 virtual void visit (TraitBound
&bound
) override
;
174 virtual void visit (ImplTraitType
&type
) override
;
175 virtual void visit (TraitObjectType
&type
) override
;
176 virtual void visit (ParenthesisedType
&type
) override
;
177 virtual void visit (ImplTraitTypeOneBound
&type
) override
;
178 virtual void visit (TupleType
&type
) override
;
179 virtual void visit (NeverType
&type
) override
;
180 virtual void visit (RawPointerType
&type
) override
;
181 virtual void visit (ReferenceType
&type
) override
;
182 virtual void visit (ArrayType
&type
) override
;
183 virtual void visit (SliceType
&type
) override
;
184 virtual void visit (InferredType
&type
) override
;
185 virtual void visit (BareFunctionType
&type
) override
;
191 #endif /* !RUST_UNSAFE_CHECKER_H */