Home | History | Annotate | Download | only in AST

Lines Matching refs:Expr

9 // This file implements Expr::classify.
13 #include "clang/AST/Expr.h"
24 using Cl = Expr::Classification;
26 static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E);
32 const Expr *trueExpr,
33 const Expr *falseExpr);
34 static Cl::ModifiableType IsModifiable(ASTContext &Ctx, const Expr *E,
37 Cl Expr::ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const {
89 const Expr *E,
102 static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E) {
109 #define STMT(Kind, Base) case Expr::Kind##Class:
110 #define EXPR(Kind, Base)
115 case Expr::ObjCIsaExprClass:
116 // C++ [expr.prim.general]p1: A string literal is an lvalue.
117 case Expr::StringLiteralClass:
119 case Expr::ObjCEncodeExprClass:
121 case Expr::PredefinedExprClass:
123 case Expr::ObjCSubscriptRefExprClass:
124 case Expr::ObjCPropertyRefExprClass:
125 // C++ [expr.typeid]p1: The result of a typeid expression is an lvalue of...
126 case Expr::CXXTypeidExprClass:
127 case Expr::CXXUuidofExprClass:
130 case Expr::UnresolvedLookupExprClass:
131 case Expr::UnresolvedMemberExprClass:
132 case Expr::TypoExprClass:
133 case Expr::DependentCoawaitExprClass:
134 case Expr::CXXDependentScopeMemberExprClass:
135 case Expr::DependentScopeDeclRefExprClass:
138 case Expr::ObjCIvarRefExprClass:
139 case Expr::FunctionParmPackExprClass:
140 case Expr::MSPropertyRefExprClass:
141 case Expr::MSPropertySubscriptExprClass:
142 case Expr::OMPArraySectionExprClass:
143 case Expr::OMPArrayShapingExprClass:
144 case Expr::OMPIteratorExprClass:
149 case Expr::CompoundLiteralExprClass:
153 case Expr::CXXBoolLiteralExprClass:
154 case Expr::CXXPseudoDestructorExprClass:
155 case Expr::UnaryExprOrTypeTraitExprClass:
156 case Expr::CXXNewExprClass:
157 case Expr::CXXThisExprClass:
158 case Expr::CXXNullPtrLiteralExprClass:
159 case Expr::ImaginaryLiteralClass:
160 case Expr::GNUNullExprClass:
161 case Expr::OffsetOfExprClass:
162 case Expr::CXXThrowExprClass:
163 case Expr::ShuffleVectorExprClass:
164 case Expr::ConvertVectorExprClass:
165 case Expr::IntegerLiteralClass:
166 case Expr::FixedPointLiteralClass:
167 case Expr::CharacterLiteralClass:
168 case Expr::AddrLabelExprClass:
169 case Expr::CXXDeleteExprClass:
170 case Expr::ImplicitValueInitExprClass:
171 case Expr::BlockExprClass:
172 case Expr::FloatingLiteralClass:
173 case Expr::CXXNoexceptExprClass:
174 case Expr::CXXScalarValueInitExprClass:
175 case Expr::TypeTraitExprClass:
176 case Expr::ArrayTypeTraitExprClass:
177 case Expr::ExpressionTraitExprClass:
178 case Expr::ObjCSelectorExprClass:
179 case Expr::ObjCProtocolExprClass:
180 case Expr::ObjCStringLiteralClass:
181 case Expr::ObjCBoxedExprClass:
182 case Expr::ObjCArrayLiteralClass:
183 case Expr::ObjCDictionaryLiteralClass:
184 case Expr::ObjCBoolLiteralExprClass:
185 case Expr::ObjCAvailabilityCheckExprClass:
186 case Expr::ParenListExprClass:
187 case Expr::SizeOfPackExprClass:
188 case Expr::SubstNonTypeTemplateParmPackExprClass:
189 case Expr::AsTypeExprClass:
190 case Expr::ObjCIndirectCopyRestoreExprClass:
191 case Expr::AtomicExprClass:
192 case Expr::CXXFoldExprClass:
193 case Expr::ArrayInitLoopExprClass:
194 case Expr::ArrayInitIndexExprClass:
195 case Expr::NoInitExprClass:
196 case Expr::DesignatedInitUpdateExprClass:
197 case Expr::SourceLocExprClass:
198 case Expr::ConceptSpecializationExprClass:
199 case Expr::RequiresExprClass:
202 case Expr::ConstantExprClass:
206 case Expr::SubstNonTypeTemplateParmExprClass:
210 // C, C++98 [expr.sub]p1: The result is an lvalue of type "T".
214 case Expr::ArraySubscriptExprClass:
227 case Expr::MatrixSubscriptExprClass:
230 // C++ [expr.prim.general]p3: The result is an lvalue if the entity is a
232 case Expr::DeclRefExprClass:
239 case Expr::MemberExprClass:
242 case Expr::UnaryOperatorClass:
244 // C++ [expr.unary.op]p1: The unary * operator performs indirection:
258 const Expr *Op = cast<UnaryOperator>(E)->getSubExpr()->IgnoreParens();
267 // C++ [expr.pre.incr]p1: The result is the updated operand; it is an
278 case Expr::RecoveryExprClass:
279 case Expr::OpaqueValueExprClass:
283 case Expr::PseudoObjectExprClass:
289 case Expr::ImplicitCastExprClass:
292 // C++ [expr.prim.general]p4: The presence of parentheses does not affect
294 case Expr::ParenExprClass:
300 case Expr::GenericSelectionExprClass:
305 case Expr::BinaryOperatorClass:
306 case Expr::CompoundAssignOperatorClass:
312 case Expr::CallExprClass:
313 case Expr::CXXOperatorCallExprClass:
314 case Expr::CXXMemberCallExprClass:
315 case Expr::UserDefinedLiteralClass:
316 case Expr::CUDAKernelCallExprClass:
319 case Expr::CXXRewrittenBinaryOperatorClass:
324 case Expr::ChooseExprClass:
329 case Expr::ExtVectorElementExprClass:
337 case Expr::CXXDefaultArgExprClass:
341 case Expr::CXXDefaultInitExprClass:
345 case Expr::CXXBindTemporaryExprClass:
349 case Expr::ExprWithCleanupsClass:
353 case Expr::CStyleCastExprClass:
354 case Expr::CXXFunctionalCastExprClass:
355 case Expr::CXXStaticCastExprClass:
356 case Expr::CXXDynamicCastExprClass:
357 case Expr::CXXReinterpretCastExprClass:
358 case Expr::CXXConstCastExprClass:
359 case Expr::CXXAddrspaceCastExprClass:
360 case Expr::ObjCBridgedCastExprClass:
361 case Expr::BuiltinBitCastExprClass:
366 case Expr::CXXUnresolvedConstructExprClass:
370 case Expr::BinaryConditionalOperatorClass: {
376 case Expr::ConditionalOperatorClass: {
385 case Expr::ObjCMessageExprClass:
394 case Expr::CXXConstructExprClass:
395 case Expr::CXXInheritedCtorInitExprClass:
396 case Expr::CXXTemporaryObjectExprClass:
397 case Expr::LambdaExprClass:
398 case Expr::CXXStdInitializerListExprClass:
401 case Expr::VAArgExprClass:
404 case Expr::DesignatedInitExprClass:
407 case Expr::StmtExprClass: {
409 if (const auto *LastExpr = dyn_cast_or_null<Expr>(S->body_back()))
414 case Expr::PackExpansionExprClass:
417 case Expr::MaterializeTemporaryExprClass:
422 case Expr::InitListExprClass:
433 case Expr::CoawaitExprClass:
434 case Expr::CoyieldExprClass:
444 // C++ [expr.prim.general]p6: The result is an lvalue if the entity is a
478 // C++ [expr.call]p10: A function call is an lvalue if the result type is an
504 Expr *Base = E->getBase()->IgnoreParens();
511 // C++ [expr.ref]p3: E1->E2 is converted to the equivalent form (*(E1)).E2.
512 // C++ [expr.ref]p4: If E2 is declared to have type "reference to T", then
530 Expr *Base = E->getBase()->IgnoreParenImpCasts();
551 // C++ [expr.ass]p1: All [...] return an lvalue referring to the left operand.
557 // C++ [expr.comma]p1: the result is of the same value category as its right
562 // C++ [expr.mptr.oper]p6: The result of a .* expression whose second operand
571 // C++ [expr.mptr.oper]p6: The result of an ->* expression is an lvalue if its
583 static Cl::Kinds ClassifyConditional(ASTContext &Ctx, const Expr *True,
584 const Expr *False) {
588 // C++ [expr.cond]p2
597 if (const Expr *NonThrow = TrueIsThrow ? (FalseIsThrow ? nullptr : False)
606 // according to [expr.cond]p3.
607 // C++ [expr.cond]p4: If the second and third operands are glvalues of the
609 // C++ [expr.cond]p5: Otherwise, the result is a prvalue.
615 static Cl::ModifiableType IsModifiable(ASTContext &Ctx, const Expr *E,
639 if (const auto *Expr = dyn_cast<ObjCPropertyRefExpr>(E)) {
640 if (Expr->isImplicitProperty() &&
641 Expr->getImplicitPropertySetter() == nullptr)
668 Expr::LValueClassification Expr::ClassifyLValue(ASTContext &Ctx) const {
687 Expr::isModifiableLvalueResult
688 Expr::isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc) const {