aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Serialization/ASTWriterStmt.cpp
diff options
context:
space:
mode:
authorKrystian Stasiowski <sdkrystian@gmail.com>2024-07-11 18:49:35 -0400
committerGitHub <noreply@github.com>2024-07-11 18:49:35 -0400
commitce4aada6e2135e29839f672a6599db628b53295d (patch)
treed686b3d0c448339db2f1a7baf9ec51e953ad8a0c /clang/lib/Serialization/ASTWriterStmt.cpp
parentac304d5ffdea7676582e987f75caeba33355a5dd (diff)
downloadllvm-ce4aada6e2135e29839f672a6599db628b53295d.zip
llvm-ce4aada6e2135e29839f672a6599db628b53295d.tar.gz
llvm-ce4aada6e2135e29839f672a6599db628b53295d.tar.bz2
Reapply "[Clang] Implement resolution for CWG1835 (#92957)" (#98547)
Reapplies #92957, fixing an instance where the `template` keyword was missing prior to a dependent name in `llvm/ADT/ArrayRef.h`. An _alias-declaration_ is used to work around a bug affecting GCC releases before 11.1 (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94799) which rejects the use of the `template` keyword prior to the _nested-name-specifier_ in the class member access.
Diffstat (limited to 'clang/lib/Serialization/ASTWriterStmt.cpp')
-rw-r--r--clang/lib/Serialization/ASTWriterStmt.cpp43
1 files changed, 25 insertions, 18 deletions
diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp
index ea49901..30c5b1b 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/lib/Serialization/ASTWriterStmt.cpp
@@ -1988,34 +1988,41 @@ void ASTStmtWriter::VisitCXXDependentScopeMemberExpr(
CXXDependentScopeMemberExpr *E) {
VisitExpr(E);
- // Don't emit anything here (or if you do you will have to update
- // the corresponding deserialization function).
- Record.push_back(E->getNumTemplateArgs());
- CurrentPackingBits.updateBits();
- CurrentPackingBits.addBit(E->hasTemplateKWAndArgsInfo());
- CurrentPackingBits.addBit(E->hasFirstQualifierFoundInScope());
-
- if (E->hasTemplateKWAndArgsInfo()) {
- const ASTTemplateKWAndArgsInfo &ArgInfo =
- *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
- AddTemplateKWAndArgsInfo(ArgInfo,
- E->getTrailingObjects<TemplateArgumentLoc>());
- }
+ bool HasQualifier = E->hasQualifier();
+ unsigned NumUnqualifiedLookups = E->getNumUnqualifiedLookups();
+ bool HasTemplateInfo = E->hasTemplateKWAndArgsInfo();
+ unsigned NumTemplateArgs = E->getNumTemplateArgs();
- CurrentPackingBits.addBit(E->isArrow());
+ // Write these first for easy access when deserializing, as they affect the
+ // size of the CXXDependentScopeMemberExpr.
+ CurrentPackingBits.updateBits();
+ CurrentPackingBits.addBit(HasQualifier);
+ CurrentPackingBits.addBit(HasTemplateInfo);
+ Record.push_back(NumUnqualifiedLookups);
+ Record.push_back(NumTemplateArgs);
Record.AddTypeRef(E->getBaseType());
- Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
+ CurrentPackingBits.addBit(E->isArrow());
CurrentPackingBits.addBit(!E->isImplicitAccess());
if (!E->isImplicitAccess())
Record.AddStmt(E->getBase());
Record.AddSourceLocation(E->getOperatorLoc());
- if (E->hasFirstQualifierFoundInScope())
- Record.AddDeclRef(E->getFirstQualifierFoundInScope());
-
Record.AddDeclarationNameInfo(E->MemberNameInfo);
+
+ if (HasQualifier)
+ Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
+
+ for (DeclAccessPair D : E->unqualified_lookups()) {
+ Record.AddDeclRef(D.getDecl());
+ Record.push_back(D.getAccess());
+ }
+
+ if (HasTemplateInfo)
+ AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
+ E->getTrailingObjects<TemplateArgumentLoc>());
+
Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;
}