1 //===------- Interp.cpp - Interpreter for the constexpr VM ------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "Interp.h" 10 #include "Compiler.h" 11 #include "Function.h" 12 #include "InterpFrame.h" 13 #include "InterpShared.h" 14 #include "InterpStack.h" 15 #include "Opcode.h" 16 #include "PrimType.h" 17 #include "Program.h" 18 #include "State.h" 19 #include "clang/AST/ASTContext.h" 20 #include "clang/AST/CXXInheritance.h" 21 #include "clang/AST/DeclObjC.h" 22 #include "clang/AST/Expr.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/Basic/DiagnosticSema.h" 25 #include "clang/Basic/TargetInfo.h" 26 #include "llvm/ADT/StringExtras.h" 27 28 using namespace clang; 29 using namespace clang::interp; 30 31 static bool RetValue(InterpState &S, CodePtr &Pt) { 32 llvm::report_fatal_error("Interpreter cannot return values"); 33 } 34 35 //===----------------------------------------------------------------------===// 36 // Jmp, Jt, Jf 37 //===----------------------------------------------------------------------===// 38 39 static bool Jmp(InterpState &S, CodePtr &PC, int32_t Offset) { 40 PC += Offset; 41 return true; 42 } 43 44 static bool Jt(InterpState &S, CodePtr &PC, int32_t Offset) { 45 if (S.Stk.pop<bool>()) { 46 PC += Offset; 47 } 48 return true; 49 } 50 51 static bool Jf(InterpState &S, CodePtr &PC, int32_t Offset) { 52 if (!S.Stk.pop<bool>()) { 53 PC += Offset; 54 } 55 return true; 56 } 57 58 // https://github.com/llvm/llvm-project/issues/102513 59 #if defined(_MSC_VER) && !defined(__clang__) && !defined(NDEBUG) 60 #pragma optimize("", off) 61 #endif 62 // FIXME: We have the large switch over all opcodes here again, and in 63 // Interpret(). 64 static bool BCP(InterpState &S, CodePtr &RealPC, int32_t Offset, PrimType PT) { 65 [[maybe_unused]] CodePtr PCBefore = RealPC; 66 size_t StackSizeBefore = S.Stk.size(); 67 68 auto SpeculativeInterp = [&S, RealPC]() -> bool { 69 const InterpFrame *StartFrame = S.Current; 70 CodePtr PC = RealPC; 71 72 for (;;) { 73 auto Op = PC.read<Opcode>(); 74 if (Op == OP_EndSpeculation) 75 return true; 76 CodePtr OpPC = PC; 77 78 switch (Op) { 79 #define GET_INTERP 80 #include "Opcodes.inc" 81 #undef GET_INTERP 82 } 83 } 84 llvm_unreachable("We didn't see an EndSpeculation op?"); 85 }; 86 87 if (SpeculativeInterp()) { 88 if (PT == PT_Ptr) { 89 const auto &Ptr = S.Stk.pop<Pointer>(); 90 assert(S.Stk.size() == StackSizeBefore); 91 S.Stk.push<Integral<32, true>>( 92 Integral<32, true>::from(CheckBCPResult(S, Ptr))); 93 } else { 94 // Pop the result from the stack and return success. 95 TYPE_SWITCH(PT, S.Stk.pop<T>();); 96 assert(S.Stk.size() == StackSizeBefore); 97 S.Stk.push<Integral<32, true>>(Integral<32, true>::from(1)); 98 } 99 } else { 100 if (!S.inConstantContext()) 101 return Invalid(S, RealPC); 102 103 S.Stk.clearTo(StackSizeBefore); 104 S.Stk.push<Integral<32, true>>(Integral<32, true>::from(0)); 105 } 106 107 // RealPC should not have been modified. 108 assert(*RealPC == *PCBefore); 109 110 // Jump to end label. This is a little tricker than just RealPC += Offset 111 // because our usual jump instructions don't have any arguments, to the offset 112 // we get is a little too much and we need to subtract the size of the 113 // bool and PrimType arguments again. 114 int32_t ParamSize = align(sizeof(PrimType)); 115 assert(Offset >= ParamSize); 116 RealPC += Offset - ParamSize; 117 118 [[maybe_unused]] CodePtr PCCopy = RealPC; 119 assert(PCCopy.read<Opcode>() == OP_EndSpeculation); 120 121 return true; 122 } 123 // https://github.com/llvm/llvm-project/issues/102513 124 #if defined(_MSC_VER) && !defined(__clang__) && !defined(NDEBUG) 125 #pragma optimize("", on) 126 #endif 127 128 static void diagnoseMissingInitializer(InterpState &S, CodePtr OpPC, 129 const ValueDecl *VD) { 130 const SourceInfo &E = S.Current->getSource(OpPC); 131 S.FFDiag(E, diag::note_constexpr_var_init_unknown, 1) << VD; 132 S.Note(VD->getLocation(), diag::note_declared_at) << VD->getSourceRange(); 133 } 134 135 static void diagnoseNonConstVariable(InterpState &S, CodePtr OpPC, 136 const ValueDecl *VD); 137 static bool diagnoseUnknownDecl(InterpState &S, CodePtr OpPC, 138 const ValueDecl *D) { 139 // This function tries pretty hard to produce a good diagnostic. Just skip 140 // tha if nobody will see it anyway. 141 if (!S.diagnosing()) 142 return false; 143 144 if (isa<ParmVarDecl>(D)) { 145 if (D->getType()->isReferenceType()) 146 return false; 147 148 const SourceInfo &Loc = S.Current->getSource(OpPC); 149 if (S.getLangOpts().CPlusPlus11) { 150 S.FFDiag(Loc, diag::note_constexpr_function_param_value_unknown) << D; 151 S.Note(D->getLocation(), diag::note_declared_at) << D->getSourceRange(); 152 } else { 153 S.FFDiag(Loc); 154 } 155 return false; 156 } 157 158 if (!D->getType().isConstQualified()) { 159 diagnoseNonConstVariable(S, OpPC, D); 160 } else if (const auto *VD = dyn_cast<VarDecl>(D)) { 161 if (!VD->getAnyInitializer()) { 162 diagnoseMissingInitializer(S, OpPC, VD); 163 } else { 164 const SourceInfo &Loc = S.Current->getSource(OpPC); 165 S.FFDiag(Loc, diag::note_constexpr_var_init_non_constant, 1) << VD; 166 S.Note(VD->getLocation(), diag::note_declared_at); 167 } 168 } 169 170 return false; 171 } 172 173 static void diagnoseNonConstVariable(InterpState &S, CodePtr OpPC, 174 const ValueDecl *VD) { 175 if (!S.diagnosing()) 176 return; 177 178 const SourceInfo &Loc = S.Current->getSource(OpPC); 179 if (!S.getLangOpts().CPlusPlus) { 180 S.FFDiag(Loc); 181 return; 182 } 183 184 if (const auto *VarD = dyn_cast<VarDecl>(VD); 185 VarD && VarD->getType().isConstQualified() && 186 !VarD->getAnyInitializer()) { 187 diagnoseMissingInitializer(S, OpPC, VD); 188 return; 189 } 190 191 // Rather random, but this is to match the diagnostic output of the current 192 // interpreter. 193 if (isa<ObjCIvarDecl>(VD)) 194 return; 195 196 if (VD->getType()->isIntegralOrEnumerationType()) { 197 S.FFDiag(Loc, diag::note_constexpr_ltor_non_const_int, 1) << VD; 198 S.Note(VD->getLocation(), diag::note_declared_at); 199 return; 200 } 201 202 S.FFDiag(Loc, 203 S.getLangOpts().CPlusPlus11 ? diag::note_constexpr_ltor_non_constexpr 204 : diag::note_constexpr_ltor_non_integral, 205 1) 206 << VD << VD->getType(); 207 S.Note(VD->getLocation(), diag::note_declared_at); 208 } 209 210 static bool CheckTemporary(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 211 AccessKinds AK) { 212 if (auto ID = Ptr.getDeclID()) { 213 if (!Ptr.isStaticTemporary()) 214 return true; 215 216 const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>( 217 Ptr.getDeclDesc()->asExpr()); 218 if (!MTE) 219 return true; 220 221 // FIXME(perf): Since we do this check on every Load from a static 222 // temporary, it might make sense to cache the value of the 223 // isUsableInConstantExpressions call. 224 if (!MTE->isUsableInConstantExpressions(S.getASTContext()) && 225 Ptr.block()->getEvalID() != S.Ctx.getEvalID()) { 226 const SourceInfo &E = S.Current->getSource(OpPC); 227 S.FFDiag(E, diag::note_constexpr_access_static_temporary, 1) << AK; 228 S.Note(Ptr.getDeclLoc(), diag::note_constexpr_temporary_here); 229 return false; 230 } 231 } 232 return true; 233 } 234 235 static bool CheckGlobal(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 236 if (auto ID = Ptr.getDeclID()) { 237 if (!Ptr.isStatic()) 238 return true; 239 240 if (S.P.getCurrentDecl() == ID) 241 return true; 242 243 S.FFDiag(S.Current->getLocation(OpPC), diag::note_constexpr_modify_global); 244 return false; 245 } 246 return true; 247 } 248 249 namespace clang { 250 namespace interp { 251 static void popArg(InterpState &S, const Expr *Arg) { 252 PrimType Ty = S.getContext().classify(Arg).value_or(PT_Ptr); 253 TYPE_SWITCH(Ty, S.Stk.discard<T>()); 254 } 255 256 void cleanupAfterFunctionCall(InterpState &S, CodePtr OpPC, 257 const Function *Func) { 258 assert(S.Current); 259 assert(Func); 260 261 if (S.Current->Caller && Func->isVariadic()) { 262 // CallExpr we're look for is at the return PC of the current function, i.e. 263 // in the caller. 264 // This code path should be executed very rarely. 265 unsigned NumVarArgs; 266 const Expr *const *Args = nullptr; 267 unsigned NumArgs = 0; 268 const Expr *CallSite = S.Current->Caller->getExpr(S.Current->getRetPC()); 269 if (const auto *CE = dyn_cast<CallExpr>(CallSite)) { 270 Args = CE->getArgs(); 271 NumArgs = CE->getNumArgs(); 272 } else if (const auto *CE = dyn_cast<CXXConstructExpr>(CallSite)) { 273 Args = CE->getArgs(); 274 NumArgs = CE->getNumArgs(); 275 } else 276 assert(false && "Can't get arguments from that expression type"); 277 278 assert(NumArgs >= Func->getNumWrittenParams()); 279 NumVarArgs = NumArgs - (Func->getNumWrittenParams() + 280 isa<CXXOperatorCallExpr>(CallSite)); 281 for (unsigned I = 0; I != NumVarArgs; ++I) { 282 const Expr *A = Args[NumArgs - 1 - I]; 283 popArg(S, A); 284 } 285 } 286 287 // And in any case, remove the fixed parameters (the non-variadic ones) 288 // at the end. 289 for (PrimType Ty : Func->args_reverse()) 290 TYPE_SWITCH(Ty, S.Stk.discard<T>()); 291 } 292 293 bool isConstexprUnknown(const Pointer &P) { 294 if (!P.isBlockPointer()) 295 return false; 296 297 if (P.isDummy()) 298 return isa_and_nonnull<ParmVarDecl>(P.getDeclDesc()->asValueDecl()); 299 300 return P.getDeclDesc()->IsConstexprUnknown; 301 } 302 303 bool CheckBCPResult(InterpState &S, const Pointer &Ptr) { 304 if (Ptr.isDummy()) 305 return false; 306 if (Ptr.isZero()) 307 return true; 308 if (Ptr.isFunctionPointer()) 309 return false; 310 if (Ptr.isIntegralPointer()) 311 return true; 312 if (Ptr.isTypeidPointer()) 313 return true; 314 315 if (Ptr.getType()->isAnyComplexType()) 316 return true; 317 318 if (const Expr *Base = Ptr.getDeclDesc()->asExpr()) 319 return isa<StringLiteral>(Base) && Ptr.getIndex() == 0; 320 return false; 321 } 322 323 bool CheckActive(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 324 AccessKinds AK) { 325 if (Ptr.isActive()) 326 return true; 327 328 assert(Ptr.inUnion()); 329 assert(Ptr.isField() && Ptr.getField()); 330 331 Pointer U = Ptr.getBase(); 332 Pointer C = Ptr; 333 while (!U.isRoot() && !U.isActive()) { 334 // A little arbitrary, but this is what the current interpreter does. 335 // See the AnonymousUnion test in test/AST/ByteCode/unions.cpp. 336 // GCC's output is more similar to what we would get without 337 // this condition. 338 if (U.getRecord() && U.getRecord()->isAnonymousUnion()) 339 break; 340 341 C = U; 342 U = U.getBase(); 343 } 344 assert(C.isField()); 345 346 // Consider: 347 // union U { 348 // struct { 349 // int x; 350 // int y; 351 // } a; 352 // } 353 // 354 // When activating x, we will also activate a. If we now try to read 355 // from y, we will get to CheckActive, because y is not active. In that 356 // case, our U will be a (not a union). We return here and let later code 357 // handle this. 358 if (!U.getFieldDesc()->isUnion()) 359 return true; 360 361 // Get the inactive field descriptor. 362 assert(!C.isActive()); 363 const FieldDecl *InactiveField = C.getField(); 364 assert(InactiveField); 365 366 // Find the active field of the union. 367 const Record *R = U.getRecord(); 368 assert(R && R->isUnion() && "Not a union"); 369 370 const FieldDecl *ActiveField = nullptr; 371 for (const Record::Field &F : R->fields()) { 372 const Pointer &Field = U.atField(F.Offset); 373 if (Field.isActive()) { 374 ActiveField = Field.getField(); 375 break; 376 } 377 } 378 379 const SourceInfo &Loc = S.Current->getSource(OpPC); 380 S.FFDiag(Loc, diag::note_constexpr_access_inactive_union_member) 381 << AK << InactiveField << !ActiveField << ActiveField; 382 return false; 383 } 384 385 bool CheckExtern(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 386 if (!Ptr.isExtern()) 387 return true; 388 389 if (Ptr.isInitialized() || 390 (Ptr.getDeclDesc()->asVarDecl() == S.EvaluatingDecl)) 391 return true; 392 393 if (S.checkingPotentialConstantExpression() && S.getLangOpts().CPlusPlus && 394 Ptr.isConst()) 395 return false; 396 397 const auto *VD = Ptr.getDeclDesc()->asValueDecl(); 398 diagnoseNonConstVariable(S, OpPC, VD); 399 return false; 400 } 401 402 bool CheckArray(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 403 if (!Ptr.isUnknownSizeArray()) 404 return true; 405 const SourceInfo &E = S.Current->getSource(OpPC); 406 S.FFDiag(E, diag::note_constexpr_unsized_array_indexed); 407 return false; 408 } 409 410 bool CheckLive(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 411 AccessKinds AK) { 412 if (Ptr.isZero()) { 413 const auto &Src = S.Current->getSource(OpPC); 414 415 if (Ptr.isField()) 416 S.FFDiag(Src, diag::note_constexpr_null_subobject) << CSK_Field; 417 else 418 S.FFDiag(Src, diag::note_constexpr_access_null) << AK; 419 420 return false; 421 } 422 423 if (!Ptr.isLive()) { 424 const auto &Src = S.Current->getSource(OpPC); 425 426 if (Ptr.isDynamic()) { 427 S.FFDiag(Src, diag::note_constexpr_access_deleted_object) << AK; 428 } else if (!S.checkingPotentialConstantExpression()) { 429 bool IsTemp = Ptr.isTemporary(); 430 S.FFDiag(Src, diag::note_constexpr_lifetime_ended, 1) << AK << !IsTemp; 431 432 if (IsTemp) 433 S.Note(Ptr.getDeclLoc(), diag::note_constexpr_temporary_here); 434 else 435 S.Note(Ptr.getDeclLoc(), diag::note_declared_at); 436 } 437 438 return false; 439 } 440 441 return true; 442 } 443 444 bool CheckConstant(InterpState &S, CodePtr OpPC, const Descriptor *Desc) { 445 assert(Desc); 446 447 const auto *D = Desc->asVarDecl(); 448 if (!D || D == S.EvaluatingDecl || D->isConstexpr()) 449 return true; 450 451 // If we're evaluating the initializer for a constexpr variable in C23, we may 452 // only read other contexpr variables. Abort here since this one isn't 453 // constexpr. 454 if (const auto *VD = dyn_cast_if_present<VarDecl>(S.EvaluatingDecl); 455 VD && VD->isConstexpr() && S.getLangOpts().C23) 456 return Invalid(S, OpPC); 457 458 QualType T = D->getType(); 459 bool IsConstant = T.isConstant(S.getASTContext()); 460 if (T->isIntegralOrEnumerationType()) { 461 if (!IsConstant) { 462 diagnoseNonConstVariable(S, OpPC, D); 463 return false; 464 } 465 return true; 466 } 467 468 if (IsConstant) { 469 if (S.getLangOpts().CPlusPlus) { 470 S.CCEDiag(S.Current->getLocation(OpPC), 471 S.getLangOpts().CPlusPlus11 472 ? diag::note_constexpr_ltor_non_constexpr 473 : diag::note_constexpr_ltor_non_integral, 474 1) 475 << D << T; 476 S.Note(D->getLocation(), diag::note_declared_at); 477 } else { 478 S.CCEDiag(S.Current->getLocation(OpPC)); 479 } 480 return true; 481 } 482 483 if (T->isPointerOrReferenceType()) { 484 if (!T->getPointeeType().isConstant(S.getASTContext()) || 485 !S.getLangOpts().CPlusPlus11) { 486 diagnoseNonConstVariable(S, OpPC, D); 487 return false; 488 } 489 return true; 490 } 491 492 diagnoseNonConstVariable(S, OpPC, D); 493 return false; 494 } 495 496 static bool CheckConstant(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 497 if (!Ptr.isStatic() || !Ptr.isBlockPointer()) 498 return true; 499 if (!Ptr.getDeclID()) 500 return true; 501 return CheckConstant(S, OpPC, Ptr.getDeclDesc()); 502 } 503 504 bool CheckNull(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 505 CheckSubobjectKind CSK) { 506 if (!Ptr.isZero()) 507 return true; 508 const SourceInfo &Loc = S.Current->getSource(OpPC); 509 S.FFDiag(Loc, diag::note_constexpr_null_subobject) 510 << CSK << S.Current->getRange(OpPC); 511 512 return false; 513 } 514 515 bool CheckRange(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 516 AccessKinds AK) { 517 if (!Ptr.isOnePastEnd()) 518 return true; 519 if (S.getLangOpts().CPlusPlus) { 520 const SourceInfo &Loc = S.Current->getSource(OpPC); 521 S.FFDiag(Loc, diag::note_constexpr_access_past_end) 522 << AK << S.Current->getRange(OpPC); 523 } 524 return false; 525 } 526 527 bool CheckRange(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 528 CheckSubobjectKind CSK) { 529 if (!Ptr.isElementPastEnd()) 530 return true; 531 const SourceInfo &Loc = S.Current->getSource(OpPC); 532 S.FFDiag(Loc, diag::note_constexpr_past_end_subobject) 533 << CSK << S.Current->getRange(OpPC); 534 return false; 535 } 536 537 bool CheckSubobject(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 538 CheckSubobjectKind CSK) { 539 if (!Ptr.isOnePastEnd()) 540 return true; 541 542 const SourceInfo &Loc = S.Current->getSource(OpPC); 543 S.FFDiag(Loc, diag::note_constexpr_past_end_subobject) 544 << CSK << S.Current->getRange(OpPC); 545 return false; 546 } 547 548 bool CheckDowncast(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 549 uint32_t Offset) { 550 uint32_t MinOffset = Ptr.getDeclDesc()->getMetadataSize(); 551 uint32_t PtrOffset = Ptr.getByteOffset(); 552 553 // We subtract Offset from PtrOffset. The result must be at least 554 // MinOffset. 555 if (Offset < PtrOffset && (PtrOffset - Offset) >= MinOffset) 556 return true; 557 558 const auto *E = cast<CastExpr>(S.Current->getExpr(OpPC)); 559 QualType TargetQT = E->getType()->getPointeeType(); 560 QualType MostDerivedQT = Ptr.getDeclPtr().getType(); 561 562 S.CCEDiag(E, diag::note_constexpr_invalid_downcast) 563 << MostDerivedQT << TargetQT; 564 565 return false; 566 } 567 568 bool CheckConst(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 569 assert(Ptr.isLive() && "Pointer is not live"); 570 if (!Ptr.isConst() || Ptr.isMutable()) 571 return true; 572 573 if (!Ptr.isBlockPointer()) 574 return false; 575 576 // The This pointer is writable in constructors and destructors, 577 // even if isConst() returns true. 578 if (llvm::find(S.InitializingBlocks, Ptr.block())) 579 return true; 580 581 const QualType Ty = Ptr.getType(); 582 const SourceInfo &Loc = S.Current->getSource(OpPC); 583 S.FFDiag(Loc, diag::note_constexpr_modify_const_type) << Ty; 584 return false; 585 } 586 587 bool CheckMutable(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 588 assert(Ptr.isLive() && "Pointer is not live"); 589 if (!Ptr.isMutable()) 590 return true; 591 592 // In C++14 onwards, it is permitted to read a mutable member whose 593 // lifetime began within the evaluation. 594 if (S.getLangOpts().CPlusPlus14 && 595 Ptr.block()->getEvalID() == S.Ctx.getEvalID()) { 596 // FIXME: This check is necessary because (of the way) we revisit 597 // variables in Compiler.cpp:visitDeclRef. Revisiting a so far 598 // unknown variable will get the same EvalID and we end up allowing 599 // reads from mutable members of it. 600 if (!S.inConstantContext() && isConstexprUnknown(Ptr)) 601 return false; 602 return true; 603 } 604 605 const SourceInfo &Loc = S.Current->getSource(OpPC); 606 const FieldDecl *Field = Ptr.getField(); 607 S.FFDiag(Loc, diag::note_constexpr_access_mutable, 1) << AK_Read << Field; 608 S.Note(Field->getLocation(), diag::note_declared_at); 609 return false; 610 } 611 612 static bool CheckVolatile(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 613 AccessKinds AK) { 614 assert(Ptr.isLive()); 615 616 if (!Ptr.isVolatile()) 617 return true; 618 619 if (!S.getLangOpts().CPlusPlus) 620 return Invalid(S, OpPC); 621 622 // The reason why Ptr is volatile might be further up the hierarchy. 623 // Find that pointer. 624 Pointer P = Ptr; 625 while (!P.isRoot()) { 626 if (P.getType().isVolatileQualified()) 627 break; 628 P = P.getBase(); 629 } 630 631 const NamedDecl *ND = nullptr; 632 int DiagKind; 633 SourceLocation Loc; 634 if (const auto *F = P.getField()) { 635 DiagKind = 2; 636 Loc = F->getLocation(); 637 ND = F; 638 } else if (auto *VD = P.getFieldDesc()->asValueDecl()) { 639 DiagKind = 1; 640 Loc = VD->getLocation(); 641 ND = VD; 642 } else { 643 DiagKind = 0; 644 if (const auto *E = P.getFieldDesc()->asExpr()) 645 Loc = E->getExprLoc(); 646 } 647 648 S.FFDiag(S.Current->getLocation(OpPC), 649 diag::note_constexpr_access_volatile_obj, 1) 650 << AK << DiagKind << ND; 651 S.Note(Loc, diag::note_constexpr_volatile_here) << DiagKind; 652 return false; 653 } 654 655 bool CheckInitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 656 AccessKinds AK) { 657 assert(Ptr.isLive()); 658 659 if (Ptr.isInitialized()) 660 return true; 661 662 if (const auto *VD = Ptr.getDeclDesc()->asVarDecl(); 663 VD && (VD->isConstexpr() || VD->hasGlobalStorage())) { 664 665 if (VD == S.EvaluatingDecl && 666 !(S.getLangOpts().CPlusPlus23 && VD->getType()->isReferenceType())) { 667 if (!S.getLangOpts().CPlusPlus14 && 668 !VD->getType().isConstant(S.getASTContext())) { 669 // Diagnose as non-const read. 670 diagnoseNonConstVariable(S, OpPC, VD); 671 } else { 672 const SourceInfo &Loc = S.Current->getSource(OpPC); 673 // Diagnose as "read of object outside its lifetime". 674 S.FFDiag(Loc, diag::note_constexpr_access_uninit) 675 << AK << /*IsIndeterminate=*/false; 676 } 677 return false; 678 } 679 680 if (VD->getAnyInitializer()) { 681 const SourceInfo &Loc = S.Current->getSource(OpPC); 682 S.FFDiag(Loc, diag::note_constexpr_var_init_non_constant, 1) << VD; 683 S.Note(VD->getLocation(), diag::note_declared_at); 684 } else { 685 diagnoseMissingInitializer(S, OpPC, VD); 686 } 687 return false; 688 } 689 690 if (!S.checkingPotentialConstantExpression()) { 691 S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_access_uninit) 692 << AK << /*uninitialized=*/true << S.Current->getRange(OpPC); 693 } 694 return false; 695 } 696 697 static bool CheckLifetime(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 698 AccessKinds AK) { 699 if (Ptr.getLifetime() == Lifetime::Started) 700 return true; 701 702 if (!S.checkingPotentialConstantExpression()) { 703 S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_access_uninit) 704 << AK << /*uninitialized=*/false << S.Current->getRange(OpPC); 705 } 706 return false; 707 } 708 709 bool CheckGlobalInitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 710 if (Ptr.isInitialized()) 711 return true; 712 713 assert(S.getLangOpts().CPlusPlus); 714 const auto *VD = cast<VarDecl>(Ptr.getDeclDesc()->asValueDecl()); 715 if ((!VD->hasConstantInitialization() && 716 VD->mightBeUsableInConstantExpressions(S.getASTContext())) || 717 (S.getLangOpts().OpenCL && !S.getLangOpts().CPlusPlus11 && 718 !VD->hasICEInitializer(S.getASTContext()))) { 719 const SourceInfo &Loc = S.Current->getSource(OpPC); 720 S.FFDiag(Loc, diag::note_constexpr_var_init_non_constant, 1) << VD; 721 S.Note(VD->getLocation(), diag::note_declared_at); 722 } 723 return false; 724 } 725 726 static bool CheckWeak(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 727 if (!Ptr.isWeak()) 728 return true; 729 730 const auto *VD = Ptr.getDeclDesc()->asVarDecl(); 731 assert(VD); 732 S.FFDiag(S.Current->getLocation(OpPC), diag::note_constexpr_var_init_weak) 733 << VD; 734 S.Note(VD->getLocation(), diag::note_declared_at); 735 736 return false; 737 } 738 739 bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 740 AccessKinds AK) { 741 if (!CheckLive(S, OpPC, Ptr, AK)) 742 return false; 743 if (!CheckExtern(S, OpPC, Ptr)) 744 return false; 745 if (!CheckConstant(S, OpPC, Ptr)) 746 return false; 747 if (!CheckDummy(S, OpPC, Ptr, AK)) 748 return false; 749 if (!CheckRange(S, OpPC, Ptr, AK)) 750 return false; 751 if (!CheckActive(S, OpPC, Ptr, AK)) 752 return false; 753 if (!CheckLifetime(S, OpPC, Ptr, AK)) 754 return false; 755 if (!CheckInitialized(S, OpPC, Ptr, AK)) 756 return false; 757 if (!CheckTemporary(S, OpPC, Ptr, AK)) 758 return false; 759 if (!CheckWeak(S, OpPC, Ptr)) 760 return false; 761 if (!CheckMutable(S, OpPC, Ptr)) 762 return false; 763 if (!CheckVolatile(S, OpPC, Ptr, AK)) 764 return false; 765 return true; 766 } 767 768 /// This is not used by any of the opcodes directly. It's used by 769 /// EvalEmitter to do the final lvalue-to-rvalue conversion. 770 bool CheckFinalLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 771 if (!CheckLive(S, OpPC, Ptr, AK_Read)) 772 return false; 773 if (!CheckConstant(S, OpPC, Ptr)) 774 return false; 775 776 if (!CheckDummy(S, OpPC, Ptr, AK_Read)) 777 return false; 778 if (!CheckExtern(S, OpPC, Ptr)) 779 return false; 780 if (!CheckRange(S, OpPC, Ptr, AK_Read)) 781 return false; 782 if (!CheckActive(S, OpPC, Ptr, AK_Read)) 783 return false; 784 if (!CheckLifetime(S, OpPC, Ptr, AK_Read)) 785 return false; 786 if (!CheckInitialized(S, OpPC, Ptr, AK_Read)) 787 return false; 788 if (!CheckTemporary(S, OpPC, Ptr, AK_Read)) 789 return false; 790 if (!CheckWeak(S, OpPC, Ptr)) 791 return false; 792 if (!CheckMutable(S, OpPC, Ptr)) 793 return false; 794 return true; 795 } 796 797 bool CheckStore(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 798 if (!CheckLive(S, OpPC, Ptr, AK_Assign)) 799 return false; 800 if (!CheckDummy(S, OpPC, Ptr, AK_Assign)) 801 return false; 802 if (!CheckLifetime(S, OpPC, Ptr, AK_Assign)) 803 return false; 804 if (!CheckExtern(S, OpPC, Ptr)) 805 return false; 806 if (!CheckRange(S, OpPC, Ptr, AK_Assign)) 807 return false; 808 if (!CheckGlobal(S, OpPC, Ptr)) 809 return false; 810 if (!CheckConst(S, OpPC, Ptr)) 811 return false; 812 if (!S.inConstantContext() && isConstexprUnknown(Ptr)) 813 return false; 814 return true; 815 } 816 817 bool CheckInvoke(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 818 if (!CheckLive(S, OpPC, Ptr, AK_MemberCall)) 819 return false; 820 if (!Ptr.isDummy()) { 821 if (!CheckExtern(S, OpPC, Ptr)) 822 return false; 823 if (!CheckRange(S, OpPC, Ptr, AK_MemberCall)) 824 return false; 825 } 826 return true; 827 } 828 829 bool CheckInit(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 830 if (!CheckLive(S, OpPC, Ptr, AK_Assign)) 831 return false; 832 if (!CheckRange(S, OpPC, Ptr, AK_Assign)) 833 return false; 834 return true; 835 } 836 837 bool CheckCallable(InterpState &S, CodePtr OpPC, const Function *F) { 838 839 if (F->isVirtual() && !S.getLangOpts().CPlusPlus20) { 840 const SourceLocation &Loc = S.Current->getLocation(OpPC); 841 S.CCEDiag(Loc, diag::note_constexpr_virtual_call); 842 return false; 843 } 844 845 if (S.checkingPotentialConstantExpression() && S.Current->getDepth() != 0) 846 return false; 847 848 if (F->isValid() && F->hasBody() && F->isConstexpr()) 849 return true; 850 851 // Implicitly constexpr. 852 if (F->isLambdaStaticInvoker()) 853 return true; 854 855 // Bail out if the function declaration itself is invalid. We will 856 // have produced a relevant diagnostic while parsing it, so just 857 // note the problematic sub-expression. 858 if (F->getDecl()->isInvalidDecl()) 859 return Invalid(S, OpPC); 860 861 // Diagnose failed assertions specially. 862 if (S.Current->getLocation(OpPC).isMacroID() && 863 F->getDecl()->getIdentifier()) { 864 // FIXME: Instead of checking for an implementation-defined function, 865 // check and evaluate the assert() macro. 866 StringRef Name = F->getDecl()->getName(); 867 bool AssertFailed = 868 Name == "__assert_rtn" || Name == "__assert_fail" || Name == "_wassert"; 869 if (AssertFailed) { 870 S.FFDiag(S.Current->getLocation(OpPC), 871 diag::note_constexpr_assert_failed); 872 return false; 873 } 874 } 875 876 if (S.getLangOpts().CPlusPlus11) { 877 const FunctionDecl *DiagDecl = F->getDecl(); 878 879 // Invalid decls have been diagnosed before. 880 if (DiagDecl->isInvalidDecl()) 881 return false; 882 883 // If this function is not constexpr because it is an inherited 884 // non-constexpr constructor, diagnose that directly. 885 const auto *CD = dyn_cast<CXXConstructorDecl>(DiagDecl); 886 if (CD && CD->isInheritingConstructor()) { 887 const auto *Inherited = CD->getInheritedConstructor().getConstructor(); 888 if (!Inherited->isConstexpr()) 889 DiagDecl = CD = Inherited; 890 } 891 892 // Silently reject constructors of invalid classes. The invalid class 893 // has been rejected elsewhere before. 894 if (CD && CD->getParent()->isInvalidDecl()) 895 return false; 896 897 // FIXME: If DiagDecl is an implicitly-declared special member function 898 // or an inheriting constructor, we should be much more explicit about why 899 // it's not constexpr. 900 if (CD && CD->isInheritingConstructor()) { 901 S.FFDiag(S.Current->getLocation(OpPC), 902 diag::note_constexpr_invalid_inhctor, 1) 903 << CD->getInheritedConstructor().getConstructor()->getParent(); 904 S.Note(DiagDecl->getLocation(), diag::note_declared_at); 905 } else { 906 // Don't emit anything if the function isn't defined and we're checking 907 // for a constant expression. It might be defined at the point we're 908 // actually calling it. 909 bool IsExtern = DiagDecl->getStorageClass() == SC_Extern; 910 bool IsDefined = F->isDefined(); 911 if (!IsDefined && !IsExtern && DiagDecl->isConstexpr() && 912 S.checkingPotentialConstantExpression()) 913 return false; 914 915 // If the declaration is defined, declared 'constexpr' _and_ has a body, 916 // the below diagnostic doesn't add anything useful. 917 if (DiagDecl->isDefined() && DiagDecl->isConstexpr() && 918 DiagDecl->hasBody()) 919 return false; 920 921 S.FFDiag(S.Current->getLocation(OpPC), 922 diag::note_constexpr_invalid_function, 1) 923 << DiagDecl->isConstexpr() << (bool)CD << DiagDecl; 924 925 if (DiagDecl->getDefinition()) 926 S.Note(DiagDecl->getDefinition()->getLocation(), 927 diag::note_declared_at); 928 else 929 S.Note(DiagDecl->getLocation(), diag::note_declared_at); 930 } 931 } else { 932 S.FFDiag(S.Current->getLocation(OpPC), 933 diag::note_invalid_subexpr_in_const_expr); 934 } 935 936 return false; 937 } 938 939 bool CheckCallDepth(InterpState &S, CodePtr OpPC) { 940 if ((S.Current->getDepth() + 1) > S.getLangOpts().ConstexprCallDepth) { 941 S.FFDiag(S.Current->getSource(OpPC), 942 diag::note_constexpr_depth_limit_exceeded) 943 << S.getLangOpts().ConstexprCallDepth; 944 return false; 945 } 946 947 return true; 948 } 949 950 bool CheckThis(InterpState &S, CodePtr OpPC, const Pointer &This) { 951 if (!This.isZero()) 952 return true; 953 954 const Expr *E = S.Current->getExpr(OpPC); 955 if (S.getLangOpts().CPlusPlus11) { 956 bool IsImplicit = false; 957 if (const auto *TE = dyn_cast<CXXThisExpr>(E)) 958 IsImplicit = TE->isImplicit(); 959 S.FFDiag(E, diag::note_constexpr_this) << IsImplicit; 960 } else { 961 S.FFDiag(E); 962 } 963 964 return false; 965 } 966 967 bool CheckFloatResult(InterpState &S, CodePtr OpPC, const Floating &Result, 968 APFloat::opStatus Status, FPOptions FPO) { 969 // [expr.pre]p4: 970 // If during the evaluation of an expression, the result is not 971 // mathematically defined [...], the behavior is undefined. 972 // FIXME: C++ rules require us to not conform to IEEE 754 here. 973 if (Result.isNan()) { 974 const SourceInfo &E = S.Current->getSource(OpPC); 975 S.CCEDiag(E, diag::note_constexpr_float_arithmetic) 976 << /*NaN=*/true << S.Current->getRange(OpPC); 977 return S.noteUndefinedBehavior(); 978 } 979 980 // In a constant context, assume that any dynamic rounding mode or FP 981 // exception state matches the default floating-point environment. 982 if (S.inConstantContext()) 983 return true; 984 985 if ((Status & APFloat::opInexact) && 986 FPO.getRoundingMode() == llvm::RoundingMode::Dynamic) { 987 // Inexact result means that it depends on rounding mode. If the requested 988 // mode is dynamic, the evaluation cannot be made in compile time. 989 const SourceInfo &E = S.Current->getSource(OpPC); 990 S.FFDiag(E, diag::note_constexpr_dynamic_rounding); 991 return false; 992 } 993 994 if ((Status != APFloat::opOK) && 995 (FPO.getRoundingMode() == llvm::RoundingMode::Dynamic || 996 FPO.getExceptionMode() != LangOptions::FPE_Ignore || 997 FPO.getAllowFEnvAccess())) { 998 const SourceInfo &E = S.Current->getSource(OpPC); 999 S.FFDiag(E, diag::note_constexpr_float_arithmetic_strict); 1000 return false; 1001 } 1002 1003 if ((Status & APFloat::opStatus::opInvalidOp) && 1004 FPO.getExceptionMode() != LangOptions::FPE_Ignore) { 1005 const SourceInfo &E = S.Current->getSource(OpPC); 1006 // There is no usefully definable result. 1007 S.FFDiag(E); 1008 return false; 1009 } 1010 1011 return true; 1012 } 1013 1014 bool CheckDynamicMemoryAllocation(InterpState &S, CodePtr OpPC) { 1015 if (S.getLangOpts().CPlusPlus20) 1016 return true; 1017 1018 const SourceInfo &E = S.Current->getSource(OpPC); 1019 S.CCEDiag(E, diag::note_constexpr_new); 1020 return true; 1021 } 1022 1023 bool CheckNewDeleteForms(InterpState &S, CodePtr OpPC, 1024 DynamicAllocator::Form AllocForm, 1025 DynamicAllocator::Form DeleteForm, const Descriptor *D, 1026 const Expr *NewExpr) { 1027 if (AllocForm == DeleteForm) 1028 return true; 1029 1030 QualType TypeToDiagnose = D->getDataType(S.getASTContext()); 1031 1032 const SourceInfo &E = S.Current->getSource(OpPC); 1033 S.FFDiag(E, diag::note_constexpr_new_delete_mismatch) 1034 << static_cast<int>(DeleteForm) << static_cast<int>(AllocForm) 1035 << TypeToDiagnose; 1036 S.Note(NewExpr->getExprLoc(), diag::note_constexpr_dynamic_alloc_here) 1037 << NewExpr->getSourceRange(); 1038 return false; 1039 } 1040 1041 bool CheckDeleteSource(InterpState &S, CodePtr OpPC, const Expr *Source, 1042 const Pointer &Ptr) { 1043 // Regular new type(...) call. 1044 if (isa_and_nonnull<CXXNewExpr>(Source)) 1045 return true; 1046 // operator new. 1047 if (const auto *CE = dyn_cast_if_present<CallExpr>(Source); 1048 CE && CE->getBuiltinCallee() == Builtin::BI__builtin_operator_new) 1049 return true; 1050 // std::allocator.allocate() call 1051 if (const auto *MCE = dyn_cast_if_present<CXXMemberCallExpr>(Source); 1052 MCE && MCE->getMethodDecl()->getIdentifier()->isStr("allocate")) 1053 return true; 1054 1055 // Whatever this is, we didn't heap allocate it. 1056 const SourceInfo &Loc = S.Current->getSource(OpPC); 1057 S.FFDiag(Loc, diag::note_constexpr_delete_not_heap_alloc) 1058 << Ptr.toDiagnosticString(S.getASTContext()); 1059 1060 if (Ptr.isTemporary()) 1061 S.Note(Ptr.getDeclLoc(), diag::note_constexpr_temporary_here); 1062 else 1063 S.Note(Ptr.getDeclLoc(), diag::note_declared_at); 1064 return false; 1065 } 1066 1067 /// We aleady know the given DeclRefExpr is invalid for some reason, 1068 /// now figure out why and print appropriate diagnostics. 1069 bool CheckDeclRef(InterpState &S, CodePtr OpPC, const DeclRefExpr *DR) { 1070 const ValueDecl *D = DR->getDecl(); 1071 return diagnoseUnknownDecl(S, OpPC, D); 1072 } 1073 1074 bool CheckDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 1075 AccessKinds AK) { 1076 if (!Ptr.isDummy()) 1077 return true; 1078 1079 const Descriptor *Desc = Ptr.getDeclDesc(); 1080 const ValueDecl *D = Desc->asValueDecl(); 1081 if (!D) 1082 return false; 1083 1084 if (AK == AK_Read || AK == AK_Increment || AK == AK_Decrement) 1085 return diagnoseUnknownDecl(S, OpPC, D); 1086 1087 if (AK == AK_Destroy || S.getLangOpts().CPlusPlus14) { 1088 const SourceInfo &E = S.Current->getSource(OpPC); 1089 S.FFDiag(E, diag::note_constexpr_modify_global); 1090 } 1091 return false; 1092 } 1093 1094 bool CheckNonNullArgs(InterpState &S, CodePtr OpPC, const Function *F, 1095 const CallExpr *CE, unsigned ArgSize) { 1096 auto Args = ArrayRef(CE->getArgs(), CE->getNumArgs()); 1097 auto NonNullArgs = collectNonNullArgs(F->getDecl(), Args); 1098 unsigned Offset = 0; 1099 unsigned Index = 0; 1100 for (const Expr *Arg : Args) { 1101 if (NonNullArgs[Index] && Arg->getType()->isPointerType()) { 1102 const Pointer &ArgPtr = S.Stk.peek<Pointer>(ArgSize - Offset); 1103 if (ArgPtr.isZero()) { 1104 const SourceLocation &Loc = S.Current->getLocation(OpPC); 1105 S.CCEDiag(Loc, diag::note_non_null_attribute_failed); 1106 return false; 1107 } 1108 } 1109 1110 Offset += align(primSize(S.Ctx.classify(Arg).value_or(PT_Ptr))); 1111 ++Index; 1112 } 1113 return true; 1114 } 1115 1116 static bool runRecordDestructor(InterpState &S, CodePtr OpPC, 1117 const Pointer &BasePtr, 1118 const Descriptor *Desc) { 1119 assert(Desc->isRecord()); 1120 const Record *R = Desc->ElemRecord; 1121 assert(R); 1122 1123 if (Pointer::pointToSameBlock(BasePtr, S.Current->getThis()) && 1124 S.Current->getFunction()->isDestructor()) { 1125 const SourceInfo &Loc = S.Current->getSource(OpPC); 1126 S.FFDiag(Loc, diag::note_constexpr_double_destroy); 1127 return false; 1128 } 1129 1130 // Destructor of this record. 1131 if (const CXXDestructorDecl *Dtor = R->getDestructor(); 1132 Dtor && !Dtor->isTrivial()) { 1133 const Function *DtorFunc = S.getContext().getOrCreateFunction(Dtor); 1134 if (!DtorFunc) 1135 return false; 1136 1137 S.Stk.push<Pointer>(BasePtr); 1138 if (!Call(S, OpPC, DtorFunc, 0)) 1139 return false; 1140 } 1141 return true; 1142 } 1143 1144 static bool RunDestructors(InterpState &S, CodePtr OpPC, const Block *B) { 1145 assert(B); 1146 const Descriptor *Desc = B->getDescriptor(); 1147 1148 if (Desc->isPrimitive() || Desc->isPrimitiveArray()) 1149 return true; 1150 1151 assert(Desc->isRecord() || Desc->isCompositeArray()); 1152 1153 if (Desc->isCompositeArray()) { 1154 unsigned N = Desc->getNumElems(); 1155 if (N == 0) 1156 return true; 1157 const Descriptor *ElemDesc = Desc->ElemDesc; 1158 assert(ElemDesc->isRecord()); 1159 1160 Pointer RP(const_cast<Block *>(B)); 1161 for (int I = static_cast<int>(N) - 1; I >= 0; --I) { 1162 if (!runRecordDestructor(S, OpPC, RP.atIndex(I).narrow(), ElemDesc)) 1163 return false; 1164 } 1165 return true; 1166 } 1167 1168 assert(Desc->isRecord()); 1169 return runRecordDestructor(S, OpPC, Pointer(const_cast<Block *>(B)), Desc); 1170 } 1171 1172 static bool hasVirtualDestructor(QualType T) { 1173 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl()) 1174 if (const CXXDestructorDecl *DD = RD->getDestructor()) 1175 return DD->isVirtual(); 1176 return false; 1177 } 1178 1179 bool Free(InterpState &S, CodePtr OpPC, bool DeleteIsArrayForm, 1180 bool IsGlobalDelete) { 1181 if (!CheckDynamicMemoryAllocation(S, OpPC)) 1182 return false; 1183 1184 DynamicAllocator &Allocator = S.getAllocator(); 1185 1186 const Expr *Source = nullptr; 1187 const Block *BlockToDelete = nullptr; 1188 { 1189 // Extra scope for this so the block doesn't have this pointer 1190 // pointing to it when we destroy it. 1191 Pointer Ptr = S.Stk.pop<Pointer>(); 1192 1193 // Deleteing nullptr is always fine. 1194 if (Ptr.isZero()) 1195 return true; 1196 1197 // Remove base casts. 1198 QualType InitialType = Ptr.getType(); 1199 while (Ptr.isBaseClass()) 1200 Ptr = Ptr.getBase(); 1201 1202 Source = Ptr.getDeclDesc()->asExpr(); 1203 BlockToDelete = Ptr.block(); 1204 1205 // Check that new[]/delete[] or new/delete were used, not a mixture. 1206 const Descriptor *BlockDesc = BlockToDelete->getDescriptor(); 1207 if (std::optional<DynamicAllocator::Form> AllocForm = 1208 Allocator.getAllocationForm(Source)) { 1209 DynamicAllocator::Form DeleteForm = 1210 DeleteIsArrayForm ? DynamicAllocator::Form::Array 1211 : DynamicAllocator::Form::NonArray; 1212 if (!CheckNewDeleteForms(S, OpPC, *AllocForm, DeleteForm, BlockDesc, 1213 Source)) 1214 return false; 1215 } 1216 1217 // For the non-array case, the types must match if the static type 1218 // does not have a virtual destructor. 1219 if (!DeleteIsArrayForm && Ptr.getType() != InitialType && 1220 !hasVirtualDestructor(InitialType)) { 1221 S.FFDiag(S.Current->getSource(OpPC), 1222 diag::note_constexpr_delete_base_nonvirt_dtor) 1223 << InitialType << Ptr.getType(); 1224 return false; 1225 } 1226 1227 if (!Ptr.isRoot() || Ptr.isOnePastEnd() || 1228 (Ptr.isArrayElement() && Ptr.getIndex() != 0)) { 1229 const SourceInfo &Loc = S.Current->getSource(OpPC); 1230 S.FFDiag(Loc, diag::note_constexpr_delete_subobject) 1231 << Ptr.toDiagnosticString(S.getASTContext()) << Ptr.isOnePastEnd(); 1232 return false; 1233 } 1234 1235 if (!CheckDeleteSource(S, OpPC, Source, Ptr)) 1236 return false; 1237 1238 // For a class type with a virtual destructor, the selected operator delete 1239 // is the one looked up when building the destructor. 1240 if (!DeleteIsArrayForm && !IsGlobalDelete) { 1241 QualType AllocType = Ptr.getType(); 1242 auto getVirtualOperatorDelete = [](QualType T) -> const FunctionDecl * { 1243 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl()) 1244 if (const CXXDestructorDecl *DD = RD->getDestructor()) 1245 return DD->isVirtual() ? DD->getOperatorDelete() : nullptr; 1246 return nullptr; 1247 }; 1248 1249 if (const FunctionDecl *VirtualDelete = 1250 getVirtualOperatorDelete(AllocType); 1251 VirtualDelete && 1252 !VirtualDelete 1253 ->isUsableAsGlobalAllocationFunctionInConstantEvaluation()) { 1254 S.FFDiag(S.Current->getSource(OpPC), 1255 diag::note_constexpr_new_non_replaceable) 1256 << isa<CXXMethodDecl>(VirtualDelete) << VirtualDelete; 1257 return false; 1258 } 1259 } 1260 } 1261 assert(Source); 1262 assert(BlockToDelete); 1263 1264 // Invoke destructors before deallocating the memory. 1265 if (!RunDestructors(S, OpPC, BlockToDelete)) 1266 return false; 1267 1268 if (!Allocator.deallocate(Source, BlockToDelete, S)) { 1269 // Nothing has been deallocated, this must be a double-delete. 1270 const SourceInfo &Loc = S.Current->getSource(OpPC); 1271 S.FFDiag(Loc, diag::note_constexpr_double_delete); 1272 return false; 1273 } 1274 1275 return true; 1276 } 1277 1278 void diagnoseEnumValue(InterpState &S, CodePtr OpPC, const EnumDecl *ED, 1279 const APSInt &Value) { 1280 if (S.EvaluatingDecl && !S.EvaluatingDecl->isConstexpr()) 1281 return; 1282 1283 llvm::APInt Min; 1284 llvm::APInt Max; 1285 ED->getValueRange(Max, Min); 1286 --Max; 1287 1288 if (ED->getNumNegativeBits() && 1289 (Max.slt(Value.getSExtValue()) || Min.sgt(Value.getSExtValue()))) { 1290 const SourceLocation &Loc = S.Current->getLocation(OpPC); 1291 S.CCEDiag(Loc, diag::note_constexpr_unscoped_enum_out_of_range) 1292 << llvm::toString(Value, 10) << Min.getSExtValue() << Max.getSExtValue() 1293 << ED; 1294 } else if (!ED->getNumNegativeBits() && Max.ult(Value.getZExtValue())) { 1295 const SourceLocation &Loc = S.Current->getLocation(OpPC); 1296 S.CCEDiag(Loc, diag::note_constexpr_unscoped_enum_out_of_range) 1297 << llvm::toString(Value, 10) << Min.getZExtValue() << Max.getZExtValue() 1298 << ED; 1299 } 1300 } 1301 1302 bool CheckLiteralType(InterpState &S, CodePtr OpPC, const Type *T) { 1303 assert(T); 1304 assert(!S.getLangOpts().CPlusPlus23); 1305 1306 // C++1y: A constant initializer for an object o [...] may also invoke 1307 // constexpr constructors for o and its subobjects even if those objects 1308 // are of non-literal class types. 1309 // 1310 // C++11 missed this detail for aggregates, so classes like this: 1311 // struct foo_t { union { int i; volatile int j; } u; }; 1312 // are not (obviously) initializable like so: 1313 // __attribute__((__require_constant_initialization__)) 1314 // static const foo_t x = {{0}}; 1315 // because "i" is a subobject with non-literal initialization (due to the 1316 // volatile member of the union). See: 1317 // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1677 1318 // Therefore, we use the C++1y behavior. 1319 1320 if (S.Current->getFunction() && S.Current->getFunction()->isConstructor() && 1321 S.Current->getThis().getDeclDesc()->asDecl() == S.EvaluatingDecl) { 1322 return true; 1323 } 1324 1325 const Expr *E = S.Current->getExpr(OpPC); 1326 if (S.getLangOpts().CPlusPlus11) 1327 S.FFDiag(E, diag::note_constexpr_nonliteral) << E->getType(); 1328 else 1329 S.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); 1330 return false; 1331 } 1332 1333 static bool getField(InterpState &S, CodePtr OpPC, const Pointer &Ptr, 1334 uint32_t Off) { 1335 if (S.getLangOpts().CPlusPlus && S.inConstantContext() && 1336 !CheckNull(S, OpPC, Ptr, CSK_Field)) 1337 return false; 1338 1339 if (!CheckRange(S, OpPC, Ptr, CSK_Field)) 1340 return false; 1341 if (!CheckArray(S, OpPC, Ptr)) 1342 return false; 1343 if (!CheckSubobject(S, OpPC, Ptr, CSK_Field)) 1344 return false; 1345 1346 if (Ptr.isIntegralPointer()) { 1347 S.Stk.push<Pointer>(Ptr.asIntPointer().atOffset(S.getASTContext(), Off)); 1348 return true; 1349 } 1350 1351 if (!Ptr.isBlockPointer()) { 1352 // FIXME: The only time we (seem to) get here is when trying to access a 1353 // field of a typeid pointer. In that case, we're supposed to diagnose e.g. 1354 // `typeid(int).name`, but we currently diagnose `&typeid(int)`. 1355 S.FFDiag(S.Current->getSource(OpPC), 1356 diag::note_constexpr_access_unreadable_object) 1357 << AK_Read << Ptr.toDiagnosticString(S.getASTContext()); 1358 return false; 1359 } 1360 1361 if ((Ptr.getByteOffset() + Off) >= Ptr.block()->getSize()) 1362 return false; 1363 1364 S.Stk.push<Pointer>(Ptr.atField(Off)); 1365 return true; 1366 } 1367 1368 bool GetPtrField(InterpState &S, CodePtr OpPC, uint32_t Off) { 1369 const auto &Ptr = S.Stk.peek<Pointer>(); 1370 return getField(S, OpPC, Ptr, Off); 1371 } 1372 1373 bool GetPtrFieldPop(InterpState &S, CodePtr OpPC, uint32_t Off) { 1374 const auto &Ptr = S.Stk.pop<Pointer>(); 1375 return getField(S, OpPC, Ptr, Off); 1376 } 1377 1378 static bool checkConstructor(InterpState &S, CodePtr OpPC, const Function *Func, 1379 const Pointer &ThisPtr) { 1380 assert(Func->isConstructor()); 1381 1382 if (Func->getParentDecl()->isInvalidDecl()) 1383 return false; 1384 1385 const Descriptor *D = ThisPtr.getFieldDesc(); 1386 // FIXME: I think this case is not 100% correct. E.g. a pointer into a 1387 // subobject of a composite array. 1388 if (!D->ElemRecord) 1389 return true; 1390 1391 if (D->ElemRecord->getNumVirtualBases() == 0) 1392 return true; 1393 1394 S.FFDiag(S.Current->getLocation(OpPC), diag::note_constexpr_virtual_base) 1395 << Func->getParentDecl(); 1396 return false; 1397 } 1398 1399 bool CheckDestructor(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { 1400 if (!CheckLive(S, OpPC, Ptr, AK_Destroy)) 1401 return false; 1402 if (!CheckTemporary(S, OpPC, Ptr, AK_Destroy)) 1403 return false; 1404 if (!CheckRange(S, OpPC, Ptr, AK_Destroy)) 1405 return false; 1406 1407 // Can't call a dtor on a global variable. 1408 if (Ptr.block()->isStatic()) { 1409 const SourceInfo &E = S.Current->getSource(OpPC); 1410 S.FFDiag(E, diag::note_constexpr_modify_global); 1411 return false; 1412 } 1413 return CheckActive(S, OpPC, Ptr, AK_Destroy); 1414 } 1415 1416 static void compileFunction(InterpState &S, const Function *Func) { 1417 Compiler<ByteCodeEmitter>(S.getContext(), S.P) 1418 .compileFunc(Func->getDecl()->getMostRecentDecl(), 1419 const_cast<Function *>(Func)); 1420 } 1421 1422 bool CallVar(InterpState &S, CodePtr OpPC, const Function *Func, 1423 uint32_t VarArgSize) { 1424 if (Func->hasThisPointer()) { 1425 size_t ArgSize = Func->getArgSize() + VarArgSize; 1426 size_t ThisOffset = ArgSize - (Func->hasRVO() ? primSize(PT_Ptr) : 0); 1427 const Pointer &ThisPtr = S.Stk.peek<Pointer>(ThisOffset); 1428 1429 // If the current function is a lambda static invoker and 1430 // the function we're about to call is a lambda call operator, 1431 // skip the CheckInvoke, since the ThisPtr is a null pointer 1432 // anyway. 1433 if (!(S.Current->getFunction() && 1434 S.Current->getFunction()->isLambdaStaticInvoker() && 1435 Func->isLambdaCallOperator())) { 1436 if (!CheckInvoke(S, OpPC, ThisPtr)) 1437 return false; 1438 } 1439 1440 if (S.checkingPotentialConstantExpression()) 1441 return false; 1442 } 1443 1444 if (!Func->isFullyCompiled()) 1445 compileFunction(S, Func); 1446 1447 if (!CheckCallable(S, OpPC, Func)) 1448 return false; 1449 1450 if (!CheckCallDepth(S, OpPC)) 1451 return false; 1452 1453 auto NewFrame = std::make_unique<InterpFrame>(S, Func, OpPC, VarArgSize); 1454 InterpFrame *FrameBefore = S.Current; 1455 S.Current = NewFrame.get(); 1456 1457 // Note that we cannot assert(CallResult.hasValue()) here since 1458 // Ret() above only sets the APValue if the curent frame doesn't 1459 // have a caller set. 1460 if (Interpret(S)) { 1461 NewFrame.release(); // Frame was delete'd already. 1462 assert(S.Current == FrameBefore); 1463 return true; 1464 } 1465 1466 // Interpreting the function failed somehow. Reset to 1467 // previous state. 1468 S.Current = FrameBefore; 1469 return false; 1470 } 1471 bool Call(InterpState &S, CodePtr OpPC, const Function *Func, 1472 uint32_t VarArgSize) { 1473 assert(Func); 1474 auto cleanup = [&]() -> bool { 1475 cleanupAfterFunctionCall(S, OpPC, Func); 1476 return false; 1477 }; 1478 1479 if (Func->hasThisPointer()) { 1480 size_t ArgSize = Func->getArgSize() + VarArgSize; 1481 size_t ThisOffset = ArgSize - (Func->hasRVO() ? primSize(PT_Ptr) : 0); 1482 1483 const Pointer &ThisPtr = S.Stk.peek<Pointer>(ThisOffset); 1484 1485 // C++23 [expr.const]p5.6 1486 // an invocation of a virtual function ([class.virtual]) for an object whose 1487 // dynamic type is constexpr-unknown; 1488 if (ThisPtr.isDummy() && Func->isVirtual()) 1489 return false; 1490 1491 // If the current function is a lambda static invoker and 1492 // the function we're about to call is a lambda call operator, 1493 // skip the CheckInvoke, since the ThisPtr is a null pointer 1494 // anyway. 1495 if (S.Current->getFunction() && 1496 S.Current->getFunction()->isLambdaStaticInvoker() && 1497 Func->isLambdaCallOperator()) { 1498 assert(ThisPtr.isZero()); 1499 } else { 1500 if (!CheckInvoke(S, OpPC, ThisPtr)) 1501 return cleanup(); 1502 if (!Func->isConstructor() && !Func->isDestructor() && 1503 !Func->isCopyOrMoveOperator() && 1504 !CheckActive(S, OpPC, ThisPtr, AK_MemberCall)) 1505 return false; 1506 } 1507 1508 if (Func->isConstructor() && !checkConstructor(S, OpPC, Func, ThisPtr)) 1509 return false; 1510 if (Func->isDestructor() && !CheckDestructor(S, OpPC, ThisPtr)) 1511 return false; 1512 1513 if (Func->isConstructor() || Func->isDestructor()) 1514 S.InitializingBlocks.push_back(ThisPtr.block()); 1515 } 1516 1517 if (!Func->isFullyCompiled()) 1518 compileFunction(S, Func); 1519 1520 if (!CheckCallable(S, OpPC, Func)) 1521 return cleanup(); 1522 1523 // FIXME: The isConstructor() check here is not always right. The current 1524 // constant evaluator is somewhat inconsistent in when it allows a function 1525 // call when checking for a constant expression. 1526 if (Func->hasThisPointer() && S.checkingPotentialConstantExpression() && 1527 !Func->isConstructor()) 1528 return cleanup(); 1529 1530 if (!CheckCallDepth(S, OpPC)) 1531 return cleanup(); 1532 1533 auto NewFrame = std::make_unique<InterpFrame>(S, Func, OpPC, VarArgSize); 1534 InterpFrame *FrameBefore = S.Current; 1535 S.Current = NewFrame.get(); 1536 1537 InterpStateCCOverride CCOverride(S, Func->isImmediate()); 1538 // Note that we cannot assert(CallResult.hasValue()) here since 1539 // Ret() above only sets the APValue if the curent frame doesn't 1540 // have a caller set. 1541 bool Success = Interpret(S); 1542 // Remove initializing block again. 1543 if (Func->isConstructor() || Func->isDestructor()) 1544 S.InitializingBlocks.pop_back(); 1545 1546 if (!Success) { 1547 // Interpreting the function failed somehow. Reset to 1548 // previous state. 1549 S.Current = FrameBefore; 1550 return false; 1551 } 1552 1553 NewFrame.release(); // Frame was delete'd already. 1554 assert(S.Current == FrameBefore); 1555 return true; 1556 } 1557 1558 bool CallVirt(InterpState &S, CodePtr OpPC, const Function *Func, 1559 uint32_t VarArgSize) { 1560 assert(Func->hasThisPointer()); 1561 assert(Func->isVirtual()); 1562 size_t ArgSize = Func->getArgSize() + VarArgSize; 1563 size_t ThisOffset = ArgSize - (Func->hasRVO() ? primSize(PT_Ptr) : 0); 1564 Pointer &ThisPtr = S.Stk.peek<Pointer>(ThisOffset); 1565 const FunctionDecl *Callee = Func->getDecl(); 1566 1567 if (!Func->isFullyCompiled()) 1568 compileFunction(S, Func); 1569 1570 // C++2a [class.abstract]p6: 1571 // the effect of making a virtual call to a pure virtual function [...] is 1572 // undefined 1573 if (Callee->isPureVirtual()) { 1574 S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_pure_virtual_call, 1575 1) 1576 << Callee; 1577 S.Note(Callee->getLocation(), diag::note_declared_at); 1578 return false; 1579 } 1580 1581 const CXXRecordDecl *DynamicDecl = nullptr; 1582 { 1583 Pointer TypePtr = ThisPtr; 1584 while (TypePtr.isBaseClass()) 1585 TypePtr = TypePtr.getBase(); 1586 1587 QualType DynamicType = TypePtr.getType(); 1588 if (DynamicType->isPointerType() || DynamicType->isReferenceType()) 1589 DynamicDecl = DynamicType->getPointeeCXXRecordDecl(); 1590 else 1591 DynamicDecl = DynamicType->getAsCXXRecordDecl(); 1592 } 1593 assert(DynamicDecl); 1594 1595 const auto *StaticDecl = cast<CXXRecordDecl>(Func->getParentDecl()); 1596 const auto *InitialFunction = cast<CXXMethodDecl>(Callee); 1597 const CXXMethodDecl *Overrider = S.getContext().getOverridingFunction( 1598 DynamicDecl, StaticDecl, InitialFunction); 1599 1600 if (Overrider != InitialFunction) { 1601 // DR1872: An instantiated virtual constexpr function can't be called in a 1602 // constant expression (prior to C++20). We can still constant-fold such a 1603 // call. 1604 if (!S.getLangOpts().CPlusPlus20 && Overrider->isVirtual()) { 1605 const Expr *E = S.Current->getExpr(OpPC); 1606 S.CCEDiag(E, diag::note_constexpr_virtual_call) << E->getSourceRange(); 1607 } 1608 1609 Func = S.getContext().getOrCreateFunction(Overrider); 1610 1611 const CXXRecordDecl *ThisFieldDecl = 1612 ThisPtr.getFieldDesc()->getType()->getAsCXXRecordDecl(); 1613 if (Func->getParentDecl()->isDerivedFrom(ThisFieldDecl)) { 1614 // If the function we call is further DOWN the hierarchy than the 1615 // FieldDesc of our pointer, just go up the hierarchy of this field 1616 // the furthest we can go. 1617 while (ThisPtr.isBaseClass()) 1618 ThisPtr = ThisPtr.getBase(); 1619 } 1620 } 1621 1622 if (!Call(S, OpPC, Func, VarArgSize)) 1623 return false; 1624 1625 // Covariant return types. The return type of Overrider is a pointer 1626 // or reference to a class type. 1627 if (Overrider != InitialFunction && 1628 Overrider->getReturnType()->isPointerOrReferenceType() && 1629 InitialFunction->getReturnType()->isPointerOrReferenceType()) { 1630 QualType OverriderPointeeType = 1631 Overrider->getReturnType()->getPointeeType(); 1632 QualType InitialPointeeType = 1633 InitialFunction->getReturnType()->getPointeeType(); 1634 // We've called Overrider above, but calling code expects us to return what 1635 // InitialFunction returned. According to the rules for covariant return 1636 // types, what InitialFunction returns needs to be a base class of what 1637 // Overrider returns. So, we need to do an upcast here. 1638 unsigned Offset = S.getContext().collectBaseOffset( 1639 InitialPointeeType->getAsRecordDecl(), 1640 OverriderPointeeType->getAsRecordDecl()); 1641 return GetPtrBasePop(S, OpPC, Offset, /*IsNullOK=*/true); 1642 } 1643 1644 return true; 1645 } 1646 1647 bool CallBI(InterpState &S, CodePtr OpPC, const CallExpr *CE, 1648 uint32_t BuiltinID) { 1649 // A little arbitrary, but the current interpreter allows evaluation 1650 // of builtin functions in this mode, with some exceptions. 1651 if (BuiltinID == Builtin::BI__builtin_operator_new && 1652 S.checkingPotentialConstantExpression()) 1653 return false; 1654 1655 return InterpretBuiltin(S, OpPC, CE, BuiltinID); 1656 } 1657 1658 bool CallPtr(InterpState &S, CodePtr OpPC, uint32_t ArgSize, 1659 const CallExpr *CE) { 1660 const Pointer &Ptr = S.Stk.pop<Pointer>(); 1661 1662 if (Ptr.isZero()) { 1663 const auto *E = cast<CallExpr>(S.Current->getExpr(OpPC)); 1664 S.FFDiag(E, diag::note_constexpr_null_callee) 1665 << const_cast<Expr *>(E->getCallee()) << E->getSourceRange(); 1666 return false; 1667 } 1668 1669 if (!Ptr.isFunctionPointer()) 1670 return Invalid(S, OpPC); 1671 1672 const FunctionPointer &FuncPtr = Ptr.asFunctionPointer(); 1673 const Function *F = FuncPtr.getFunction(); 1674 assert(F); 1675 // Don't allow calling block pointers. 1676 if (!F->getDecl()) 1677 return Invalid(S, OpPC); 1678 1679 // This happens when the call expression has been cast to 1680 // something else, but we don't support that. 1681 if (S.Ctx.classify(F->getDecl()->getReturnType()) != 1682 S.Ctx.classify(CE->getCallReturnType(S.getASTContext()))) 1683 return false; 1684 1685 // Check argument nullability state. 1686 if (F->hasNonNullAttr()) { 1687 if (!CheckNonNullArgs(S, OpPC, F, CE, ArgSize)) 1688 return false; 1689 } 1690 1691 assert(ArgSize >= F->getWrittenArgSize()); 1692 uint32_t VarArgSize = ArgSize - F->getWrittenArgSize(); 1693 1694 // We need to do this explicitly here since we don't have the necessary 1695 // information to do it automatically. 1696 if (F->isThisPointerExplicit()) 1697 VarArgSize -= align(primSize(PT_Ptr)); 1698 1699 if (F->isVirtual()) 1700 return CallVirt(S, OpPC, F, VarArgSize); 1701 1702 return Call(S, OpPC, F, VarArgSize); 1703 } 1704 1705 static void startLifetimeRecurse(const Pointer &Ptr) { 1706 if (const Record *R = Ptr.getRecord()) { 1707 Ptr.startLifetime(); 1708 for (const Record::Field &Fi : R->fields()) 1709 startLifetimeRecurse(Ptr.atField(Fi.Offset)); 1710 return; 1711 } 1712 1713 if (const Descriptor *FieldDesc = Ptr.getFieldDesc(); 1714 FieldDesc->isCompositeArray()) { 1715 assert(Ptr.getLifetime() == Lifetime::Started); 1716 for (unsigned I = 0; I != FieldDesc->getNumElems(); ++I) 1717 startLifetimeRecurse(Ptr.atIndex(I).narrow()); 1718 return; 1719 } 1720 1721 Ptr.startLifetime(); 1722 } 1723 1724 bool StartLifetime(InterpState &S, CodePtr OpPC) { 1725 const auto &Ptr = S.Stk.peek<Pointer>(); 1726 if (!CheckDummy(S, OpPC, Ptr, AK_Destroy)) 1727 return false; 1728 startLifetimeRecurse(Ptr.narrow()); 1729 return true; 1730 } 1731 1732 // FIXME: It might be better to the recursing as part of the generated code for 1733 // a destructor? 1734 static void endLifetimeRecurse(const Pointer &Ptr) { 1735 if (const Record *R = Ptr.getRecord()) { 1736 Ptr.endLifetime(); 1737 for (const Record::Field &Fi : R->fields()) 1738 endLifetimeRecurse(Ptr.atField(Fi.Offset)); 1739 return; 1740 } 1741 1742 if (const Descriptor *FieldDesc = Ptr.getFieldDesc(); 1743 FieldDesc->isCompositeArray()) { 1744 // No endLifetime() for array roots. 1745 assert(Ptr.getLifetime() == Lifetime::Started); 1746 for (unsigned I = 0; I != FieldDesc->getNumElems(); ++I) 1747 endLifetimeRecurse(Ptr.atIndex(I).narrow()); 1748 return; 1749 } 1750 1751 Ptr.endLifetime(); 1752 } 1753 1754 /// Ends the lifetime of the peek'd pointer. 1755 bool EndLifetime(InterpState &S, CodePtr OpPC) { 1756 const auto &Ptr = S.Stk.peek<Pointer>(); 1757 if (!CheckDummy(S, OpPC, Ptr, AK_Destroy)) 1758 return false; 1759 endLifetimeRecurse(Ptr.narrow()); 1760 return true; 1761 } 1762 1763 /// Ends the lifetime of the pop'd pointer. 1764 bool EndLifetimePop(InterpState &S, CodePtr OpPC) { 1765 const auto &Ptr = S.Stk.pop<Pointer>(); 1766 if (!CheckDummy(S, OpPC, Ptr, AK_Destroy)) 1767 return false; 1768 endLifetimeRecurse(Ptr.narrow()); 1769 return true; 1770 } 1771 1772 bool CheckNewTypeMismatch(InterpState &S, CodePtr OpPC, const Expr *E, 1773 std::optional<uint64_t> ArraySize) { 1774 const Pointer &Ptr = S.Stk.peek<Pointer>(); 1775 1776 // Similar to CheckStore(), but with the additional CheckTemporary() call and 1777 // the AccessKinds are different. 1778 if (!CheckTemporary(S, OpPC, Ptr, AK_Construct)) 1779 return false; 1780 if (!CheckLive(S, OpPC, Ptr, AK_Construct)) 1781 return false; 1782 if (!CheckDummy(S, OpPC, Ptr, AK_Construct)) 1783 return false; 1784 1785 // CheckLifetime for this and all base pointers. 1786 for (Pointer P = Ptr;;) { 1787 if (!CheckLifetime(S, OpPC, P, AK_Construct)) 1788 return false; 1789 1790 if (P.isRoot()) 1791 break; 1792 P = P.getBase(); 1793 } 1794 if (!CheckExtern(S, OpPC, Ptr)) 1795 return false; 1796 if (!CheckRange(S, OpPC, Ptr, AK_Construct)) 1797 return false; 1798 if (!CheckGlobal(S, OpPC, Ptr)) 1799 return false; 1800 if (!CheckConst(S, OpPC, Ptr)) 1801 return false; 1802 if (!S.inConstantContext() && isConstexprUnknown(Ptr)) 1803 return false; 1804 1805 if (!InvalidNewDeleteExpr(S, OpPC, E)) 1806 return false; 1807 1808 const auto *NewExpr = cast<CXXNewExpr>(E); 1809 QualType StorageType = Ptr.getFieldDesc()->getDataType(S.getASTContext()); 1810 const ASTContext &ASTCtx = S.getASTContext(); 1811 QualType AllocType; 1812 if (ArraySize) { 1813 AllocType = ASTCtx.getConstantArrayType( 1814 NewExpr->getAllocatedType(), 1815 APInt(64, static_cast<uint64_t>(*ArraySize), false), nullptr, 1816 ArraySizeModifier::Normal, 0); 1817 } else { 1818 AllocType = NewExpr->getAllocatedType(); 1819 } 1820 1821 unsigned StorageSize = 1; 1822 unsigned AllocSize = 1; 1823 if (const auto *CAT = dyn_cast<ConstantArrayType>(AllocType)) 1824 AllocSize = CAT->getZExtSize(); 1825 if (const auto *CAT = dyn_cast<ConstantArrayType>(StorageType)) 1826 StorageSize = CAT->getZExtSize(); 1827 1828 if (AllocSize > StorageSize || 1829 !ASTCtx.hasSimilarType(ASTCtx.getBaseElementType(AllocType), 1830 ASTCtx.getBaseElementType(StorageType))) { 1831 S.FFDiag(S.Current->getLocation(OpPC), 1832 diag::note_constexpr_placement_new_wrong_type) 1833 << StorageType << AllocType; 1834 return false; 1835 } 1836 1837 // Can't activate fields in a union, unless the direct base is the union. 1838 if (Ptr.inUnion() && !Ptr.isActive() && !Ptr.getBase().getRecord()->isUnion()) 1839 return CheckActive(S, OpPC, Ptr, AK_Construct); 1840 1841 return true; 1842 } 1843 1844 bool InvalidNewDeleteExpr(InterpState &S, CodePtr OpPC, const Expr *E) { 1845 assert(E); 1846 1847 if (const auto *NewExpr = dyn_cast<CXXNewExpr>(E)) { 1848 const FunctionDecl *OperatorNew = NewExpr->getOperatorNew(); 1849 1850 if (NewExpr->getNumPlacementArgs() > 0) { 1851 // This is allowed pre-C++26, but only an std function. 1852 if (S.getLangOpts().CPlusPlus26 || S.Current->isStdFunction()) 1853 return true; 1854 S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_new_placement) 1855 << /*C++26 feature*/ 1 << E->getSourceRange(); 1856 } else if ( 1857 !OperatorNew 1858 ->isUsableAsGlobalAllocationFunctionInConstantEvaluation()) { 1859 S.FFDiag(S.Current->getSource(OpPC), 1860 diag::note_constexpr_new_non_replaceable) 1861 << isa<CXXMethodDecl>(OperatorNew) << OperatorNew; 1862 return false; 1863 } else if (!S.getLangOpts().CPlusPlus26 && 1864 NewExpr->getNumPlacementArgs() == 1 && 1865 !OperatorNew->isReservedGlobalPlacementOperator()) { 1866 if (!S.getLangOpts().CPlusPlus26) { 1867 S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_new_placement) 1868 << /*Unsupported*/ 0 << E->getSourceRange(); 1869 return false; 1870 } 1871 return true; 1872 } 1873 } else { 1874 const auto *DeleteExpr = cast<CXXDeleteExpr>(E); 1875 const FunctionDecl *OperatorDelete = DeleteExpr->getOperatorDelete(); 1876 if (!OperatorDelete 1877 ->isUsableAsGlobalAllocationFunctionInConstantEvaluation()) { 1878 S.FFDiag(S.Current->getSource(OpPC), 1879 diag::note_constexpr_new_non_replaceable) 1880 << isa<CXXMethodDecl>(OperatorDelete) << OperatorDelete; 1881 return false; 1882 } 1883 } 1884 1885 return false; 1886 } 1887 1888 bool handleFixedPointOverflow(InterpState &S, CodePtr OpPC, 1889 const FixedPoint &FP) { 1890 const Expr *E = S.Current->getExpr(OpPC); 1891 if (S.checkingForUndefinedBehavior()) { 1892 S.getASTContext().getDiagnostics().Report( 1893 E->getExprLoc(), diag::warn_fixedpoint_constant_overflow) 1894 << FP.toDiagnosticString(S.getASTContext()) << E->getType(); 1895 } 1896 S.CCEDiag(E, diag::note_constexpr_overflow) 1897 << FP.toDiagnosticString(S.getASTContext()) << E->getType(); 1898 return S.noteUndefinedBehavior(); 1899 } 1900 1901 bool InvalidShuffleVectorIndex(InterpState &S, CodePtr OpPC, uint32_t Index) { 1902 const SourceInfo &Loc = S.Current->getSource(OpPC); 1903 S.FFDiag(Loc, 1904 diag::err_shufflevector_minus_one_is_undefined_behavior_constexpr) 1905 << Index; 1906 return false; 1907 } 1908 1909 bool CheckPointerToIntegralCast(InterpState &S, CodePtr OpPC, 1910 const Pointer &Ptr, unsigned BitWidth) { 1911 if (Ptr.isDummy()) 1912 return false; 1913 if (Ptr.isFunctionPointer()) 1914 return true; 1915 1916 const SourceInfo &E = S.Current->getSource(OpPC); 1917 S.CCEDiag(E, diag::note_constexpr_invalid_cast) 1918 << 2 << S.getLangOpts().CPlusPlus << S.Current->getRange(OpPC); 1919 1920 if (Ptr.isBlockPointer() && !Ptr.isZero()) { 1921 // Only allow based lvalue casts if they are lossless. 1922 if (S.getASTContext().getTargetInfo().getPointerWidth(LangAS::Default) != 1923 BitWidth) 1924 return Invalid(S, OpPC); 1925 } 1926 return true; 1927 } 1928 1929 bool CastPointerIntegralAP(InterpState &S, CodePtr OpPC, uint32_t BitWidth) { 1930 const Pointer &Ptr = S.Stk.pop<Pointer>(); 1931 1932 if (!CheckPointerToIntegralCast(S, OpPC, Ptr, BitWidth)) 1933 return false; 1934 1935 auto Result = S.allocAP<IntegralAP<false>>(BitWidth); 1936 Result.copy(APInt(BitWidth, Ptr.getIntegerRepresentation())); 1937 1938 S.Stk.push<IntegralAP<false>>(Result); 1939 return true; 1940 } 1941 1942 bool CastPointerIntegralAPS(InterpState &S, CodePtr OpPC, uint32_t BitWidth) { 1943 const Pointer &Ptr = S.Stk.pop<Pointer>(); 1944 1945 if (!CheckPointerToIntegralCast(S, OpPC, Ptr, BitWidth)) 1946 return false; 1947 1948 auto Result = S.allocAP<IntegralAP<true>>(BitWidth); 1949 Result.copy(APInt(BitWidth, Ptr.getIntegerRepresentation())); 1950 1951 S.Stk.push<IntegralAP<true>>(Result); 1952 return true; 1953 } 1954 1955 bool CheckBitCast(InterpState &S, CodePtr OpPC, bool HasIndeterminateBits, 1956 bool TargetIsUCharOrByte) { 1957 // This is always fine. 1958 if (!HasIndeterminateBits) 1959 return true; 1960 1961 // Indeterminate bits can only be bitcast to unsigned char or std::byte. 1962 if (TargetIsUCharOrByte) 1963 return true; 1964 1965 const Expr *E = S.Current->getExpr(OpPC); 1966 QualType ExprType = E->getType(); 1967 S.FFDiag(E, diag::note_constexpr_bit_cast_indet_dest) 1968 << ExprType << S.getLangOpts().CharIsSigned << E->getSourceRange(); 1969 return false; 1970 } 1971 1972 bool GetTypeid(InterpState &S, CodePtr OpPC, const Type *TypePtr, 1973 const Type *TypeInfoType) { 1974 S.Stk.push<Pointer>(TypePtr, TypeInfoType); 1975 return true; 1976 } 1977 1978 bool GetTypeidPtr(InterpState &S, CodePtr OpPC, const Type *TypeInfoType) { 1979 const auto &P = S.Stk.pop<Pointer>(); 1980 1981 if (!P.isBlockPointer()) 1982 return false; 1983 1984 // Pick the most-derived type. 1985 const Type *T = P.getDeclPtr().getType().getTypePtr(); 1986 // ... unless we're currently constructing this object. 1987 // FIXME: We have a similar check to this in more places. 1988 if (S.Current->getFunction()) { 1989 for (const InterpFrame *Frame = S.Current; Frame; Frame = Frame->Caller) { 1990 if (const Function *Func = Frame->getFunction(); 1991 Func && (Func->isConstructor() || Func->isDestructor()) && 1992 P.block() == Frame->getThis().block()) { 1993 T = Func->getParentDecl()->getTypeForDecl(); 1994 break; 1995 } 1996 } 1997 } 1998 1999 S.Stk.push<Pointer>(T->getCanonicalTypeUnqualified().getTypePtr(), 2000 TypeInfoType); 2001 return true; 2002 } 2003 2004 bool DiagTypeid(InterpState &S, CodePtr OpPC) { 2005 const auto *E = cast<CXXTypeidExpr>(S.Current->getExpr(OpPC)); 2006 S.CCEDiag(E, diag::note_constexpr_typeid_polymorphic) 2007 << E->getExprOperand()->getType() 2008 << E->getExprOperand()->getSourceRange(); 2009 return false; 2010 } 2011 2012 bool arePotentiallyOverlappingStringLiterals(const Pointer &LHS, 2013 const Pointer &RHS) { 2014 unsigned LHSOffset = LHS.getIndex(); 2015 unsigned RHSOffset = RHS.getIndex(); 2016 unsigned LHSLength = (LHS.getNumElems() - 1) * LHS.elemSize(); 2017 unsigned RHSLength = (RHS.getNumElems() - 1) * RHS.elemSize(); 2018 2019 StringRef LHSStr((const char *)LHS.atIndex(0).getRawAddress(), LHSLength); 2020 StringRef RHSStr((const char *)RHS.atIndex(0).getRawAddress(), RHSLength); 2021 int32_t IndexDiff = RHSOffset - LHSOffset; 2022 if (IndexDiff < 0) { 2023 if (static_cast<int32_t>(LHSLength) < -IndexDiff) 2024 return false; 2025 LHSStr = LHSStr.drop_front(-IndexDiff); 2026 } else { 2027 if (static_cast<int32_t>(RHSLength) < IndexDiff) 2028 return false; 2029 RHSStr = RHSStr.drop_front(IndexDiff); 2030 } 2031 2032 unsigned ShorterCharWidth; 2033 StringRef Shorter; 2034 StringRef Longer; 2035 if (LHSLength < RHSLength) { 2036 ShorterCharWidth = LHS.elemSize(); 2037 Shorter = LHSStr; 2038 Longer = RHSStr; 2039 } else { 2040 ShorterCharWidth = RHS.elemSize(); 2041 Shorter = RHSStr; 2042 Longer = LHSStr; 2043 } 2044 2045 // The null terminator isn't included in the string data, so check for it 2046 // manually. If the longer string doesn't have a null terminator where the 2047 // shorter string ends, they aren't potentially overlapping. 2048 for (unsigned NullByte : llvm::seq(ShorterCharWidth)) { 2049 if (Shorter.size() + NullByte >= Longer.size()) 2050 break; 2051 if (Longer[Shorter.size() + NullByte]) 2052 return false; 2053 } 2054 return Shorter == Longer.take_front(Shorter.size()); 2055 } 2056 2057 static void copyPrimitiveMemory(InterpState &S, const Pointer &Ptr, 2058 PrimType T) { 2059 2060 if (T == PT_IntAPS) { 2061 auto &Val = Ptr.deref<IntegralAP<true>>(); 2062 if (!Val.singleWord()) { 2063 uint64_t *NewMemory = new (S.P) uint64_t[Val.numWords()]; 2064 Val.take(NewMemory); 2065 } 2066 } else if (T == PT_IntAP) { 2067 auto &Val = Ptr.deref<IntegralAP<false>>(); 2068 if (!Val.singleWord()) { 2069 uint64_t *NewMemory = new (S.P) uint64_t[Val.numWords()]; 2070 Val.take(NewMemory); 2071 } 2072 } else if (T == PT_Float) { 2073 auto &Val = Ptr.deref<Floating>(); 2074 if (!Val.singleWord()) { 2075 uint64_t *NewMemory = new (S.P) uint64_t[Val.numWords()]; 2076 Val.take(NewMemory); 2077 } 2078 } 2079 } 2080 2081 template <typename T> 2082 static void copyPrimitiveMemory(InterpState &S, const Pointer &Ptr) { 2083 assert(needsAlloc<T>()); 2084 auto &Val = Ptr.deref<T>(); 2085 if (!Val.singleWord()) { 2086 uint64_t *NewMemory = new (S.P) uint64_t[Val.numWords()]; 2087 Val.take(NewMemory); 2088 } 2089 } 2090 2091 static void finishGlobalRecurse(InterpState &S, const Pointer &Ptr) { 2092 if (const Record *R = Ptr.getRecord()) { 2093 for (const Record::Field &Fi : R->fields()) { 2094 if (Fi.Desc->isPrimitive()) { 2095 TYPE_SWITCH_ALLOC(Fi.Desc->getPrimType(), { 2096 copyPrimitiveMemory<T>(S, Ptr.atField(Fi.Offset)); 2097 }); 2098 copyPrimitiveMemory(S, Ptr.atField(Fi.Offset), Fi.Desc->getPrimType()); 2099 } else 2100 finishGlobalRecurse(S, Ptr.atField(Fi.Offset)); 2101 } 2102 return; 2103 } 2104 2105 if (const Descriptor *D = Ptr.getFieldDesc(); D && D->isArray()) { 2106 unsigned NumElems = D->getNumElems(); 2107 if (NumElems == 0) 2108 return; 2109 2110 if (D->isPrimitiveArray()) { 2111 PrimType PT = D->getPrimType(); 2112 if (!needsAlloc(PT)) 2113 return; 2114 assert(NumElems >= 1); 2115 const Pointer EP = Ptr.atIndex(0); 2116 bool AllSingleWord = true; 2117 TYPE_SWITCH_ALLOC(PT, { 2118 if (!EP.deref<T>().singleWord()) { 2119 copyPrimitiveMemory<T>(S, EP); 2120 AllSingleWord = false; 2121 } 2122 }); 2123 if (AllSingleWord) 2124 return; 2125 for (unsigned I = 1; I != D->getNumElems(); ++I) { 2126 const Pointer EP = Ptr.atIndex(I); 2127 copyPrimitiveMemory(S, EP, PT); 2128 } 2129 } else { 2130 assert(D->isCompositeArray()); 2131 for (unsigned I = 0; I != D->getNumElems(); ++I) { 2132 const Pointer EP = Ptr.atIndex(I).narrow(); 2133 finishGlobalRecurse(S, EP); 2134 } 2135 } 2136 } 2137 } 2138 2139 bool FinishInitGlobal(InterpState &S, CodePtr OpPC) { 2140 const Pointer &Ptr = S.Stk.pop<Pointer>(); 2141 2142 finishGlobalRecurse(S, Ptr); 2143 if (Ptr.canBeInitialized()) { 2144 Ptr.initialize(); 2145 Ptr.activate(); 2146 } 2147 2148 return true; 2149 } 2150 2151 // https://github.com/llvm/llvm-project/issues/102513 2152 #if defined(_MSC_VER) && !defined(__clang__) && !defined(NDEBUG) 2153 #pragma optimize("", off) 2154 #endif 2155 bool Interpret(InterpState &S) { 2156 // The current stack frame when we started Interpret(). 2157 // This is being used by the ops to determine wheter 2158 // to return from this function and thus terminate 2159 // interpretation. 2160 const InterpFrame *StartFrame = S.Current; 2161 assert(!S.Current->isRoot()); 2162 CodePtr PC = S.Current->getPC(); 2163 2164 // Empty program. 2165 if (!PC) 2166 return true; 2167 2168 for (;;) { 2169 auto Op = PC.read<Opcode>(); 2170 CodePtr OpPC = PC; 2171 2172 switch (Op) { 2173 #define GET_INTERP 2174 #include "Opcodes.inc" 2175 #undef GET_INTERP 2176 } 2177 } 2178 } 2179 // https://github.com/llvm/llvm-project/issues/102513 2180 #if defined(_MSC_VER) && !defined(__clang__) && !defined(NDEBUG) 2181 #pragma optimize("", on) 2182 #endif 2183 2184 } // namespace interp 2185 } // namespace clang 2186