• Home
  • History
  • Annotate
  • Raw
  • Download

Lines Matching +full:- +full:wno +full:- +full:sign +full:- +full:conversion

1 //===--- ExprConstant.cpp - Expression Constant Evaluator -----------------===//
8 //===----------------------------------------------------------------------===//
21 // * A flag indicating if evaluation encountered (unevaluated) side-effects.
30 // fold a potential constant sub-expression will be indicated by a 'false'
32 // expression is not necessarily non-constant).
34 //===----------------------------------------------------------------------===//
66 return D->getType(); in getType()
76 const Expr *Temp = MTE->GetTemporaryExpr(); in getType()
77 const Expr *Inner = Temp->skipRValueSubobjectAdjustments(CommaLHSs, in getType()
79 // Keep any cv-qualifiers from the reference if we generated a temporary in getType()
82 return Inner->getType(); in getType()
85 return Base->getType(); in getType()
113 /// Find the path length and type of the most-derived subobject in the given
123 if (Type->isArrayType()) { in findMostDerivedSubobject()
126 Type = CAT->getElementType(); in findMostDerivedSubobject()
127 ArraySize = CAT->getSize().getZExtValue(); in findMostDerivedSubobject()
130 } else if (Type->isAnyComplexType()) { in findMostDerivedSubobject()
131 const ComplexType *CT = Type->castAs<ComplexType>(); in findMostDerivedSubobject()
132 Type = CT->getElementType(); in findMostDerivedSubobject()
137 Type = FD->getType(); in findMostDerivedSubobject()
160 /// and we cannot perform lvalue-to-rvalue conversions on them.
166 /// Indicator of whether the most-derived object is an array element.
169 /// The length of the path to the most-derived object of which this is a
173 /// The size of the array of which the most-derived object is an element.
174 /// This will always be 0 if the most-derived object is not an array
175 /// element. 0 is not an indicator of whether or not the most-derived object
176 /// is an array, however, because 0-length arrays are allowed.
218 /// Determine whether this is a one-past-the-end pointer.
224 Entries[MostDerivedPathLength - 1].ArrayIndex == MostDerivedArraySize) in isOnePastTheEnd()
245 // This is a most-derived object. in addArrayUnchecked()
246 MostDerivedType = CAT->getElementType(); in addArrayUnchecked()
248 MostDerivedArraySize = CAT->getSize().getZExtValue(); in addArrayUnchecked()
259 // If this isn't a base class, it's a new most-derived object. in addDeclUnchecked()
261 MostDerivedType = FD->getType(); in addDeclUnchecked()
273 // This is technically a most-derived object, though in practice this in addComplexUnchecked()
296 if (IsOnePastTheEnd && N == (uint64_t)-1) in adjustIndex()
311 /// Parent - The caller of this stack frame.
314 /// CallLoc - The location of the call expression for this call.
317 /// Callee - The function which was called.
320 /// Index - The call index of this call.
323 /// This - The binding for the this pointer in this call, if any.
326 /// Arguments - Parameter bindings for this function call, indexed by
334 /// Temporaries - Temporary lvalues materialized within this stack frame.
344 return I == Temporaries.end() ? nullptr : &I->second; in getTemporary()
409 /// A cleanup, and a flag indicating whether it is lifetime-extended.
423 /// EvalInfo - This is a private struct used by the evaluator to capture
440 /// EvalStatus - Contains information about the evaluation.
443 /// CurrentCall - The top of the constexpr call stack.
446 /// CallStackDepth - The number of calls in the call stack right now.
449 /// NextCallIndex - The next call index to assign.
452 /// StepsLeft - The remaining number of evaluation steps we're permitted
457 /// BottomFrame - The frame in which evaluation started. This must be
465 /// EvaluatingDecl - This is the declaration whose initializer is being
469 /// EvaluatingDeclValue - This is the value being constructed for the
473 /// HasActiveDiagnostic - Was the previous diagnostic stored? If so, further
495 /// Fold the expression to a constant. Stop if we hit a side-effect that
500 /// issues. Don't worry about side-effects, and try to visit all
504 /// Evaluate in any way we know how. Don't worry about side-effects that
580 while (Frame->Index > CallIndex) in getCallFrame()
581 Frame = Frame->Caller; in getCallFrame()
582 return (Frame->Index == CallIndex) ? Frame : nullptr; in getCallFrame()
587 FFDiag(S->getLocStart(), diag::note_constexpr_step_limit_exceeded); in nextStep()
590 --StepsLeft; in nextStep()
598 EvalStatus.Diag->push_back(std::make_pair(Loc, PD)); in addDiag()
599 return EvalStatus.Diag->back().second; in addDiag()
616 if (!EvalStatus.Diag->empty()) { in Diag()
634 unsigned CallStackNotes = CallStackDepth - 1; in Diag()
643 EvalStatus.Diag->clear(); in Diag()
644 EvalStatus.Diag->reserve(1 + ExtraNotes + CallStackNotes); in Diag()
666 return Diag(E->getExprLoc(), DiagId, ExtraNotes, /*IsCCEDiag*/false); in FFDiag()
681 if (!EvalStatus.Diag || !EvalStatus.Diag->empty()) { in CCEDiag()
690 return CCEDiag(E->getExprLoc(), DiagId, ExtraNotes); in CCEDiag()
702 EvalStatus.Diag->insert(EvalStatus.Diag->end(), in addNotes()
707 /// Should we continue evaluation after encountering a side-effect that we
726 /// Note that we have had a side-effect, and determine whether we should
752 /// that we can evaluate past it (such as signed overflow or floating-point
796 // subexpression implies that a side-effect has potentially happened. We in noteFailure()
820 Info.EvalStatus.Diag->empty() && in FoldConstant()
830 if (Enabled && HadNoPriorDiags && !Info.EvalStatus.Diag->empty() && in ~FoldConstant()
832 Info.EvalStatus.Diag->clear(); in ~FoldConstant()
852 /// RAII object used to optionally suppress diagnostics and side-effects from
871 Info->EvalStatus = Old; in maybeRestoreState()
872 Info->IsSpeculativelyEvaluating = InfoAndOldSpecEval.getInt(); in maybeRestoreState()
900 /// RAII object wrapping a full-expression or block scope, and handling
920 // Full-expression cleanup of a lifetime-extended temporary: nothing in cleanup()
958 << static_cast<int>(N) << /*non-array*/ 1; in diagnosePointerArithmetic()
973 --Info.CallStackDepth; in ~CallStackFrame()
989 unsigned ActiveCalls = CallStackDepth - 1; in addCallStack()
993 SkipEnd = ActiveCalls - Limit / 2; in addCallStack()
999 Frame = Frame->Caller, ++CallIdx) { in addCallStack()
1004 addDiag(Frame->CallLoc, diag::note_constexpr_calls_suppressed) in addCallStack()
1005 << unsigned(ActiveCalls - Limit); in addCallStack()
1012 if (auto *CD = dyn_cast_or_null<CXXConstructorDecl>(Frame->Callee)) { in addCallStack()
1013 if (CD->isInheritingConstructor()) { in addCallStack()
1014 addDiag(Frame->CallLoc, diag::note_constexpr_inherited_ctor_call_here) in addCallStack()
1015 << CD->getParent(); in addCallStack()
1023 addDiag(Frame->CallLoc, diag::note_constexpr_call_here) << Out.str(); in addCallStack()
1168 DeclAndIsDerivedMember.getPointer()->getDeclContext()); in getContainingRecord()
1183 /// DeclAndIsDerivedMember - The member declaration, and a flag indicating
1187 /// Path - The path of base/derived classes from the member declaration's
1197 Expected = Path[Path.size() - 2]; in castBack()
1200 if (Expected->getCanonicalDecl() != Class->getCanonicalDecl()) { in castBack()
1201 // C++11 [expr.static.cast]p12: In a conversion from (D::*) to (B::*), in castBack()
1212 /// Perform a base-to-derived member pointer cast.
1226 /// Perform a derived-to-base member pointer cast.
1244 if (LHS.getDecl()->getCanonicalDecl() != RHS.getDecl()->getCanonicalDecl()) in operator ==()
1267 //===----------------------------------------------------------------------===//
1269 //===----------------------------------------------------------------------===//
1274 bool IsMemberCall = isa<CXXMethodDecl>(Frame->Callee) && in describeCall()
1275 !isa<CXXConstructorDecl>(Frame->Callee) && in describeCall()
1276 cast<CXXMethodDecl>(Frame->Callee)->isInstance(); in describeCall()
1279 Out << *Frame->Callee << '('; in describeCall()
1281 if (Frame->This && IsMemberCall) { in describeCall()
1283 Frame->This->moveInto(Val); in describeCall()
1284 Val.printPretty(Out, Frame->Info.Ctx, in describeCall()
1285 Frame->This->Designator.MostDerivedType); in describeCall()
1287 Out << "->" << *Frame->Callee << '('; in describeCall()
1291 for (FunctionDecl::param_const_iterator I = Frame->Callee->param_begin(), in describeCall()
1292 E = Frame->Callee->param_end(); I != E; ++I, ++ArgIndex) { in describeCall()
1297 const APValue &Arg = Frame->Arguments[ArgIndex]; in describeCall()
1298 Arg.printPretty(Out, Frame->Info.Ctx, Param->getType()); in describeCall()
1301 Out << "->" << *Frame->Callee << '('; in describeCall()
1307 /// Evaluate an expression to see if it had side-effects, and discard its
1318 /// Sign- or zero-extend a value to 64 bits. If it's already 64 bits, just
1327 unsigned Builtin = E->getBuiltinCallee(); in IsStringLiteralCall()
1343 return VD->hasGlobalStorage(); in IsGlobalLValue()
1349 switch (E->getStmtClass()) { in IsGlobalLValue()
1354 return CLE->isFileScope() && CLE->isLValue(); in IsGlobalLValue()
1357 // A materialized temporary might have been lifetime-extended to static in IsGlobalLValue()
1359 return cast<MaterializeTemporaryExpr>(E)->getStorageDuration() == SD_Static; in IsGlobalLValue()
1376 return !cast<BlockExpr>(E)->getBlockDecl()->hasCaptures(); in IsGlobalLValue()
1392 Info.Note(VD->getLocation(), diag::note_declared_at); in NoteLValueLocation()
1394 Info.Note(Base.get<const Expr*>()->getExprLoc(), in NoteLValueLocation()
1403 bool IsReferenceType = Type->isReferenceType(); in CheckLValueConstantExpression()
1430 // Check if this is a thread-local variable. in CheckLValueConstantExpression()
1431 if (Var->getTLSKind()) in CheckLValueConstantExpression()
1435 if (Var->hasAttr<DLLImportAttr>()) in CheckLValueConstantExpression()
1441 // Doing otherwise would allow the same id-expression to yield in CheckLValueConstantExpression()
1449 if (Info.getLangOpts().CPlusPlus && FD->hasAttr<DLLImportAttr>()) in CheckLValueConstantExpression()
1454 // Allow address constant expressions to be past-the-end pointers. This is in CheckLValueConstantExpression()
1481 if (!E->isRValue() || E->getType()->isLiteralType(Info.Ctx)) in CheckLiteralType()
1486 // are of non-literal class types. in CheckLiteralType()
1488 Info.EvaluatingDecl == This->getLValueBase()) in CheckLiteralType()
1494 << E->getType(); in CheckLiteralType()
1513 if (const AtomicType *AT = Type->getAs<AtomicType>()) in CheckConstantExpression()
1514 Type = AT->getValueType(); in CheckConstantExpression()
1520 QualType EltTy = Type->castAsArrayTypeUnsafe()->getElementType(); in CheckConstantExpression()
1533 Value.getUnionField()->getType(), in CheckConstantExpression()
1537 RecordDecl *RD = Type->castAs<RecordType>()->getDecl(); in CheckConstantExpression()
1540 for (CXXRecordDecl::base_class_const_iterator I = CD->bases_begin(), in CheckConstantExpression()
1541 End = CD->bases_end(); I != End; ++I, ++BaseIndex) { in CheckConstantExpression()
1542 if (!CheckConstantExpression(Info, DiagLoc, I->getType(), in CheckConstantExpression()
1547 for (const auto *I : RD->fields()) { in CheckConstantExpression()
1548 if (!CheckConstantExpression(Info, DiagLoc, I->getType(), in CheckConstantExpression()
1549 Value.getStructField(I->getFieldIndex()))) in CheckConstantExpression()
1577 return Decl && Decl->isWeak(); in IsWeakLValue()
1583 QualType Ty = Decl->getType(); in isZeroSized()
1584 if (Ty->isArrayType()) in isZeroSized()
1585 return Ty->isIncompleteType() || in isZeroSized()
1586 Decl->getASTContext().getTypeSize(Ty) == 0; in isZeroSized()
1599 // We have a non-null base. These are generally known to be true, but if it's in EvalPointerValueAsBool()
1603 return !Decl || !Decl->isWeak(); in EvalPointerValueAsBool()
1642 assert(E->isRValue() && "missing lvalue-to-rvalue conv in bool condition"); in EvaluateAsBooleanCondition()
1662 bool DestSigned = DestType->isSignedIntegerOrEnumerationType(); in HandleFloatToIntCast()
1690 // If the input is signed, do a sign extend, noop, or truncate. in HandleIntToIntCast()
1692 Result.setIsUnsigned(DestType->isUnsignedIntegerOrEnumerationType()); in HandleIntToIntCast()
1709 assert(FD->isBitField() && "truncateBitfieldValue on non-bitfield"); in truncateBitfieldValue()
1712 // Trying to store a pointer-cast-to-integer into a bitfield. in truncateBitfieldValue()
1722 unsigned NewBitWidth = FD->getBitWidthValue(Info.Ctx); in truncateBitfieldValue()
1742 QualType VecTy = E->getType(); in EvalAndBitcastToAPInt()
1744 QualType EltTy = VecTy->castAs<VectorType>()->getElementType(); in EvalAndBitcastToAPInt()
1792 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in CheckedIntArithmetic()
1794 << Result.toString(10) << E->getType(); in CheckedIntArithmetic()
1796 return HandleOverflow(Info, E, Value, E->getType()); in CheckedIntArithmetic()
1828 // Check for overflow case: INT_MIN / -1 or INT_MIN % -1. APSInt supports in handleIntIntBinOp()
1832 return HandleOverflow(Info, E, -LHS.extend(LHS.getBitWidth() + 1), in handleIntIntBinOp()
1833 E->getType()); in handleIntIntBinOp()
1839 static_cast<uint64_t>(LHS.getBitWidth() - 1)), in handleIntIntBinOp()
1842 // During constant-folding, a negative shift is an opposite shift. Such in handleIntIntBinOp()
1845 RHS = -RHS; in handleIntIntBinOp()
1851 unsigned SA = (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1); in handleIntIntBinOp()
1854 << RHS << E->getType() << LHS.getBitWidth(); in handleIntIntBinOp()
1856 // C++11 [expr.shift]p2: A signed left shift must have a non-negative in handleIntIntBinOp()
1870 static_cast<uint64_t>(LHS.getBitWidth() - 1)), in handleIntIntBinOp()
1873 // During constant-folding, a negative shift is an opposite shift. Such a in handleIntIntBinOp()
1876 RHS = -RHS; in handleIntIntBinOp()
1882 unsigned SA = (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1); in handleIntIntBinOp()
1885 << RHS << E->getType() << LHS.getBitWidth(); in handleIntIntBinOp()
1899 /// Perform the given binary floating-point operation, in-place, on LHS.
1943 // Truncate the path to the subobject, and remove any derived-to-base offsets. in CastToDerivedClass()
1946 if (RD->isInvalidDecl()) return false; in CastToDerivedClass()
1950 Result.Offset -= Layout.getVBaseClassOffset(Base); in CastToDerivedClass()
1952 Result.Offset -= Layout.getBaseClassOffset(Base); in CastToDerivedClass()
1964 if (Derived->isInvalidDecl()) return false; in HandleLValueDirectBase()
1968 Obj.getLValueOffset() += RL->getBaseClassOffset(Base); in HandleLValueDirectBase()
1976 const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl(); in HandleLValueBase()
1978 if (!Base->isVirtual()) in HandleLValueBase()
1985 // Extract most-derived object and corresponding type. in HandleLValueBase()
1986 DerivedDecl = D.MostDerivedType->getAsCXXRecordDecl(); in HandleLValueBase()
1991 if (DerivedDecl->isInvalidDecl()) return false; in HandleLValueBase()
2000 for (CastExpr::path_const_iterator PathI = E->path_begin(), in HandleLValueBasePath()
2001 PathE = E->path_end(); in HandleLValueBasePath()
2003 if (!HandleLValueBase(Info, E, Result, Type->getAsCXXRecordDecl(), in HandleLValueBasePath()
2006 Type = (*PathI)->getType(); in HandleLValueBasePath()
2017 if (FD->getParent()->isInvalidDecl()) return false; in HandleLValueMember()
2018 RL = &Info.Ctx.getASTRecordLayout(FD->getParent()); in HandleLValueMember()
2021 unsigned I = FD->getFieldIndex(); in HandleLValueMember()
2022 LVal.Offset += Info.Ctx.toCharUnitsFromBits(RL->getFieldOffset(I)); in HandleLValueMember()
2031 for (const auto *C : IFD->chain()) in HandleLValueIndirectMember()
2042 if (Type->isVoidType() || Type->isFunctionType()) { in HandleSizeof()
2047 if (Type->isDependentType()) { in HandleSizeof()
2052 if (!Type->isConstantSizeType()) { in HandleSizeof()
2064 /// \param Info - Information about the ongoing evaluation.
2065 /// \param E - The expression being evaluated, for diagnostic purposes.
2066 /// \param LVal - The pointer value to be updated.
2067 /// \param EltTy - The pointee type represented by LVal.
2068 /// \param Adjustment - The adjustment, in objects of type EltTy, to add.
2073 if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfPointee)) in HandleLValueArrayAdjustment()
2083 /// \param Info - Information about the ongoing evaluation.
2084 /// \param LVal - The lvalue to be updated.
2085 /// \param EltTy - The complex number's component type.
2086 /// \param Imag - False for the real component, true for the imaginary.
2092 if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfComponent)) in HandleLValueComplexElement()
2118 if (!Frame || !Frame->Arguments) { in evaluateVarDeclInit()
2122 Result = &Frame->Arguments[PVD->getFunctionScopeIndex()]; in evaluateVarDeclInit()
2128 Result = Frame->getTemporary(VD); in evaluateVarDeclInit()
2134 assert(isLambdaCallOperator(Frame->Callee) && in evaluateVarDeclInit()
2135 (VD->getDeclContext() != Frame->Callee || VD->isInitCapture()) && in evaluateVarDeclInit()
2140 Info.FFDiag(E->getLocStart(), in evaluateVarDeclInit()
2149 const Expr *Init = VD->getAnyInitializer(VD); in evaluateVarDeclInit()
2150 if (!Init || Init->isValueDependent()) { in evaluateVarDeclInit()
2159 // in-flight value. in evaluateVarDeclInit()
2167 if (VD->isWeak()) { in evaluateVarDeclInit()
2175 if (!VD->evaluateValue(Notes)) { in evaluateVarDeclInit()
2178 Info.Note(VD->getLocation(), diag::note_declared_at); in evaluateVarDeclInit()
2181 } else if (!VD->checkInitIsICE()) { in evaluateVarDeclInit()
2184 Info.Note(VD->getLocation(), diag::note_declared_at); in evaluateVarDeclInit()
2188 Result = VD->getEvaluatedValue(); in evaluateVarDeclInit()
2201 Base = Base->getCanonicalDecl(); in getBaseIndex()
2203 for (CXXRecordDecl::base_class_const_iterator I = Derived->bases_begin(), in getBaseIndex()
2204 E = Derived->bases_end(); I != E; ++I, ++Index) { in getBaseIndex()
2205 if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == Base) in getBaseIndex()
2217 Lit = PE->getFunctionName(); in extractStringLiteralCharacter()
2220 Info.Ctx.getAsConstantArrayType(S->getType()); in extractStringLiteralCharacter()
2222 QualType CharType = CAT->getElementType(); in extractStringLiteralCharacter()
2223 assert(CharType->isIntegerType() && "unexpected character type"); in extractStringLiteralCharacter()
2225 APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(), in extractStringLiteralCharacter()
2226 CharType->isUnsignedIntegerType()); in extractStringLiteralCharacter()
2227 if (Index < S->getLength()) in extractStringLiteralCharacter()
2228 Value = S->getCodeUnit(Index); in extractStringLiteralCharacter()
2237 Info.Ctx.getAsConstantArrayType(S->getType()); in expandStringLiteral()
2239 QualType CharType = CAT->getElementType(); in expandStringLiteral()
2240 assert(CharType->isIntegerType() && "unexpected character type"); in expandStringLiteral()
2242 unsigned Elts = CAT->getSize().getZExtValue(); in expandStringLiteral()
2244 std::min(S->getLength(), Elts), Elts); in expandStringLiteral()
2245 APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(), in expandStringLiteral()
2246 CharType->isUnsignedIntegerType()); in expandStringLiteral()
2250 Value = S->getCodeUnit(I); in expandStringLiteral()
2276 /// Determine whether a type would actually be read by an lvalue-to-rvalue
2277 /// conversion. If it's of class type, we may assume that the copy operation
2280 /// a non-class type.
2282 CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl(); in isReadByLvalueToRvalueConversion()
2283 if (!RD || (RD->isUnion() && !RD->field_empty())) in isReadByLvalueToRvalueConversion()
2285 if (RD->isEmpty()) in isReadByLvalueToRvalueConversion()
2288 for (auto *Field : RD->fields()) in isReadByLvalueToRvalueConversion()
2289 if (isReadByLvalueToRvalueConversion(Field->getType())) in isReadByLvalueToRvalueConversion()
2292 for (auto &BaseSpec : RD->bases()) in isReadByLvalueToRvalueConversion()
2303 CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl(); in diagnoseUnreadableFields()
2307 if (!RD->hasMutableFields()) in diagnoseUnreadableFields()
2310 for (auto *Field : RD->fields()) { in diagnoseUnreadableFields()
2315 if (Field->isMutable() && in diagnoseUnreadableFields()
2316 (RD->isUnion() || isReadByLvalueToRvalueConversion(Field->getType()))) { in diagnoseUnreadableFields()
2318 Info.Note(Field->getLocation(), diag::note_declared_at); in diagnoseUnreadableFields()
2322 if (diagnoseUnreadableFields(Info, E, Field->getType())) in diagnoseUnreadableFields()
2326 for (auto &BaseSpec : RD->bases()) in diagnoseUnreadableFields()
2361 /// Find the designated sub-object of an rvalue.
2384 if (O->isUninit()) { in findSubobject()
2395 if (ObjType->isRecordType() && handler.AccessKind == AK_Read && in findSubobject()
2402 // If we modified a bit-field, truncate it to the right width. in findSubobject()
2404 LastField && LastField->isBitField() && in findSubobject()
2412 if (ObjType->isArrayType()) { in findSubobject()
2417 if (CAT->getSize().ule(Index)) { in findSubobject()
2428 ObjType = CAT->getElementType(); in findSubobject()
2432 if (O->isLValue()) { in findSubobject()
2433 assert(I == N - 1 && "extracting subobject of character?"); in findSubobject()
2434 assert(!O->hasLValuePath() || O->getLValuePath().empty()); in findSubobject()
2436 expandStringLiteral(Info, O->getLValueBase().get<const Expr *>(), in findSubobject()
2442 if (O->getArrayInitializedElts() > Index) in findSubobject()
2443 O = &O->getArrayInitializedElt(Index); in findSubobject()
2446 O = &O->getArrayInitializedElt(Index); in findSubobject()
2448 O = &O->getArrayFiller(); in findSubobject()
2449 } else if (ObjType->isAnyComplexType()) { in findSubobject()
2462 ObjType = ObjType->castAs<ComplexType>()->getElementType(); in findSubobject()
2466 assert(I == N - 1 && "extracting subobject of scalar?"); in findSubobject()
2467 if (O->isComplexInt()) { in findSubobject()
2468 return handler.found(Index ? O->getComplexIntImag() in findSubobject()
2469 : O->getComplexIntReal(), ObjType); in findSubobject()
2471 assert(O->isComplexFloat()); in findSubobject()
2472 return handler.found(Index ? O->getComplexFloatImag() in findSubobject()
2473 : O->getComplexFloatReal(), ObjType); in findSubobject()
2476 if (Field->isMutable() && handler.AccessKind == AK_Read) { in findSubobject()
2479 Info.Note(Field->getLocation(), diag::note_declared_at); in findSubobject()
2484 RecordDecl *RD = ObjType->castAs<RecordType>()->getDecl(); in findSubobject()
2485 if (RD->isUnion()) { in findSubobject()
2486 const FieldDecl *UnionField = O->getUnionField(); in findSubobject()
2488 UnionField->getCanonicalDecl() != Field->getCanonicalDecl()) { in findSubobject()
2493 O = &O->getUnionValue(); in findSubobject()
2495 O = &O->getStructField(Field->getFieldIndex()); in findSubobject()
2498 ObjType = Field->getType(); in findSubobject()
2499 if (WasConstQualified && !Field->isMutable()) in findSubobject()
2507 Info.Note(Field->getLocation(), diag::note_declared_at); in findSubobject()
2517 const CXXRecordDecl *Derived = ObjType->getAsCXXRecordDecl(); in findSubobject()
2519 O = &O->getStructBase(getBaseIndex(Derived, Base)); in findSubobject()
2560 /// Extract the designated sub-object of an rvalue.
2620 /// Update the designated sub-object of an rvalue to the given value.
2638 (ObjType->isArrayType() || ObjType->isAnyComplexType())) { in FindDesignatorMismatch()
2644 if (ObjType->isAnyComplexType()) in FindDesignatorMismatch()
2645 ObjType = ObjType->castAs<ComplexType>()->getElementType(); in FindDesignatorMismatch()
2647 ObjType = ObjType->castAsArrayTypeUnsafe()->getElementType(); in FindDesignatorMismatch()
2655 ObjType = FD->getType(); in FindDesignatorMismatch()
2683 return CommonLength >= A.Entries.size() - IsArray; in AreElementsOfSameArray()
2706 // C++11 DR1311: An lvalue-to-rvalue conversion on a volatile-qualified type in findCompleteObject()
2707 // is not a constant expression (even if the object is non-volatile). We also in findCompleteObject()
2724 // In C++98, const, non-volatile integers initialized with ICEs are ICEs. in findCompleteObject()
2725 // In C++11, constexpr, non-volatile variables initialized with constant in findCompleteObject()
2727 // parameters are constant expressions even if they're non-const. in findCompleteObject()
2733 if (const VarDecl *VDef = VD->getDefinition(Info.Ctx)) in findCompleteObject()
2736 if (!VD || VD->isInvalidDecl()) { in findCompleteObject()
2741 // Accesses of volatile-qualified objects are not allowed. in findCompleteObject()
2746 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
2765 } else if (VD->isConstexpr()) { in findCompleteObject()
2767 } else if (BaseType->isIntegralOrEnumerationType()) { in findCompleteObject()
2774 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
2780 } else if (BaseType->isFloatingType() && BaseType.isConstQualified()) { in findCompleteObject()
2781 // We support folding of const floating-point types, in order to make in findCompleteObject()
2786 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
2793 VD->getType().isConstQualified() && !VD->hasDefinition(Info.Ctx)) { in findCompleteObject()
2798 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
2814 assert(MTE->getStorageDuration() == SD_Static && in findCompleteObject()
2815 "should have a frame for a non-global materialized temporary"); in findCompleteObject()
2818 // an lvalue-to-rvalue conversion [is not allowed unless it applies to] in findCompleteObject()
2819 // - a [...] glvalue of integral or enumeration type that refers to in findCompleteObject()
2820 // a non-volatile const object [...] in findCompleteObject()
2822 // - a [...] glvalue of literal type that refers to a non-volatile in findCompleteObject()
2832 const ValueDecl *ED = MTE->getExtendingDecl(); in findCompleteObject()
2834 BaseType->isIntegralOrEnumerationType()) && in findCompleteObject()
2835 !(VD && VD->getCanonicalDecl() == ED->getCanonicalDecl())) { in findCompleteObject()
2837 Info.Note(MTE->getExprLoc(), diag::note_constexpr_temporary_here); in findCompleteObject()
2848 BaseVal = Frame->getTemporary(Base); in findCompleteObject()
2857 Info.Note(Base->getExprLoc(), diag::note_constexpr_temporary_here); in findCompleteObject()
2887 /// \brief Perform an lvalue-to-rvalue conversion on the given glvalue. This
2888 /// can also be used for 'lvalue-to-lvalue' conversions for looking up the
2891 /// \param Info - Information about the ongoing evaluation.
2892 /// \param Conv - The expression for which we are performing the conversion.
2894 /// \param Type - The type of the glvalue (before stripping cv-qualifiers in the
2895 /// case of a non-class type).
2896 /// \param LVal - The glvalue on which we are attempting to perform this action.
2897 /// \param RVal - The produced value will be placed here.
2917 if (!Evaluate(Lit, Info, CLE->getInitializer())) in handleLValueToRValueConversion()
2919 CompleteObject LitObj(&Lit, Base->getType()); in handleLValueToRValueConversion()
2926 CompleteObject StrObj(&Str, Base->getType()); in handleLValueToRValueConversion()
2951 return T->isSignedIntegerType() && in isOverflowingIntegerType()
3000 if (!SubobjType->isIntegerType() || !RHS.isInt()) { in found()
3001 // We don't support compound assignment on integer-cast-to-pointer in found()
3026 if (const PointerType *PT = SubobjType->getAs<PointerType>()) in foundPointer()
3027 PointeeType = PT->getPointeeType(); in foundPointer()
3037 Offset = -Offset; in foundPointer()
3094 // if we're post-incrementing a complex. in found()
3107 SubobjType->castAs<ComplexType>()->getElementType() in found()
3111 SubobjType->castAs<ComplexType>()->getElementType() in found()
3125 if (!SubobjType->isIntegerType()) { in found()
3126 // We don't support increment / decrement on integer-cast-to-pointer in found()
3134 // bool arithmetic promotes to int, and the conversion back to bool in found()
3135 // doesn't reduce mod 2^n, so special-case it. in found()
3136 if (SubobjType->isBooleanType()) { in found()
3154 --Value; in found()
3184 if (const PointerType *PT = SubobjType->getAs<PointerType>()) in foundPointer()
3185 PointeeType = PT->getPointeeType(); in foundPointer()
3194 AccessKind == AK_Increment ? 1 : -1)) in foundPointer()
3225 if (Object->getType()->isPointerType()) in EvaluateObjectArgument()
3228 if (Object->isGLValue()) in EvaluateObjectArgument()
3231 if (Object->getType()->isLiteralType(Info.Ctx)) in EvaluateObjectArgument()
3234 Info.FFDiag(Object, diag::note_constexpr_nonliteral) << Object->getType(); in EvaluateObjectArgument()
3238 /// HandleMemberPointerAccess - Evaluate a member access operation and build an
3241 /// \param Info - Information about the ongoing evaluation.
3242 /// \param LV - An lvalue referring to the base of the member pointer.
3243 /// \param RHS - The member pointer expression.
3244 /// \param IncludeMember - Specifies whether the member itself is included in
3268 // The end of the derived-to-base path for the base object must match the in HandleMemberPointerAccess()
3269 // derived-to-base path for the member pointer. in HandleMemberPointerAccess()
3276 LV.Designator.Entries.size() - MemPtr.Path.size(); in HandleMemberPointerAccess()
3281 if (LVDecl->getCanonicalDecl() != MPDecl->getCanonicalDecl()) { in HandleMemberPointerAccess()
3297 if (const PointerType *PT = LVType->getAs<PointerType>()) in HandleMemberPointerAccess()
3298 LVType = PT->getPointeeType(); in HandleMemberPointerAccess()
3299 const CXXRecordDecl *RD = LVType->getAsCXXRecordDecl(); in HandleMemberPointerAccess()
3300 assert(RD && "member pointer access on non-class-type expression"); in HandleMemberPointerAccess()
3303 const CXXRecordDecl *Base = MemPtr.Path[N - I - 1]; in HandleMemberPointerAccess()
3335 assert(BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI); in HandleMemberPointerAccess()
3337 if (!EvaluateObjectArgument(Info, BO->getLHS(), LV)) { in HandleMemberPointerAccess()
3340 EvaluateMemberPointer(BO->getRHS(), MemPtr, Info); in HandleMemberPointerAccess()
3345 return HandleMemberPointerAccess(Info, BO->getLHS()->getType(), LV, in HandleMemberPointerAccess()
3346 BO->getRHS(), IncludeMember); in HandleMemberPointerAccess()
3349 /// HandleBaseToDerivedCast - Apply the given base-to-derived cast operation on
3357 QualType TargetQT = E->getType(); in HandleBaseToDerivedCast()
3358 if (const PointerType *PT = TargetQT->getAs<PointerType>()) in HandleBaseToDerivedCast()
3359 TargetQT = PT->getPointeeType(); in HandleBaseToDerivedCast()
3361 // Check this cast lands within the final derived-to-base subobject path. in HandleBaseToDerivedCast()
3362 if (D.MostDerivedPathLength + E->path_size() > D.Entries.size()) { in HandleBaseToDerivedCast()
3370 unsigned NewEntriesSize = D.Entries.size() - E->path_size(); in HandleBaseToDerivedCast()
3371 const CXXRecordDecl *TargetType = TargetQT->getAsCXXRecordDecl(); in HandleBaseToDerivedCast()
3374 FinalType = D.MostDerivedType->getAsCXXRecordDecl(); in HandleBaseToDerivedCast()
3376 FinalType = getAsBaseClass(D.Entries[NewEntriesSize - 1]); in HandleBaseToDerivedCast()
3377 if (FinalType->getCanonicalDecl() != TargetType->getCanonicalDecl()) { in HandleBaseToDerivedCast()
3407 if (!VD->hasLocalStorage()) in EvaluateDecl()
3411 Result.set(VD, Info.CurrentCall->Index); in EvaluateDecl()
3412 APValue &Val = Info.CurrentCall->createTemporary(VD, true); in EvaluateDecl()
3414 const Expr *InitE = VD->getInit(); in EvaluateDecl()
3416 Info.FFDiag(D->getLocStart(), diag::note_constexpr_uninitialized) in EvaluateDecl()
3417 << false << VD->getType(); in EvaluateDecl()
3422 if (InitE->isValueDependent()) in EvaluateDecl()
3426 // Wipe out any partially-computed value, to allow tracking that this in EvaluateDecl()
3488 if (const Stmt *Init = SS->getInit()) { in EvaluateSwitch()
3493 if (SS->getConditionVariable() && in EvaluateSwitch()
3494 !EvaluateDecl(Info, SS->getConditionVariable())) in EvaluateSwitch()
3496 if (!EvaluateInteger(SS->getCond(), Value, Info)) in EvaluateSwitch()
3503 for (const SwitchCase *SC = SS->getSwitchCaseList(); SC; in EvaluateSwitch()
3504 SC = SC->getNextSwitchCase()) { in EvaluateSwitch()
3511 APSInt LHS = CS->getLHS()->EvaluateKnownConstInt(Info.Ctx); in EvaluateSwitch()
3512 APSInt RHS = CS->getRHS() ? CS->getRHS()->EvaluateKnownConstInt(Info.Ctx) in EvaluateSwitch()
3524 switch (EvalStmtResult ESR = EvaluateStmt(Result, Info, SS->getBody(), Found)) { in EvaluateSwitch()
3535 Info.FFDiag(Found->getLocStart(), diag::note_constexpr_stmt_expr_unsupported); in EvaluateSwitch()
3554 switch (S->getStmtClass()) { in EvaluateStmt()
3579 EvalStmtResult ESR = EvaluateStmt(Result, Info, IS->getThen(), Case); in EvaluateStmt()
3580 if (ESR != ESR_CaseNotFound || !IS->getElse()) in EvaluateStmt()
3582 return EvaluateStmt(Result, Info, IS->getElse(), Case); in EvaluateStmt()
3587 EvaluateLoopBody(Result, Info, cast<WhileStmt>(S)->getBody(), Case); in EvaluateStmt()
3596 EvaluateLoopBody(Result, Info, FS->getBody(), Case); in EvaluateStmt()
3599 if (FS->getInc()) { in EvaluateStmt()
3601 if (!EvaluateIgnoredValue(Info, FS->getInc())) in EvaluateStmt()
3609 // bail out of any immediately-surrounding compound-statement too. in EvaluateStmt()
3615 switch (S->getStmtClass()) { in EvaluateStmt()
3618 // Don't bother evaluating beyond an expression-statement which couldn't in EvaluateStmt()
3626 Info.FFDiag(S->getLocStart()); in EvaluateStmt()
3634 for (const auto *DclIt : DS->decls()) { in EvaluateStmt()
3635 // Each declaration initialization is its own full-expression. in EvaluateStmt()
3637 // initialization, each braced subexpression is its own full-expression. in EvaluateStmt()
3646 const Expr *RetExpr = cast<ReturnStmt>(S)->getRetValue(); in EvaluateStmt()
3660 for (const auto *BI : CS->body()) { in EvaluateStmt()
3675 if (const Stmt *Init = IS->getInit()) { in EvaluateStmt()
3681 if (!EvaluateCond(Info, IS->getConditionVariable(), IS->getCond(), Cond)) in EvaluateStmt()
3684 if (const Stmt *SubStmt = Cond ? IS->getThen() : IS->getElse()) { in EvaluateStmt()
3697 if (!EvaluateCond(Info, WS->getConditionVariable(), WS->getCond(), in EvaluateStmt()
3703 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, WS->getBody()); in EvaluateStmt()
3714 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, DS->getBody(), Case); in EvaluateStmt()
3720 if (!EvaluateAsBooleanCondition(DS->getCond(), Continue, Info)) in EvaluateStmt()
3729 if (FS->getInit()) { in EvaluateStmt()
3730 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getInit()); in EvaluateStmt()
3737 if (FS->getCond() && !EvaluateCond(Info, FS->getConditionVariable(), in EvaluateStmt()
3738 FS->getCond(), Continue)) in EvaluateStmt()
3743 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, FS->getBody()); in EvaluateStmt()
3747 if (FS->getInc()) { in EvaluateStmt()
3749 if (!EvaluateIgnoredValue(Info, FS->getInc())) in EvaluateStmt()
3761 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getRangeStmt()); in EvaluateStmt()
3766 ESR = EvaluateStmt(Result, Info, FS->getBeginStmt()); in EvaluateStmt()
3769 ESR = EvaluateStmt(Result, Info, FS->getEndStmt()); in EvaluateStmt()
3778 if (!EvaluateAsBooleanCondition(FS->getCond(), Continue, Info)) in EvaluateStmt()
3786 ESR = EvaluateStmt(Result, Info, FS->getLoopVarStmt()); in EvaluateStmt()
3791 ESR = EvaluateLoopBody(Result, Info, FS->getBody()); in EvaluateStmt()
3796 if (!EvaluateIgnoredValue(Info, FS->getInc())) in EvaluateStmt()
3813 return EvaluateStmt(Result, Info, cast<LabelStmt>(S)->getSubStmt(), Case); in EvaluateStmt()
3818 return EvaluateStmt(Result, Info, cast<AttributedStmt>(S)->getSubStmt(), in EvaluateStmt()
3823 return EvaluateStmt(Result, Info, cast<SwitchCase>(S)->getSubStmt(), Case); in EvaluateStmt()
3827 /// CheckTrivialDefaultConstructor - Check whether a constructor is a trivial
3834 if (!CD->isTrivial() || !CD->isDefaultConstructor()) in CheckTrivialDefaultConstructor()
3837 // Value-initialization does not call a trivial default constructor, so such a in CheckTrivialDefaultConstructor()
3840 if (!CD->isConstexpr() && !IsValueInitialization) { in CheckTrivialDefaultConstructor()
3842 // FIXME: If DiagDecl is an implicitly-declared special member function, in CheckTrivialDefaultConstructor()
3846 Info.Note(CD->getLocation(), diag::note_declared_at); in CheckTrivialDefaultConstructor()
3854 /// CheckConstexprFunction - Check that a function can be called in a constant
3863 Declaration->isConstexpr()) in CheckConstexprFunction()
3868 if (Declaration->isInvalidDecl()) in CheckConstexprFunction()
3872 if (Definition && Definition->isConstexpr() && in CheckConstexprFunction()
3873 !Definition->isInvalidDecl() && Body) in CheckConstexprFunction()
3880 // non-constexpr constructor, diagnose that directly. in CheckConstexprFunction()
3882 if (CD && CD->isInheritingConstructor()) { in CheckConstexprFunction()
3883 auto *Inherited = CD->getInheritedConstructor().getConstructor(); in CheckConstexprFunction()
3884 if (!Inherited->isConstexpr()) in CheckConstexprFunction()
3888 // FIXME: If DiagDecl is an implicitly-declared special member function in CheckConstexprFunction()
3891 if (CD && CD->isInheritingConstructor()) in CheckConstexprFunction()
3893 << CD->getInheritedConstructor().getConstructor()->getParent(); in CheckConstexprFunction()
3896 << DiagDecl->isConstexpr() << (bool)CD << DiagDecl; in CheckConstexprFunction()
3897 Info.Note(DiagDecl->getLocation(), diag::note_declared_at); in CheckConstexprFunction()
3907 if (!RD || RD->isEmpty()) in hasFields()
3909 for (auto *FD : RD->fields()) { in hasFields()
3910 if (FD->isUnnamedBitfield()) in hasFields()
3914 for (auto &Base : RD->bases()) in hasFields()
3915 if (hasFields(Base.getType()->getAsCXXRecordDecl())) in hasFields()
3924 /// EvaluateArgs - Evaluate the arguments to a function call.
3930 if (!Evaluate(ArgValues[I - Args.begin()], Info, *I)) { in EvaluateArgs()
3960 // Skip this for non-union classes with no fields; in that case, the defaulted in HandleFunctionCall()
3963 if (MD && MD->isDefaulted() && in HandleFunctionCall()
3964 (MD->getParent()->isUnion() || in HandleFunctionCall()
3965 (MD->isTrivial() && hasFields(MD->getParent())))) { in HandleFunctionCall()
3967 (MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())); in HandleFunctionCall()
3971 if (!handleLValueToRValueConversion(Info, Args[0], Args[0]->getType(), in HandleFunctionCall()
3974 if (!handleAssignment(Info, Args[0], *This, MD->getThisType(Info.Ctx), in HandleFunctionCall()
3977 This->moveInto(Result); in HandleFunctionCall()
3984 if (Callee->getReturnType()->isVoidType()) in HandleFunctionCall()
3986 Info.FFDiag(Callee->getLocEnd(), diag::note_constexpr_no_return); in HandleFunctionCall()
3996 SourceLocation CallLoc = E->getExprLoc(); in HandleConstructorCall()
4000 const CXXRecordDecl *RD = Definition->getParent(); in HandleConstructorCall()
4001 if (RD->getNumVBases()) { in HandleConstructorCall()
4014 if (Definition->isDelegatingConstructor()) { in HandleConstructorCall()
4015 CXXConstructorDecl::init_const_iterator I = Definition->init_begin(); in HandleConstructorCall()
4018 if (!EvaluateInPlace(Result, Info, This, (*I)->getInit())) in HandleConstructorCall()
4021 return EvaluateStmt(Ret, Info, Definition->getBody()) != ESR_Failed; in HandleConstructorCall()
4027 // ctor-initializers. in HandleConstructorCall()
4029 // Skip this for empty non-union classes; we should not perform an in HandleConstructorCall()
4030 // lvalue-to-rvalue conversion on them because their copy constructor does not in HandleConstructorCall()
4032 if (Definition->isDefaulted() && Definition->isCopyOrMoveConstructor() && in HandleConstructorCall()
4033 (Definition->getParent()->isUnion() || in HandleConstructorCall()
4034 (Definition->isTrivial() && hasFields(Definition->getParent())))) { in HandleConstructorCall()
4038 Info, E, Definition->getParamDecl(0)->getType().getNonReferenceType(), in HandleConstructorCall()
4043 if (!RD->isUnion() && Result.isUninit()) in HandleConstructorCall()
4044 Result = APValue(APValue::UninitStruct(), RD->getNumBases(), in HandleConstructorCall()
4045 std::distance(RD->field_begin(), RD->field_end())); in HandleConstructorCall()
4047 if (RD->isInvalidDecl()) return false; in HandleConstructorCall()
4050 // A scope for temporaries lifetime-extended by reference members. in HandleConstructorCall()
4056 CXXRecordDecl::base_class_const_iterator BaseIt = RD->bases_begin(); in HandleConstructorCall()
4058 for (const auto *I : Definition->inits()) { in HandleConstructorCall()
4064 if (I->isBaseInitializer()) { in HandleConstructorCall()
4065 QualType BaseType(I->getBaseClass(), 0); in HandleConstructorCall()
4067 // Non-virtual base classes are initialized in the order in the class in HandleConstructorCall()
4069 assert(!BaseIt->isVirtual() && "virtual base for literal type"); in HandleConstructorCall()
4070 assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) && in HandleConstructorCall()
4074 if (!HandleLValueDirectBase(Info, I->getInit(), Subobject, RD, in HandleConstructorCall()
4075 BaseType->getAsCXXRecordDecl(), &Layout)) in HandleConstructorCall()
4078 } else if ((FD = I->getMember())) { in HandleConstructorCall()
4079 if (!HandleLValueMember(Info, I->getInit(), Subobject, FD, &Layout)) in HandleConstructorCall()
4081 if (RD->isUnion()) { in HandleConstructorCall()
4085 Value = &Result.getStructField(FD->getFieldIndex()); in HandleConstructorCall()
4087 } else if (IndirectFieldDecl *IFD = I->getIndirectMember()) { in HandleConstructorCall()
4090 for (auto *C : IFD->chain()) { in HandleConstructorCall()
4092 CXXRecordDecl *CD = cast<CXXRecordDecl>(FD->getParent()); in HandleConstructorCall()
4094 // preceding zero-initialization, and we're now initializing a union in HandleConstructorCall()
4097 // specified, since zero-initialization sets all padding bits to zero. in HandleConstructorCall()
4098 if (Value->isUninit() || in HandleConstructorCall()
4099 (Value->isUnion() && Value->getUnionField() != FD)) { in HandleConstructorCall()
4100 if (CD->isUnion()) in HandleConstructorCall()
4103 *Value = APValue(APValue::UninitStruct(), CD->getNumBases(), in HandleConstructorCall()
4104 std::distance(CD->field_begin(), CD->field_end())); in HandleConstructorCall()
4106 if (!HandleLValueMember(Info, I->getInit(), Subobject, FD)) in HandleConstructorCall()
4108 if (CD->isUnion()) in HandleConstructorCall()
4109 Value = &Value->getUnionValue(); in HandleConstructorCall()
4111 Value = &Value->getStructField(FD->getFieldIndex()); in HandleConstructorCall()
4118 if (!EvaluateInPlace(*Value, Info, Subobject, I->getInit()) || in HandleConstructorCall()
4119 (FD && FD->isBitField() && !truncateBitfieldValue(Info, I->getInit(), in HandleConstructorCall()
4130 EvaluateStmt(Ret, Info, Definition->getBody()) != ESR_Failed; in HandleConstructorCall()
4145 //===----------------------------------------------------------------------===//
4147 //===----------------------------------------------------------------------===//
4162 // Check whether a conditional operator with a non-constant condition is a
4173 StmtVisitorTy::Visit(E->getFalseExpr()); in CheckPotentialConstantConditional()
4181 StmtVisitorTy::Visit(E->getTrueExpr()); in CheckPotentialConstantConditional()
4193 if (!EvaluateAsBooleanCondition(E->getCond(), BoolResult, Info)) { in HandleConditionalOperator()
4199 Expr *EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); in HandleConditionalOperator()
4237 { return StmtVisitorTy::Visit(E->getSubExpr()); } in VisitParenExpr()
4239 { return StmtVisitorTy::Visit(E->getSubExpr()); } in VisitUnaryExtension()
4241 { return StmtVisitorTy::Visit(E->getSubExpr()); } in VisitUnaryPlus()
4243 { return StmtVisitorTy::Visit(E->getChosenSubExpr()); } in VisitChooseExpr()
4245 { return StmtVisitorTy::Visit(E->getResultExpr()); } in VisitGenericSelectionExpr()
4247 { return StmtVisitorTy::Visit(E->getReplacement()); } in VisitSubstNonTypeTemplateParmExpr()
4249 { return StmtVisitorTy::Visit(E->getExpr()); } in VisitCXXDefaultArgExpr()
4252 if (!E->getExpr()) in VisitCXXDefaultInitExpr()
4254 return StmtVisitorTy::Visit(E->getExpr()); in VisitCXXDefaultInitExpr()
4259 { return StmtVisitorTy::Visit(E->getSubExpr()); } in VisitExprWithCleanups()
4263 return static_cast<Derived*>(this)->VisitCastExpr(E); in VisitCXXReinterpretCastExpr()
4267 return static_cast<Derived*>(this)->VisitCastExpr(E); in VisitCXXDynamicCastExpr()
4271 switch (E->getOpcode()) { in VisitBinaryOperator()
4276 VisitIgnoredValue(E->getLHS()); in VisitBinaryOperator()
4277 return StmtVisitorTy::Visit(E->getRHS()); in VisitBinaryOperator()
4285 if (!handleLValueToRValueConversion(Info, E, E->getType(), Obj, Result)) in VisitBinaryOperator()
4295 if (!Evaluate(Info.CurrentCall->createTemporary(E->getOpaqueValue(), false), in VisitBinaryConditionalOperator()
4296 Info, E->getCommon())) in VisitBinaryConditionalOperator()
4306 // side-effects. This is an important GNU extension. See GCC PR38377 in VisitConditionalOperator()
4309 dyn_cast<CallExpr>(E->getCond()->IgnoreParenCasts())) in VisitConditionalOperator()
4310 if (CallCE->getBuiltinCallee() == Builtin::BI__builtin_constant_p) in VisitConditionalOperator()
4328 if (APValue *Value = Info.CurrentCall->getTemporary(E)) in VisitOpaqueValueExpr()
4331 const Expr *Source = E->getSourceExpr(); in VisitOpaqueValueExpr()
4350 const Expr *Callee = E->getCallee()->IgnoreParens(); in handleCallExpr()
4351 QualType CalleeType = Callee->getType(); in handleCallExpr()
4355 auto Args = llvm::makeArrayRef(E->getArgs(), E->getNumArgs()); in handleCallExpr()
4359 if (CalleeType->isSpecificBuiltinType(BuiltinType::BoundMember)) { in handleCallExpr()
4362 // Explicit bound member calls, such as x.f() or p->g(); in handleCallExpr()
4363 if (!EvaluateObjectArgument(Info, ME->getBase(), ThisVal)) in handleCallExpr()
4365 Member = ME->getMemberDecl(); in handleCallExpr()
4367 HasQualifier = ME->hasQualifier(); in handleCallExpr()
4369 // Indirect bound member calls ('.*' or '->*'). in handleCallExpr()
4379 } else if (CalleeType->isFunctionPointerType()) { in handleCallExpr()
4394 if (MD && !MD->isStatic()) { in handleCallExpr()
4395 // FIXME: When selecting an implicit conversion for an overloaded in handleCallExpr()
4396 // operator delete, we sometimes try to evaluate calls to conversion in handleCallExpr()
4408 if (!Info.Ctx.hasSameType(CalleeType->getPointeeType(), FD->getType())) in handleCallExpr()
4413 if (This && !This->checkSubobject(Info, E, CSK_This)) in handleCallExpr()
4419 isa<CXXMethodDecl>(FD) && cast<CXXMethodDecl>(FD)->isVirtual()) in handleCallExpr()
4423 Stmt *Body = FD->getBody(Definition); in handleCallExpr()
4425 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body) || in handleCallExpr()
4426 !HandleFunctionCall(E->getExprLoc(), Definition, This, Args, Body, Info, in handleCallExpr()
4434 return StmtVisitorTy::Visit(E->getInitializer()); in VisitCompoundLiteralExpr()
4437 if (E->getNumInits() == 0) in VisitInitListExpr()
4439 if (E->getNumInits() == 1) in VisitInitListExpr()
4440 return StmtVisitorTy::Visit(E->getInit(0)); in VisitInitListExpr()
4455 assert(!E->isArrow() && "missing call to bound member function?"); in VisitMemberExpr()
4458 if (!Evaluate(Val, Info, E->getBase())) in VisitMemberExpr()
4461 QualType BaseTy = E->getBase()->getType(); in VisitMemberExpr()
4463 const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); in VisitMemberExpr()
4465 assert(!FD->getType()->isReferenceType() && "prvalue reference?"); in VisitMemberExpr()
4466 assert(BaseTy->castAs<RecordType>()->getDecl()->getCanonicalDecl() == in VisitMemberExpr()
4467 FD->getParent()->getCanonicalDecl() && "record / field mismatch"); in VisitMemberExpr()
4479 switch (E->getCastKind()) { in VisitCastExpr()
4485 if (!EvaluateAtomic(E->getSubExpr(), AtomicVal, Info)) in VisitCastExpr()
4492 return StmtVisitorTy::Visit(E->getSubExpr()); in VisitCastExpr()
4496 if (!EvaluateLValue(E->getSubExpr(), LVal, Info)) in VisitCastExpr()
4499 // Note, we use the subexpression's type in order to retain cv-qualifiers. in VisitCastExpr()
4500 if (!handleLValueToRValueConversion(Info, E, E->getSubExpr()->getType(), in VisitCastExpr()
4521 if (!EvaluateLValue(UO->getSubExpr(), LVal, Info)) in VisitUnaryPostIncDec()
4524 if (!handleIncDec(this->Info, UO, LVal, UO->getSubExpr()->getType(), in VisitUnaryPostIncDec()
4525 UO->isIncrementOp(), &RVal)) in VisitUnaryPostIncDec()
4531 // We will have checked the full-expressions inside the statement expression in VisitStmtExpr()
4537 const CompoundStmt *CS = E->getSubStmt(); in VisitStmtExpr()
4538 if (CS->body_empty()) in VisitStmtExpr()
4541 for (CompoundStmt::const_body_iterator BI = CS->body_begin(), in VisitStmtExpr()
4542 BE = CS->body_end(); in VisitStmtExpr()
4547 Info.FFDiag((*BI)->getLocStart(), in VisitStmtExpr()
4551 return this->Visit(FinalExpr); in VisitStmtExpr()
4558 // FIXME: If the statement-expression terminated due to 'return', in VisitStmtExpr()
4562 Info.FFDiag((*BI)->getLocStart(), in VisitStmtExpr()
4579 // presence of side-effecting behavior. in VisitIgnoredBaseExpression()
4580 if (Info.getLangOpts().MSVCCompat && !E->HasSideEffects(Info.Ctx)) in VisitIgnoredBaseExpression()
4588 //===----------------------------------------------------------------------===//
4590 //===----------------------------------------------------------------------===//
4610 Result.setFrom(this->Info.Ctx, V); in Success()
4615 // Handle non-static data members. in VisitMemberExpr()
4618 if (E->isArrow()) { in VisitMemberExpr()
4619 EvalOK = EvaluatePointer(E->getBase(), Result, this->Info); in VisitMemberExpr()
4620 BaseTy = E->getBase()->getType()->castAs<PointerType>()->getPointeeType(); in VisitMemberExpr()
4621 } else if (E->getBase()->isRValue()) { in VisitMemberExpr()
4622 assert(E->getBase()->getType()->isRecordType()); in VisitMemberExpr()
4623 EvalOK = EvaluateTemporary(E->getBase(), Result, this->Info); in VisitMemberExpr()
4624 BaseTy = E->getBase()->getType(); in VisitMemberExpr()
4626 EvalOK = this->Visit(E->getBase()); in VisitMemberExpr()
4627 BaseTy = E->getBase()->getType(); in VisitMemberExpr()
4630 if (!this->Info.allowInvalidBaseExpr()) in VisitMemberExpr()
4636 const ValueDecl *MD = E->getMemberDecl(); in VisitMemberExpr()
4637 if (const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl())) { in VisitMemberExpr()
4638 assert(BaseTy->getAs<RecordType>()->getDecl()->getCanonicalDecl() == in VisitMemberExpr()
4639 FD->getParent()->getCanonicalDecl() && "record / field mismatch"); in VisitMemberExpr()
4641 if (!HandleLValueMember(this->Info, E, Result, FD)) in VisitMemberExpr()
4644 if (!HandleLValueIndirectMember(this->Info, E, Result, IFD)) in VisitMemberExpr()
4647 return this->Error(E); in VisitMemberExpr()
4649 if (MD->getType()->isReferenceType()) { in VisitMemberExpr()
4651 if (!handleLValueToRValueConversion(this->Info, E, MD->getType(), Result, in VisitMemberExpr()
4660 switch (E->getOpcode()) { in VisitBinaryOperator()
4666 return HandleMemberPointerAccess(this->Info, E, Result); in VisitBinaryOperator()
4671 switch (E->getCastKind()) { in VisitCastExpr()
4677 if (!this->Visit(E->getSubExpr())) in VisitCastExpr()
4682 return HandleLValueBasePath(this->Info, E, E->getSubExpr()->getType(), in VisitCastExpr()
4689 //===----------------------------------------------------------------------===//
4694 // temporaries (if building with -Wno-address-of-temporary).
4698 // - Declarations
4701 // - Literals
4711 // - Locals and temporaries
4717 // CallIndex, for a lifetime-extended temporary.
4719 //===----------------------------------------------------------------------===//
4753 switch (E->getCastKind()) { in VisitCastExpr()
4758 this->CCEDiag(E, diag::note_constexpr_invalid_cast) << 2; in VisitCastExpr()
4759 if (!Visit(E->getSubExpr())) in VisitCastExpr()
4765 if (!Visit(E->getSubExpr())) in VisitCastExpr()
4777 /// * @selector() expressions in Objective-C
4779 assert(E->isGLValue() || E->getType()->isFunctionType() || in EvaluateLValue()
4780 E->getType()->isVoidType() || isa<ObjCSelectorExpr>(E)); in EvaluateLValue()
4785 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl())) in VisitDeclRefExpr()
4787 if (const VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) in VisitDeclRefExpr()
4794 if (VD->hasLocalStorage() && Info.CurrentCall->Index > 1) in VisitVarDecl()
4797 if (!VD->getType()->isReferenceType()) { in VisitVarDecl()
4799 Result.set(VD, Frame->Index); in VisitVarDecl()
4808 if (V->isUninit()) { in VisitVarDecl()
4821 const Expr *Inner = E->GetTemporaryExpr()-> in VisitMaterializeTemporaryExpr()
4833 if (E->getStorageDuration() == SD_Static) { in VisitMaterializeTemporaryExpr()
4838 Value = &Info.CurrentCall-> in VisitMaterializeTemporaryExpr()
4839 createTemporary(E, E->getStorageDuration() == SD_Automatic); in VisitMaterializeTemporaryExpr()
4840 Result.set(E, Info.CurrentCall->Index); in VisitMaterializeTemporaryExpr()
4843 QualType Type = Inner->getType(); in VisitMaterializeTemporaryExpr()
4847 (E->getStorageDuration() == SD_Static && in VisitMaterializeTemporaryExpr()
4848 !CheckConstantExpression(Info, E->getExprLoc(), Type, *Value))) { in VisitMaterializeTemporaryExpr()
4855 --I; in VisitMaterializeTemporaryExpr()
4861 Type = Adjustments[I].DerivedToBase.BasePath->getType(); in VisitMaterializeTemporaryExpr()
4867 Type = Adjustments[I].Field->getType(); in VisitMaterializeTemporaryExpr()
4871 if (!HandleMemberPointerAccess(this->Info, Type, Result, in VisitMaterializeTemporaryExpr()
4874 Type = Adjustments[I].Ptr.MPT->getPointeeType(); in VisitMaterializeTemporaryExpr()
4885 // Defer visiting the literal until the lvalue-to-rvalue conversion. We can in VisitCompoundLiteralExpr()
4891 if (!E->isPotentiallyEvaluated()) in VisitCXXTypeidExpr()
4895 << E->getExprOperand()->getType() in VisitCXXTypeidExpr()
4896 << E->getExprOperand()->getSourceRange(); in VisitCXXTypeidExpr()
4906 if (const VarDecl *VD = dyn_cast<VarDecl>(E->getMemberDecl())) { in VisitMemberExpr()
4907 VisitIgnoredBaseExpression(E->getBase()); in VisitMemberExpr()
4912 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->getMemberDecl())) { in VisitMemberExpr()
4913 if (MD->isStatic()) { in VisitMemberExpr()
4914 VisitIgnoredBaseExpression(E->getBase()); in VisitMemberExpr()
4919 // Handle non-static data members. in VisitMemberExpr()
4925 if (E->getBase()->getType()->isVectorType()) in VisitArraySubscriptExpr()
4928 if (!EvaluatePointer(E->getBase(), Result, Info)) in VisitArraySubscriptExpr()
4932 if (!EvaluateInteger(E->getIdx(), Index, Info)) in VisitArraySubscriptExpr()
4935 return HandleLValueArrayAdjustment(Info, E, Result, E->getType(), in VisitArraySubscriptExpr()
4940 return EvaluatePointer(E->getSubExpr(), Result, Info); in VisitUnaryDeref()
4944 if (!Visit(E->getSubExpr())) in VisitUnaryReal()
4946 // __real is a no-op on scalar lvalues. in VisitUnaryReal()
4947 if (E->getSubExpr()->getType()->isAnyComplexType()) in VisitUnaryReal()
4948 HandleLValueComplexElement(Info, E, Result, E->getType(), false); in VisitUnaryReal()
4953 assert(E->getSubExpr()->getType()->isAnyComplexType() && in VisitUnaryImag()
4955 if (!Visit(E->getSubExpr())) in VisitUnaryImag()
4957 HandleLValueComplexElement(Info, E, Result, E->getType(), true); in VisitUnaryImag()
4965 if (!this->Visit(UO->getSubExpr())) in VisitUnaryPreIncDec()
4969 this->Info, UO, Result, UO->getSubExpr()->getType(), in VisitUnaryPreIncDec()
4970 UO->isIncrementOp(), nullptr); in VisitUnaryPreIncDec()
4981 if (!this->Visit(CAO->getLHS())) { in VisitCompoundAssignOperator()
4983 Evaluate(RHS, this->Info, CAO->getRHS()); in VisitCompoundAssignOperator()
4987 if (!Evaluate(RHS, this->Info, CAO->getRHS())) in VisitCompoundAssignOperator()
4991 this->Info, CAO, in VisitCompoundAssignOperator()
4992 Result, CAO->getLHS()->getType(), CAO->getComputationLHSType(), in VisitCompoundAssignOperator()
4993 CAO->getOpForCompoundAssignment(CAO->getOpcode()), RHS); in VisitCompoundAssignOperator()
5002 if (!this->Visit(E->getLHS())) { in VisitBinAssign()
5004 Evaluate(NewVal, this->Info, E->getRHS()); in VisitBinAssign()
5008 if (!Evaluate(NewVal, this->Info, E->getRHS())) in VisitBinAssign()
5011 return handleAssignment(this->Info, E, Result, E->getLHS()->getType(), in VisitBinAssign()
5015 //===----------------------------------------------------------------------===//
5017 //===----------------------------------------------------------------------===//
5052 if (!E->getBlockDecl()->hasCaptures()) in VisitBlockExpr()
5060 if (!Info.CurrentCall->This) { in VisitCXXThisExpr()
5062 Info.FFDiag(E, diag::note_constexpr_this) << E->isImplicit(); in VisitCXXThisExpr()
5067 Result = *Info.CurrentCall->This; in VisitCXXThisExpr()
5076 assert(E->isRValue() && E->getType()->hasPointerRepresentation()); in EvaluatePointer()
5081 if (E->getOpcode() != BO_Add && in VisitBinaryOperator()
5082 E->getOpcode() != BO_Sub) in VisitBinaryOperator()
5085 const Expr *PExp = E->getLHS(); in VisitBinaryOperator()
5086 const Expr *IExp = E->getRHS(); in VisitBinaryOperator()
5087 if (IExp->getType()->isPointerType()) in VisitBinaryOperator()
5099 if (E->getOpcode() == BO_Sub) in VisitBinaryOperator()
5100 AdditionalOffset = -AdditionalOffset; in VisitBinaryOperator()
5102 QualType Pointee = PExp->getType()->castAs<PointerType>()->getPointeeType(); in VisitBinaryOperator()
5108 return EvaluateLValue(E->getSubExpr(), Result, Info); in VisitUnaryAddrOf()
5112 const Expr* SubExpr = E->getSubExpr(); in VisitCastExpr()
5114 switch (E->getCastKind()) { in VisitCastExpr()
5128 if (!E->getType()->isVoidPointerType()) { in VisitCastExpr()
5130 if (SubExpr->getType()->isVoidPointerType()) in VisitCastExpr()
5132 << 3 << SubExpr->getType(); in VisitCastExpr()
5140 if (!EvaluatePointer(E->getSubExpr(), Result, Info)) in VisitCastExpr()
5147 return HandleLValueBasePath(Info, E, E->getSubExpr()->getType()-> in VisitCastExpr()
5148 castAs<PointerType>()->getPointeeType(), in VisitCastExpr()
5152 if (!Visit(E->getSubExpr())) in VisitCastExpr()
5159 VisitIgnoredValue(E->getSubExpr()); in VisitCastExpr()
5170 unsigned Size = Info.Ctx.getTypeSize(E->getType()); in VisitCastExpr()
5185 if (SubExpr->isGLValue()) { in VisitCastExpr()
5189 Result.set(SubExpr, Info.CurrentCall->Index); in VisitCastExpr()
5190 if (!EvaluateInPlace(Info.CurrentCall->createTemporary(SubExpr, false), in VisitCastExpr()
5196 = Info.Ctx.getAsConstantArrayType(SubExpr->getType())) in VisitCastExpr()
5213 if (const ReferenceType *Ref = T->getAs<ReferenceType>()) in GetAlignOfType()
5214 T = Ref->getPointeeType(); in GetAlignOfType()
5222 E = E->IgnoreParens(); in GetAlignOfExpr()
5224 // The kinds of expressions that we have special-case logic here for in GetAlignOfExpr()
5231 return Info.Ctx.getDeclAlign(DRE->getDecl(), in GetAlignOfExpr()
5235 return Info.Ctx.getDeclAlign(ME->getMemberDecl(), in GetAlignOfExpr()
5238 return GetAlignOfType(Info, E->getType()); in GetAlignOfExpr()
5245 switch (E->getBuiltinCallee()) { in VisitCallExpr()
5247 return EvaluateLValue(E->getArg(0), Result, Info); in VisitCallExpr()
5251 // behavior is non-constant. in VisitCallExpr()
5252 if (!EvaluatePointer(E->getArg(0), Result, Info)) in VisitCallExpr()
5257 if (!EvaluateInteger(E->getArg(1), Alignment, Info)) in VisitCallExpr()
5261 if (E->getNumArgs() > 2) { in VisitCallExpr()
5263 if (!EvaluateInteger(E->getArg(2), Offset, Info)) in VisitCallExpr()
5266 int64_t AdditionalOffset = -getExtValue(Offset); in VisitCallExpr()
5285 CCEDiag(E->getArg(0), in VisitCallExpr()
5300 CCEDiag(E->getArg(0), in VisitCallExpr()
5304 CCEDiag(E->getArg(0), in VisitCallExpr()
5318 //===----------------------------------------------------------------------===//
5320 //===----------------------------------------------------------------------===//
5351 assert(E->isRValue() && E->getType()->isMemberPointerType()); in EvaluateMemberPointer()
5356 switch (E->getCastKind()) { in VisitCastExpr()
5361 VisitIgnoredValue(E->getSubExpr()); in VisitCastExpr()
5365 if (!Visit(E->getSubExpr())) in VisitCastExpr()
5367 if (E->path_empty()) in VisitCastExpr()
5369 // Base-to-derived member pointer casts store the path in derived-to-base in VisitCastExpr()
5371 // the wrong end of the derived->base arc, so stagger the path by one class. in VisitCastExpr()
5373 for (ReverseIter PathI(E->path_end() - 1), PathE(E->path_begin()); in VisitCastExpr()
5375 assert(!(*PathI)->isVirtual() && "memptr cast through vbase"); in VisitCastExpr()
5376 const CXXRecordDecl *Derived = (*PathI)->getType()->getAsCXXRecordDecl(); in VisitCastExpr()
5380 const Type *FinalTy = E->getType()->castAs<MemberPointerType>()->getClass(); in VisitCastExpr()
5381 if (!Result.castToDerived(FinalTy->getAsCXXRecordDecl())) in VisitCastExpr()
5387 if (!Visit(E->getSubExpr())) in VisitCastExpr()
5389 for (CastExpr::path_const_iterator PathI = E->path_begin(), in VisitCastExpr()
5390 PathE = E->path_end(); PathI != PathE; ++PathI) { in VisitCastExpr()
5391 assert(!(*PathI)->isVirtual() && "memptr cast through vbase"); in VisitCastExpr()
5392 const CXXRecordDecl *Base = (*PathI)->getType()->getAsCXXRecordDecl(); in VisitCastExpr()
5403 return Success(cast<DeclRefExpr>(E->getSubExpr())->getDecl()); in VisitUnaryAddrOf()
5406 //===----------------------------------------------------------------------===//
5408 //===----------------------------------------------------------------------===//
5425 return ZeroInitialization(E, E->getType()); in ZeroInitialization()
5435 return VisitCXXConstructExpr(E, E->getType()); in VisitCXXConstructExpr()
5443 /// Perform zero-initialization on an object of non-union class type.
5445 /// To zero-initialize an object or reference of type T means:
5447 /// -- if T is a (possibly cv-qualified) non-union class type,
5448 /// each non-static data member and each base-class subobject is
5449 /// zero-initialized
5453 assert(!RD->isUnion() && "Expected non-union class type"); in HandleClassZeroInitialization()
5455 Result = APValue(APValue::UninitStruct(), CD ? CD->getNumBases() : 0, in HandleClassZeroInitialization()
5456 std::distance(RD->field_begin(), RD->field_end())); in HandleClassZeroInitialization()
5458 if (RD->isInvalidDecl()) return false; in HandleClassZeroInitialization()
5463 for (CXXRecordDecl::base_class_const_iterator I = CD->bases_begin(), in HandleClassZeroInitialization()
5464 End = CD->bases_end(); I != End; ++I, ++Index) { in HandleClassZeroInitialization()
5465 const CXXRecordDecl *Base = I->getType()->getAsCXXRecordDecl(); in HandleClassZeroInitialization()
5475 for (const auto *I : RD->fields()) { in HandleClassZeroInitialization()
5476 // -- if T is a reference type, no initialization is performed. in HandleClassZeroInitialization()
5477 if (I->getType()->isReferenceType()) in HandleClassZeroInitialization()
5484 ImplicitValueInitExpr VIE(I->getType()); in HandleClassZeroInitialization()
5486 Result.getStructField(I->getFieldIndex()), Info, Subobject, &VIE)) in HandleClassZeroInitialization()
5494 const RecordDecl *RD = T->castAs<RecordType>()->getDecl(); in ZeroInitialization()
5495 if (RD->isInvalidDecl()) return false; in ZeroInitialization()
5496 if (RD->isUnion()) { in ZeroInitialization()
5497 // C++11 [dcl.init]p5: If T is a (possibly cv-qualified) union type, the in ZeroInitialization()
5498 // object's first non-static named data member is zero-initialized in ZeroInitialization()
5499 RecordDecl::field_iterator I = RD->field_begin(); in ZeroInitialization()
5500 if (I == RD->field_end()) { in ZeroInitialization()
5509 ImplicitValueInitExpr VIE(I->getType()); in ZeroInitialization()
5513 if (isa<CXXRecordDecl>(RD) && cast<CXXRecordDecl>(RD)->getNumVBases()) { in ZeroInitialization()
5522 switch (E->getCastKind()) { in VisitCastExpr()
5527 return Visit(E->getSubExpr()); in VisitCastExpr()
5532 if (!Evaluate(DerivedObject, Info, E->getSubExpr())) in VisitCastExpr()
5535 return Error(E->getSubExpr()); in VisitCastExpr()
5537 // Derived-to-base rvalue conversion: just slice off the derived part. in VisitCastExpr()
5539 const CXXRecordDecl *RD = E->getSubExpr()->getType()->getAsCXXRecordDecl(); in VisitCastExpr()
5540 for (CastExpr::path_const_iterator PathI = E->path_begin(), in VisitCastExpr()
5541 PathE = E->path_end(); PathI != PathE; ++PathI) { in VisitCastExpr()
5542 assert(!(*PathI)->isVirtual() && "record rvalue with virtual base"); in VisitCastExpr()
5543 const CXXRecordDecl *Base = (*PathI)->getType()->getAsCXXRecordDecl(); in VisitCastExpr()
5544 Value = &Value->getStructBase(getBaseIndex(RD, Base)); in VisitCastExpr()
5554 const RecordDecl *RD = E->getType()->castAs<RecordType>()->getDecl(); in VisitInitListExpr()
5555 if (RD->isInvalidDecl()) return false; in VisitInitListExpr()
5558 if (RD->isUnion()) { in VisitInitListExpr()
5559 const FieldDecl *Field = E->getInitializedFieldInUnion(); in VisitInitListExpr()
5565 // first element of the union is value-initialized. in VisitInitListExpr()
5569 ImplicitValueInitExpr VIE(Field->getType()); in VisitInitListExpr()
5570 const Expr *InitExpr = E->getNumInits() ? E->getInit(0) : &VIE; in VisitInitListExpr()
5585 Result = APValue(APValue::UninitStruct(), CXXRD ? CXXRD->getNumBases() : 0, in VisitInitListExpr()
5586 std::distance(RD->field_begin(), RD->field_end())); in VisitInitListExpr()
5592 for (const auto &Base : CXXRD->bases()) { in VisitInitListExpr()
5593 assert(ElementNo < E->getNumInits() && "missing init for base class"); in VisitInitListExpr()
5594 const Expr *Init = E->getInit(ElementNo); in VisitInitListExpr()
5611 for (const auto *Field : RD->fields()) { in VisitInitListExpr()
5612 // Anonymous bit-fields are not considered members of the class for in VisitInitListExpr()
5614 if (Field->isUnnamedBitfield()) in VisitInitListExpr()
5619 bool HaveInit = ElementNo < E->getNumInits(); in VisitInitListExpr()
5623 if (!HandleLValueMember(Info, HaveInit ? E->getInit(ElementNo) : E, in VisitInitListExpr()
5627 // Perform an implicit value-initialization for members beyond the end of in VisitInitListExpr()
5629 ImplicitValueInitExpr VIE(HaveInit ? Info.Ctx.IntTy : Field->getType()); in VisitInitListExpr()
5630 const Expr *Init = HaveInit ? E->getInit(ElementNo++) : &VIE; in VisitInitListExpr()
5636 APValue &FieldVal = Result.getStructField(Field->getFieldIndex()); in VisitInitListExpr()
5638 (Field->isBitField() && !truncateBitfieldValue(Info, Init, in VisitInitListExpr()
5653 const CXXConstructorDecl *FD = E->getConstructor(); in VisitCXXConstructExpr()
5654 if (FD->isInvalidDecl() || FD->getParent()->isInvalidDecl()) return false; in VisitCXXConstructExpr()
5656 bool ZeroInit = E->requiresZeroInitialization(); in VisitCXXConstructExpr()
5657 if (CheckTrivialDefaultConstructor(Info, E->getExprLoc(), FD, ZeroInit)) { in VisitCXXConstructExpr()
5658 // If we've already performed zero-initialization, we're already done. in VisitCXXConstructExpr()
5663 // 1) We're performing value-initialization, and should zero-initialize in VisitCXXConstructExpr()
5665 // 2) We're performing default-initialization of an object with a trivial in VisitCXXConstructExpr()
5674 auto Body = FD->getBody(Definition); in VisitCXXConstructExpr()
5676 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body)) in VisitCXXConstructExpr()
5680 if (E->isElidable() && !ZeroInit) in VisitCXXConstructExpr()
5682 = dyn_cast<MaterializeTemporaryExpr>(E->getArg(0))) in VisitCXXConstructExpr()
5683 return Visit(ME->GetTemporaryExpr()); in VisitCXXConstructExpr()
5688 auto Args = llvm::makeArrayRef(E->getArgs(), E->getNumArgs()); in VisitCXXConstructExpr()
5701 const CXXConstructorDecl *FD = E->getConstructor(); in VisitCXXInheritedCtorInitExpr()
5702 if (FD->isInvalidDecl() || FD->getParent()->isInvalidDecl()) in VisitCXXInheritedCtorInitExpr()
5706 auto Body = FD->getBody(Definition); in VisitCXXInheritedCtorInitExpr()
5708 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body)) in VisitCXXInheritedCtorInitExpr()
5711 return HandleConstructorCall(E, This, Info.CurrentCall->Arguments, in VisitCXXInheritedCtorInitExpr()
5719 Info.Ctx.getAsConstantArrayType(E->getSubExpr()->getType()); in VisitCXXStdInitializerListExpr()
5722 if (!EvaluateLValue(E->getSubExpr(), Array, Info)) in VisitCXXStdInitializerListExpr()
5729 RecordDecl *Record = E->getType()->castAs<RecordType>()->getDecl(); in VisitCXXStdInitializerListExpr()
5730 RecordDecl::field_iterator Field = Record->field_begin(); in VisitCXXStdInitializerListExpr()
5731 if (Field == Record->field_end()) in VisitCXXStdInitializerListExpr()
5735 if (!Field->getType()->isPointerType() || in VisitCXXStdInitializerListExpr()
5736 !Info.Ctx.hasSameType(Field->getType()->getPointeeType(), in VisitCXXStdInitializerListExpr()
5737 ArrayType->getElementType())) in VisitCXXStdInitializerListExpr()
5744 if (++Field == Record->field_end()) in VisitCXXStdInitializerListExpr()
5747 if (Field->getType()->isPointerType() && in VisitCXXStdInitializerListExpr()
5748 Info.Ctx.hasSameType(Field->getType()->getPointeeType(), in VisitCXXStdInitializerListExpr()
5749 ArrayType->getElementType())) { in VisitCXXStdInitializerListExpr()
5752 ArrayType->getElementType(), in VisitCXXStdInitializerListExpr()
5753 ArrayType->getSize().getZExtValue())) in VisitCXXStdInitializerListExpr()
5756 } else if (Info.Ctx.hasSameType(Field->getType(), Info.Ctx.getSizeType())) in VisitCXXStdInitializerListExpr()
5758 Result.getStructField(1) = APValue(APSInt(ArrayType->getSize())); in VisitCXXStdInitializerListExpr()
5762 if (++Field != Record->field_end()) in VisitCXXStdInitializerListExpr()
5770 assert(E->isRValue() && E->getType()->isRecordType() && in EvaluateRecord()
5775 //===----------------------------------------------------------------------===//
5779 // lvalues. The full-object of which the temporary is a subobject is implicitly
5781 //===----------------------------------------------------------------------===//
5791 Result.set(E, Info.CurrentCall->Index); in VisitConstructExpr()
5792 return EvaluateInPlace(Info.CurrentCall->createTemporary(E, false), in VisitConstructExpr()
5797 switch (E->getCastKind()) { in VisitCastExpr()
5802 return VisitConstructExpr(E->getSubExpr()); in VisitCastExpr()
5822 assert(E->isRValue() && E->getType()->isRecordType()); in EvaluateTemporary()
5826 //===----------------------------------------------------------------------===//
5828 //===----------------------------------------------------------------------===//
5840 assert(V.size() == E->getType()->castAs<VectorType>()->getNumElements()); in Success()
5853 { return Visit(E->getSubExpr()); } in VisitUnaryReal()
5857 // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div,
5864 assert(E->isRValue() && E->getType()->isVectorType() &&"not a vector rvalue"); in EvaluateVector()
5869 const VectorType *VTy = E->getType()->castAs<VectorType>(); in VisitCastExpr()
5870 unsigned NElts = VTy->getNumElements(); in VisitCastExpr()
5872 const Expr *SE = E->getSubExpr(); in VisitCastExpr()
5873 QualType SETy = SE->getType(); in VisitCastExpr()
5875 switch (E->getCastKind()) { in VisitCastExpr()
5878 if (SETy->isIntegerType()) { in VisitCastExpr()
5883 } else if (SETy->isRealFloatingType()) { in VisitCastExpr()
5902 QualType EltTy = VTy->getElementType(); in VisitCastExpr()
5906 if (EltTy->isRealFloatingType()) { in VisitCastExpr()
5919 } else if (EltTy->isIntegerType()) { in VisitCastExpr()
5926 Elts.push_back(APValue(APSInt(Elt, EltTy->isSignedIntegerType()))); in VisitCastExpr()
5940 const VectorType *VT = E->getType()->castAs<VectorType>(); in VisitInitListExpr()
5941 unsigned NumInits = E->getNumInits(); in VisitInitListExpr()
5942 unsigned NumElements = VT->getNumElements(); in VisitInitListExpr()
5944 QualType EltTy = VT->getElementType(); in VisitInitListExpr()
5955 && E->getInit(CountInits)->getType()->isVectorType()) { in VisitInitListExpr()
5957 if (!EvaluateVector(E->getInit(CountInits), v, Info)) in VisitInitListExpr()
5963 } else if (EltTy->isIntegerType()) { in VisitInitListExpr()
5966 if (!EvaluateInteger(E->getInit(CountInits), sInt, Info)) in VisitInitListExpr()
5975 if (!EvaluateFloat(E->getInit(CountInits), f, Info)) in VisitInitListExpr()
5989 const VectorType *VT = E->getType()->getAs<VectorType>(); in ZeroInitialization()
5990 QualType EltTy = VT->getElementType(); in ZeroInitialization()
5992 if (EltTy->isIntegerType()) in ZeroInitialization()
5998 SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement); in ZeroInitialization()
6003 VisitIgnoredValue(E->getSubExpr()); in VisitUnaryImag()
6007 //===----------------------------------------------------------------------===//
6009 //===----------------------------------------------------------------------===//
6030 Info.Ctx.getAsConstantArrayType(E->getType()); in ZeroInitialization()
6035 CAT->getSize().getZExtValue()); in ZeroInitialization()
6038 // Zero-initialize all elements. in ZeroInitialization()
6041 ImplicitValueInitExpr VIE(CAT->getElementType()); in ZeroInitialization()
6058 assert(E->isRValue() && E->getType()->isArrayType() && "not an array rvalue"); in EvaluateArray()
6063 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(E->getType()); in VisitInitListExpr()
6068 // an appropriately-typed string literal enclosed in braces. in VisitInitListExpr()
6069 if (E->isStringLiteralInit()) { in VisitInitListExpr()
6071 if (!EvaluateLValue(E->getInit(0), LV, Info)) in VisitInitListExpr()
6081 "zero-initialized array shouldn't have any initialized elts"); in VisitInitListExpr()
6086 unsigned NumEltsToInit = E->getNumInits(); in VisitInitListExpr()
6087 unsigned NumElts = CAT->getSize().getZExtValue(); in VisitInitListExpr()
6088 const Expr *FillerExpr = E->hasArrayFiller() ? E->getArrayFiller() : nullptr; in VisitInitListExpr()
6091 // array element. For now, just whitelist non-class value-initialization. in VisitInitListExpr()
6097 // If the array was previously zero-initialized, preserve the in VisitInitListExpr()
6098 // zero-initialized values. in VisitInitListExpr()
6110 Index < E->getNumInits() ? E->getInit(Index) : FillerExpr; in VisitInitListExpr()
6114 CAT->getElementType(), 1)) { in VisitInitListExpr()
6132 return VisitCXXConstructExpr(E, This, &Result, E->getType()); in VisitCXXConstructExpr()
6139 bool HadZeroInit = !Value->isUninit(); in VisitCXXConstructExpr()
6142 unsigned N = CAT->getSize().getZExtValue(); in VisitCXXConstructExpr()
6144 // Preserve the array filler if we had prior zero-initialization. in VisitCXXConstructExpr()
6146 HadZeroInit && Value->hasArrayFiller() ? Value->getArrayFiller() in VisitCXXConstructExpr()
6153 Value->getArrayInitializedElt(I) = Filler; in VisitCXXConstructExpr()
6159 if (!VisitCXXConstructExpr(E, ArrayElt, &Value->getArrayInitializedElt(I), in VisitCXXConstructExpr()
6160 CAT->getElementType()) || in VisitCXXConstructExpr()
6162 CAT->getElementType(), 1)) in VisitCXXConstructExpr()
6168 if (!Type->isRecordType()) in VisitCXXConstructExpr()
6175 //===----------------------------------------------------------------------===//
6178 // As a GNU extension, we support casting pointers to sufficiently-wide integer
6180 // either as an integer-valued APValue, or as an lvalue-valued APValue.
6181 //===----------------------------------------------------------------------===//
6192 assert(E->getType()->isIntegralOrEnumerationType() && in Success()
6194 assert(SI.isSigned() == E->getType()->isSignedIntegerOrEnumerationType() && in Success()
6196 assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && in Success()
6206 assert(E->getType()->isIntegralOrEnumerationType() && in Success()
6208 assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && in Success()
6212 E->getType()->isUnsignedIntegerOrEnumerationType()); in Success()
6220 assert(E->getType()->isIntegralOrEnumerationType() && in Success()
6222 Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType())); in Success()
6243 //===--------------------------------------------------------------------===//
6245 //===--------------------------------------------------------------------===//
6248 return Success(E->getValue(), E); in VisitIntegerLiteral()
6251 return Success(E->getValue(), E); in VisitCharacterLiteral()
6256 if (CheckReferencedDecl(E, E->getDecl())) in VisitDeclRefExpr()
6262 if (CheckReferencedDecl(E, E->getMemberDecl())) { in VisitMemberExpr()
6263 VisitIgnoredBaseExpression(E->getBase()); in VisitMemberExpr()
6279 return Success(E->getValue(), E); in VisitCXXBoolLiteralExpr()
6283 return Success(E->getValue(), E); in VisitObjCBoolLiteralExpr()
6292 return Success(E->getValue(), E); in VisitTypeTraitExpr()
6296 return Success(E->getValue(), E); in VisitArrayTypeTraitExpr()
6300 return Success(E->getValue(), E); in VisitExpressionTraitExpr()
6315 /// EvaluateIntegerOrLValue - Evaluate an rvalue integral-typed expression, and
6319 /// pointer-sized integral types. We support this by allowing the evaluation of
6325 assert(E->isRValue() && E->getType()->isIntegralOrEnumerationType()); in EvaluateIntegerOrLValue()
6350 bool SameSign = (ECD->getInitVal().isSigned() in CheckReferencedDecl()
6351 == E->getType()->isSignedIntegerOrEnumerationType()); in CheckReferencedDecl()
6352 bool SameWidth = (ECD->getInitVal().getBitWidth() in CheckReferencedDecl()
6353 == Info.Ctx.getIntWidth(E->getType())); in CheckReferencedDecl()
6355 return Success(ECD->getInitVal(), E); in CheckReferencedDecl()
6359 llvm::APSInt Val = ECD->getInitVal(); in CheckReferencedDecl()
6361 Val.setIsSigned(!ECD->getInitVal().isSigned()); in CheckReferencedDecl()
6363 Val = Val.extOrTrunc(Info.Ctx.getIntWidth(E->getType())); in CheckReferencedDecl()
6370 /// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
6377 no_type_class = -1, in EvaluateBuiltinClassifyType()
6390 if (E->getNumArgs() == 0) in EvaluateBuiltinClassifyType()
6393 QualType CanTy = E->getArg(0)->getType().getCanonicalType(); in EvaluateBuiltinClassifyType()
6396 switch (CanTy->getTypeClass()) { in EvaluateBuiltinClassifyType()
6405 switch (BT->getKind()) { in EvaluateBuiltinClassifyType()
6457 if (CanTy->isMemberDataPointerType()) in EvaluateBuiltinClassifyType()
6462 assert(CanTy->isMemberFunctionPointerType()); in EvaluateBuiltinClassifyType()
6474 if (const RecordType *RT = CanTy->getAs<RecordType>()) { in EvaluateBuiltinClassifyType()
6475 switch (RT->getDecl()->getTagKind()) { in EvaluateBuiltinClassifyType()
6512 /// EvaluateBuiltinConstantPForLValue - Determine the result of
6523 /// EvaluateBuiltinConstantP - Evaluate __builtin_constant_p as similarly to
6526 QualType ArgType = Arg->getType(); in EvaluateBuiltinConstantP()
6531 // - If the operand is of integral, floating, complex or enumeration type, in EvaluateBuiltinConstantP()
6533 // - If the operand and can be folded to a pointer to the first character in EvaluateBuiltinConstantP()
6541 if (ArgType->isIntegralOrEnumerationType()) { in EvaluateBuiltinConstantP()
6543 if (!Arg->EvaluateAsRValue(Result, Ctx) || Result.HasSideEffects) in EvaluateBuiltinConstantP()
6551 } else if (ArgType->isFloatingType() || ArgType->isAnyComplexType()) { in EvaluateBuiltinConstantP()
6552 return Arg->isEvaluatable(Ctx); in EvaluateBuiltinConstantP()
6553 } else if (ArgType->isPointerType() || Arg->isGLValue()) { in EvaluateBuiltinConstantP()
6557 if ((Arg->isGLValue() ? EvaluateLValue(Arg, LV, Info) in EvaluateBuiltinConstantP()
6572 return VD->getType(); in getObjectType()
6575 return E->getType(); in getObjectType()
6581 /// A more selective version of E->IgnoreParenCasts for
6588 assert(E->isRValue() && E->getType()->hasPointerRepresentation()); in ignorePointerCastsAndParens()
6590 auto *NoParens = E->IgnoreParens(); in ignorePointerCastsAndParens()
6597 auto CastKind = Cast->getCastKind(); in ignorePointerCastsAndParens()
6602 auto *SubExpr = Cast->getSubExpr(); in ignorePointerCastsAndParens()
6603 if (!SubExpr->getType()->hasPointerRepresentation() || !SubExpr->isRValue()) in ignorePointerCastsAndParens()
6626 const RecordDecl *Parent = FD->getParent(); in isDesignatorAtObjectEnd()
6627 Invalid = Parent->isInvalidDecl(); in isDesignatorAtObjectEnd()
6628 if (Invalid || Parent->isUnion()) in isDesignatorAtObjectEnd()
6631 return FD->getFieldIndex() + 1 == Layout.getFieldCount(); in isDesignatorAtObjectEnd()
6636 if (auto *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) { in isDesignatorAtObjectEnd()
6640 } else if (auto *IFD = dyn_cast<IndirectFieldDecl>(ME->getMemberDecl())) { in isDesignatorAtObjectEnd()
6641 for (auto *FD : IFD->chain()) { in isDesignatorAtObjectEnd()
6651 if (BaseType->isArrayType()) { in isDesignatorAtObjectEnd()
6658 if (Index + 1 != CAT->getSize()) in isDesignatorAtObjectEnd()
6660 BaseType = CAT->getElementType(); in isDesignatorAtObjectEnd()
6661 } else if (BaseType->isAnyComplexType()) { in isDesignatorAtObjectEnd()
6662 auto *CT = BaseType->castAs<ComplexType>(); in isDesignatorAtObjectEnd()
6666 BaseType = CT->getElementType(); in isDesignatorAtObjectEnd()
6671 BaseType = FD->getType(); in isDesignatorAtObjectEnd()
6698 /// If @p WasError is non-null, this will report whether the failure to evaluate
6720 // The operand of __builtin_object_size is never evaluated for side-effects. in tryEvaluateBuiltinObjectSize()
6721 // If there are any, but we can determine the pointed-to object anyway, then in tryEvaluateBuiltinObjectSize()
6722 // ignore the side-effects. in tryEvaluateBuiltinObjectSize()
6726 if (E->isGLValue()) { in tryEvaluateBuiltinObjectSize()
6754 // int a = __builtin_object_size(p->buff + 4, 3); // returns 28 in tryEvaluateBuiltinObjectSize()
6755 // int b = __builtin_object_size(p->buff + 4, 2); // returns 0, not 40 in tryEvaluateBuiltinObjectSize()
6779 // time, __builtin_object_size should return (size_t) -1 for type 0 or 1 in tryEvaluateBuiltinObjectSize()
6785 // denoted by the pointer. But that's not quite right -- what we actually in tryEvaluateBuiltinObjectSize()
6786 // want is the size of the immediately-enclosing array, if there is one. in tryEvaluateBuiltinObjectSize()
6791 AmountToAdd = End.Designator.MostDerivedArraySize - in tryEvaluateBuiltinObjectSize()
6800 if (PointeeType->isIncompleteType() || PointeeType->isFunctionType()) in tryEvaluateBuiltinObjectSize()
6813 // strcpy(&F->c[0], Bar); in tryEvaluateBuiltinObjectSize()
6815 // So, if we see that we're examining a 1-length (or 0-length) array at the in tryEvaluateBuiltinObjectSize()
6829 return Success((EndOffset - BaseOffset).getQuantity(), E); in tryEvaluateBuiltinObjectSize()
6836 if (::tryEvaluateBuiltinObjectSize(E->getArg(0), Type, Info, Size, &WasError)) in TryEvaluateBuiltinObjectSize()
6844 switch (unsigned BuiltinOp = E->getBuiltinCallee()) { in VisitCallExpr()
6851 E->getArg(1)->EvaluateKnownConstInt(Info.Ctx).getZExtValue(); in VisitCallExpr()
6857 if (E->getArg(0)->HasSideEffects(Info.Ctx)) in VisitCallExpr()
6858 return Success((Type & 2) ? 0 : -1, E); in VisitCallExpr()
6874 return Success((Type & 2) ? 0 : -1, E); in VisitCallExpr()
6882 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
6900 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
6909 return Success(EvaluateBuiltinConstantP(Info.Ctx, E->getArg(0)), E); in VisitCallExpr()
6916 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
6925 int Operand = E->getArg(0)->EvaluateKnownConstInt(Info.Ctx).getZExtValue(); in VisitCallExpr()
6931 return Visit(E->getArg(0)); in VisitCallExpr()
6937 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
6946 if (!EvaluateFloat(E->getArg(5), Val, Info)) in VisitCallExpr()
6955 return Visit(E->getArg(Arg)); in VisitCallExpr()
6960 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitCallExpr()
6961 Success(Val.isInfinity() ? (Val.isNegative() ? -1 : 1) : 0, E); in VisitCallExpr()
6966 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitCallExpr()
6972 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitCallExpr()
6978 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitCallExpr()
6984 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitCallExpr()
6992 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
7002 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
7020 if (!EvaluatePointer(E->getArg(0), String, Info)) in VisitCallExpr()
7028 StringRef Str = S->getBytes(); in VisitCallExpr()
7031 S->getCharByteWidth() == 1) { in VisitCallExpr()
7045 QualType CharTy = E->getArg(0)->getType()->getPointeeType(); in VisitCallExpr()
7062 if (!EvaluateInteger(E->getArg(0), SizeVal, Info)) in VisitCallExpr()
7067 // lock-free. If the size isn't a power of two, or greater than the in VisitCallExpr()
7068 // maximum alignment where we promote atomics, we know it is not lock-free in VisitCallExpr()
7070 // the answer can only be determined at runtime; for example, 16-byte in VisitCallExpr()
7071 // atomics have lock-free implementations on some, but not all, in VisitCallExpr()
7072 // x86-64 processors. in VisitCallExpr()
7074 // Check power-of-two. in VisitCallExpr()
7083 E->getArg(1)->isNullPointerConstant(Info.Ctx, in VisitCallExpr()
7085 // OK, we will inline appropriately-aligned operations of this size, in VisitCallExpr()
7086 // and _Atomic(T) is appropriately-aligned. in VisitCallExpr()
7089 QualType PointeeType = E->getArg(1)->IgnoreImpCasts()->getType()-> in VisitCallExpr()
7090 castAs<PointerType>()->getPointeeType(); in VisitCallExpr()
7091 if (!PointeeType->isIncompleteType() && in VisitCallExpr()
7117 if (!BDecl || ADecl->getCanonicalDecl() != BDecl->getCanonicalDecl()) in HasSameBase()
7140 // A pointer to an incomplete type might be past-the-end if the type's size is in isOnePastTheEndOfCompleteObject()
7143 if (Ty->isIncompleteType()) in isOnePastTheEndOfCompleteObject()
7146 // We're a past-the-end pointer if we point to the byte after the object, in isOnePastTheEndOfCompleteObject()
7206 return E->getOpcode() == BO_Comma || in shouldEnqueue()
7207 E->isLogicalOp() || in shouldEnqueue()
7208 (E->isRValue() && in shouldEnqueue()
7209 E->getType()->isIntegralOrEnumerationType() && in shouldEnqueue()
7210 E->getLHS()->getType()->isIntegralOrEnumerationType() && in shouldEnqueue()
7211 E->getRHS()->getType()->isIntegralOrEnumerationType()); in shouldEnqueue()
7260 E = E->IgnoreParens(); in enqueue()
7272 if (E->getOpcode() == BO_Comma) { in VisitBinOpLHSOnly()
7279 if (E->isLogicalOp()) { in VisitBinOpLHSOnly()
7283 // evaluating the RHS: 0 && X -> 0, 1 || X -> 1 in VisitBinOpLHSOnly()
7284 if (LHSAsBool == (E->getOpcode() == BO_LOr)) { in VisitBinOpLHSOnly()
7297 // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. in VisitBinOpLHSOnly()
7305 assert(E->getLHS()->getType()->isIntegralOrEnumerationType() && in VisitBinOpLHSOnly()
7306 E->getRHS()->getType()->isIntegralOrEnumerationType()); in VisitBinOpLHSOnly()
7317 if (E->getOpcode() == BO_Comma) { in VisitBinOp()
7324 if (E->isLogicalOp()) { in VisitBinOp()
7331 if (E->getOpcode() == BO_LOr) in VisitBinOp()
7339 // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. in VisitBinOp()
7340 if (rhsResult == (E->getOpcode() == BO_LOr)) in VisitBinOp()
7348 assert(E->getLHS()->getType()->isIntegralOrEnumerationType() && in VisitBinOp()
7349 E->getRHS()->getType()->isIntegralOrEnumerationType()); in VisitBinOp()
7358 if (E->isAdditiveOp() && LHSVal.isLValue() && RHSVal.isInt()) { in VisitBinOp()
7362 if (E->getOpcode() == BO_Add) in VisitBinOp()
7365 Result.getLValueOffset() -= AdditionalOffset; in VisitBinOp()
7370 if (E->getOpcode() == BO_Add && in VisitBinOp()
7378 if (E->getOpcode() == BO_Sub && LHSVal.isLValue() && RHSVal.isLValue()) { in VisitBinOp()
7379 // Handle (intptr_t)&&A - (intptr_t)&&B. in VisitBinOp()
7392 if (LHSAddrExpr->getLabel()->getDeclContext() != in VisitBinOp()
7393 RHSAddrExpr->getLabel()->getDeclContext()) in VisitBinOp()
7406 APSInt Value(Info.Ctx.getIntWidth(E->getType()), in VisitBinOp()
7407 E->getType()->isUnsignedIntegerOrEnumerationType()); in VisitBinOp()
7408 if (!handleIntIntBinOp(Info, E, LHSVal.getInt(), E->getOpcode(), in VisitBinOp()
7422 enqueue(Bop->getLHS()); in process()
7443 enqueue(Bop->getRHS()); in process()
7484 if (!Info.keepEvaluatingAfterFailure() && E->isAssignmentOp()) in VisitBinaryOperator()
7487 DelayedNoteFailureRAII MaybeNoteFailureLater(Info, E->isAssignmentOp()); in VisitBinaryOperator()
7491 QualType LHSTy = E->getLHS()->getType(); in VisitBinaryOperator()
7492 QualType RHSTy = E->getRHS()->getType(); in VisitBinaryOperator()
7494 if (LHSTy->isAnyComplexType() || RHSTy->isAnyComplexType()) { in VisitBinaryOperator()
7497 if (E->isAssignmentOp()) { in VisitBinaryOperator()
7499 EvaluateLValue(E->getLHS(), LV, Info); in VisitBinaryOperator()
7501 } else if (LHSTy->isRealFloatingType()) { in VisitBinaryOperator()
7502 LHSOK = EvaluateFloat(E->getLHS(), LHS.FloatReal, Info); in VisitBinaryOperator()
7508 LHSOK = EvaluateComplex(E->getLHS(), LHS, Info); in VisitBinaryOperator()
7513 if (E->getRHS()->getType()->isRealFloatingType()) { in VisitBinaryOperator()
7514 if (!EvaluateFloat(E->getRHS(), RHS.FloatReal, Info) || !LHSOK) in VisitBinaryOperator()
7518 } else if (!EvaluateComplex(E->getRHS(), RHS, Info) || !LHSOK) in VisitBinaryOperator()
7527 if (E->getOpcode() == BO_EQ) in VisitBinaryOperator()
7531 assert(E->getOpcode() == BO_NE && in VisitBinaryOperator()
7541 if (E->getOpcode() == BO_EQ) in VisitBinaryOperator()
7545 assert(E->getOpcode() == BO_NE && in VisitBinaryOperator()
7553 if (LHSTy->isRealFloatingType() && in VisitBinaryOperator()
7554 RHSTy->isRealFloatingType()) { in VisitBinaryOperator()
7557 bool LHSOK = EvaluateFloat(E->getRHS(), RHS, Info); in VisitBinaryOperator()
7561 if (!EvaluateFloat(E->getLHS(), LHS, Info) || !LHSOK) in VisitBinaryOperator()
7566 switch (E->getOpcode()) { in VisitBinaryOperator()
7587 if (LHSTy->isPointerType() && RHSTy->isPointerType()) { in VisitBinaryOperator()
7588 if (E->getOpcode() == BO_Sub || E->isComparisonOp()) { in VisitBinaryOperator()
7591 bool LHSOK = EvaluatePointer(E->getLHS(), LHSValue, Info); in VisitBinaryOperator()
7595 if (!EvaluatePointer(E->getRHS(), RHSValue, Info) || !LHSOK) in VisitBinaryOperator()
7598 // Reject differing bases from the normal codepath; we special-case in VisitBinaryOperator()
7601 if (E->getOpcode() == BO_Sub) { in VisitBinaryOperator()
7602 // Handle &&A - &&B. in VisitBinaryOperator()
7614 if (LHSAddrExpr->getLabel()->getDeclContext() != in VisitBinaryOperator()
7615 RHSAddrExpr->getLabel()->getDeclContext()) in VisitBinaryOperator()
7621 if (!E->isEqualityOp()) in VisitBinaryOperator()
7629 // It's implementation-defined whether distinct literals will have in VisitBinaryOperator()
7632 // that the address of a literal will be non-null. in VisitBinaryOperator()
7641 // past-the-end address of another object, per C++ DR1652. in VisitBinaryOperator()
7653 // (Note that clang defaults to -fmerge-all-constants, which can in VisitBinaryOperator()
7656 return Success(E->getOpcode() == BO_NE, E); in VisitBinaryOperator()
7665 if (E->getOpcode() == BO_Sub) { in VisitBinaryOperator()
7675 QualType Type = E->getLHS()->getType(); in VisitBinaryOperator()
7676 QualType ElementType = Type->getAs<PointerType>()->getPointeeType(); in VisitBinaryOperator()
7679 if (!HandleSizeof(Info, E->getExprLoc(), ElementType, ElementSize)) in VisitBinaryOperator()
7691 // FIXME: LLVM and GCC both compute LHSOffset - RHSOffset at runtime, in VisitBinaryOperator()
7693 // appears to be non-conforming, but is common, so perhaps we should in VisitBinaryOperator()
7697 // Compute (LHSOffset - RHSOffset) / Size carefully, checking for in VisitBinaryOperator()
7698 // overflow in the final conversion to ptrdiff_t. in VisitBinaryOperator()
7705 APSInt TrueResult = (LHS - RHS) / ElemSize; in VisitBinaryOperator()
7706 APSInt Result = TrueResult.trunc(Info.Ctx.getIntWidth(E->getType())); in VisitBinaryOperator()
7709 !HandleOverflow(Info, E, TrueResult, E->getType())) in VisitBinaryOperator()
7721 if (LHSTy->isVoidPointerType() && LHSOffset != RHSOffset && in VisitBinaryOperator()
7722 E->isRelationalOp()) in VisitBinaryOperator()
7726 // - If two pointers point to non-static data members of the same object, in VisitBinaryOperator()
7732 // - Otherwise pointer comparisons are unspecified. in VisitBinaryOperator()
7734 E->isRelationalOp()) { in VisitBinaryOperator()
7741 // - we are comparing array indices in VisitBinaryOperator()
7742 // - we are comparing fields of a union, or fields with the same access in VisitBinaryOperator()
7754 << RF->getParent() << RF; in VisitBinaryOperator()
7758 << LF->getParent() << LF; in VisitBinaryOperator()
7759 else if (!LF->getParent()->isUnion() && in VisitBinaryOperator()
7760 LF->getAccess() != RF->getAccess()) in VisitBinaryOperator()
7762 << LF << LF->getAccess() << RF << RF->getAccess() in VisitBinaryOperator()
7763 << LF->getParent(); in VisitBinaryOperator()
7773 uint64_t Mask = ~0ULL >> (64 - PtrSize); in VisitBinaryOperator()
7780 if (!LHSValue.Base.isNull() && E->isRelationalOp()) { in VisitBinaryOperator()
7782 if (BaseTy->isIncompleteType()) in VisitBinaryOperator()
7790 switch (E->getOpcode()) { in VisitBinaryOperator()
7802 if (LHSTy->isMemberPointerType()) { in VisitBinaryOperator()
7803 assert(E->isEqualityOp() && "unexpected member pointer operation"); in VisitBinaryOperator()
7804 assert(RHSTy->isMemberPointerType() && "invalid comparison"); in VisitBinaryOperator()
7808 bool LHSOK = EvaluateMemberPointer(E->getLHS(), LHSValue, Info); in VisitBinaryOperator()
7812 if (!EvaluateMemberPointer(E->getRHS(), RHSValue, Info) || !LHSOK) in VisitBinaryOperator()
7820 return Success(E->getOpcode() == BO_EQ ? Equal : !Equal, E); in VisitBinaryOperator()
7826 if (MD->isVirtual()) in VisitBinaryOperator()
7829 if (MD->isVirtual()) in VisitBinaryOperator()
7837 return Success(E->getOpcode() == BO_EQ ? Equal : !Equal, E); in VisitBinaryOperator()
7840 if (LHSTy->isNullPtrType()) { in VisitBinaryOperator()
7841 assert(E->isComparisonOp() && "unexpected nullptr operation"); in VisitBinaryOperator()
7842 assert(RHSTy->isNullPtrType() && "missing pointer conversion"); in VisitBinaryOperator()
7846 BinaryOperator::Opcode Opcode = E->getOpcode(); in VisitBinaryOperator()
7850 assert((!LHSTy->isIntegralOrEnumerationType() || in VisitBinaryOperator()
7851 !RHSTy->isIntegralOrEnumerationType()) && in VisitBinaryOperator()
7853 // We can't continue from here for non-integral types. in VisitBinaryOperator()
7857 /// VisitUnaryExprOrTypeTraitExpr - Evaluate a sizeof, alignof or vec_step with
7861 switch(E->getKind()) { in VisitUnaryExprOrTypeTraitExpr()
7863 if (E->isArgumentType()) in VisitUnaryExprOrTypeTraitExpr()
7864 return Success(GetAlignOfType(Info, E->getArgumentType()), E); in VisitUnaryExprOrTypeTraitExpr()
7866 return Success(GetAlignOfExpr(Info, E->getArgumentExpr()), E); in VisitUnaryExprOrTypeTraitExpr()
7870 QualType Ty = E->getTypeOfArgument(); in VisitUnaryExprOrTypeTraitExpr()
7872 if (Ty->isVectorType()) { in VisitUnaryExprOrTypeTraitExpr()
7873 unsigned n = Ty->castAs<VectorType>()->getNumElements(); in VisitUnaryExprOrTypeTraitExpr()
7875 // The vec_step built-in functions that take a 3-component in VisitUnaryExprOrTypeTraitExpr()
7886 QualType SrcTy = E->getTypeOfArgument(); in VisitUnaryExprOrTypeTraitExpr()
7889 if (const ReferenceType *Ref = SrcTy->getAs<ReferenceType>()) in VisitUnaryExprOrTypeTraitExpr()
7890 SrcTy = Ref->getPointeeType(); in VisitUnaryExprOrTypeTraitExpr()
7893 if (!HandleSizeof(Info, E->getExprLoc(), SrcTy, Sizeof)) in VisitUnaryExprOrTypeTraitExpr()
7898 assert(E->isArgumentType()); in VisitUnaryExprOrTypeTraitExpr()
7901 Info.Ctx.getOpenMPDefaultSimdAlign(E->getArgumentType())) in VisitUnaryExprOrTypeTraitExpr()
7911 unsigned n = OOE->getNumComponents(); in VisitOffsetOfExpr()
7914 QualType CurrentType = OOE->getTypeSourceInfo()->getType(); in VisitOffsetOfExpr()
7916 OffsetOfNode ON = OOE->getComponent(i); in VisitOffsetOfExpr()
7919 const Expr *Idx = OOE->getIndexExpr(ON.getArrayExprIndex()); in VisitOffsetOfExpr()
7926 CurrentType = AT->getElementType(); in VisitOffsetOfExpr()
7934 const RecordType *RT = CurrentType->getAs<RecordType>(); in VisitOffsetOfExpr()
7937 RecordDecl *RD = RT->getDecl(); in VisitOffsetOfExpr()
7938 if (RD->isInvalidDecl()) return false; in VisitOffsetOfExpr()
7940 unsigned i = MemberDecl->getFieldIndex(); in VisitOffsetOfExpr()
7943 CurrentType = MemberDecl->getType().getNonReferenceType(); in VisitOffsetOfExpr()
7952 if (BaseSpec->isVirtual()) in VisitOffsetOfExpr()
7956 const RecordType *RT = CurrentType->getAs<RecordType>(); in VisitOffsetOfExpr()
7959 RecordDecl *RD = RT->getDecl(); in VisitOffsetOfExpr()
7960 if (RD->isInvalidDecl()) return false; in VisitOffsetOfExpr()
7964 CurrentType = BaseSpec->getType(); in VisitOffsetOfExpr()
7965 const RecordType *BaseRT = CurrentType->getAs<RecordType>(); in VisitOffsetOfExpr()
7970 Result += RL.getBaseClassOffset(cast<CXXRecordDecl>(BaseRT->getDecl())); in VisitOffsetOfExpr()
7979 switch (E->getOpcode()) { in VisitUnaryOperator()
7985 // FIXME: Should extension allow i-c-e extension expressions in its scope? in VisitUnaryOperator()
7987 return Visit(E->getSubExpr()); in VisitUnaryOperator()
7990 return Visit(E->getSubExpr()); in VisitUnaryOperator()
7992 if (!Visit(E->getSubExpr())) in VisitUnaryOperator()
7997 !HandleOverflow(Info, E, -Value.extend(Value.getBitWidth() + 1), in VisitUnaryOperator()
7998 E->getType())) in VisitUnaryOperator()
8000 return Success(-Value, E); in VisitUnaryOperator()
8003 if (!Visit(E->getSubExpr())) in VisitUnaryOperator()
8010 if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info)) in VisitUnaryOperator()
8017 /// HandleCast - This is used to evaluate implicit or explicit casts where the
8020 const Expr *SubExpr = E->getSubExpr(); in VisitCastExpr()
8021 QualType DestType = E->getType(); in VisitCastExpr()
8022 QualType SrcType = SubExpr->getType(); in VisitCastExpr()
8024 switch (E->getCastKind()) { in VisitCastExpr()
8087 if (BoolResult && E->getCastKind() == CK_BooleanToSignedIntegral) in VisitCastExpr()
8088 IntResult = (uint64_t)-1; in VisitCastExpr()
8097 // Allow casts of address-of-label differences if they are no-ops in VisitCastExpr()
8099 // be constant-evaluatable except in some narrow cases which are hard in VisitCastExpr()
8160 if (E->getSubExpr()->getType()->isAnyComplexType()) { in VisitUnaryReal()
8162 if (!EvaluateComplex(E->getSubExpr(), LV, Info)) in VisitUnaryReal()
8169 return Visit(E->getSubExpr()); in VisitUnaryReal()
8173 if (E->getSubExpr()->getType()->isComplexIntegerType()) { in VisitUnaryImag()
8175 if (!EvaluateComplex(E->getSubExpr(), LV, Info)) in VisitUnaryImag()
8182 VisitIgnoredValue(E->getSubExpr()); in VisitUnaryImag()
8187 return Success(E->getPackLength(), E); in VisitSizeOfPackExpr()
8191 return Success(E->getValue(), E); in VisitCXXNoexceptExpr()
8194 //===----------------------------------------------------------------------===//
8196 //===----------------------------------------------------------------------===//
8212 Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); in ZeroInitialization()
8231 assert(E->isRValue() && E->getType()->isRealFloatingType()); in EvaluateFloat()
8240 const StringLiteral *S = dyn_cast<StringLiteral>(Arg->IgnoreParenCasts()); in TryEvaluateBuiltinNaN()
8248 if (S->getString().empty()) in TryEvaluateBuiltinNaN()
8250 else if (S->getString().getAsInteger(0, fill)) in TryEvaluateBuiltinNaN()
8259 // Prior to IEEE 754-2008, architectures were allowed to choose whether in TryEvaluateBuiltinNaN()
8261 // a different encoding to what became a standard in 2008, and for pre- in TryEvaluateBuiltinNaN()
8262 // 2008 revisions, MIPS interpreted sNaN-2008 as qNan and qNaN-2008 as in TryEvaluateBuiltinNaN()
8274 switch (E->getBuiltinCallee()) { in VisitCallExpr()
8285 Info.Ctx.getFloatTypeSemantics(E->getType()); in VisitCallExpr()
8293 if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), in VisitCallExpr()
8303 if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), in VisitCallExpr()
8311 if (!EvaluateFloat(E->getArg(0), Result, Info)) in VisitCallExpr()
8326 if (!EvaluateFloat(E->getArg(0), Result, Info) || in VisitCallExpr()
8327 !EvaluateFloat(E->getArg(1), RHS, Info)) in VisitCallExpr()
8336 if (E->getSubExpr()->getType()->isAnyComplexType()) { in VisitUnaryReal()
8338 if (!EvaluateComplex(E->getSubExpr(), CV, Info)) in VisitUnaryReal()
8344 return Visit(E->getSubExpr()); in VisitUnaryReal()
8348 if (E->getSubExpr()->getType()->isAnyComplexType()) { in VisitUnaryImag()
8350 if (!EvaluateComplex(E->getSubExpr(), CV, Info)) in VisitUnaryImag()
8356 VisitIgnoredValue(E->getSubExpr()); in VisitUnaryImag()
8357 const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType()); in VisitUnaryImag()
8363 switch (E->getOpcode()) { in VisitUnaryOperator()
8366 return EvaluateFloat(E->getSubExpr(), Result, Info); in VisitUnaryOperator()
8368 if (!EvaluateFloat(E->getSubExpr(), Result, Info)) in VisitUnaryOperator()
8376 if (E->isPtrMemOp() || E->isAssignmentOp() || E->getOpcode() == BO_Comma) in VisitBinaryOperator()
8380 bool LHSOK = EvaluateFloat(E->getLHS(), Result, Info); in VisitBinaryOperator()
8383 return EvaluateFloat(E->getRHS(), RHS, Info) && LHSOK && in VisitBinaryOperator()
8384 handleFloatFloatBinOp(Info, E, Result, E->getOpcode(), RHS); in VisitBinaryOperator()
8388 Result = E->getValue(); in VisitFloatingLiteral()
8393 const Expr* SubExpr = E->getSubExpr(); in VisitCastExpr()
8395 switch (E->getCastKind()) { in VisitCastExpr()
8402 HandleIntToFloatCast(Info, E, SubExpr->getType(), IntResult, in VisitCastExpr()
8403 E->getType(), Result); in VisitCastExpr()
8409 return HandleFloatToFloatCast(Info, E, SubExpr->getType(), E->getType(), in VisitCastExpr()
8423 //===----------------------------------------------------------------------===//
8425 //===----------------------------------------------------------------------===//
8443 //===--------------------------------------------------------------------===//
8445 //===--------------------------------------------------------------------===//
8457 assert(E->isRValue() && E->getType()->isAnyComplexType()); in EvaluateComplex()
8462 QualType ElemTy = E->getType()->castAs<ComplexType>()->getElementType(); in ZeroInitialization()
8463 if (ElemTy->isRealFloatingType()) { in ZeroInitialization()
8478 const Expr* SubExpr = E->getSubExpr(); in VisitImaginaryLiteral()
8480 if (SubExpr->getType()->isRealFloatingType()) { in VisitImaginaryLiteral()
8489 assert(SubExpr->getType()->isIntegerType() && in VisitImaginaryLiteral()
8504 switch (E->getCastKind()) { in VisitCastExpr()
8563 if (!EvaluateFloat(E->getSubExpr(), Real, Info)) in VisitCastExpr()
8572 if (!Visit(E->getSubExpr())) in VisitCastExpr()
8575 QualType To = E->getType()->getAs<ComplexType>()->getElementType(); in VisitCastExpr()
8577 = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); in VisitCastExpr()
8584 if (!Visit(E->getSubExpr())) in VisitCastExpr()
8587 QualType To = E->getType()->getAs<ComplexType>()->getElementType(); in VisitCastExpr()
8589 = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); in VisitCastExpr()
8599 if (!EvaluateInteger(E->getSubExpr(), Real, Info)) in VisitCastExpr()
8608 if (!Visit(E->getSubExpr())) in VisitCastExpr()
8611 QualType To = E->getType()->getAs<ComplexType>()->getElementType(); in VisitCastExpr()
8613 = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); in VisitCastExpr()
8621 if (!Visit(E->getSubExpr())) in VisitCastExpr()
8624 QualType To = E->getType()->castAs<ComplexType>()->getElementType(); in VisitCastExpr()
8626 = E->getSubExpr()->getType()->castAs<ComplexType>()->getElementType(); in VisitCastExpr()
8639 if (E->isPtrMemOp() || E->isAssignmentOp() || E->getOpcode() == BO_Comma) in VisitBinaryOperator()
8647 if (E->getLHS()->getType()->isRealFloatingType()) { in VisitBinaryOperator()
8650 LHSOK = EvaluateFloat(E->getLHS(), Real, Info); in VisitBinaryOperator()
8656 LHSOK = Visit(E->getLHS()); in VisitBinaryOperator()
8662 if (E->getRHS()->getType()->isRealFloatingType()) { in VisitBinaryOperator()
8665 if (!EvaluateFloat(E->getRHS(), Real, Info) || !LHSOK) in VisitBinaryOperator()
8669 } else if (!EvaluateComplex(E->getRHS(), RHS, Info) || !LHSOK) in VisitBinaryOperator()
8674 switch (E->getOpcode()) { in VisitBinaryOperator()
8702 Result.getComplexIntReal() -= RHS.getComplexIntReal(); in VisitBinaryOperator()
8703 Result.getComplexIntImag() -= RHS.getComplexIntImag(); in VisitBinaryOperator()
8733 ResR = AC - BD; in VisitBinaryOperator()
8772 ResR = APFloat::getInf(A.getSemantics()) * (A * C - B * D); in VisitBinaryOperator()
8780 (LHS.getComplexIntReal() * RHS.getComplexIntReal() - in VisitBinaryOperator()
8812 C = scalbn(C, -DenomLogB, APFloat::rmNearestTiesToEven); in VisitBinaryOperator()
8813 D = scalbn(D, -DenomLogB, APFloat::rmNearestTiesToEven); in VisitBinaryOperator()
8816 ResR = scalbn((A * C + B * D) / Denom, -DenomLogB, in VisitBinaryOperator()
8818 ResI = scalbn((B * C - A * D) / Denom, -DenomLogB, in VisitBinaryOperator()
8831 ResI = APFloat::getInf(ResI.getSemantics()) * (B * C - A * D); in VisitBinaryOperator()
8838 ResI = APFloat::getZero(ResI.getSemantics()) * (B * C - A * D); in VisitBinaryOperator()
8853 (LHS.getComplexIntImag() * RHS.getComplexIntReal() - in VisitBinaryOperator()
8864 if (!Visit(E->getSubExpr())) in VisitUnaryOperator()
8867 switch (E->getOpcode()) { in VisitUnaryOperator()
8881 Result.getComplexIntReal() = -Result.getComplexIntReal(); in VisitUnaryOperator()
8882 Result.getComplexIntImag() = -Result.getComplexIntImag(); in VisitUnaryOperator()
8889 Result.getComplexIntImag() = -Result.getComplexIntImag(); in VisitUnaryOperator()
8895 if (E->getNumInits() == 2) { in VisitInitListExpr()
8896 if (E->getType()->isComplexType()) { in VisitInitListExpr()
8898 if (!EvaluateFloat(E->getInit(0), Result.FloatReal, Info)) in VisitInitListExpr()
8900 if (!EvaluateFloat(E->getInit(1), Result.FloatImag, Info)) in VisitInitListExpr()
8904 if (!EvaluateInteger(E->getInit(0), Result.IntReal, Info)) in VisitInitListExpr()
8906 if (!EvaluateInteger(E->getInit(1), Result.IntImag, Info)) in VisitInitListExpr()
8914 //===----------------------------------------------------------------------===//
8916 // implicit conversion.
8917 //===----------------------------------------------------------------------===//
8934 E->getType()->castAs<AtomicType>()->getValueType()); in ZeroInitialization()
8939 switch (E->getCastKind()) { in VisitCastExpr()
8943 return Evaluate(Result, Info, E->getSubExpr()); in VisitCastExpr()
8950 assert(E->isRValue() && E->getType()->isAtomicType()); in EvaluateAtomic()
8954 //===----------------------------------------------------------------------===//
8957 //===----------------------------------------------------------------------===//
8968 switch (E->getCastKind()) { in VisitCastExpr()
8972 VisitIgnoredValue(E->getSubExpr()); in VisitCastExpr()
8978 switch (E->getBuiltinCallee()) { in VisitCallExpr()
8991 assert(E->isRValue() && E->getType()->isVoidType()); in EvaluateVoid()
8995 //===----------------------------------------------------------------------===//
8997 //===----------------------------------------------------------------------===//
9002 QualType T = E->getType(); in Evaluate()
9003 if (E->isGLValue() || T->isFunctionType()) { in Evaluate()
9008 } else if (T->isVectorType()) { in Evaluate()
9011 } else if (T->isIntegralOrEnumerationType()) { in Evaluate()
9014 } else if (T->hasPointerRepresentation()) { in Evaluate()
9019 } else if (T->isRealFloatingType()) { in Evaluate()
9024 } else if (T->isAnyComplexType()) { in Evaluate()
9029 } else if (T->isMemberPointerType()) { in Evaluate()
9035 } else if (T->isArrayType()) { in Evaluate()
9037 LV.set(E, Info.CurrentCall->Index); in Evaluate()
9038 APValue &Value = Info.CurrentCall->createTemporary(E, false); in Evaluate()
9042 } else if (T->isRecordType()) { in Evaluate()
9044 LV.set(E, Info.CurrentCall->Index); in Evaluate()
9045 APValue &Value = Info.CurrentCall->createTemporary(E, false); in Evaluate()
9049 } else if (T->isVoidType()) { in Evaluate()
9052 << E->getType(); in Evaluate()
9055 } else if (T->isAtomicType()) { in Evaluate()
9059 Info.FFDiag(E, diag::note_constexpr_nonliteral) << E->getType(); in Evaluate()
9069 /// EvaluateInPlace - Evaluate an expression in-place in an APValue. In some
9070 /// cases, the in-place evaluation is essential, since later initializers for
9074 assert(!E->isValueDependent()); in EvaluateInPlace()
9079 if (E->isRValue()) { in EvaluateInPlace()
9080 // Evaluate arrays and record types in-place, so that later initializers can in EvaluateInPlace()
9081 // refer to earlier-initialized members of the object. in EvaluateInPlace()
9082 if (E->getType()->isArrayType()) in EvaluateInPlace()
9084 else if (E->getType()->isRecordType()) in EvaluateInPlace()
9088 // For any other type, in-place evaluation is unimportant. in EvaluateInPlace()
9092 /// EvaluateAsRValue - Try to evaluate this expression, performing an implicit
9093 /// lvalue-to-rvalue cast if it is an lvalue.
9095 if (E->getType().isNull()) in EvaluateAsRValue()
9104 if (E->isGLValue()) { in EvaluateAsRValue()
9107 if (!handleLValueToRValueConversion(Info, E, E->getType(), LV, Result)) in EvaluateAsRValue()
9112 return CheckConstantExpression(Info, E->getExprLoc(), E->getType(), Result); in EvaluateAsRValue()
9117 // Fast-path evaluations of integer literals, since we sometimes see files in FastEvaluateAsRValue()
9120 Result.Val = APValue(APSInt(L->getValue(), in FastEvaluateAsRValue()
9121 L->getType()->isUnsignedIntegerType())); in FastEvaluateAsRValue()
9128 if (Exp->getType().isNull()) { in FastEvaluateAsRValue()
9135 if (Exp->isRValue() && (Exp->getType()->isArrayType() || in FastEvaluateAsRValue()
9136 Exp->getType()->isRecordType()) && in FastEvaluateAsRValue()
9145 /// EvaluateAsRValue - Return true if this is a constant which we can fold using
9148 /// in Result. If this expression is a glvalue, an lvalue-to-rvalue conversion
9174 if (!getType()->isIntegralOrEnumerationType()) in EvaluateAsInt()
9188 if (!getType()->isRealFloatingType()) in EvaluateAsFloat()
9218 if (isRValue() && (getType()->isArrayType() || getType()->isRecordType()) && in EvaluateAsInitializer()
9225 EvalInfo InitInfo(Ctx, EStatus, VD->isConstexpr() in EvaluateAsInitializer()
9235 // zero-initialized before any other initialization takes place. in EvaluateAsInitializer()
9237 if (Ctx.getLangOpts().CPlusPlus && !VD->hasLocalStorage() && in EvaluateAsInitializer()
9238 !VD->getType()->isReferenceType()) { in EvaluateAsInitializer()
9239 ImplicitValueInitExpr VIE(VD->getType()); in EvaluateAsInitializer()
9250 return CheckConstantExpression(InitInfo, VD->getLocation(), VD->getType(), in EvaluateAsInitializer()
9254 /// isEvaluatable - Call EvaluateAsRValue to see if this expression can be
9289 /// isIntegerConstantExpr - this recursive routine will test if an expression is
9292 /// FIXME: Pass up a reason why! Invalid operation in i-c-e, division by zero,
9295 // CheckICE - This function does the fundamental ICE checking: the returned
9311 /// the comma operator in C99 mode, and non-constant subexpressions.
9332 if (!E->EvaluateAsRValue(EVResult, Ctx) || EVResult.HasSideEffects || in CheckEvalInICE()
9334 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckEvalInICE()
9340 assert(!E->isValueDependent() && "Should not see value dependent exprs!"); in CheckICE()
9341 if (!E->getType()->isIntegralOrEnumerationType()) in CheckICE()
9342 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9344 switch (E->getStmtClass()) { in CheckICE()
9422 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9429 if (E->isRValue()) in CheckICE()
9430 if (cast<InitListExpr>(E)->getNumInits() == 1) in CheckICE()
9431 return CheckICE(cast<InitListExpr>(E)->getInit(0), Ctx); in CheckICE()
9432 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9442 CheckICE(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(), Ctx); in CheckICE()
9445 return CheckICE(cast<ParenExpr>(E)->getSubExpr(), Ctx); in CheckICE()
9447 return CheckICE(cast<GenericSelectionExpr>(E)->getResultExpr(), Ctx); in CheckICE()
9464 if (CE->getBuiltinCallee()) in CheckICE()
9466 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9469 if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl())) in CheckICE()
9471 const ValueDecl *D = dyn_cast<ValueDecl>(cast<DeclRefExpr>(E)->getDecl()); in CheckICE()
9473 D && IsConstNonVolatile(D->getType())) { in CheckICE()
9478 return ICEDiag(IK_NotICE, cast<DeclRefExpr>(E)->getLocation()); in CheckICE()
9481 // A variable of non-volatile const-qualified integral or enumeration in CheckICE()
9484 if (!Dcl->getType()->isIntegralOrEnumerationType()) in CheckICE()
9485 return ICEDiag(IK_NotICE, cast<DeclRefExpr>(E)->getLocation()); in CheckICE()
9490 if (Dcl->getAnyInitializer(VD) && VD->checkInitIsICE()) in CheckICE()
9493 return ICEDiag(IK_NotICE, cast<DeclRefExpr>(E)->getLocation()); in CheckICE()
9496 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9500 switch (Exp->getOpcode()) { in CheckICE()
9511 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9519 return CheckICE(Exp->getSubExpr(), Ctx); in CheckICE()
9535 if ((Exp->getKind() == UETT_SizeOf) && in CheckICE()
9536 Exp->getTypeOfArgument()->isVariableArrayType()) in CheckICE()
9537 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9542 switch (Exp->getOpcode()) { in CheckICE()
9559 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9578 ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); in CheckICE()
9579 ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); in CheckICE()
9580 if (Exp->getOpcode() == BO_Div || in CheckICE()
9581 Exp->getOpcode() == BO_Rem) { in CheckICE()
9585 llvm::APSInt REval = Exp->getRHS()->EvaluateKnownConstInt(Ctx); in CheckICE()
9587 return ICEDiag(IK_ICEIfUnevaluated, E->getLocStart()); in CheckICE()
9589 llvm::APSInt LEval = Exp->getLHS()->EvaluateKnownConstInt(Ctx); in CheckICE()
9591 return ICEDiag(IK_ICEIfUnevaluated, E->getLocStart()); in CheckICE()
9595 if (Exp->getOpcode() == BO_Comma) { in CheckICE()
9600 return ICEDiag(IK_ICEIfUnevaluated, E->getLocStart()); in CheckICE()
9603 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9610 ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); in CheckICE()
9611 ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); in CheckICE()
9613 // Rare case where the RHS has a comma "side-effect"; we need in CheckICE()
9616 if ((Exp->getOpcode() == BO_LAnd) != in CheckICE()
9617 (Exp->getLHS()->EvaluateKnownConstInt(Ctx) == 0)) in CheckICE()
9633 const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr(); in CheckICE()
9636 = dyn_cast<FloatingLiteral>(SubExpr->IgnoreParenImpCasts())) { in CheckICE()
9637 unsigned DestWidth = Ctx.getIntWidth(E->getType()); in CheckICE()
9638 bool DestSigned = E->getType()->isSignedIntegerOrEnumerationType(); in CheckICE()
9644 if (FL->getValue().convertToInteger(IgnoredVal, in CheckICE()
9647 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9651 switch (cast<CastExpr>(E)->getCastKind()) { in CheckICE()
9660 return ICEDiag(IK_NotICE, E->getLocStart()); in CheckICE()
9665 ICEDiag CommonResult = CheckICE(Exp->getCommon(), Ctx); in CheckICE()
9667 ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx); in CheckICE()
9671 Exp->getCommon()->EvaluateKnownConstInt(Ctx) != 0) return NoDiag(); in CheckICE()
9681 = dyn_cast<CallExpr>(Exp->getCond()->IgnoreParenCasts())) in CheckICE()
9682 if (CallCE->getBuiltinCallee() == Builtin::BI__builtin_constant_p) in CheckICE()
9684 ICEDiag CondResult = CheckICE(Exp->getCond(), Ctx); in CheckICE()
9688 ICEDiag TrueResult = CheckICE(Exp->getTrueExpr(), Ctx); in CheckICE()
9689 ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx); in CheckICE()
9701 // TrueResult and FalseResult is non-zero. in CheckICE()
9702 if (Exp->getCond()->EvaluateKnownConstInt(Ctx) == 0) in CheckICE()
9707 return CheckICE(cast<CXXDefaultArgExpr>(E)->getExpr(), Ctx); in CheckICE()
9709 return CheckICE(cast<CXXDefaultInitExpr>(E)->getExpr(), Ctx); in CheckICE()
9711 return CheckICE(cast<ChooseExpr>(E)->getChosenSubExpr(), Ctx); in CheckICE()
9723 if (!E->getType()->isIntegralOrEnumerationType()) { in EvaluateCPlusPlus11IntegralConstantExpr()
9724 if (Loc) *Loc = E->getExprLoc(); in EvaluateCPlusPlus11IntegralConstantExpr()
9729 if (!E->isCXX11ConstantExpr(Ctx, &Result, Loc)) in EvaluateCPlusPlus11IntegralConstantExpr()
9733 if (Loc) *Loc = E->getExprLoc(); in EvaluateCPlusPlus11IntegralConstantExpr()
9761 // The only possible side-effects here are due to UB discovered in the in isIntegerConstantExpr()
9809 if ((*I)->isValueDependent() || in EvaluateWithSubstitution()
9810 !Evaluate(ArgValues[I - Args.begin()], Info, *I)) in EvaluateWithSubstitution()
9812 ArgValues[I - Args.begin()] = APValue(); in EvaluateWithSubstitution()
9818 CallStackFrame Frame(Info, Callee->getLocation(), Callee, /*This*/nullptr, in EvaluateWithSubstitution()
9827 // moment the constant expression evaluator cannot cope with the non-rigorous in isPotentialConstantExpr()
9829 if (FD->isDependentContext()) in isPotentialConstantExpr()
9835 EvalInfo Info(FD->getASTContext(), Status, in isPotentialConstantExpr()
9839 const CXXRecordDecl *RD = MD ? MD->getParent()->getCanonicalDecl() : nullptr; in isPotentialConstantExpr()
9845 This.set(&VIE, Info.CurrentCall->Index); in isPotentialConstantExpr()
9852 // of objects of non-literal types. in isPotentialConstantExpr()
9856 SourceLocation Loc = FD->getLocation(); in isPotentialConstantExpr()
9857 HandleFunctionCall(Loc, FD, (MD && MD->isInstance()) ? &This : nullptr, in isPotentialConstantExpr()
9858 Args, FD->getBody(), Info, Scratch, nullptr); in isPotentialConstantExpr()
9871 EvalInfo Info(FD->getASTContext(), Status, in isPotentialConstantExprUnevaluated()
9890 if (!getType()->isPointerType()) in tryEvaluateObjectSize()