From: Richard Smith Date: Tue, 11 Jun 2019 23:51:46 +0000 (+0000) Subject: Mark declarations as referenced by a default argument in a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f80fa1d28cd7d31f1744cfffa90f804e4578e9ac;p=clang Mark declarations as referenced by a default argument in a potentially-evaluated context. This applies even if the use of the default argument is within an unevaluated context. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@363113 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index ed39278b1a..d444a35be8 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -4855,6 +4855,8 @@ bool Sema::CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, // We already type-checked the argument, so we know it works. // Just mark all of the declarations in this potentially-evaluated expression // as being "referenced". + EnterExpressionEvaluationContext EvalContext( + *this, ExpressionEvaluationContext::PotentiallyEvaluated, Param); MarkDeclarationsReferencedInExpr(Param->getDefaultArg(), /*SkipLocalVariables=*/true); return false; diff --git a/test/SemaTemplate/default-arguments.cpp b/test/SemaTemplate/default-arguments.cpp index b5b042c64a..882b279de1 100644 --- a/test/SemaTemplate/default-arguments.cpp +++ b/test/SemaTemplate/default-arguments.cpp @@ -223,3 +223,9 @@ namespace friends { X *p; } } + +namespace unevaluated { + int a; + template int f(int = a); // expected-warning 0-1{{extension}} + int k = sizeof(f()); +}