clang 20.0.0git
NonTrivialTypeVisitor.h
Go to the documentation of this file.
1//===-- NonTrivialTypeVisitor.h - Visitor for non-trivial Types -*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the visitor classes that are used to traverse non-trivial
10// structs.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_AST_NONTRIVIALTYPEVISITOR_H
15#define LLVM_CLANG_AST_NONTRIVIALTYPEVISITOR_H
16
17#include "clang/AST/Type.h"
18
19namespace clang {
20
21template <class Derived, class RetTy = void> struct DestructedTypeVisitor {
22 template <class... Ts> RetTy visit(QualType FT, Ts &&... Args) {
23 return asDerived().visitWithKind(FT.isDestructedType(), FT,
24 std::forward<Ts>(Args)...);
25 }
26
27 template <class... Ts>
29 Ts &&... Args) {
30 switch (DK) {
32 return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...);
34 return asDerived().visitStruct(FT, std::forward<Ts>(Args)...);
36 return asDerived().visitTrivial(FT, std::forward<Ts>(Args)...);
38 return asDerived().visitCXXDestructor(FT, std::forward<Ts>(Args)...);
40 return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...);
41 }
42
43 llvm_unreachable("unknown destruction kind");
44 }
45
46 Derived &asDerived() { return static_cast<Derived &>(*this); }
47};
48
49template <class Derived, class RetTy = void>
51 template <class... Ts> RetTy visit(QualType FT, Ts &&... Args) {
52 return asDerived().visitWithKind(
54 std::forward<Ts>(Args)...);
55 }
56
57 template <class... Ts>
59 QualType FT, Ts &&... Args) {
60 switch (PDIK) {
62 return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...);
64 return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...);
66 return asDerived().visitStruct(FT, std::forward<Ts>(Args)...);
68 return asDerived().visitTrivial(FT, std::forward<Ts>(Args)...);
69 }
70
71 llvm_unreachable("unknown default-initialize kind");
72 }
73
74 Derived &asDerived() { return static_cast<Derived &>(*this); }
75};
76
77template <class Derived, bool IsMove, class RetTy = void>
79 template <class... Ts> RetTy visit(QualType FT, Ts &&... Args) {
83 return asDerived().visitWithKind(PCK, FT, std::forward<Ts>(Args)...);
84 }
85
86 template <class... Ts>
88 Ts &&... Args) {
89 asDerived().preVisit(PCK, FT, std::forward<Ts>(Args)...);
90
91 switch (PCK) {
93 return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...);
95 return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...);
97 return asDerived().visitStruct(FT, std::forward<Ts>(Args)...);
99 return asDerived().visitTrivial(FT, std::forward<Ts>(Args)...);
101 return asDerived().visitVolatileTrivial(FT, std::forward<Ts>(Args)...);
102 }
103
104 llvm_unreachable("unknown primitive copy kind");
105 }
106
107 Derived &asDerived() { return static_cast<Derived &>(*this); }
108};
109
110} // end namespace clang
111
112#endif
C Language Family Type Representation.
A (possibly-)qualified type.
Definition: Type.h:941
@ DK_cxx_destructor
Definition: Type.h:1532
@ DK_nontrivial_c_struct
Definition: Type.h:1535
@ DK_objc_weak_lifetime
Definition: Type.h:1534
@ DK_objc_strong_lifetime
Definition: Type.h:1533
PrimitiveDefaultInitializeKind
Definition: Type.h:1463
@ PDIK_ARCWeak
The type is an Objective-C retainable pointer type that is qualified with the ARC __weak qualifier.
Definition: Type.h:1475
@ PDIK_Trivial
The type does not fall into any of the following categories.
Definition: Type.h:1467
@ PDIK_ARCStrong
The type is an Objective-C retainable pointer type that is qualified with the ARC __strong qualifier.
Definition: Type.h:1471
@ PDIK_Struct
The type is a struct containing a field whose type is not PCK_Trivial.
Definition: Type.h:1478
PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
Definition: Type.cpp:2870
PrimitiveDefaultInitializeKind isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C struct types.
Definition: Type.cpp:2854
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
Definition: Type.h:1542
PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
Definition: Type.cpp:2888
@ PCK_Struct
The type is a struct containing a field whose type is neither PCK_Trivial nor PCK_VolatileTrivial.
Definition: Type.h:1514
@ PCK_Trivial
The type does not fall into any of the following categories.
Definition: Type.h:1493
@ PCK_ARCStrong
The type is an Objective-C retainable pointer type that is qualified with the ARC __strong qualifier.
Definition: Type.h:1502
@ PCK_VolatileTrivial
The type would be trivial except that it is volatile-qualified.
Definition: Type.h:1498
@ PCK_ARCWeak
The type is an Objective-C retainable pointer type that is qualified with the ARC __weak qualifier.
Definition: Type.h:1506
The JSON file list parser is used to communicate input to InstallAPI.
RetTy visit(QualType FT, Ts &&... Args)
RetTy visitWithKind(QualType::PrimitiveCopyKind PCK, QualType FT, Ts &&... Args)
RetTy visit(QualType FT, Ts &&... Args)
RetTy visitWithKind(QualType::PrimitiveDefaultInitializeKind PDIK, QualType FT, Ts &&... Args)
RetTy visit(QualType FT, Ts &&... Args)
RetTy visitWithKind(QualType::DestructionKind DK, QualType FT, Ts &&... Args)