Skip to content

Commit

Permalink
Simplify some implementations of get*Decl.
Browse files Browse the repository at this point in the history
* NamedDecl and CXXMethodDecl were missing getMostRecentDecl.
* The const version can just forward to the non const.
* getMostRecentDecl can use cast instead of cast_or_null.

This then removes some casts from the callers.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193039 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
espindola committed Oct 19, 2013
1 parent e6ddd7f commit 87bcee8
Show file tree
Hide file tree
Showing 7 changed files with 45 additions and 33 deletions.
33 changes: 20 additions & 13 deletions include/clang/AST/Decl.h
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,13 @@ class NamedDecl : public Decl {
return const_cast<NamedDecl*>(this)->getUnderlyingDecl();
}

NamedDecl *getMostRecentDecl() {
return cast<NamedDecl>(Decl::getMostRecentDecl());
}
const NamedDecl *getMostRecentDecl() const {
return const_cast<NamedDecl*>(this)->getMostRecentDecl();
}

static bool classof(const Decl *D) { return classofKind(D->getKind()); }
static bool classofKind(Kind K) { return K >= firstNamed && K <= lastNamed; }
};
Expand Down Expand Up @@ -2810,22 +2817,22 @@ class EnumDecl : public TagDecl {
return cast<EnumDecl>(TagDecl::getCanonicalDecl());
}
const EnumDecl *getCanonicalDecl() const {
return cast<EnumDecl>(TagDecl::getCanonicalDecl());
return const_cast<EnumDecl*>(this)->getCanonicalDecl();
}

const EnumDecl *getPreviousDecl() const {
return cast_or_null<EnumDecl>(TagDecl::getPreviousDecl());
}
EnumDecl *getPreviousDecl() {
return cast_or_null<EnumDecl>(TagDecl::getPreviousDecl());
}

