diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -4528,9 +4528,7 @@ /// Determine whether this materialized temporary is bound to an /// lvalue reference; otherwise, it's bound to an rvalue reference. - bool isBoundToLvalueReference() const { - return getValueKind() == VK_LValue; - } + bool isBoundToLvalueReference() const { return isLValue(); } /// Determine whether this temporary object is usable in constant /// expressions, as specified in C++20 [expr.const]p4. diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -2401,7 +2401,7 @@ // In C++11, discarded-value expressions of a certain form are special, // according to [expr]p10: // The lvalue-to-rvalue conversion (4.1) is applied only if the - // expression is an lvalue of volatile-qualified type and it has + // expression is a glvalue of volatile-qualified type and it has // one of the following forms: if (!isGLValue() || !getType().isVolatileQualified()) return false; @@ -3869,8 +3869,7 @@ const ObjCPropertyRefExpr *Expr::getObjCProperty() const { const Expr *E = this; while (true) { - assert((E->getValueKind() == VK_LValue && - E->getObjectKind() == OK_ObjCProperty) && + assert((E->isLValue() && E->getObjectKind() == OK_ObjCProperty) && "expression is not a property reference"); E = E->IgnoreParenCasts(); if (const BinaryOperator *BO = dyn_cast(E)) { @@ -3909,7 +3908,7 @@ while (ImplicitCastExpr *ICE = dyn_cast(E)) { if (ICE->getCastKind() == CK_LValueToRValue || - (ICE->getValueKind() != VK_PRValue && ICE->getCastKind() == CK_NoOp)) + (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp)) E = ICE->getSubExpr()->IgnoreParens(); else break; @@ -3956,7 +3955,7 @@ const Expr *E = this->IgnoreParens(); while (const ImplicitCastExpr *ICE = dyn_cast(E)) { - if (ICE->getValueKind() != VK_PRValue && ICE->getCastKind() == CK_NoOp) + if (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp) E = ICE->getSubExpr()->IgnoreParens(); else break; diff --git a/clang/lib/AST/ExprClassification.cpp b/clang/lib/AST/ExprClassification.cpp --- a/clang/lib/AST/ExprClassification.cpp +++ b/clang/lib/AST/ExprClassification.cpp @@ -53,8 +53,12 @@ // Enable this assertion for testing. switch (kind) { - case Cl::CL_LValue: assert(getValueKind() == VK_LValue); break; - case Cl::CL_XValue: assert(getValueKind() == VK_XValue); break; + case Cl::CL_LValue: + assert(isLValue()); + break; + case Cl::CL_XValue: + assert(isXValue()); + break; case Cl::CL_Function: case Cl::CL_Void: case Cl::CL_AddressableVoid: @@ -65,7 +69,7 @@ case Cl::CL_ArrayTemporary: case Cl::CL_ObjCMessageRValue: case Cl::CL_PRValue: - assert(getValueKind() == VK_PRValue); + assert(isPRValue()); break; } diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -714,10 +714,10 @@ } // If it was an l-value, use objc_copyWeak. - if (srcExpr->getValueKind() == VK_LValue) { + if (srcExpr->isLValue()) { CGF.EmitARCCopyWeak(destLV.getAddress(CGF), srcAddr); } else { - assert(srcExpr->getValueKind() == VK_XValue); + assert(srcExpr->isXValue()); CGF.EmitARCMoveWeak(destLV.getAddress(CGF), srcAddr); } return true; diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -1965,7 +1965,7 @@ if (const ImplicitCastExpr *ICE = dyn_cast(CE)) { // And that glvalue casts are never null. - if (ICE->getValueKind() != VK_PRValue) + if (ICE->isGLValue()) return false; } diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -609,7 +609,7 @@ // C++1z [conv.array]: The temporary materialization conversion is applied. // We also use this to fuel C++ DR1213, which applies to C++11 onwards. if (Kind == CK_ArrayToPointerDecay && getLangOpts().CPlusPlus && - E->getValueKind() == VK_PRValue) { + E->isPRValue()) { // The temporary is an lvalue in C++98 and an xvalue otherwise. ExprResult Materialized = CreateMaterializeTemporaryExpr( E->getType(), E, !getLangOpts().CPlusPlus11); diff --git a/clang/lib/Sema/SemaCoroutine.cpp b/clang/lib/Sema/SemaCoroutine.cpp --- a/clang/lib/Sema/SemaCoroutine.cpp +++ b/clang/lib/Sema/SemaCoroutine.cpp @@ -897,7 +897,7 @@ // If the expression is a temporary, materialize it as an lvalue so that we // can use it multiple times. - if (E->getValueKind() == VK_PRValue) + if (E->isPRValue()) E = CreateMaterializeTemporaryExpr(E->getType(), E, true); // The location of the `co_await` token cannot be used when constructing @@ -957,7 +957,7 @@ // If the expression is a temporary, materialize it as an lvalue so that we // can use it multiple times. - if (E->getValueKind() == VK_PRValue) + if (E->isPRValue()) E = CreateMaterializeTemporaryExpr(E->getType(), E, true); // Build the await_ready, await_suspend, await_resume calls. diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -5541,7 +5541,7 @@ BaseExpr = LHSExp; // vectors: V[123] IndexExpr = RHSExp; // We apply C++ DR1213 to vector subscripting too. - if (getLangOpts().CPlusPlus11 && LHSExp->getValueKind() == VK_PRValue) { + if (getLangOpts().CPlusPlus11 && LHSExp->isPRValue()) { ExprResult Materialized = TemporaryMaterializationConversion(LHSExp); if (Materialized.isInvalid()) return ExprError(); @@ -10129,7 +10129,7 @@ RHSType, DiagID)) return RHSType; } else { - if (LHS.get()->getValueKind() == VK_LValue || + if (LHS.get()->isLValue() || !tryGCCVectorConvertAndSplat(*this, &LHS, &RHS)) return RHSType; } @@ -14852,7 +14852,7 @@ // complex l-values to ordinary l-values and all other values to r-values. if (Input.isInvalid()) return ExprError(); if (Opc == UO_Real || Input.get()->getType()->isAnyComplexType()) { - if (Input.get()->getValueKind() != VK_PRValue && + if (Input.get()->isGLValue() && Input.get()->getObjectKind() == OK_Ordinary) VK = Input.get()->getValueKind(); } else if (!getLangOpts().CPlusPlus) { @@ -19049,7 +19049,7 @@ Expr *SubExpr = SubResult.get(); E->setSubExpr(SubExpr); E->setType(S.Context.getPointerType(SubExpr->getType())); - assert(E->getValueKind() == VK_PRValue); + assert(E->isPRValue()); assert(E->getObjectKind() == OK_Ordinary); return E; } @@ -19059,7 +19059,7 @@ E->setType(VD->getType()); - assert(E->getValueKind() == VK_PRValue); + assert(E->isPRValue()); if (S.getLangOpts().CPlusPlus && !(isa(VD) && cast(VD)->isInstance())) @@ -19150,7 +19150,7 @@ return ExprError(); } - assert(E->getValueKind() == VK_PRValue); + assert(E->isPRValue()); assert(E->getObjectKind() == OK_Ordinary); E->setType(DestType); @@ -19304,7 +19304,7 @@ ExprResult RebuildUnknownAnyExpr::VisitImplicitCastExpr(ImplicitCastExpr *E) { // The only case we should ever see here is a function-to-pointer decay. if (E->getCastKind() == CK_FunctionToPointerDecay) { - assert(E->getValueKind() == VK_PRValue); + assert(E->isPRValue()); assert(E->getObjectKind() == OK_Ordinary); E->setType(DestType); @@ -19318,7 +19318,7 @@ E->setSubExpr(Result.get()); return E; } else if (E->getCastKind() == CK_LValueToRValue) { - assert(E->getValueKind() == VK_PRValue); + assert(E->isPRValue()); assert(E->getObjectKind() == OK_Ordinary); assert(isa(E->getType())); diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -6870,7 +6870,7 @@ assert(!isa(E) && "Double-bound temporary?"); // If the result is a glvalue, we shouldn't bind it. - if (!E->isPRValue()) + if (E->isGLValue()) return E; // In ARC, calls that return a retainable type can return retained, diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -5832,7 +5832,7 @@ Entity.getType()) && canPerformArrayCopy(Entity)) { // If source is a prvalue, use it directly. - if (Initializer->getValueKind() == VK_PRValue) { + if (Initializer->isPRValue()) { AddArrayInitStep(DestType, /*IsGNUExtension*/false); return; }