Skip to content

Commit d257fa4

Browse files
committed
[Clang][AST][NFC] MemberExpr stores NestedNameSpecifierLoc and DeclAccessPair separately
1 parent f914e8e commit d257fa4

File tree

5 files changed

+53
-72
lines changed

5 files changed

+53
-72
lines changed

clang/include/clang/AST/Expr.h

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3163,23 +3163,12 @@ class CallExpr : public Expr {
31633163
}
31643164
};
31653165

3166-
/// Extra data stored in some MemberExpr objects.
3167-
struct MemberExprNameQualifier {
3168-
/// The nested-name-specifier that qualifies the name, including
3169-
/// source-location information.
3170-
NestedNameSpecifierLoc QualifierLoc;
3171-
3172-
/// The DeclAccessPair through which the MemberDecl was found due to
3173-
/// name qualifiers.
3174-
DeclAccessPair FoundDecl;
3175-
};
3176-
31773166
/// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F.
31783167
///
31793168
class MemberExpr final
31803169
: public Expr,
3181-
private llvm::TrailingObjects<MemberExpr, MemberExprNameQualifier,
3182-
ASTTemplateKWAndArgsInfo,
3170+
private llvm::TrailingObjects<MemberExpr, NestedNameSpecifierLoc,
3171+
DeclAccessPair, ASTTemplateKWAndArgsInfo,
31833172
TemplateArgumentLoc> {
31843173
friend class ASTReader;
31853174
friend class ASTStmtReader;
@@ -3201,17 +3190,19 @@ class MemberExpr final
32013190
/// MemberLoc - This is the location of the member name.
32023191
SourceLocation MemberLoc;
32033192

3204-
size_t numTrailingObjects(OverloadToken<MemberExprNameQualifier>) const {
3205-
return hasQualifierOrFoundDecl();
3193+
size_t numTrailingObjects(OverloadToken<NestedNameSpecifierLoc>) const {
3194+
return hasQualifier();
3195+
}
3196+
3197+
size_t numTrailingObjects(OverloadToken<DeclAccessPair>) const {
3198+
return hasFoundDecl();
32063199
}
32073200

32083201
size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
32093202
return hasTemplateKWAndArgsInfo();
32103203
}
32113204

3212-
bool hasQualifierOrFoundDecl() const {
3213-
return MemberExprBits.HasQualifierOrFoundDecl;
3214-
}
3205+
bool hasFoundDecl() const { return MemberExprBits.HasFoundDecl; }
32153206

32163207
bool hasTemplateKWAndArgsInfo() const {
32173208
return MemberExprBits.HasTemplateKWAndArgsInfo;
@@ -3264,24 +3255,24 @@ class MemberExpr final
32643255

32653256
/// Retrieves the declaration found by lookup.
32663257
DeclAccessPair getFoundDecl() const {
3267-
if (!hasQualifierOrFoundDecl())
3258+
if (!hasFoundDecl())
32683259
return DeclAccessPair::make(getMemberDecl(),
32693260
getMemberDecl()->getAccess());
3270-
return getTrailingObjects<MemberExprNameQualifier>()->FoundDecl;
3261+
return *getTrailingObjects<DeclAccessPair>();
32713262
}
32723263

32733264
/// Determines whether this member expression actually had
32743265
/// a C++ nested-name-specifier prior to the name of the member, e.g.,
32753266
/// x->Base::foo.
3276-
bool hasQualifier() const { return getQualifier() != nullptr; }
3267+
bool hasQualifier() const { return MemberExprBits.HasQualifier; }
32773268

32783269
/// If the member name was qualified, retrieves the
32793270
/// nested-name-specifier that precedes the member name, with source-location
32803271
/// information.
32813272
NestedNameSpecifierLoc getQualifierLoc() const {
3282-
if (!hasQualifierOrFoundDecl())
3273+
if (!hasQualifier())
32833274
return NestedNameSpecifierLoc();
3284-
return getTrailingObjects<MemberExprNameQualifier>()->QualifierLoc;
3275+
return *getTrailingObjects<NestedNameSpecifierLoc>();
32853276
}
32863277

32873278
/// If the member name was qualified, retrieves the

clang/include/clang/AST/Stmt.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -583,11 +583,13 @@ class alignas(void *) Stmt {
583583
unsigned IsArrow : 1;
584584

585585
/// True if this member expression used a nested-name-specifier to
586-
/// refer to the member, e.g., "x->Base::f", or found its member via
587-
/// a using declaration. When true, a MemberExprNameQualifier
588-
/// structure is allocated immediately after the MemberExpr.
586+
/// refer to the member, e.g., "x->Base::f".
589587
LLVM_PREFERRED_TYPE(bool)
590-
unsigned HasQualifierOrFoundDecl : 1;
588+
unsigned HasQualifier : 1;
589+
590+
// True if this member expression found its member via a using declaration.
591+
LLVM_PREFERRED_TYPE(bool)
592+
unsigned HasFoundDecl : 1;
591593

592594
/// True if this member expression specified a template keyword
593595
/// and/or a template argument list explicitly, e.g., x->f<int>,

clang/lib/AST/Expr.cpp

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,7 +1721,8 @@ MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
17211721
assert(!NameInfo.getName() ||
17221722
MemberDecl->getDeclName() == NameInfo.getName());
17231723
MemberExprBits.IsArrow = IsArrow;
1724-
MemberExprBits.HasQualifierOrFoundDecl = false;
1724+
MemberExprBits.HasQualifier = false;
1725+
MemberExprBits.HasFoundDecl = false;
17251726
MemberExprBits.HasTemplateKWAndArgsInfo = false;
17261727
MemberExprBits.HadMultipleCandidates = false;
17271728
MemberExprBits.NonOdrUseReason = NOUR;
@@ -1735,30 +1736,29 @@ MemberExpr *MemberExpr::Create(
17351736
ValueDecl *MemberDecl, DeclAccessPair FoundDecl,
17361737
DeclarationNameInfo NameInfo, const TemplateArgumentListInfo *TemplateArgs,
17371738
QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR) {
1738-
bool HasQualOrFound = QualifierLoc || FoundDecl.getDecl() != MemberDecl ||
1739-
FoundDecl.getAccess() != MemberDecl->getAccess();
1739+
bool HasQualifier = QualifierLoc.hasQualifier();
1740+
bool HasFoundDecl = FoundDecl.getDecl() != MemberDecl ||
1741+
FoundDecl.getAccess() != MemberDecl->getAccess();
17401742
bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid();
17411743
std::size_t Size =
1742-
totalSizeToAlloc<MemberExprNameQualifier, ASTTemplateKWAndArgsInfo,
1743-
TemplateArgumentLoc>(
1744-
HasQualOrFound ? 1 : 0, HasTemplateKWAndArgsInfo ? 1 : 0,
1744+
totalSizeToAlloc<NestedNameSpecifierLoc, DeclAccessPair,
1745+
ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1746+
HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
17451747
TemplateArgs ? TemplateArgs->size() : 0);
17461748

17471749
void *Mem = C.Allocate(Size, alignof(MemberExpr));
17481750
MemberExpr *E = new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, MemberDecl,
17491751
NameInfo, T, VK, OK, NOUR);
17501752

1751-
if (HasQualOrFound) {
1752-
E->MemberExprBits.HasQualifierOrFoundDecl = true;
1753-
1754-
MemberExprNameQualifier *NQ =
1755-
E->getTrailingObjects<MemberExprNameQualifier>();
1756-
NQ->QualifierLoc = QualifierLoc;
1757-
NQ->FoundDecl = FoundDecl;
1758-
}
1753+
E->MemberExprBits.HasQualifier = HasQualifier;
1754+
E->MemberExprBits.HasFoundDecl = HasFoundDecl;
1755+
E->MemberExprBits.HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
17591756

1760-
E->MemberExprBits.HasTemplateKWAndArgsInfo =
1761-
TemplateArgs || TemplateKWLoc.isValid();
1757+
if (HasQualifier)
1758+
new (E->getTrailingObjects<NestedNameSpecifierLoc>())
1759+
NestedNameSpecifierLoc(QualifierLoc);
1760+
if (HasFoundDecl)
1761+
*E->getTrailingObjects<DeclAccessPair>() = FoundDecl;
17621762

17631763
// FIXME: remove remaining dependence computation to computeDependence().
17641764
auto Deps = E->getDependence();
@@ -1785,12 +1785,11 @@ MemberExpr *MemberExpr::CreateEmpty(const ASTContext &Context,
17851785
unsigned NumTemplateArgs) {
17861786
assert((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
17871787
"template args but no template arg info?");
1788-
bool HasQualOrFound = HasQualifier || HasFoundDecl;
17891788
std::size_t Size =
1790-
totalSizeToAlloc<MemberExprNameQualifier, ASTTemplateKWAndArgsInfo,
1791-
TemplateArgumentLoc>(HasQualOrFound ? 1 : 0,
1792-
HasTemplateKWAndArgsInfo ? 1 : 0,
1793-
NumTemplateArgs);
1789+
totalSizeToAlloc<NestedNameSpecifierLoc, DeclAccessPair,
1790+
ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1791+
HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1792+
NumTemplateArgs);
17941793
void *Mem = Context.Allocate(Size, alignof(MemberExpr));
17951794
return new (Mem) MemberExpr(EmptyShell());
17961795
}

clang/lib/Serialization/ASTReaderStmt.cpp

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,30 +1047,22 @@ void ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
10471047
E->MemberDNLoc = Record.readDeclarationNameLoc(E->MemberDecl->getDeclName());
10481048
E->MemberLoc = Record.readSourceLocation();
10491049
E->MemberExprBits.IsArrow = CurrentUnpackingBits->getNextBit();
1050-
E->MemberExprBits.HasQualifierOrFoundDecl = HasQualifier || HasFoundDecl;
1050+
E->MemberExprBits.HasQualifier = HasQualifier;
1051+
E->MemberExprBits.HasFoundDecl = HasFoundDecl;
10511052
E->MemberExprBits.HasTemplateKWAndArgsInfo = HasTemplateInfo;
10521053
E->MemberExprBits.HadMultipleCandidates = CurrentUnpackingBits->getNextBit();
10531054
E->MemberExprBits.NonOdrUseReason =
10541055
CurrentUnpackingBits->getNextBits(/*Width=*/2);
10551056
E->MemberExprBits.OperatorLoc = Record.readSourceLocation();
10561057

1057-
if (HasQualifier || HasFoundDecl) {
1058-
DeclAccessPair FoundDecl;
1059-
if (HasFoundDecl) {
1060-
auto *FoundD = Record.readDeclAs<NamedDecl>();
1061-
auto AS = (AccessSpecifier)CurrentUnpackingBits->getNextBits(/*Width=*/2);
1062-
FoundDecl = DeclAccessPair::make(FoundD, AS);
1063-
} else {
1064-
FoundDecl = DeclAccessPair::make(E->MemberDecl,
1065-
E->MemberDecl->getAccess());
1066-
}
1067-
E->getTrailingObjects<MemberExprNameQualifier>()->FoundDecl = FoundDecl;
1058+
if (HasQualifier)
1059+
new (E->getTrailingObjects<NestedNameSpecifierLoc>())
1060+
NestedNameSpecifierLoc(Record.readNestedNameSpecifierLoc());
10681061

1069-
NestedNameSpecifierLoc QualifierLoc;
1070-
if (HasQualifier)
1071-
QualifierLoc = Record.readNestedNameSpecifierLoc();
1072-
E->getTrailingObjects<MemberExprNameQualifier>()->QualifierLoc =
1073-
QualifierLoc;
1062+
if (HasFoundDecl) {
1063+
auto *FoundD = Record.readDeclAs<NamedDecl>();
1064+
auto AS = (AccessSpecifier)CurrentUnpackingBits->getNextBits(/*Width=*/2);
1065+
*E->getTrailingObjects<DeclAccessPair>() = DeclAccessPair::make(FoundD, AS);
10741066
}
10751067

10761068
if (HasTemplateInfo)

clang/lib/Serialization/ASTWriterStmt.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -970,10 +970,7 @@ void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {
970970
VisitExpr(E);
971971

972972
bool HasQualifier = E->hasQualifier();
973-
bool HasFoundDecl =
974-
E->hasQualifierOrFoundDecl() &&
975-
(E->getFoundDecl().getDecl() != E->getMemberDecl() ||
976-
E->getFoundDecl().getAccess() != E->getMemberDecl()->getAccess());
973+
bool HasFoundDecl = E->hasFoundDecl();
977974
bool HasTemplateInfo = E->hasTemplateKWAndArgsInfo();
978975
unsigned NumTemplateArgs = E->getNumTemplateArgs();
979976

@@ -995,15 +992,15 @@ void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {
995992
CurrentPackingBits.addBits(E->isNonOdrUse(), /*Width=*/2);
996993
Record.AddSourceLocation(E->getOperatorLoc());
997994

995+
if (HasQualifier)
996+
Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
997+
998998
if (HasFoundDecl) {
999999
DeclAccessPair FoundDecl = E->getFoundDecl();
10001000
Record.AddDeclRef(FoundDecl.getDecl());
10011001
CurrentPackingBits.addBits(FoundDecl.getAccess(), /*BitWidth=*/2);
10021002
}
10031003

1004-
if (HasQualifier)
1005-
Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
1006-
10071004
if (HasTemplateInfo)
10081005
AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
10091006
E->getTrailingObjects<TemplateArgumentLoc>());

0 commit comments

Comments
 (0)