clang: lib/AST/ASTStructuralEquivalence.cpp File Reference (original) (raw)

Go to the source code of this file.

Macros
#define STMT(CLASS, PARENT)
#define STMT(CLASS, PARENT)
#define ABSTRACT_STMT(S)
#define ABSTRACT_DECL(DECL)
#define DECL(DERIVED, BASE)
Functions
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, QualType T1, QualType T2)
Determine structural equivalence of two types.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, Decl *D1, Decl *D2)
Determine structural equivalence of two declarations.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, const Stmt *S1, const Stmt *S2)
Determine structural equivalence of two statements.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, const TemplateArgument &Arg1, const TemplateArgument &Arg2)
Determine whether two template arguments are equivalent.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, const TemplateArgumentLoc &Arg1, const TemplateArgumentLoc &Arg2)
Determine whether two template argument locations are equivalent.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, NestedNameSpecifier NNS1, NestedNameSpecifier NNS2)
Determine whether two nested-name-specifiers are equivalent.
static bool IsStructurallyEquivalent (const IdentifierInfo *Name1, const IdentifierInfo *Name2)
Determine whether two identifiers are equivalent.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, const DeclarationName Name1, const DeclarationName Name2)
static bool CheckStructurallyEquivalentAttributes (StructuralEquivalenceContext &Context, const Decl *D1, const Decl *D2, const Decl *PrimaryDecl=nullptr)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, const UnaryOperator *E1, const CXXOperatorCallExpr *E2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, const CXXOperatorCallExpr *E1, const UnaryOperator *E2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, const BinaryOperator *E1, const CXXOperatorCallExpr *E2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, const CXXOperatorCallExpr *E1, const BinaryOperator *E2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, const DependentTemplateStorage &S1, const DependentTemplateStorage &S2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, const TemplateName &N1, const TemplateName &N2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, ArrayRef< TemplateArgument > Args1, ArrayRef< TemplateArgument > Args2)
Determine structural equivalence of two template argument lists.
static bool IsArrayStructurallyEquivalent (StructuralEquivalenceContext &Context, const ArrayType *Array1, const ArrayType *Array2)
Determine structural equivalence for the common part of array types.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, FunctionType::ExtInfo EI1, FunctionType::ExtInfo EI2)
Determine structural equivalence based on the ExtInfo of functions.
static bool IsEquivalentExceptionSpec (StructuralEquivalenceContext &Context, const FunctionProtoType *Proto1, const FunctionProtoType *Proto2)
Check the equivalence of exception specifications.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, VarDecl *D1, VarDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, FieldDecl *Field1, FieldDecl *Field2, QualType Owner2Type)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, FieldDecl *Field1, FieldDecl *Field2)
Determine structural equivalence of two fields.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, CXXMethodDecl *Method1, CXXMethodDecl *Method2)
Determine structural equivalence of two methods.
static bool IsStructurallyEquivalentLambdas (StructuralEquivalenceContext &Context, CXXRecordDecl *D1, CXXRecordDecl *D2)
Determine structural equivalence of two lambda classes.
static bool IsRecordContextStructurallyEquivalent (StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2)
Determine if context of a class is equivalent.
static bool NameIsStructurallyEquivalent (const TagDecl &D1, const TagDecl &D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2)
Determine structural equivalence of two records.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, EnumConstantDecl *D1, EnumConstantDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, EnumDecl *D1, EnumDecl *D2)
Determine structural equivalence of two enums.
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, TemplateParameterList *Params1, TemplateParameterList *Params2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, TemplateTypeParmDecl *D1, TemplateTypeParmDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, NonTypeTemplateParmDecl *D1, NonTypeTemplateParmDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, TemplateTemplateParmDecl *D1, TemplateTemplateParmDecl *D2)
static bool IsTemplateDeclCommonStructurallyEquivalent (StructuralEquivalenceContext &Ctx, TemplateDecl *D1, TemplateDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, ClassTemplateDecl *D1, ClassTemplateDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, FunctionTemplateDecl *D1, FunctionTemplateDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, TypeAliasTemplateDecl *D1, TypeAliasTemplateDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, ConceptDecl *D1, ConceptDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, FriendDecl *D1, FriendDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, TypedefNameDecl *D1, TypedefNameDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, FunctionDecl *D1, FunctionDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, ObjCIvarDecl *D1, ObjCIvarDecl *D2, QualType Owner2Type)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, ObjCIvarDecl *D1, ObjCIvarDecl *D2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, ObjCMethodDecl *Method1, ObjCMethodDecl *Method2)
static bool IsStructurallyEquivalent (StructuralEquivalenceContext &Context, ObjCCategoryDecl *D1, ObjCCategoryDecl *D2)

