@@ -18361,35 +18361,23 @@ enum class OdrUseContext {
1836118361/// Are we within a context in which references to resolved functions or to
1836218362/// variables result in odr-use?
1836318363static OdrUseContext isOdrUseContext(Sema &SemaRef) {
18364- OdrUseContext Result;
18364+ const Sema::ExpressionEvaluationContextRecord &Context =
18365+ SemaRef.currentEvaluationContext();
1836518366
18366- switch (SemaRef.ExprEvalContexts.back().Context) {
18367- case Sema::ExpressionEvaluationContext::Unevaluated:
18368- case Sema::ExpressionEvaluationContext::UnevaluatedList:
18369- case Sema::ExpressionEvaluationContext::UnevaluatedAbstract:
18370- return OdrUseContext::None;
18371-
18372- case Sema::ExpressionEvaluationContext::ConstantEvaluated:
18373- case Sema::ExpressionEvaluationContext::ImmediateFunctionContext:
18374- case Sema::ExpressionEvaluationContext::PotentiallyEvaluated:
18375- Result = OdrUseContext::Used;
18376- break;
18377-
18378- case Sema::ExpressionEvaluationContext::DiscardedStatement:
18379- Result = OdrUseContext::FormallyOdrUsed;
18380- break;
18381-
18382- case Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed:
18383- // A default argument formally results in odr-use, but doesn't actually
18384- // result in a use in any real sense until it itself is used.
18385- Result = OdrUseContext::FormallyOdrUsed;
18386- break;
18387- }
18367+ if (Context.isUnevaluated())
18368+ return OdrUseContext::None;
1838818369
1838918370 if (SemaRef.CurContext->isDependentContext())
1839018371 return OdrUseContext::Dependent;
1839118372
18392- return Result;
18373+ if (Context.isDiscardedStatementContext())
18374+ return OdrUseContext::FormallyOdrUsed;
18375+
18376+ else if (Context.Context ==
18377+ Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed)
18378+ return OdrUseContext::FormallyOdrUsed;
18379+
18380+ return OdrUseContext::Used;
1839318381}
1839418382
1839518383static bool isImplicitlyDefinableConstexprFunction(FunctionDecl *Func) {
@@ -20356,9 +20344,11 @@ MarkExprReferenced(Sema &SemaRef, SourceLocation Loc, Decl *D, Expr *E,
2035620344}
2035720345
2035820346void Sema::MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base) {
20359- // TODO: update this with DR# once a defect report is filed.
20360- // C++11 defect. The address of a pure member should not be an ODR use, even
20361- // if it's a qualified reference.
20347+ // [basic.def.odr] (CWG 1614)
20348+ // A function is named by an expression or conversion [...]
20349+ // unless it is a pure virtual function and either the expression is not an
20350+ // id-expression naming the function with an explicitly qualified name or
20351+ // the expression forms a pointer to member
2036220352 bool OdrUse = true;
2036320353 if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(E->getDecl()))
2036420354 if (Method->isVirtual() &&
0 commit comments