Skip to content

Commit 876bb86

Browse files
committed
[AST] Move dependence computations into a separate file
To group the code in one place, simplify it and make it easier to add the containsErrors bit and find existing bugs. Reviewers: sammccall Reviewed By: sammccall Tags: #clang Differential Revision: https://reviews.llvm.org/D73638
1 parent 398b497 commit 876bb86

16 files changed

+1391
-944
lines changed
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
//===--- ComputeDependence.h -------------------------------------- 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+
// Calculate various template dependency flags for the AST.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef LLVM_CLANG_AST_COMPUTE_DEPENDENCE_H
14+
#define LLVM_CLANG_AST_COMPUTE_DEPENDENCE_H
15+
16+
#include "clang/AST/DependenceFlags.h"
17+
#include "clang/Basic/ExceptionSpecificationType.h"
18+
#include "llvm/ADT/ArrayRef.h"
19+
20+
namespace clang {
21+
22+
class ASTContext;
23+
24+
class Expr;
25+
class FullExpr;
26+
class OpaqueValueExpr;
27+
class ParenExpr;
28+
class UnaryOperator;
29+
class UnaryExprOrTypeTraitExpr;
30+
class ArraySubscriptExpr;
31+
class CompoundLiteralExpr;
32+
class CastExpr;
33+
class BinaryOperator;
34+
class ConditionalOperator;
35+
class BinaryConditionalOperator;
36+
class StmtExpr;
37+
class ConvertVectorExpr;
38+
class VAArgExpr;
39+
class ChooseExpr;
40+
class NoInitExpr;
41+
class ArrayInitLoopExpr;
42+
class ImplicitValueInitExpr;
43+
class InitListExpr;
44+
class ExtVectorElementExpr;
45+
class BlockExpr;
46+
class AsTypeExpr;
47+
class DeclRefExpr;
48+
class CXXRewrittenBinaryOperator;
49+
class CXXStdInitializerListExpr;
50+
class CXXTypeidExpr;
51+
class MSPropertyRefExpr;
52+
class MSPropertySubscriptExpr;
53+
class CXXUuidofExpr;
54+
class CXXThisExpr;
55+
class CXXThrowExpr;
56+
class CXXBindTemporaryExpr;
57+
class CXXScalarValueInitExpr;
58+
class CXXDeleteExpr;
59+
class ArrayTypeTraitExpr;
60+
class ExpressionTraitExpr;
61+
class CXXNoexceptExpr;
62+
class SubstNonTypeTemplateParmExpr;
63+
class CoroutineSuspendExpr;
64+
class DependentCoawaitExpr;
65+
class CXXNewExpr;
66+
class CXXPseudoDestructorExpr;
67+
class OverloadExpr;
68+
class DependentScopeDeclRefExpr;
69+
class CXXConstructExpr;
70+
class LambdaExpr;
71+
class CXXUnresolvedConstructExpr;
72+
class CXXDependentScopeMemberExpr;
73+
class MaterializeTemporaryExpr;
74+
class TypeTraitExpr;
75+
class ConceptSpecializationExpr;
76+
class PredefinedExpr;
77+
class CallExpr;
78+
class OffsetOfExpr;
79+
class MemberExpr;
80+
class ShuffleVectorExpr;
81+
class GenericSelectionExpr;
82+
class DesignatedInitExpr;
83+
class ParenListExpr;
84+
class PseudoObjectExpr;
85+
class AtomicExpr;
86+
class OMPArraySectionExpr;
87+
class ObjCArrayLiteral;
88+
class ObjCDictionaryLiteral;
89+
class ObjCBoxedExpr;
90+
class ObjCEncodeExpr;
91+
class ObjCIvarRefExpr;
92+
class ObjCPropertyRefExpr;
93+
class ObjCSubscriptRefExpr;
94+
class ObjCIsaExpr;
95+
class ObjCIndirectCopyRestoreExpr;
96+
class ObjCMessageExpr;
97+
98+
// The following functions are called from constructors of `Expr`, so they
99+
// should not access anything beyond basic
100+
ExprDependence computeDependence(FullExpr *E);
101+
ExprDependence computeDependence(OpaqueValueExpr *E);
102+
ExprDependence computeDependence(ParenExpr *E);
103+
ExprDependence computeDependence(UnaryOperator *E);
104+
ExprDependence computeDependence(UnaryExprOrTypeTraitExpr *E);
105+
ExprDependence computeDependence(ArraySubscriptExpr *E);
106+
ExprDependence computeDependence(CompoundLiteralExpr *E);
107+
ExprDependence computeDependence(CastExpr *E);
108+
ExprDependence computeDependence(BinaryOperator *E);
109+
ExprDependence computeDependence(ConditionalOperator *E);
110+
ExprDependence computeDependence(BinaryConditionalOperator *E);
111+
ExprDependence computeDependence(StmtExpr *E, unsigned TemplateDepth);
112+
ExprDependence computeDependence(ConvertVectorExpr *E);
113+
ExprDependence computeDependence(VAArgExpr *E);
114+
ExprDependence computeDependence(ChooseExpr *E);
115+
ExprDependence computeDependence(NoInitExpr *E);
116+
ExprDependence computeDependence(ArrayInitLoopExpr *E);
117+
ExprDependence computeDependence(ImplicitValueInitExpr *E);
118+
ExprDependence computeDependence(InitListExpr *E);
119+
ExprDependence computeDependence(ExtVectorElementExpr *E);
120+
ExprDependence computeDependence(BlockExpr *E);
121+
ExprDependence computeDependence(AsTypeExpr *E);
122+
ExprDependence computeDependence(DeclRefExpr *E, const ASTContext &Ctx);
123+
ExprDependence computeDependence(CXXRewrittenBinaryOperator *E);
124+
ExprDependence computeDependence(CXXStdInitializerListExpr *E);
125+
ExprDependence computeDependence(CXXTypeidExpr *E);
126+
ExprDependence computeDependence(MSPropertyRefExpr *E);
127+
ExprDependence computeDependence(MSPropertySubscriptExpr *E);
128+
ExprDependence computeDependence(CXXUuidofExpr *E);
129+
ExprDependence computeDependence(CXXThisExpr *E);
130+
ExprDependence computeDependence(CXXThrowExpr *E);
131+
ExprDependence computeDependence(CXXBindTemporaryExpr *E);
132+
ExprDependence computeDependence(CXXScalarValueInitExpr *E);
133+
ExprDependence computeDependence(CXXDeleteExpr *E);
134+
ExprDependence computeDependence(ArrayTypeTraitExpr *E);
135+
ExprDependence computeDependence(ExpressionTraitExpr *E);
136+
ExprDependence computeDependence(CXXNoexceptExpr *E, CanThrowResult CT);
137+
ExprDependence computeDependence(SubstNonTypeTemplateParmExpr *E);
138+
ExprDependence computeDependence(CoroutineSuspendExpr *E);
139+
ExprDependence computeDependence(DependentCoawaitExpr *E);
140+
ExprDependence computeDependence(CXXNewExpr *E);
141+
ExprDependence computeDependence(CXXPseudoDestructorExpr *E);
142+
ExprDependence computeDependence(OverloadExpr *E, bool KnownDependent,
143+
bool KnownInstantiationDependent,
144+
bool KnownContainsUnexpandedParameterPack);
145+
ExprDependence computeDependence(DependentScopeDeclRefExpr *E);
146+
ExprDependence computeDependence(CXXConstructExpr *E);
147+
ExprDependence computeDependence(LambdaExpr *E,
148+
bool ContainsUnexpandedParameterPack);
149+
ExprDependence computeDependence(CXXUnresolvedConstructExpr *E);
150+
ExprDependence computeDependence(CXXDependentScopeMemberExpr *E);
151+
ExprDependence computeDependence(MaterializeTemporaryExpr *E);
152+
ExprDependence computeDependence(TypeTraitExpr *E);
153+
ExprDependence computeDependence(ConceptSpecializationExpr *E,
154+
bool ValueDependent);
155+
156+
ExprDependence computeDependence(PredefinedExpr *E);
157+
ExprDependence computeDependence(CallExpr *E, llvm::ArrayRef<Expr *> PreArgs);
158+
ExprDependence computeDependence(OffsetOfExpr *E);
159+
ExprDependence computeDependence(MemberExpr *E);
160+
ExprDependence computeDependence(ShuffleVectorExpr *E);
161+
ExprDependence computeDependence(GenericSelectionExpr *E,
162+
bool ContainsUnexpandedPack);
163+
ExprDependence computeDependence(DesignatedInitExpr *E);
164+
ExprDependence computeDependence(ParenListExpr *E);
165+
ExprDependence computeDependence(PseudoObjectExpr *E);
166+
ExprDependence computeDependence(AtomicExpr *E);
167+
168+
ExprDependence computeDependence(OMPArraySectionExpr *E);
169+
170+
ExprDependence computeDependence(ObjCArrayLiteral *E);
171+
ExprDependence computeDependence(ObjCDictionaryLiteral *E);
172+
ExprDependence computeDependence(ObjCBoxedExpr *E);
173+
ExprDependence computeDependence(ObjCEncodeExpr *E);
174+
ExprDependence computeDependence(ObjCIvarRefExpr *E);
175+
ExprDependence computeDependence(ObjCPropertyRefExpr *E);
176+
ExprDependence computeDependence(ObjCSubscriptRefExpr *E);
177+
ExprDependence computeDependence(ObjCIsaExpr *E);
178+
ExprDependence computeDependence(ObjCIndirectCopyRestoreExpr *E);
179+
ExprDependence computeDependence(ObjCMessageExpr *E);
180+
181+
} // namespace clang
182+
#endif

clang/include/clang/AST/DependenceFlags.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct ExprDependenceScope {
2323
None = 0,
2424
All = 15,
2525

26+
TypeValue = Type | Value,
2627
TypeInstantiation = Type | Instantiation,
2728
ValueInstantiation = Value | Instantiation,
2829
TypeValueInstantiation = Type | Value | Instantiation,
@@ -94,6 +95,12 @@ inline ExprDependence toExprDependence(TypeDependence TD) {
9495
return toExprDependence(static_cast<TemplateArgumentDependence>(
9596
TD & ~TypeDependence::VariablyModified));
9697
}
98+
inline ExprDependence toExprDependence(NestedNameSpecifierDependence NSD) {
99+
// This hack works because TypeDependence and TemplateArgumentDependence
100+
// share the same bit representation.
101+
return toExprDependence(static_cast<TemplateArgumentDependence>(NSD)) &
102+
~ExprDependence::TypeValue;
103+
}
97104
inline ExprDependence turnTypeToValueDependence(ExprDependence D) {
98105
// Type-dependent expressions are always be value-dependent, so we simply drop
99106
// type dependency.

0 commit comments

Comments
 (0)