ABSTRACT_DECL

#define ABSTRACT_DECL ( DECL )

ABSTRACT_STMT

#define ABSTRACT_STMT ( S )

DECL

#define DECL ( DERIVED,
BASE )

Value:

case Decl::Kind::DERIVED: \

return ::IsStructurallyEquivalent(*this, static_cast<DERIVED##Decl *>(D1), \

static_cast<DERIVED##Decl *>(D2));

Decl - This represents one declaration (or definition), e.g.

STMT [1/2]

#define STMT ( CLASS,
PARENT )

Value:

bool TraverseStmt(const CLASS *S1, const CLASS *S2) { \

if (!TraverseStmt(static_cast<const PARENT *>(S1), \

static_cast<const PARENT *>(S2))) \

return false; \

return IsStmtEquivalent(S1, S2); \

}

Definition at line 415 of file ASTStructuralEquivalence.cpp.

STMT [2/2]

#define STMT ( CLASS,
PARENT )

Value:

case Stmt::StmtClass::CLASS##Class: \

return TraverseStmt(static_cast<const CLASS *>(S1), \

static_cast<const CLASS *>(S2));

Definition at line 415 of file ASTStructuralEquivalence.cpp.

CheckStructurallyEquivalentAttributes()

IsArrayStructurallyEquivalent()

IsEquivalentExceptionSpec()

IsRecordContextStructurallyEquivalent()

IsStructurallyEquivalent() [1/38]

IsStructurallyEquivalent() [2/38]

IsStructurallyEquivalent() [3/38]

IsStructurallyEquivalent() [4/38]

IsStructurallyEquivalent() [5/38]

IsStructurallyEquivalent() [6/38]

IsStructurallyEquivalent() [7/38]

IsStructurallyEquivalent() [8/38]

Definition at line 118 of file ASTStructuralEquivalence.cpp.

References clang::DeclarationName::CXXConstructorName, clang::DeclarationName::CXXConversionFunctionName, clang::DeclarationName::CXXDeductionGuideName, clang::DeclarationName::CXXDestructorName, clang::DeclarationName::CXXLiteralOperatorName, clang::DeclarationName::CXXOperatorName, clang::DeclarationName::CXXUsingDirective, clang::DeclarationName::getAsIdentifierInfo(), clang::DeclarationName::getCXXDeductionGuideTemplate(), clang::DeclarationName::getCXXLiteralIdentifier(), clang::DeclarationName::getCXXNameType(), clang::DeclarationName::getCXXOverloadedOperator(), clang::NamedDecl::getDeclName(), clang::DeclarationName::getNameKind(), clang::DeclarationName::Identifier, IsStructurallyEquivalent(), clang::DeclarationName::ObjCMultiArgSelector, clang::DeclarationName::ObjCOneArgSelector, and clang::DeclarationName::ObjCZeroArgSelector.

IsStructurallyEquivalent() [9/38]

IsStructurallyEquivalent() [10/38]

IsStructurallyEquivalent() [11/38]

Determine whether two template arguments are equivalent.

Definition at line 694 of file ASTStructuralEquivalence.cpp.

