@@ -178,6 +178,109 @@ class ClangRecordMemberLookup
178
178
evaluate (Evaluator &evaluator, ClangRecordMemberLookupDescriptor desc) const ;
179
179
};
180
180
181
+ enum class CxxRecordSemanticsKind {
182
+ Trivial,
183
+ Owned,
184
+ Reference,
185
+ Iterator,
186
+ // An API that has be annotated as explicitly unsafe, but still importable.
187
+ // TODO: we should rename these APIs.
188
+ ExplicitlyUnsafe,
189
+ // A record that has custom lifetime operations which we cannot prove are
190
+ // safe.
191
+ UnsafeLifetimeOperation,
192
+ // A record that contains a pointer (aka non-trivial type).
193
+ UnsafePointerMember
194
+ };
195
+
196
+ struct CxxRecordSemanticsDescriptor final {
197
+ const clang::CXXRecordDecl *decl;
198
+
199
+ CxxRecordSemanticsDescriptor (const clang::CXXRecordDecl *decl) : decl(decl) {}
200
+
201
+ friend llvm::hash_code hash_value (const CxxRecordSemanticsDescriptor &desc) {
202
+ return llvm::hash_combine (desc.decl );
203
+ }
204
+
205
+ friend bool operator ==(const CxxRecordSemanticsDescriptor &lhs,
206
+ const CxxRecordSemanticsDescriptor &rhs) {
207
+ return lhs.decl == rhs.decl ;
208
+ }
209
+
210
+ friend bool operator !=(const CxxRecordSemanticsDescriptor &lhs,
211
+ const CxxRecordSemanticsDescriptor &rhs) {
212
+ return !(lhs == rhs);
213
+ }
214
+ };
215
+
216
+ void simple_display (llvm::raw_ostream &out, CxxRecordSemanticsDescriptor desc);
217
+ SourceLoc extractNearestSourceLoc (CxxRecordSemanticsDescriptor desc);
218
+
219
+ // / What pattern does this C++ API fit? Uses attributes such as
220
+ // / import_owned and import_as_reference to determine the pattern.
221
+ class CxxRecordSemantics
222
+ : public SimpleRequest<CxxRecordSemantics,
223
+ CxxRecordSemanticsKind (CxxRecordSemanticsDescriptor),
224
+ RequestFlags::Cached> {
225
+ public:
226
+ using SimpleRequest::SimpleRequest;
227
+
228
+ // Caching
229
+ bool isCached () const { return true ; }
230
+
231
+ // Source location
232
+ SourceLoc getNearestLoc () const { return SourceLoc (); };
233
+
234
+ private:
235
+ friend SimpleRequest;
236
+
237
+ // Evaluation.
238
+ CxxRecordSemanticsKind evaluate (Evaluator &evaluator,
239
+ CxxRecordSemanticsDescriptor) const ;
240
+ };
241
+
242
+ struct SafeUseOfCxxDeclDescriptor final {
243
+ const clang::Decl *decl;
244
+
245
+ SafeUseOfCxxDeclDescriptor (const clang::Decl *decl) : decl(decl) {}
246
+
247
+ friend llvm::hash_code hash_value (const SafeUseOfCxxDeclDescriptor &desc) {
248
+ return llvm::hash_combine (desc.decl );
249
+ }
250
+
251
+ friend bool operator ==(const SafeUseOfCxxDeclDescriptor &lhs,
252
+ const SafeUseOfCxxDeclDescriptor &rhs) {
253
+ return lhs.decl == rhs.decl ;
254
+ }
255
+
256
+ friend bool operator !=(const SafeUseOfCxxDeclDescriptor &lhs,
257
+ const SafeUseOfCxxDeclDescriptor &rhs) {
258
+ return !(lhs == rhs);
259
+ }
260
+ };
261
+
262
+ void simple_display (llvm::raw_ostream &out, SafeUseOfCxxDeclDescriptor desc);
263
+ SourceLoc extractNearestSourceLoc (SafeUseOfCxxDeclDescriptor desc);
264
+
265
+ class IsSafeUseOfCxxDecl
266
+ : public SimpleRequest<IsSafeUseOfCxxDecl, bool (SafeUseOfCxxDeclDescriptor),
267
+ RequestFlags::Cached> {
268
+ public:
269
+ using SimpleRequest::SimpleRequest;
270
+
271
+ // Caching
272
+ bool isCached () const { return true ; }
273
+
274
+ // Source location
275
+ SourceLoc getNearestLoc () const { return SourceLoc (); };
276
+
277
+ private:
278
+ friend SimpleRequest;
279
+
280
+ // Evaluation.
281
+ bool evaluate (Evaluator &evaluator, SafeUseOfCxxDeclDescriptor desc) const ;
282
+ };
283
+
181
284
#define SWIFT_TYPEID_ZONE ClangImporter
182
285
#define SWIFT_TYPEID_HEADER " swift/ClangImporter/ClangImporterTypeIDZone.def"
183
286
#include " swift/Basic/DefineTypeIDZone.h"
0 commit comments