Skip to content

Commit 0cd44ff

Browse files
authored
[Clang][AST][NFC] Move template argument dependence computations for MemberExpr to computeDependence (#86682)
(This patch depends on #86678) Pretty straightforward change, addresses the FIXME's in `computeDependence(MemberExpr*)` and `MemberExpr::Create` by moving the template argument dependence computations to `computeDependence`.
1 parent a6d932b commit 0cd44ff

File tree

3 files changed

+37
-39
lines changed

3 files changed

+37
-39
lines changed

clang/include/clang/AST/Expr.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3209,9 +3209,11 @@ class MemberExpr final
32093209
}
32103210

32113211
MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
3212-
ValueDecl *MemberDecl, const DeclarationNameInfo &NameInfo,
3213-
QualType T, ExprValueKind VK, ExprObjectKind OK,
3214-
NonOdrUseReason NOUR);
3212+
NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
3213+
ValueDecl *MemberDecl, DeclAccessPair FoundDecl,
3214+
const DeclarationNameInfo &NameInfo,
3215+
const TemplateArgumentListInfo *TemplateArgs, QualType T,
3216+
ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR);
32153217
MemberExpr(EmptyShell Empty)
32163218
: Expr(MemberExprClass, Empty), Base(), MemberDecl() {}
32173219

clang/lib/AST/ComputeDependence.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,9 @@ ExprDependence clang::computeDependence(MemberExpr *E) {
654654
D |= toExprDependence(NNS->getDependence() &
655655
~NestedNameSpecifierDependence::Dependent);
656656

657+
for (const auto &A : E->template_arguments())
658+
D |= toExprDependence(A.getArgument().getDependence());
659+
657660
auto *MemberDecl = E->getMemberDecl();
658661
if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl)) {
659662
DeclContext *DC = MemberDecl->getDeclContext();
@@ -670,7 +673,6 @@ ExprDependence clang::computeDependence(MemberExpr *E) {
670673
D |= ExprDependence::Type;
671674
}
672675
}
673-
// FIXME: move remaining dependence computation from MemberExpr::Create()
674676
return D;
675677
}
676678

clang/lib/AST/Expr.cpp

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,21 +1712,42 @@ UnaryExprOrTypeTraitExpr::UnaryExprOrTypeTraitExpr(
17121712
}
17131713

17141714
MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
1715-
ValueDecl *MemberDecl,
1716-
const DeclarationNameInfo &NameInfo, QualType T,
1715+
NestedNameSpecifierLoc QualifierLoc,
1716+
SourceLocation TemplateKWLoc, ValueDecl *MemberDecl,
1717+
DeclAccessPair FoundDecl,
1718+
const DeclarationNameInfo &NameInfo,
1719+
const TemplateArgumentListInfo *TemplateArgs, QualType T,
17171720
ExprValueKind VK, ExprObjectKind OK,
17181721
NonOdrUseReason NOUR)
17191722
: Expr(MemberExprClass, T, VK, OK), Base(Base), MemberDecl(MemberDecl),
17201723
MemberDNLoc(NameInfo.getInfo()), MemberLoc(NameInfo.getLoc()) {
17211724
assert(!NameInfo.getName() ||
17221725
MemberDecl->getDeclName() == NameInfo.getName());
17231726
MemberExprBits.IsArrow = IsArrow;
1724-
MemberExprBits.HasQualifier = false;
1725-
MemberExprBits.HasFoundDecl = false;
1726-
MemberExprBits.HasTemplateKWAndArgsInfo = false;
1727+
MemberExprBits.HasQualifier = QualifierLoc.hasQualifier();
1728+
MemberExprBits.HasFoundDecl =
1729+
FoundDecl.getDecl() != MemberDecl ||
1730+
FoundDecl.getAccess() != MemberDecl->getAccess();
1731+
MemberExprBits.HasTemplateKWAndArgsInfo =
1732+
TemplateArgs || TemplateKWLoc.isValid();
17271733
MemberExprBits.HadMultipleCandidates = false;
17281734
MemberExprBits.NonOdrUseReason = NOUR;
17291735
MemberExprBits.OperatorLoc = OperatorLoc;
1736+
1737+
if (hasQualifier())
1738+
new (getTrailingObjects<NestedNameSpecifierLoc>())
1739+
NestedNameSpecifierLoc(QualifierLoc);
1740+
if (hasFoundDecl())
1741+
*getTrailingObjects<DeclAccessPair>() = FoundDecl;
1742+
if (TemplateArgs) {
1743+
auto Deps = TemplateArgumentDependence::None;
1744+
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1745+
TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1746+
Deps);
1747+
} else if (TemplateKWLoc.isValid()) {
1748+
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1749+
TemplateKWLoc);
1750+
}
17301751
setDependence(computeDependence(this));
17311752
}
17321753

@@ -1747,36 +1768,9 @@ MemberExpr *MemberExpr::Create(
17471768
TemplateArgs ? TemplateArgs->size() : 0);
17481769

17491770
void *Mem = C.Allocate(Size, alignof(MemberExpr));
1750-
MemberExpr *E = new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, MemberDecl,
1751-
NameInfo, T, VK, OK, NOUR);
1752-
1753-
E->MemberExprBits.HasQualifier = HasQualifier;
1754-
E->MemberExprBits.HasFoundDecl = HasFoundDecl;
1755-
E->MemberExprBits.HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
1756-
1757-
if (HasQualifier)
1758-
new (E->getTrailingObjects<NestedNameSpecifierLoc>())
1759-
NestedNameSpecifierLoc(QualifierLoc);
1760-
if (HasFoundDecl)
1761-
*E->getTrailingObjects<DeclAccessPair>() = FoundDecl;
1762-
1763-
// FIXME: remove remaining dependence computation to computeDependence().
1764-
auto Deps = E->getDependence();
1765-
if (TemplateArgs) {
1766-
auto TemplateArgDeps = TemplateArgumentDependence::None;
1767-
E->getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1768-
TemplateKWLoc, *TemplateArgs,
1769-
E->getTrailingObjects<TemplateArgumentLoc>(), TemplateArgDeps);
1770-
for (const TemplateArgumentLoc &ArgLoc : TemplateArgs->arguments()) {
1771-
Deps |= toExprDependence(ArgLoc.getArgument().getDependence());
1772-
}
1773-
} else if (TemplateKWLoc.isValid()) {
1774-
E->getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1775-
TemplateKWLoc);
1776-
}
1777-
E->setDependence(Deps);
1778-
1779-
return E;
1771+
return new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, QualifierLoc,
1772+
TemplateKWLoc, MemberDecl, FoundDecl, NameInfo,
1773+
TemplateArgs, T, VK, OK, NOUR);
17801774
}
17811775

17821776
MemberExpr *MemberExpr::CreateEmpty(const ASTContext &Context,

0 commit comments

Comments
 (0)