//===--- ComputeDependence.h -------------------------------------- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
//
 
//  Calculate various template dependency flags for the AST.
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_CLANG_AST_COMPUTEDEPENDENCE_H
 
#define LLVM_CLANG_AST_COMPUTEDEPENDENCE_H
 
 
 
#include "clang/AST/DependenceFlags.h"
 
#include "clang/Basic/ExceptionSpecificationType.h"
 
#include "llvm/ADT/ArrayRef.h"
 
 
 
namespace clang {
 
 
 
class ASTContext;
 
 
 
class Expr;
 
class FullExpr;
 
class OpaqueValueExpr;
 
class ParenExpr;
 
class UnaryOperator;
 
class UnaryExprOrTypeTraitExpr;
 
class ArraySubscriptExpr;
 
class MatrixSubscriptExpr;
 
class CompoundLiteralExpr;
 
class ImplicitCastExpr;
 
class ExplicitCastExpr;
 
class BinaryOperator;
 
class ConditionalOperator;
 
class BinaryConditionalOperator;
 
class StmtExpr;
 
class ConvertVectorExpr;
 
class VAArgExpr;
 
class ChooseExpr;
 
class NoInitExpr;
 
class ArrayInitLoopExpr;
 
class ImplicitValueInitExpr;
 
class InitListExpr;
 
class ExtVectorElementExpr;
 
class BlockExpr;
 
class AsTypeExpr;
 
class DeclRefExpr;
 
class RecoveryExpr;
 
class CXXRewrittenBinaryOperator;
 
class CXXStdInitializerListExpr;
 
class CXXTypeidExpr;
 
class MSPropertyRefExpr;
 
class MSPropertySubscriptExpr;
 
class CXXUuidofExpr;
 
class CXXThisExpr;
 
class CXXThrowExpr;
 
class CXXBindTemporaryExpr;
 
class CXXScalarValueInitExpr;
 
class CXXDeleteExpr;
 
class ArrayTypeTraitExpr;
 
class ExpressionTraitExpr;
 
class CXXNoexceptExpr;
 
class PackExpansionExpr;
 
class SubstNonTypeTemplateParmExpr;
 
class CoroutineSuspendExpr;
 
class DependentCoawaitExpr;
 
class CXXNewExpr;
 
class CXXPseudoDestructorExpr;
 
class OverloadExpr;
 
class DependentScopeDeclRefExpr;
 
class CXXConstructExpr;
 
class CXXTemporaryObjectExpr;
 
class CXXDefaultInitExpr;
 
class CXXDefaultArgExpr;
 
class LambdaExpr;
 
class CXXUnresolvedConstructExpr;
 
class CXXDependentScopeMemberExpr;
 
class MaterializeTemporaryExpr;
 
class CXXFoldExpr;
 
class CXXParenListInitExpr;
 
class TypeTraitExpr;
 
class ConceptSpecializationExpr;
 
class SYCLUniqueStableNameExpr;
 
class PredefinedExpr;
 
class CallExpr;
 
class OffsetOfExpr;
 
class MemberExpr;
 
class ShuffleVectorExpr;
 
class GenericSelectionExpr;
 
class DesignatedInitExpr;
 
class ParenListExpr;
 
class PseudoObjectExpr;
 
class AtomicExpr;
 
class OMPArraySectionExpr;
 
class OMPArrayShapingExpr;
 
class OMPIteratorExpr;
 
class ObjCArrayLiteral;
 
class ObjCDictionaryLiteral;
 
class ObjCBoxedExpr;
 
class ObjCEncodeExpr;
 
class ObjCIvarRefExpr;
 
class ObjCPropertyRefExpr;
 
class ObjCSubscriptRefExpr;
 
class ObjCIsaExpr;
 
class ObjCIndirectCopyRestoreExpr;
 
class ObjCMessageExpr;
 
 
 
// The following functions are called from constructors of `Expr`, so they
 
// should not access anything beyond basic
 
ExprDependence computeDependence(FullExpr *E);
 
ExprDependence computeDependence(OpaqueValueExpr *E);
 
ExprDependence computeDependence(ParenExpr *E);
 
ExprDependence computeDependence(UnaryOperator *E, const ASTContext &Ctx);
 
ExprDependence computeDependence(UnaryExprOrTypeTraitExpr *E);
 
ExprDependence computeDependence(ArraySubscriptExpr *E);
 
ExprDependence computeDependence(MatrixSubscriptExpr *E);
 
ExprDependence computeDependence(CompoundLiteralExpr *E);
 
ExprDependence computeDependence(ImplicitCastExpr *E);
 
ExprDependence computeDependence(ExplicitCastExpr *E);
 
ExprDependence computeDependence(BinaryOperator *E);
 
ExprDependence computeDependence(ConditionalOperator *E);
 
ExprDependence computeDependence(BinaryConditionalOperator *E);
 
ExprDependence computeDependence(StmtExpr *E, unsigned TemplateDepth);
 
ExprDependence computeDependence(ConvertVectorExpr *E);
 
ExprDependence computeDependence(VAArgExpr *E);
 
ExprDependence computeDependence(ChooseExpr *E);
 
ExprDependence computeDependence(NoInitExpr *E);
 
ExprDependence computeDependence(ArrayInitLoopExpr *E);
 
ExprDependence computeDependence(ImplicitValueInitExpr *E);
 
ExprDependence computeDependence(InitListExpr *E);
 
ExprDependence computeDependence(ExtVectorElementExpr *E);
 
ExprDependence computeDependence(BlockExpr *E);
 
ExprDependence computeDependence(AsTypeExpr *E);
 
ExprDependence computeDependence(DeclRefExpr *E, const ASTContext &Ctx);
 
ExprDependence computeDependence(RecoveryExpr *E);
 
ExprDependence computeDependence(CXXRewrittenBinaryOperator *E);
 
ExprDependence computeDependence(CXXStdInitializerListExpr *E);
 
ExprDependence computeDependence(CXXTypeidExpr *E);
 
ExprDependence computeDependence(MSPropertyRefExpr *E);
 
ExprDependence computeDependence(MSPropertySubscriptExpr *E);
 
ExprDependence computeDependence(CXXUuidofExpr *E);
 
ExprDependence computeDependence(CXXThisExpr *E);
 
ExprDependence computeDependence(CXXThrowExpr *E);
 
ExprDependence computeDependence(CXXBindTemporaryExpr *E);
 
ExprDependence computeDependence(CXXScalarValueInitExpr *E);
 
ExprDependence computeDependence(CXXDeleteExpr *E);
 
ExprDependence computeDependence(ArrayTypeTraitExpr *E);
 
ExprDependence computeDependence(ExpressionTraitExpr *E);
 
ExprDependence computeDependence(CXXNoexceptExpr *E, CanThrowResult CT);
 
ExprDependence computeDependence(PackExpansionExpr *E);
 
ExprDependence computeDependence(SubstNonTypeTemplateParmExpr *E);
 
ExprDependence computeDependence(CoroutineSuspendExpr *E);
 
ExprDependence computeDependence(DependentCoawaitExpr *E);
 
ExprDependence computeDependence(CXXNewExpr *E);
 
ExprDependence computeDependence(CXXPseudoDestructorExpr *E);
 
ExprDependence computeDependence(OverloadExpr *E, bool KnownDependent,
 
                                 bool KnownInstantiationDependent,
 
                                 bool KnownContainsUnexpandedParameterPack);
 
ExprDependence computeDependence(DependentScopeDeclRefExpr *E);
 
ExprDependence computeDependence(CXXConstructExpr *E);
 
ExprDependence computeDependence(CXXTemporaryObjectExpr *E);
 
ExprDependence computeDependence(CXXDefaultInitExpr *E);
 
ExprDependence computeDependence(CXXDefaultArgExpr *E);
 
ExprDependence computeDependence(LambdaExpr *E,
 
                                 bool ContainsUnexpandedParameterPack);
 
ExprDependence computeDependence(CXXUnresolvedConstructExpr *E);
 
ExprDependence computeDependence(CXXDependentScopeMemberExpr *E);
 
ExprDependence computeDependence(MaterializeTemporaryExpr *E);
 
ExprDependence computeDependence(CXXFoldExpr *E);
 
ExprDependence computeDependence(CXXParenListInitExpr *E);
 
ExprDependence computeDependence(TypeTraitExpr *E);
 
ExprDependence computeDependence(ConceptSpecializationExpr *E,
 
                                 bool ValueDependent);
 
 
 
ExprDependence computeDependence(SYCLUniqueStableNameExpr *E);
 
ExprDependence computeDependence(PredefinedExpr *E);
 
ExprDependence computeDependence(CallExpr *E, llvm::ArrayRef<Expr *> PreArgs);
 
ExprDependence computeDependence(OffsetOfExpr *E);
 
ExprDependence computeDependence(MemberExpr *E);
 
ExprDependence computeDependence(ShuffleVectorExpr *E);
 
ExprDependence computeDependence(GenericSelectionExpr *E,
 
                                 bool ContainsUnexpandedPack);
 
ExprDependence computeDependence(DesignatedInitExpr *E);
 
ExprDependence computeDependence(ParenListExpr *E);
 
ExprDependence computeDependence(PseudoObjectExpr *E);
 
ExprDependence computeDependence(AtomicExpr *E);
 
 
 
ExprDependence computeDependence(OMPArraySectionExpr *E);
 
ExprDependence computeDependence(OMPArrayShapingExpr *E);
 
ExprDependence computeDependence(OMPIteratorExpr *E);
 
 
 
ExprDependence computeDependence(ObjCArrayLiteral *E);
 
ExprDependence computeDependence(ObjCDictionaryLiteral *E);
 
ExprDependence computeDependence(ObjCBoxedExpr *E);
 
ExprDependence computeDependence(ObjCEncodeExpr *E);
 
ExprDependence computeDependence(ObjCIvarRefExpr *E);
 
ExprDependence computeDependence(ObjCPropertyRefExpr *E);
 
ExprDependence computeDependence(ObjCSubscriptRefExpr *E);
 
ExprDependence computeDependence(ObjCIsaExpr *E);
 
ExprDependence computeDependence(ObjCIndirectCopyRestoreExpr *E);
 
ExprDependence computeDependence(ObjCMessageExpr *E);
 
 
 
} // namespace clang
 
#endif