const EnumDecl *getMostRecentDecl() const {
return cast<EnumDecl>(TagDecl::getMostRecentDecl());
const EnumDecl *getPreviousDecl() const {
return const_cast<EnumDecl*>(this)->getPreviousDecl();
}

EnumDecl *getMostRecentDecl() {
return cast<EnumDecl>(TagDecl::getMostRecentDecl());
}
const EnumDecl *getMostRecentDecl() const {
return const_cast<EnumDecl*>(this)->getMostRecentDecl();
}

EnumDecl *getDefinition() const {
return cast_or_null<EnumDecl>(TagDecl::getDefinition());
Expand Down Expand Up @@ -3020,19 +3027,19 @@ class RecordDecl : public TagDecl {
IdentifierInfo *Id, RecordDecl* PrevDecl = 0);
static RecordDecl *CreateDeserialized(const ASTContext &C, unsigned ID);

const RecordDecl *getPreviousDecl() const {
return cast_or_null<RecordDecl>(TagDecl::getPreviousDecl());
}
RecordDecl *getPreviousDecl() {
return cast_or_null<RecordDecl>(TagDecl::getPreviousDecl());
}

const RecordDecl *getMostRecentDecl() const {
return cast<RecordDecl>(TagDecl::getMostRecentDecl());
const RecordDecl *getPreviousDecl() const {
return const_cast<RecordDecl*>(this)->getPreviousDecl();
}

RecordDecl *getMostRecentDecl() {
return cast<RecordDecl>(TagDecl::getMostRecentDecl());
}
const RecordDecl *getMostRecentDecl() const {
return const_cast<RecordDecl*>(this)->getMostRecentDecl();
}

bool hasFlexibleArrayMember() const { return HasFlexibleArrayMember; }
void setHasFlexibleArrayMember(bool V) { HasFlexibleArrayMember = V; }
Expand Down
28 changes: 18 additions & 10 deletions include/clang/AST/DeclCXX.h
Original file line number Diff line number Diff line change
Expand Up @@ -641,18 +641,19 @@ class CXXRecordDecl : public RecordDecl {
return cast<CXXRecordDecl>(RecordDecl::getCanonicalDecl());
}

const CXXRecordDecl *getPreviousDecl() const {
return cast_or_null<CXXRecordDecl>(RecordDecl::getPreviousDecl());
}
CXXRecordDecl *getPreviousDecl() {
return cast_or_null<CXXRecordDecl>(RecordDecl::getPreviousDecl());
}

const CXXRecordDecl *getMostRecentDecl() const {
return cast_or_null<CXXRecordDecl>(RecordDecl::getMostRecentDecl());
const CXXRecordDecl *getPreviousDecl() const {
return const_cast<CXXRecordDecl*>(this)->getPreviousDecl();
}

CXXRecordDecl *getMostRecentDecl() {
return cast_or_null<CXXRecordDecl>(RecordDecl::getMostRecentDecl());
return cast<CXXRecordDecl>(RecordDecl::getMostRecentDecl());
}

const CXXRecordDecl *getMostRecentDecl() const {
return const_cast<CXXRecordDecl*>(this)->getMostRecentDecl();
}

CXXRecordDecl *getDefinition() const {
Expand Down Expand Up @@ -1716,12 +1717,19 @@ class CXXMethodDecl : public FunctionDecl {
/// \brief Determine whether this is a move assignment operator.
bool isMoveAssignmentOperator() const;

const CXXMethodDecl *getCanonicalDecl() const {
return cast<CXXMethodDecl>(FunctionDecl::getCanonicalDecl());
}
CXXMethodDecl *getCanonicalDecl() {
return cast<CXXMethodDecl>(FunctionDecl::getCanonicalDecl());
}
const CXXMethodDecl *getCanonicalDecl() const {
return const_cast<CXXMethodDecl*>(this)->getCanonicalDecl();
}

CXXMethodDecl *getMostRecentDecl() {
return cast<CXXMethodDecl>(FunctionDecl::getMostRecentDecl());
}
const CXXMethodDecl *getMostRecentDecl() const {
return const_cast<CXXMethodDecl*>(this)->getMostRecentDecl();
}

/// True if this method is user-declared and was not
/// deleted or defaulted on its first declaration.
Expand Down
5 changes: 2 additions & 3 deletions include/clang/AST/DeclTemplate.h
Original file line number Diff line number Diff line change
Expand Up @@ -1449,8 +1449,7 @@ class ClassTemplateSpecializationDecl
bool Qualified) const;

ClassTemplateSpecializationDecl *getMostRecentDecl() {
CXXRecordDecl *Recent
= cast<CXXRecordDecl>(CXXRecordDecl::getMostRecentDecl());
CXXRecordDecl *Recent = CXXRecordDecl::getMostRecentDecl();
while (!isa<ClassTemplateSpecializationDecl>(Recent)) {
// FIXME: Does injected class name need to be in the redeclarations chain?
assert(Recent->isInjectedClassName() && Recent->getPreviousDecl());
Expand Down Expand Up @@ -2310,7 +2309,7 @@ class VarTemplateSpecializationDecl : public VarDecl,
bool Qualified) const;

VarTemplateSpecializationDecl *getMostRecentDecl() {
VarDecl *Recent = cast<VarDecl>(VarDecl::getMostRecentDecl());
VarDecl *Recent = VarDecl::getMostRecentDecl();
return cast<VarTemplateSpecializationDecl>(Recent);
}

Expand Down
2 changes: 1 addition & 1 deletion lib/AST/Decl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -972,7 +972,7 @@ NamedDecl::getExplicitVisibility(ExplicitVisibilityKind kind) const {
kind);

// Use the most recent declaration.
const NamedDecl *MostRecent = cast<NamedDecl>(this->getMostRecentDecl());
const NamedDecl *MostRecent = getMostRecentDecl();
if (MostRecent != this)
return MostRecent->getExplicitVisibility(kind);

Expand Down
6 changes: 2 additions & 4 deletions lib/Analysis/ThreadSafety.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,7 @@ class SExpr {
} else if (const CXXMemberCallExpr *CMCE = dyn_cast<CXXMemberCallExpr>(Exp)) {
// When calling a function with a lock_returned attribute, replace
// the function call with the expression in lock_returned.
const CXXMethodDecl* MD =
cast<CXXMethodDecl>(CMCE->getMethodDecl()->getMostRecentDecl());
const CXXMethodDecl *MD = CMCE->getMethodDecl()->getMostRecentDecl();
if (LockReturnedAttr* At = MD->getAttr<LockReturnedAttr>()) {
CallingContext LRCallCtx(CMCE->getMethodDecl());
LRCallCtx.SelfArg = CMCE->getImplicitObjectArgument();
Expand Down Expand Up @@ -353,8 +352,7 @@ class SExpr {
NodeVec[Root].setSize(Sz + 1);
return Sz + 1;
} else if (const CallExpr *CE = dyn_cast<CallExpr>(Exp)) {
const FunctionDecl* FD =
cast<FunctionDecl>(CE->getDirectCallee()->getMostRecentDecl());
const FunctionDecl *FD = CE->getDirectCallee()->getMostRecentDecl();
if (LockReturnedAttr* At = FD->getAttr<LockReturnedAttr>()) {
CallingContext LRCallCtx(CE->getDirectCallee());
LRCallCtx.NumArgs = CE->getNumArgs();
Expand Down
2 changes: 1 addition & 1 deletion lib/Sema/SemaDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4487,7 +4487,7 @@ NamedDecl *Sema::findLocallyScopedExternCDecl(DeclarationName Name) {
}

NamedDecl *D = LocallyScopedExternCDecls.lookup(Name);
return D ? cast<NamedDecl>(D->getMostRecentDecl()) : 0;
return D ? D->getMostRecentDecl() : 0;
}

/// \brief Diagnose function specifiers on a declaration of an identifier that
Expand Down
2 changes: 1 addition & 1 deletion lib/Serialization/ASTReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7580,7 +7580,7 @@ void ASTReader::FinishedDeserializing() {
}

void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
D = cast<NamedDecl>(D->getMostRecentDecl());
D = D->getMostRecentDecl();

if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
SemaObj->TUScope->AddDecl(D);
Expand Down

0 comments on commit 87bcee8

Please sign in to comment.