clang 22.0.0git
ASTStructuralEquivalence.cpp File Reference
#include "clang/AST/ASTStructuralEquivalence.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTDiagnostic.h"
#include "clang/AST/Attr.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclFriend.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclOpenACC.h"
#include "clang/AST/DeclOpenMP.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprConcepts.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/ExprOpenMP.h"
#include "clang/AST/NestedNameSpecifier.h"
#include "clang/AST/StmtObjC.h"
#include "clang/AST/StmtOpenACC.h"
#include "clang/AST/StmtOpenMP.h"
#include "clang/AST/StmtSYCL.h"
#include "clang/AST/TemplateBase.h"
#include "clang/AST/TemplateName.h"
#include "clang/AST/Type.h"
#include "clang/Basic/ExceptionSpecificationType.h"
#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/SourceLocation.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include <cassert>
#include <optional>
#include <utility>
#include "clang/AST/StmtNodes.inc"
#include "clang/AST/DeclNodes.inc"

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)

Macro Definition Documentation

◆ 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.
Definition DeclBase.h:86

◆ 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.

Function Documentation

◆ CheckStructurallyEquivalentAttributes()

bool CheckStructurallyEquivalentAttributes ( StructuralEquivalenceContext & Context,
const Decl * D1,
const Decl * D2,
const Decl * PrimaryDecl = nullptr )
static

◆ IsArrayStructurallyEquivalent()

bool IsArrayStructurallyEquivalent ( StructuralEquivalenceContext & Context,
const ArrayType * Array1,
const ArrayType * Array2 )
static

Determine structural equivalence for the common part of array types.

Definition at line 768 of file ASTStructuralEquivalence.cpp.

References clang::ArrayType::getElementType(), clang::ArrayType::getIndexTypeQualifiers(), clang::ArrayType::getSizeModifier(), and IsStructurallyEquivalent().

Referenced by IsStructurallyEquivalent().

◆ IsEquivalentExceptionSpec()

◆ IsRecordContextStructurallyEquivalent()

◆ IsStructurallyEquivalent() [1/38]

bool IsStructurallyEquivalent ( const IdentifierInfo * Name1,
const IdentifierInfo * Name2 )
static

Determine whether two identifiers are equivalent.

Definition at line 572 of file ASTStructuralEquivalence.cpp.

References clang::IdentifierInfo::getName().

◆ IsStructurallyEquivalent() [2/38]

bool IsStructurallyEquivalent ( StructuralEquivalenceContext & Context,
ArrayRef< TemplateArgument > Args1,
ArrayRef< TemplateArgument > Args2 )
static

Determine structural equivalence of two template argument lists.

Definition at line 746 of file ASTStructuralEquivalence.cpp.

References IsStructurallyEquivalent().

◆ IsStructurallyEquivalent() [3/38]

◆ IsStructurallyEquivalent() [4/38]

◆ IsStructurallyEquivalent() [5/38]

◆ IsStructurallyEquivalent() [6/38]

◆ IsStructurallyEquivalent() [7/38]

◆ IsStructurallyEquivalent() [8/38]

◆ IsStructurallyEquivalent() [9/38]

◆ IsStructurallyEquivalent() [10/38]

bool IsStructurallyEquivalent ( StructuralEquivalenceContext & Context,
const Stmt * S1,
const Stmt * S2 )
static

Determine structural equivalence of two statements.

Definition at line 526 of file ASTStructuralEquivalence.cpp.

References clang::Stmt::children(), and IsStructurallyEquivalent().

◆ IsStructurallyEquivalent() [11/38]

◆ IsStructurallyEquivalent() [12/38]

bool IsStructurallyEquivalent ( StructuralEquivalenceContext & Context,
const TemplateArgumentLoc & Arg1,
const TemplateArgumentLoc & Arg2 )
static

Determine whether two template argument locations are equivalent.

Definition at line 759 of file ASTStructuralEquivalence.cpp.

References clang::TemplateArgumentLoc::getArgument(), and IsStructurallyEquivalent().

◆ IsStructurallyEquivalent() [13/38]

◆ IsStructurallyEquivalent() [14/38]

◆ IsStructurallyEquivalent() [15/38]

◆ IsStructurallyEquivalent() [16/38]

bool IsStructurallyEquivalent ( StructuralEquivalenceContext & Context,
Decl * D1,
Decl * D2 )
static

Determine structural equivalence of two declarations.

Definition at line 2533 of file ASTStructuralEquivalence.cpp.

References clang::Decl::getCanonicalDecl().

◆ IsStructurallyEquivalent() [17/38]

◆ IsStructurallyEquivalent() [18/38]

◆ IsStructurallyEquivalent() [19/38]

bool IsStructurallyEquivalent ( StructuralEquivalenceContext & Context,
FieldDecl * Field1,
FieldDecl * Field2 )
static

Determine structural equivalence of two fields.

Definition at line 1609 of file ASTStructuralEquivalence.cpp.

References clang::cast(), clang::Decl::getDeclContext(), and IsStructurallyEquivalent().

◆ IsStructurallyEquivalent() [20/38]

◆ IsStructurallyEquivalent() [21/38]

◆ IsStructurallyEquivalent() [22/38]

◆ IsStructurallyEquivalent() [23/38]

◆ IsStructurallyEquivalent() [24/38]

bool IsStructurallyEquivalent ( StructuralEquivalenceContext & Context,
FunctionType::ExtInfo EI1,
FunctionType::ExtInfo EI2 )
static

◆ IsStructurallyEquivalent() [25/38]

◆ IsStructurallyEquivalent() [26/38]

◆ IsStructurallyEquivalent() [27/38]

◆ IsStructurallyEquivalent() [28/38]

bool IsStructurallyEquivalent ( StructuralEquivalenceContext & Context,
ObjCIvarDecl * D1,
ObjCIvarDecl * D2 )
static

◆ IsStructurallyEquivalent() [29/38]

bool IsStructurallyEquivalent ( StructuralEquivalenceContext & Context,
ObjCIvarDecl * D1,
ObjCIvarDecl * D2,
QualType Owner2Type )
static

◆ IsStructurallyEquivalent() [30/38]

◆ IsStructurallyEquivalent() [31/38]

bool IsStructurallyEquivalent ( StructuralEquivalenceContext & Context,
QualType T1,
QualType T2 )
static

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]

◆ IsStructurallyEquivalent() [33/38]

◆ IsStructurallyEquivalent() [34/38]

◆ IsStructurallyEquivalent() [35/38]

◆ IsStructurallyEquivalent() [36/38]

◆ IsStructurallyEquivalent() [37/38]

◆ IsStructurallyEquivalent() [38/38]

◆ IsStructurallyEquivalentLambdas()

bool IsStructurallyEquivalentLambdas ( StructuralEquivalenceContext & Context,
CXXRecordDecl * D1,
CXXRecordDecl * D2 )
static

Determine structural equivalence of two lambda classes.

Definition at line 1677 of file ASTStructuralEquivalence.cpp.

References clang::CXXRecordDecl::getLambdaCallOperator(), clang::CXXRecordDecl::isLambda(), and IsStructurallyEquivalent().

Referenced by IsStructurallyEquivalent().

◆ IsTemplateDeclCommonStructurallyEquivalent()

◆ NameIsStructurallyEquivalent()

bool NameIsStructurallyEquivalent ( const TagDecl & D1,
const TagDecl & D2 )
static