References clang::TemplateArgument::Declaration, clang::TemplateArgument::Expression, clang::TemplateArgument::getAsDecl(), clang::TemplateArgument::getAsExpr(), clang::TemplateArgument::getAsIntegral(), clang::TemplateArgument::getAsTemplate(), clang::TemplateArgument::getAsTemplateOrTemplatePattern(), clang::TemplateArgument::getAsType(), clang::TemplateArgument::getIntegralType(), clang::TemplateArgument::getKind(), clang::TemplateArgument::Integral, IsStructurallyEquivalent(), clang::TemplateArgument::Null, clang::TemplateArgument::NullPtr, clang::TemplateArgument::Pack, clang::TemplateArgument::pack_elements(), clang::TemplateArgument::structurallyEquals(), clang::TemplateArgument::StructuralValue, clang::TemplateArgument::Template, clang::TemplateArgument::TemplateExpansion, and clang::TemplateArgument::Type.

IsStructurallyEquivalent() [12/38]

IsStructurallyEquivalent() [13/38]

Definition at line 623 of file ASTStructuralEquivalence.cpp.

References clang::TemplateName::AssumedTemplate, clang::OverloadedTemplateStorage::begin(), clang::TemplateName::DeducedTemplate, clang::TemplateName::DependentTemplate, clang::OverloadedTemplateStorage::end(), clang::SubstTemplateTemplateParmPackStorage::getArgumentPack(), clang::TemplateName::getAsAssumedTemplateName(), clang::TemplateName::getAsDependentTemplateName(), clang::TemplateName::getAsOverloadedTemplate(), clang::SubstTemplateTemplateParmPackStorage::getAssociatedDecl(), clang::TemplateName::getAsSubstTemplateTemplateParmPack(), clang::TemplateName::getAsTemplateDecl(), clang::AssumedTemplateStorage::getDeclName(), clang::SubstTemplateTemplateParmPackStorage::getIndex(), clang::TemplateName::getKind(), IsStructurallyEquivalent(), clang::TemplateName::OverloadedTemplate, clang::TemplateName::QualifiedTemplate, clang::TemplateName::SubstTemplateTemplateParm, clang::TemplateName::SubstTemplateTemplateParmPack, clang::TemplateName::Template, and clang::TemplateName::UsingTemplate.

IsStructurallyEquivalent() [14/38]

IsStructurallyEquivalent() [15/38]

Determine structural equivalence of two methods.

Definition at line 1616 of file ASTStructuralEquivalence.cpp.

References clang::cast(), clang::Decl::getAccess(), clang::DeclContext::getDeclKind(), clang::NamedDecl::getIdentifier(), clang::FunctionDecl::getOverloadedOperator(), clang::CXXMethodDecl::getRefQualifier(), clang::ValueDecl::getType(), clang::CXXMethodDecl::isConst(), clang::FunctionDecl::isDefaulted(), clang::FunctionDecl::isDeleted(), clang::CXXMethodDecl::isImplicitObjectMemberFunction(), clang::FunctionDecl::isPureVirtual(), clang::CXXMethodDecl::isStatic(), IsStructurallyEquivalent(), clang::CXXMethodDecl::isVirtual(), and clang::CXXMethodDecl::isVolatile().

IsStructurallyEquivalent() [16/38]

IsStructurallyEquivalent() [17/38]

IsStructurallyEquivalent() [18/38]

IsStructurallyEquivalent() [19/38]

IsStructurallyEquivalent() [20/38]

Definition at line 1517 of file ASTStructuralEquivalence.cpp.

References clang::cast(), clang::Type::castAs(), CheckStructurallyEquivalentAttributes(), Diag(), clang::StructuralEquivalenceContext::Diag1(), clang::StructuralEquivalenceContext::Diag2(), clang::FieldDecl::getBitWidth(), clang::FieldDecl::getBitWidthValue(), clang::Decl::getDeclContext(), clang::NamedDecl::getDeclName(), clang::NamedDecl::getIdentifier(), clang::Decl::getLocation(), clang::ValueDecl::getType(), clang::FieldDecl::isAnonymousStructOrUnion(), clang::FieldDecl::isBitField(), and IsStructurallyEquivalent().

