@@ -18350,8 +18350,9 @@ void Sema::CleanupVarDeclMarking() {
1835018350 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
1835118351}
1835218352
18353- static void DoMarkVarDeclReferenced(Sema &SemaRef, SourceLocation Loc,
18354- VarDecl *Var, Expr *E) {
18353+ static void DoMarkVarDeclReferenced(
18354+ Sema &SemaRef, SourceLocation Loc, VarDecl *Var, Expr *E,
18355+ llvm::DenseMap<const VarDecl *, int> &RefsMinusAssignments) {
1835518356 assert((!E || isa<DeclRefExpr>(E) || isa<MemberExpr>(E) ||
1835618357 isa<FunctionParmPackExpr>(E)) &&
1835718358 "Invalid Expr argument to DoMarkVarDeclReferenced");
@@ -18368,6 +18369,10 @@ static void DoMarkVarDeclReferenced(Sema &SemaRef, SourceLocation Loc,
1836818369 bool UsableInConstantExpr =
1836918370 Var->mightBeUsableInConstantExpressions(SemaRef.Context);
1837018371
18372+ if (Var->isLocalVarDeclOrParm() && !Var->hasExternalStorage()) {
18373+ RefsMinusAssignments.insert({Var, 0}).first->getSecond()++;
18374+ }
18375+
1837118376 // C++20 [expr.const]p12:
1837218377 // A variable [...] is needed for constant evaluation if it is [...] a
1837318378 // variable whose name appears as a potentially constant evaluated
@@ -18523,16 +18528,18 @@ static void DoMarkVarDeclReferenced(Sema &SemaRef, SourceLocation Loc,
1852318528/// (C++ [basic.def.odr]p2, C99 6.9p3). Note that this should not be
1852418529/// used directly for normal expressions referring to VarDecl.
1852518530void Sema::MarkVariableReferenced(SourceLocation Loc, VarDecl *Var) {
18526- DoMarkVarDeclReferenced(*this, Loc, Var, nullptr);
18531+ DoMarkVarDeclReferenced(*this, Loc, Var, nullptr, RefsMinusAssignments );
1852718532}
1852818533
18529- static void MarkExprReferenced(Sema &SemaRef, SourceLocation Loc,
18530- Decl *D, Expr *E, bool MightBeOdrUse) {
18534+ static void
18535+ MarkExprReferenced(Sema &SemaRef, SourceLocation Loc, Decl *D, Expr *E,
18536+ bool MightBeOdrUse,
18537+ llvm::DenseMap<const VarDecl *, int> &RefsMinusAssignments) {
1853118538 if (SemaRef.isInOpenMPDeclareTargetContext())
1853218539 SemaRef.checkDeclIsAllowedInOpenMPTarget(E, D);
1853318540
1853418541 if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
18535- DoMarkVarDeclReferenced(SemaRef, Loc, Var, E);
18542+ DoMarkVarDeclReferenced(SemaRef, Loc, Var, E, RefsMinusAssignments );
1853618543 return;
1853718544 }
1853818545
@@ -18578,7 +18585,8 @@ void Sema::MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base) {
1857818585 if (!isConstantEvaluated() && FD->isConsteval() &&
1857918586 !RebuildingImmediateInvocation)
1858018587 ExprEvalContexts.back().ReferenceToConsteval.insert(E);
18581- MarkExprReferenced(*this, E->getLocation(), E->getDecl(), E, OdrUse);
18588+ MarkExprReferenced(*this, E->getLocation(), E->getDecl(), E, OdrUse,
18589+ RefsMinusAssignments);
1858218590}
1858318591
1858418592/// Perform reference-marking and odr-use handling for a MemberExpr.
@@ -18597,13 +18605,15 @@ void Sema::MarkMemberReferenced(MemberExpr *E) {
1859718605 }
1859818606 SourceLocation Loc =
1859918607 E->getMemberLoc().isValid() ? E->getMemberLoc() : E->getBeginLoc();
18600- MarkExprReferenced(*this, Loc, E->getMemberDecl(), E, MightBeOdrUse);
18608+ MarkExprReferenced(*this, Loc, E->getMemberDecl(), E, MightBeOdrUse,
18609+ RefsMinusAssignments);
1860118610}
1860218611
1860318612/// Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
1860418613void Sema::MarkFunctionParmPackReferenced(FunctionParmPackExpr *E) {
1860518614 for (VarDecl *VD : *E)
18606- MarkExprReferenced(*this, E->getParameterPackLocation(), VD, E, true);
18615+ MarkExprReferenced(*this, E->getParameterPackLocation(), VD, E, true,
18616+ RefsMinusAssignments);
1860718617}
1860818618
1860918619/// Perform marking for a reference to an arbitrary declaration. It
0 commit comments