forked from OSchip/llvm-project
Refactor checks for unevaluated contexts into a common utility function.
The one caller that's surrounded by nearby code manipulating the underlying evaluation context list is left unmodified for readability. Review by Sean Silva and Richard Smith. llvm-svn: 161355
This commit is contained in:
parent
2da09fd794
commit
131fcb4a06
|
@ -5703,6 +5703,14 @@ public:
|
|||
/// diagnostics that will be suppressed.
|
||||
llvm::Optional<sema::TemplateDeductionInfo *> isSFINAEContext() const;
|
||||
|
||||
/// \brief Determines whether we are currently in a context that
|
||||
/// is not evaluated as per C++ [expr] p5.
|
||||
bool isUnevaluatedContext() const {
|
||||
assert(!ExprEvalContexts.empty() &&
|
||||
"Must be in an expression evaluation context");
|
||||
return ExprEvalContexts.back().Context == Sema::Unevaluated;
|
||||
}
|
||||
|
||||
/// \brief RAII class used to determine whether SFINAE has
|
||||
/// trapped any errors that occur during template argument
|
||||
/// deduction.`
|
||||
|
|
|
@ -4710,7 +4710,7 @@ void AnalyzeImplicitConversions(Sema &S, Expr *OrigE, SourceLocation CC) {
|
|||
/// conversion
|
||||
void Sema::CheckImplicitConversions(Expr *E, SourceLocation CC) {
|
||||
// Don't diagnose in unevaluated contexts.
|
||||
if (ExprEvalContexts.back().Context == Sema::Unevaluated)
|
||||
if (isUnevaluatedContext())
|
||||
return;
|
||||
|
||||
// Don't diagnose for value- or type-dependent expressions.
|
||||
|
|
|
@ -584,8 +584,7 @@ ExprResult Sema::DefaultArgumentPromotion(Expr *E) {
|
|||
// is a prvalue for the temporary.
|
||||
// FIXME: add some way to gate this entire thing for correctness in
|
||||
// potentially potentially evaluated contexts.
|
||||
if (getLangOpts().CPlusPlus && E->isGLValue() &&
|
||||
ExprEvalContexts.back().Context != Unevaluated) {
|
||||
if (getLangOpts().CPlusPlus && E->isGLValue() && !isUnevaluatedContext()) {
|
||||
ExprResult Temp = PerformCopyInitialization(
|
||||
InitializedEntity::InitializeTemporary(E->getType()),
|
||||
E->getExprLoc(),
|
||||
|
@ -2403,7 +2402,7 @@ Sema::BuildDeclarationNameExpr(const CXXScopeSpec &SS,
|
|||
// FIXME: Does the addition of const really only apply in
|
||||
// potentially-evaluated contexts? Since the variable isn't actually
|
||||
// captured in an unevaluated context, it seems that the answer is no.
|
||||
if (ExprEvalContexts.back().Context != Sema::Unevaluated) {
|
||||
if (!isUnevaluatedContext()) {
|
||||
QualType CapturedType = getCapturedDeclRefType(cast<VarDecl>(VD), Loc);
|
||||
if (!CapturedType.isNull())
|
||||
type = CapturedType;
|
||||
|
@ -10039,7 +10038,7 @@ namespace {
|
|||
// Error on DeclRefExprs referring to FieldDecls.
|
||||
ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
|
||||
if (isa<FieldDecl>(E->getDecl()) &&
|
||||
SemaRef.ExprEvalContexts.back().Context != Sema::Unevaluated)
|
||||
!SemaRef.isUnevaluatedContext())
|
||||
return SemaRef.Diag(E->getLocation(),
|
||||
diag::err_invalid_non_static_member_use)
|
||||
<< E->getDecl() << E->getSourceRange();
|
||||
|
|
|
@ -1085,7 +1085,7 @@ static QualType inferARCLifetimeForPointee(Sema &S, QualType type,
|
|||
|
||||
// If we are in an unevaluated context, like sizeof, skip adding a
|
||||
// qualification.
|
||||
} else if (S.ExprEvalContexts.back().Context == Sema::Unevaluated) {
|
||||
} else if (S.isUnevaluatedContext()) {
|
||||
return type;
|
||||
|
||||
// If that failed, give an error and recover using __strong. __strong
|
||||
|
|
Loading…
Reference in New Issue