IsStructurallyEquivalent() [21/38]

IsStructurallyEquivalent() [22/38]

IsStructurallyEquivalent() [23/38]

IsStructurallyEquivalent() [24/38]

IsStructurallyEquivalent() [25/38]

IsStructurallyEquivalent() [26/38]

IsStructurallyEquivalent() [27/38]

IsStructurallyEquivalent() [28/38]

IsStructurallyEquivalent() [29/38]

IsStructurallyEquivalent() [30/38]

Definition at line 2409 of file ASTStructuralEquivalence.cpp.

References clang::Selector::getIdentifierInfoForSlot(), clang::Selector::getNumArgs(), clang::ObjCMethodDecl::getReturnType(), clang::ObjCMethodDecl::getSelector(), clang::ObjCMethodDecl::isDirectMethod(), clang::ObjCMethodDecl::isInstanceMethod(), IsStructurallyEquivalent(), clang::ObjCMethodDecl::isVariadic(), clang::ObjCMethodDecl::param_size(), clang::ObjCMethodDecl::param_type_begin(), and clang::ObjCMethodDecl::param_type_end().

IsStructurallyEquivalent() [31/38]

Determine structural equivalence of two types.

Definition at line 839 of file ASTStructuralEquivalence.cpp.

References clang::cast(), clang::QualType::getCanonicalType(), clang::DependentSizedMatrixType::getColumnExpr(), clang::QualType::getDesugaredType(), clang::MatrixType::getElementType(), getKind(), clang::ConstantMatrixType::getNumColumns(), clang::ConstantMatrixType::getNumRows(), getPointeeType(), clang::QualType::getQualifiers(), clang::DependentSizedMatrixType::getRowExpr(), clang::Type::getTypeClass(), getUnderlyingType(), IsArrayStructurallyEquivalent(), clang::Type::isBuiltinType(), IsEquivalentExceptionSpec(), clang::QualType::isNull(), and IsStructurallyEquivalent().

Referenced by IsArrayStructurallyEquivalent(), clang::StructuralEquivalenceContext::IsEquivalent(), clang::StructuralEquivalenceContext::IsEquivalent(), clang::StructuralEquivalenceContext::IsEquivalent(), IsEquivalentExceptionSpec(), IsRecordContextStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalentLambdas(), IsTemplateDeclCommonStructurallyEquivalent(), and NameIsStructurallyEquivalent().

IsStructurallyEquivalent() [32/38]

Determine structural equivalence of two records.

Definition at line 1742 of file ASTStructuralEquivalence.cpp.

References CheckStructurallyEquivalentAttributes(), clang::RecordDecl::field_begin(), clang::RecordDecl::field_end(), clang::StructuralEquivalenceContext::findUntaggedStructOrUnionIndex(), clang::CXXBaseSpecifier::getBeginLoc(), clang::NamedDecl::getDeclName(), clang::RecordDecl::getDefinition(), clang::Decl::getLocation(), clang::CXXBaseSpecifier::getSourceRange(), clang::TagDecl::getTagKind(), clang::CXXBaseSpecifier::getType(), clang::DeclContext::hasExternalLexicalStorage(), clang::TagDecl::isBeingDefined(), IsRecordContextStructurallyEquivalent(), IsStructurallyEquivalent(), IsStructurallyEquivalentLambdas(), clang::TagDecl::isUnion(), clang::Minimal, and NameIsStructurallyEquivalent().

IsStructurallyEquivalent() [33/38]

IsStructurallyEquivalent() [34/38]

IsStructurallyEquivalent() [35/38]

IsStructurallyEquivalent() [36/38]

IsStructurallyEquivalent() [37/38]

IsStructurallyEquivalent() [38/38]

IsStructurallyEquivalentLambdas()

IsTemplateDeclCommonStructurallyEquivalent()

NameIsStructurallyEquivalent()