@@ -1712,21 +1712,42 @@ UnaryExprOrTypeTraitExpr::UnaryExprOrTypeTraitExpr(
1712
1712
}
1713
1713
1714
1714
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,
1717
1720
ExprValueKind VK, ExprObjectKind OK,
1718
1721
NonOdrUseReason NOUR)
1719
1722
: Expr(MemberExprClass, T, VK, OK), Base(Base), MemberDecl(MemberDecl),
1720
1723
MemberDNLoc(NameInfo.getInfo()), MemberLoc(NameInfo.getLoc()) {
1721
1724
assert(!NameInfo.getName() ||
1722
1725
MemberDecl->getDeclName() == NameInfo.getName());
1723
1726
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();
1727
1733
MemberExprBits.HadMultipleCandidates = false;
1728
1734
MemberExprBits.NonOdrUseReason = NOUR;
1729
1735
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
+ }
1730
1751
setDependence(computeDependence(this));
1731
1752
}
1732
1753
@@ -1747,36 +1768,9 @@ MemberExpr *MemberExpr::Create(
1747
1768
TemplateArgs ? TemplateArgs->size() : 0);
1748
1769
1749
1770
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);
1780
1774
}
1781
1775
1782
1776
MemberExpr *MemberExpr::CreateEmpty(const ASTContext &Context,
0 commit comments