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