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