Bug Summary

File:src/gnu/usr.bin/clang/libclangAST/../../../llvm/clang/lib/AST/ExprConstant.cpp
Warning:line 5966, column 57
Called C++ object pointer is null

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name ExprConstant.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model static -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/gnu/usr.bin/clang/libclangAST/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/gnu/usr.bin/clang/libclangAST/obj/../include/clang/AST -I /usr/src/gnu/usr.bin/clang/libclangAST/../../../llvm/clang/include -I /usr/src/gnu/usr.bin/clang/libclangAST/../../../llvm/llvm/include -I /usr/src/gnu/usr.bin/clang/libclangAST/../include -I /usr/src/gnu/usr.bin/clang/libclangAST/obj -I /usr/src/gnu/usr.bin/clang/libclangAST/obj/../include -D NDEBUG -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D LLVM_PREFIX="/usr" -internal-isystem /usr/include/c++/v1 -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir=/usr/src/gnu/usr.bin/clang/libclangAST/obj -ferror-limit 19 -fvisibility-inlines-hidden -fwrapv -stack-protector 2 -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c++ /usr/src/gnu/usr.bin/clang/libclangAST/../../../llvm/clang/lib/AST/ExprConstant.cpp

/usr/src/gnu/usr.bin/clang/libclangAST/../../../llvm/clang/lib/AST/ExprConstant.cpp

1//===--- ExprConstant.cpp - Expression Constant Evaluator -----------------===//
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// This file implements the Expr constant evaluator.
10//
11// Constant expression evaluation produces four main results:
12//
13// * A success/failure flag indicating whether constant folding was successful.
14// This is the 'bool' return value used by most of the code in this file. A
15// 'false' return value indicates that constant folding has failed, and any
16// appropriate diagnostic has already been produced.
17//
18// * An evaluated result, valid only if constant folding has not failed.
19//
20// * A flag indicating if evaluation encountered (unevaluated) side-effects.
21// These arise in cases such as (sideEffect(), 0) and (sideEffect() || 1),
22// where it is possible to determine the evaluated result regardless.
23//
24// * A set of notes indicating why the evaluation was not a constant expression
25// (under the C++11 / C++1y rules only, at the moment), or, if folding failed
26// too, why the expression could not be folded.
27//
28// If we are checking for a potential constant expression, failure to constant
29// fold a potential constant sub-expression will be indicated by a 'false'
30// return value (the expression could not be folded) and no diagnostic (the
31// expression is not necessarily non-constant).
32//
33//===----------------------------------------------------------------------===//
34
35#include "Interp/Context.h"
36#include "Interp/Frame.h"
37#include "Interp/State.h"
38#include "clang/AST/APValue.h"
39#include "clang/AST/ASTContext.h"
40#include "clang/AST/ASTDiagnostic.h"
41#include "clang/AST/ASTLambda.h"
42#include "clang/AST/Attr.h"
43#include "clang/AST/CXXInheritance.h"
44#include "clang/AST/CharUnits.h"
45#include "clang/AST/CurrentSourceLocExprScope.h"
46#include "clang/AST/Expr.h"
47#include "clang/AST/OSLog.h"
48#include "clang/AST/OptionalDiagnostic.h"
49#include "clang/AST/RecordLayout.h"
50#include "clang/AST/StmtVisitor.h"
51#include "clang/AST/TypeLoc.h"
52#include "clang/Basic/Builtins.h"
53#include "clang/Basic/TargetInfo.h"
54#include "llvm/ADT/APFixedPoint.h"
55#include "llvm/ADT/Optional.h"
56#include "llvm/ADT/SmallBitVector.h"
57#include "llvm/Support/Debug.h"
58#include "llvm/Support/SaveAndRestore.h"
59#include "llvm/Support/raw_ostream.h"
60#include <cstring>
61#include <functional>
62
63#define DEBUG_TYPE"exprconstant" "exprconstant"
64
65using namespace clang;
66using llvm::APFixedPoint;
67using llvm::APInt;
68using llvm::APSInt;
69using llvm::APFloat;
70using llvm::FixedPointSemantics;
71using llvm::Optional;
72
73namespace {
74 struct LValue;
75 class CallStackFrame;
76 class EvalInfo;
77
78 using SourceLocExprScopeGuard =
79 CurrentSourceLocExprScope::SourceLocExprScopeGuard;
80
81 static QualType getType(APValue::LValueBase B) {
82 return B.getType();
83 }
84
85 /// Get an LValue path entry, which is known to not be an array index, as a
86 /// field declaration.
87 static const FieldDecl *getAsField(APValue::LValuePathEntry E) {
88 return dyn_cast_or_null<FieldDecl>(E.getAsBaseOrMember().getPointer());
89 }
90 /// Get an LValue path entry, which is known to not be an array index, as a
91 /// base class declaration.
92 static const CXXRecordDecl *getAsBaseClass(APValue::LValuePathEntry E) {
93 return dyn_cast_or_null<CXXRecordDecl>(E.getAsBaseOrMember().getPointer());
94 }
95 /// Determine whether this LValue path entry for a base class names a virtual
96 /// base class.
97 static bool isVirtualBaseClass(APValue::LValuePathEntry E) {
98 return E.getAsBaseOrMember().getInt();
99 }
100
101 /// Given an expression, determine the type used to store the result of
102 /// evaluating that expression.
103 static QualType getStorageType(const ASTContext &Ctx, const Expr *E) {
104 if (E->isPRValue())
105 return E->getType();
106 return Ctx.getLValueReferenceType(E->getType());
107 }
108
109 /// Given a CallExpr, try to get the alloc_size attribute. May return null.
110 static const AllocSizeAttr *getAllocSizeAttr(const CallExpr *CE) {
111 if (const FunctionDecl *DirectCallee = CE->getDirectCallee())
112 return DirectCallee->getAttr<AllocSizeAttr>();
113 if (const Decl *IndirectCallee = CE->getCalleeDecl())
114 return IndirectCallee->getAttr<AllocSizeAttr>();
115 return nullptr;
116 }
117
118 /// Attempts to unwrap a CallExpr (with an alloc_size attribute) from an Expr.
119 /// This will look through a single cast.
120 ///
121 /// Returns null if we couldn't unwrap a function with alloc_size.
122 static const CallExpr *tryUnwrapAllocSizeCall(const Expr *E) {
123 if (!E->getType()->isPointerType())
124 return nullptr;
125
126 E = E->IgnoreParens();
127 // If we're doing a variable assignment from e.g. malloc(N), there will
128 // probably be a cast of some kind. In exotic cases, we might also see a
129 // top-level ExprWithCleanups. Ignore them either way.
130 if (const auto *FE = dyn_cast<FullExpr>(E))
131 E = FE->getSubExpr()->IgnoreParens();
132
133 if (const auto *Cast = dyn_cast<CastExpr>(E))
134 E = Cast->getSubExpr()->IgnoreParens();
135
136 if (const auto *CE = dyn_cast<CallExpr>(E))
137 return getAllocSizeAttr(CE) ? CE : nullptr;
138 return nullptr;
139 }
140
141 /// Determines whether or not the given Base contains a call to a function
142 /// with the alloc_size attribute.
143 static bool isBaseAnAllocSizeCall(APValue::LValueBase Base) {
144 const auto *E = Base.dyn_cast<const Expr *>();
145 return E && E->getType()->isPointerType() && tryUnwrapAllocSizeCall(E);
146 }
147
148 /// Determines whether the given kind of constant expression is only ever
149 /// used for name mangling. If so, it's permitted to reference things that we
150 /// can't generate code for (in particular, dllimported functions).
151 static bool isForManglingOnly(ConstantExprKind Kind) {
152 switch (Kind) {
153 case ConstantExprKind::Normal:
154 case ConstantExprKind::ClassTemplateArgument:
155 case ConstantExprKind::ImmediateInvocation:
156 // Note that non-type template arguments of class type are emitted as
157 // template parameter objects.
158 return false;
159
160 case ConstantExprKind::NonClassTemplateArgument:
161 return true;
162 }
163 llvm_unreachable("unknown ConstantExprKind")__builtin_unreachable();
164 }
165
166 static bool isTemplateArgument(ConstantExprKind Kind) {
167 switch (Kind) {
168 case ConstantExprKind::Normal:
169 case ConstantExprKind::ImmediateInvocation:
170 return false;
171
172 case ConstantExprKind::ClassTemplateArgument:
173 case ConstantExprKind::NonClassTemplateArgument:
174 return true;
175 }
176 llvm_unreachable("unknown ConstantExprKind")__builtin_unreachable();
177 }
178
179 /// The bound to claim that an array of unknown bound has.
180 /// The value in MostDerivedArraySize is undefined in this case. So, set it
181 /// to an arbitrary value that's likely to loudly break things if it's used.
182 static const uint64_t AssumedSizeForUnsizedArray =
183 std::numeric_limits<uint64_t>::max() / 2;
184
185 /// Determines if an LValue with the given LValueBase will have an unsized
186 /// array in its designator.
187 /// Find the path length and type of the most-derived subobject in the given
188 /// path, and find the size of the containing array, if any.
189 static unsigned
190 findMostDerivedSubobject(ASTContext &Ctx, APValue::LValueBase Base,
191 ArrayRef<APValue::LValuePathEntry> Path,
192 uint64_t &ArraySize, QualType &Type, bool &IsArray,
193 bool &FirstEntryIsUnsizedArray) {
194 // This only accepts LValueBases from APValues, and APValues don't support
195 // arrays that lack size info.
196 assert(!isBaseAnAllocSizeCall(Base) &&((void)0)
197 "Unsized arrays shouldn't appear here")((void)0);
198 unsigned MostDerivedLength = 0;
199 Type = getType(Base);
200
201 for (unsigned I = 0, N = Path.size(); I != N; ++I) {
202 if (Type->isArrayType()) {
203 const ArrayType *AT = Ctx.getAsArrayType(Type);
204 Type = AT->getElementType();
205 MostDerivedLength = I + 1;
206 IsArray = true;
207
208 if (auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
209 ArraySize = CAT->getSize().getZExtValue();
210 } else {
211 assert(I == 0 && "unexpected unsized array designator")((void)0);
212 FirstEntryIsUnsizedArray = true;
213 ArraySize = AssumedSizeForUnsizedArray;
214 }
215 } else if (Type->isAnyComplexType()) {
216 const ComplexType *CT = Type->castAs<ComplexType>();
217 Type = CT->getElementType();
218 ArraySize = 2;
219 MostDerivedLength = I + 1;
220 IsArray = true;
221 } else if (const FieldDecl *FD = getAsField(Path[I])) {
222 Type = FD->getType();
223 ArraySize = 0;
224 MostDerivedLength = I + 1;
225 IsArray = false;
226 } else {
227 // Path[I] describes a base class.
228 ArraySize = 0;
229 IsArray = false;
230 }
231 }
232 return MostDerivedLength;
233 }
234
235 /// A path from a glvalue to a subobject of that glvalue.
236 struct SubobjectDesignator {
237 /// True if the subobject was named in a manner not supported by C++11. Such
238 /// lvalues can still be folded, but they are not core constant expressions
239 /// and we cannot perform lvalue-to-rvalue conversions on them.
240 unsigned Invalid : 1;
241
242 /// Is this a pointer one past the end of an object?
243 unsigned IsOnePastTheEnd : 1;
244
245 /// Indicator of whether the first entry is an unsized array.
246 unsigned FirstEntryIsAnUnsizedArray : 1;
247
248 /// Indicator of whether the most-derived object is an array element.
249 unsigned MostDerivedIsArrayElement : 1;
250
251 /// The length of the path to the most-derived object of which this is a
252 /// subobject.
253 unsigned MostDerivedPathLength : 28;
254
255 /// The size of the array of which the most-derived object is an element.
256 /// This will always be 0 if the most-derived object is not an array
257 /// element. 0 is not an indicator of whether or not the most-derived object
258 /// is an array, however, because 0-length arrays are allowed.
259 ///
260 /// If the current array is an unsized array, the value of this is
261 /// undefined.
262 uint64_t MostDerivedArraySize;
263
264 /// The type of the most derived object referred to by this address.
265 QualType MostDerivedType;
266
267 typedef APValue::LValuePathEntry PathEntry;
268
269 /// The entries on the path from the glvalue to the designated subobject.
270 SmallVector<PathEntry, 8> Entries;
271
272 SubobjectDesignator() : Invalid(true) {}
273
274 explicit SubobjectDesignator(QualType T)
275 : Invalid(false), IsOnePastTheEnd(false),
276 FirstEntryIsAnUnsizedArray(false), MostDerivedIsArrayElement(false),
277 MostDerivedPathLength(0), MostDerivedArraySize(0),
278 MostDerivedType(T) {}
279
280 SubobjectDesignator(ASTContext &Ctx, const APValue &V)
281 : Invalid(!V.isLValue() || !V.hasLValuePath()), IsOnePastTheEnd(false),
282 FirstEntryIsAnUnsizedArray(false), MostDerivedIsArrayElement(false),
283 MostDerivedPathLength(0), MostDerivedArraySize(0) {
284 assert(V.isLValue() && "Non-LValue used to make an LValue designator?")((void)0);
285 if (!Invalid) {
286 IsOnePastTheEnd = V.isLValueOnePastTheEnd();
287 ArrayRef<PathEntry> VEntries = V.getLValuePath();
288 Entries.insert(Entries.end(), VEntries.begin(), VEntries.end());
289 if (V.getLValueBase()) {
290 bool IsArray = false;
291 bool FirstIsUnsizedArray = false;
292 MostDerivedPathLength = findMostDerivedSubobject(
293 Ctx, V.getLValueBase(), V.getLValuePath(), MostDerivedArraySize,
294 MostDerivedType, IsArray, FirstIsUnsizedArray);
295 MostDerivedIsArrayElement = IsArray;
296 FirstEntryIsAnUnsizedArray = FirstIsUnsizedArray;
297 }
298 }
299 }
300
301 void truncate(ASTContext &Ctx, APValue::LValueBase Base,
302 unsigned NewLength) {
303 if (Invalid)
304 return;
305
306 assert(Base && "cannot truncate path for null pointer")((void)0);
307 assert(NewLength <= Entries.size() && "not a truncation")((void)0);
308
309 if (NewLength == Entries.size())
310 return;
311 Entries.resize(NewLength);
312
313 bool IsArray = false;
314 bool FirstIsUnsizedArray = false;
315 MostDerivedPathLength = findMostDerivedSubobject(
316 Ctx, Base, Entries, MostDerivedArraySize, MostDerivedType, IsArray,
317 FirstIsUnsizedArray);
318 MostDerivedIsArrayElement = IsArray;
319 FirstEntryIsAnUnsizedArray = FirstIsUnsizedArray;
320 }
321
322 void setInvalid() {
323 Invalid = true;
324 Entries.clear();
325 }
326
327 /// Determine whether the most derived subobject is an array without a
328 /// known bound.
329 bool isMostDerivedAnUnsizedArray() const {
330 assert(!Invalid && "Calling this makes no sense on invalid designators")((void)0);
331 return Entries.size() == 1 && FirstEntryIsAnUnsizedArray;
332 }
333
334 /// Determine what the most derived array's size is. Results in an assertion
335 /// failure if the most derived array lacks a size.
336 uint64_t getMostDerivedArraySize() const {
337 assert(!isMostDerivedAnUnsizedArray() && "Unsized array has no size")((void)0);
338 return MostDerivedArraySize;
339 }
340
341 /// Determine whether this is a one-past-the-end pointer.
342 bool isOnePastTheEnd() const {
343 assert(!Invalid)((void)0);
344 if (IsOnePastTheEnd)
345 return true;
346 if (!isMostDerivedAnUnsizedArray() && MostDerivedIsArrayElement &&
347 Entries[MostDerivedPathLength - 1].getAsArrayIndex() ==
348 MostDerivedArraySize)
349 return true;
350 return false;
351 }
352
353 /// Get the range of valid index adjustments in the form
354 /// {maximum value that can be subtracted from this pointer,
355 /// maximum value that can be added to this pointer}
356 std::pair<uint64_t, uint64_t> validIndexAdjustments() {
357 if (Invalid || isMostDerivedAnUnsizedArray())
358 return {0, 0};
359
360 // [expr.add]p4: For the purposes of these operators, a pointer to a
361 // nonarray object behaves the same as a pointer to the first element of
362 // an array of length one with the type of the object as its element type.
363 bool IsArray = MostDerivedPathLength == Entries.size() &&
364 MostDerivedIsArrayElement;
365 uint64_t ArrayIndex = IsArray ? Entries.back().getAsArrayIndex()
366 : (uint64_t)IsOnePastTheEnd;
367 uint64_t ArraySize =
368 IsArray ? getMostDerivedArraySize() : (uint64_t)1;
369 return {ArrayIndex, ArraySize - ArrayIndex};
370 }
371
372 /// Check that this refers to a valid subobject.
373 bool isValidSubobject() const {
374 if (Invalid)
375 return false;
376 return !isOnePastTheEnd();
377 }
378 /// Check that this refers to a valid subobject, and if not, produce a
379 /// relevant diagnostic and set the designator as invalid.
380 bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK);
381
382 /// Get the type of the designated object.
383 QualType getType(ASTContext &Ctx) const {
384 assert(!Invalid && "invalid designator has no subobject type")((void)0);
385 return MostDerivedPathLength == Entries.size()
386 ? MostDerivedType
387 : Ctx.getRecordType(getAsBaseClass(Entries.back()));
388 }
389
390 /// Update this designator to refer to the first element within this array.
391 void addArrayUnchecked(const ConstantArrayType *CAT) {
392 Entries.push_back(PathEntry::ArrayIndex(0));
393
394 // This is a most-derived object.
395 MostDerivedType = CAT->getElementType();
396 MostDerivedIsArrayElement = true;
397 MostDerivedArraySize = CAT->getSize().getZExtValue();
398 MostDerivedPathLength = Entries.size();
399 }
400 /// Update this designator to refer to the first element within the array of
401 /// elements of type T. This is an array of unknown size.
402 void addUnsizedArrayUnchecked(QualType ElemTy) {
403 Entries.push_back(PathEntry::ArrayIndex(0));
404
405 MostDerivedType = ElemTy;
406 MostDerivedIsArrayElement = true;
407 // The value in MostDerivedArraySize is undefined in this case. So, set it
408 // to an arbitrary value that's likely to loudly break things if it's
409 // used.
410 MostDerivedArraySize = AssumedSizeForUnsizedArray;
411 MostDerivedPathLength = Entries.size();
412 }
413 /// Update this designator to refer to the given base or member of this
414 /// object.
415 void addDeclUnchecked(const Decl *D, bool Virtual = false) {
416 Entries.push_back(APValue::BaseOrMemberType(D, Virtual));
417
418 // If this isn't a base class, it's a new most-derived object.
419 if (const FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
420 MostDerivedType = FD->getType();
421 MostDerivedIsArrayElement = false;
422 MostDerivedArraySize = 0;
423 MostDerivedPathLength = Entries.size();
424 }
425 }
426 /// Update this designator to refer to the given complex component.
427 void addComplexUnchecked(QualType EltTy, bool Imag) {
428 Entries.push_back(PathEntry::ArrayIndex(Imag));
429
430 // This is technically a most-derived object, though in practice this
431 // is unlikely to matter.
432 MostDerivedType = EltTy;
433 MostDerivedIsArrayElement = true;
434 MostDerivedArraySize = 2;
435 MostDerivedPathLength = Entries.size();
436 }
437 void diagnoseUnsizedArrayPointerArithmetic(EvalInfo &Info, const Expr *E);
438 void diagnosePointerArithmetic(EvalInfo &Info, const Expr *E,
439 const APSInt &N);
440 /// Add N to the address of this subobject.
441 void adjustIndex(EvalInfo &Info, const Expr *E, APSInt N) {
442 if (Invalid || !N) return;
443 uint64_t TruncatedN = N.extOrTrunc(64).getZExtValue();
444 if (isMostDerivedAnUnsizedArray()) {
445 diagnoseUnsizedArrayPointerArithmetic(Info, E);
446 // Can't verify -- trust that the user is doing the right thing (or if
447 // not, trust that the caller will catch the bad behavior).
448 // FIXME: Should we reject if this overflows, at least?
449 Entries.back() = PathEntry::ArrayIndex(
450 Entries.back().getAsArrayIndex() + TruncatedN);
451 return;
452 }
453
454 // [expr.add]p4: For the purposes of these operators, a pointer to a
455 // nonarray object behaves the same as a pointer to the first element of
456 // an array of length one with the type of the object as its element type.
457 bool IsArray = MostDerivedPathLength == Entries.size() &&
458 MostDerivedIsArrayElement;
459 uint64_t ArrayIndex = IsArray ? Entries.back().getAsArrayIndex()
460 : (uint64_t)IsOnePastTheEnd;
461 uint64_t ArraySize =
462 IsArray ? getMostDerivedArraySize() : (uint64_t)1;
463
464 if (N < -(int64_t)ArrayIndex || N > ArraySize - ArrayIndex) {
465 // Calculate the actual index in a wide enough type, so we can include
466 // it in the note.
467 N = N.extend(std::max<unsigned>(N.getBitWidth() + 1, 65));
468 (llvm::APInt&)N += ArrayIndex;
469 assert(N.ugt(ArraySize) && "bounds check failed for in-bounds index")((void)0);
470 diagnosePointerArithmetic(Info, E, N);
471 setInvalid();
472 return;
473 }
474
475 ArrayIndex += TruncatedN;
476 assert(ArrayIndex <= ArraySize &&((void)0)
477 "bounds check succeeded for out-of-bounds index")((void)0);
478
479 if (IsArray)
480 Entries.back() = PathEntry::ArrayIndex(ArrayIndex);
481 else
482 IsOnePastTheEnd = (ArrayIndex != 0);
483 }
484 };
485
486 /// A scope at the end of which an object can need to be destroyed.
487 enum class ScopeKind {
488 Block,
489 FullExpression,
490 Call
491 };
492
493 /// A reference to a particular call and its arguments.
494 struct CallRef {
495 CallRef() : OrigCallee(), CallIndex(0), Version() {}
496 CallRef(const FunctionDecl *Callee, unsigned CallIndex, unsigned Version)
497 : OrigCallee(Callee), CallIndex(CallIndex), Version(Version) {}
498
499 explicit operator bool() const { return OrigCallee; }
500
501 /// Get the parameter that the caller initialized, corresponding to the
502 /// given parameter in the callee.
503 const ParmVarDecl *getOrigParam(const ParmVarDecl *PVD) const {
504 return OrigCallee ? OrigCallee->getParamDecl(PVD->getFunctionScopeIndex())
505 : PVD;
506 }
507
508 /// The callee at the point where the arguments were evaluated. This might
509 /// be different from the actual callee (a different redeclaration, or a
510 /// virtual override), but this function's parameters are the ones that
511 /// appear in the parameter map.
512 const FunctionDecl *OrigCallee;
513 /// The call index of the frame that holds the argument values.
514 unsigned CallIndex;
515 /// The version of the parameters corresponding to this call.
516 unsigned Version;
517 };
518
519 /// A stack frame in the constexpr call stack.
520 class CallStackFrame : public interp::Frame {
521 public:
522 EvalInfo &Info;
523
524 /// Parent - The caller of this stack frame.
525 CallStackFrame *Caller;
526
527 /// Callee - The function which was called.
528 const FunctionDecl *Callee;
529
530 /// This - The binding for the this pointer in this call, if any.
531 const LValue *This;
532
533 /// Information on how to find the arguments to this call. Our arguments
534 /// are stored in our parent's CallStackFrame, using the ParmVarDecl* as a
535 /// key and this value as the version.
536 CallRef Arguments;
537
538 /// Source location information about the default argument or default
539 /// initializer expression we're evaluating, if any.
540 CurrentSourceLocExprScope CurSourceLocExprScope;
541
542 // Note that we intentionally use std::map here so that references to
543 // values are stable.
544 typedef std::pair<const void *, unsigned> MapKeyTy;
545 typedef std::map<MapKeyTy, APValue> MapTy;
546 /// Temporaries - Temporary lvalues materialized within this stack frame.
547 MapTy Temporaries;
548
549 /// CallLoc - The location of the call expression for this call.
550 SourceLocation CallLoc;
551
552 /// Index - The call index of this call.
553 unsigned Index;
554
555 /// The stack of integers for tracking version numbers for temporaries.
556 SmallVector<unsigned, 2> TempVersionStack = {1};
557 unsigned CurTempVersion = TempVersionStack.back();
558
559 unsigned getTempVersion() const { return TempVersionStack.back(); }
560
561 void pushTempVersion() {
562 TempVersionStack.push_back(++CurTempVersion);
563 }
564
565 void popTempVersion() {
566 TempVersionStack.pop_back();
567 }
568
569 CallRef createCall(const FunctionDecl *Callee) {
570 return {Callee, Index, ++CurTempVersion};
571 }
572
573 // FIXME: Adding this to every 'CallStackFrame' may have a nontrivial impact
574 // on the overall stack usage of deeply-recursing constexpr evaluations.
575 // (We should cache this map rather than recomputing it repeatedly.)
576 // But let's try this and see how it goes; we can look into caching the map
577 // as a later change.
578
579 /// LambdaCaptureFields - Mapping from captured variables/this to
580 /// corresponding data members in the closure class.
581 llvm::DenseMap<const VarDecl *, FieldDecl *> LambdaCaptureFields;
582 FieldDecl *LambdaThisCaptureField;
583
584 CallStackFrame(EvalInfo &Info, SourceLocation CallLoc,
585 const FunctionDecl *Callee, const LValue *This,
586 CallRef Arguments);
587 ~CallStackFrame();
588
589 // Return the temporary for Key whose version number is Version.
590 APValue *getTemporary(const void *Key, unsigned Version) {
591 MapKeyTy KV(Key, Version);
592 auto LB = Temporaries.lower_bound(KV);
593 if (LB != Temporaries.end() && LB->first == KV)
60
Assuming the condition is true
61
Taking true branch
594 return &LB->second;
62
Returning pointer, which participates in a condition later
595 // Pair (Key,Version) wasn't found in the map. Check that no elements
596 // in the map have 'Key' as their key.
597 assert((LB == Temporaries.end() || LB->first.first != Key) &&((void)0)
598 (LB == Temporaries.begin() || std::prev(LB)->first.first != Key) &&((void)0)
599 "Element with key 'Key' found in map")((void)0);
600 return nullptr;
601 }
602
603 // Return the current temporary for Key in the map.
604 APValue *getCurrentTemporary(const void *Key) {
605 auto UB = Temporaries.upper_bound(MapKeyTy(Key, UINT_MAX(2147483647 *2U +1U)));
606 if (UB != Temporaries.begin() && std::prev(UB)->first.first == Key)
607 return &std::prev(UB)->second;
608 return nullptr;
609 }
610
611 // Return the version number of the current temporary for Key.
612 unsigned getCurrentTemporaryVersion(const void *Key) const {
613 auto UB = Temporaries.upper_bound(MapKeyTy(Key, UINT_MAX(2147483647 *2U +1U)));
614 if (UB != Temporaries.begin() && std::prev(UB)->first.first == Key)
615 return std::prev(UB)->first.second;
616 return 0;
617 }
618
619 /// Allocate storage for an object of type T in this stack frame.
620 /// Populates LV with a handle to the created object. Key identifies
621 /// the temporary within the stack frame, and must not be reused without
622 /// bumping the temporary version number.
623 template<typename KeyT>
624 APValue &createTemporary(const KeyT *Key, QualType T,
625 ScopeKind Scope, LValue &LV);
626
627 /// Allocate storage for a parameter of a function call made in this frame.
628 APValue &createParam(CallRef Args, const ParmVarDecl *PVD, LValue &LV);
629
630 void describe(llvm::raw_ostream &OS) override;
631
632 Frame *getCaller() const override { return Caller; }
633 SourceLocation getCallLocation() const override { return CallLoc; }
634 const FunctionDecl *getCallee() const override { return Callee; }
635
636 bool isStdFunction() const {
637 for (const DeclContext *DC = Callee; DC; DC = DC->getParent())
638 if (DC->isStdNamespace())
639 return true;
640 return false;
641 }
642
643 private:
644 APValue &createLocal(APValue::LValueBase Base, const void *Key, QualType T,
645 ScopeKind Scope);
646 };
647
648 /// Temporarily override 'this'.
649 class ThisOverrideRAII {
650 public:
651 ThisOverrideRAII(CallStackFrame &Frame, const LValue *NewThis, bool Enable)
652 : Frame(Frame), OldThis(Frame.This) {
653 if (Enable)
654 Frame.This = NewThis;
655 }
656 ~ThisOverrideRAII() {
657 Frame.This = OldThis;
658 }
659 private:
660 CallStackFrame &Frame;
661 const LValue *OldThis;
662 };
663}
664
665static bool HandleDestruction(EvalInfo &Info, const Expr *E,
666 const LValue &This, QualType ThisType);
667static bool HandleDestruction(EvalInfo &Info, SourceLocation Loc,
668 APValue::LValueBase LVBase, APValue &Value,
669 QualType T);
670
671namespace {
672 /// A cleanup, and a flag indicating whether it is lifetime-extended.
673 class Cleanup {
674 llvm::PointerIntPair<APValue*, 2, ScopeKind> Value;
675 APValue::LValueBase Base;
676 QualType T;
677
678 public:
679 Cleanup(APValue *Val, APValue::LValueBase Base, QualType T,
680 ScopeKind Scope)
681 : Value(Val, Scope), Base(Base), T(T) {}
682
683 /// Determine whether this cleanup should be performed at the end of the
684 /// given kind of scope.
685 bool isDestroyedAtEndOf(ScopeKind K) const {
686 return (int)Value.getInt() >= (int)K;
687 }
688 bool endLifetime(EvalInfo &Info, bool RunDestructors) {
689 if (RunDestructors) {
690 SourceLocation Loc;
691 if (const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>())
692 Loc = VD->getLocation();
693 else if (const Expr *E = Base.dyn_cast<const Expr*>())
694 Loc = E->getExprLoc();
695 return HandleDestruction(Info, Loc, Base, *Value.getPointer(), T);
696 }
697 *Value.getPointer() = APValue();
698 return true;
699 }
700
701 bool hasSideEffect() {
702 return T.isDestructedType();
703 }
704 };
705
706 /// A reference to an object whose construction we are currently evaluating.
707 struct ObjectUnderConstruction {
708 APValue::LValueBase Base;
709 ArrayRef<APValue::LValuePathEntry> Path;
710 friend bool operator==(const ObjectUnderConstruction &LHS,
711 const ObjectUnderConstruction &RHS) {
712 return LHS.Base == RHS.Base && LHS.Path == RHS.Path;
713 }
714 friend llvm::hash_code hash_value(const ObjectUnderConstruction &Obj) {
715 return llvm::hash_combine(Obj.Base, Obj.Path);
716 }
717 };
718 enum class ConstructionPhase {
719 None,
720 Bases,
721 AfterBases,
722 AfterFields,
723 Destroying,
724 DestroyingBases
725 };
726}
727
728namespace llvm {
729template<> struct DenseMapInfo<ObjectUnderConstruction> {
730 using Base = DenseMapInfo<APValue::LValueBase>;
731 static ObjectUnderConstruction getEmptyKey() {
732 return {Base::getEmptyKey(), {}}; }
733 static ObjectUnderConstruction getTombstoneKey() {
734 return {Base::getTombstoneKey(), {}};
735 }
736 static unsigned getHashValue(const ObjectUnderConstruction &Object) {
737 return hash_value(Object);
738 }
739 static bool isEqual(const ObjectUnderConstruction &LHS,
740 const ObjectUnderConstruction &RHS) {
741 return LHS == RHS;
742 }
743};
744}
745
746namespace {
747 /// A dynamically-allocated heap object.
748 struct DynAlloc {
749 /// The value of this heap-allocated object.
750 APValue Value;
751 /// The allocating expression; used for diagnostics. Either a CXXNewExpr
752 /// or a CallExpr (the latter is for direct calls to operator new inside
753 /// std::allocator<T>::allocate).
754 const Expr *AllocExpr = nullptr;
755
756 enum Kind {
757 New,
758 ArrayNew,
759 StdAllocator
760 };
761
762 /// Get the kind of the allocation. This must match between allocation
763 /// and deallocation.
764 Kind getKind() const {
765 if (auto *NE = dyn_cast<CXXNewExpr>(AllocExpr))
766 return NE->isArray() ? ArrayNew : New;
767 assert(isa<CallExpr>(AllocExpr))((void)0);
768 return StdAllocator;
769 }
770 };
771
772 struct DynAllocOrder {
773 bool operator()(DynamicAllocLValue L, DynamicAllocLValue R) const {
774 return L.getIndex() < R.getIndex();
775 }
776 };
777
778 /// EvalInfo - This is a private struct used by the evaluator to capture
779 /// information about a subexpression as it is folded. It retains information
780 /// about the AST context, but also maintains information about the folded
781 /// expression.
782 ///
783 /// If an expression could be evaluated, it is still possible it is not a C
784 /// "integer constant expression" or constant expression. If not, this struct
785 /// captures information about how and why not.
786 ///
787 /// One bit of information passed *into* the request for constant folding
788 /// indicates whether the subexpression is "evaluated" or not according to C
789 /// rules. For example, the RHS of (0 && foo()) is not evaluated. We can
790 /// evaluate the expression regardless of what the RHS is, but C only allows
791 /// certain things in certain situations.
792 class EvalInfo : public interp::State {
793 public:
794 ASTContext &Ctx;
795
796 /// EvalStatus - Contains information about the evaluation.
797 Expr::EvalStatus &EvalStatus;
798
799 /// CurrentCall - The top of the constexpr call stack.
800 CallStackFrame *CurrentCall;
801
802 /// CallStackDepth - The number of calls in the call stack right now.
803 unsigned CallStackDepth;
804
805 /// NextCallIndex - The next call index to assign.
806 unsigned NextCallIndex;
807
808 /// StepsLeft - The remaining number of evaluation steps we're permitted
809 /// to perform. This is essentially a limit for the number of statements
810 /// we will evaluate.
811 unsigned StepsLeft;
812
813 /// Enable the experimental new constant interpreter. If an expression is
814 /// not supported by the interpreter, an error is triggered.
815 bool EnableNewConstInterp;
816
817 /// BottomFrame - The frame in which evaluation started. This must be
818 /// initialized after CurrentCall and CallStackDepth.
819 CallStackFrame BottomFrame;
820
821 /// A stack of values whose lifetimes end at the end of some surrounding
822 /// evaluation frame.
823 llvm::SmallVector<Cleanup, 16> CleanupStack;
824
825 /// EvaluatingDecl - This is the declaration whose initializer is being
826 /// evaluated, if any.
827 APValue::LValueBase EvaluatingDecl;
828
829 enum class EvaluatingDeclKind {
830 None,
831 /// We're evaluating the construction of EvaluatingDecl.
832 Ctor,
833 /// We're evaluating the destruction of EvaluatingDecl.
834 Dtor,
835 };
836 EvaluatingDeclKind IsEvaluatingDecl = EvaluatingDeclKind::None;
837
838 /// EvaluatingDeclValue - This is the value being constructed for the
839 /// declaration whose initializer is being evaluated, if any.
840 APValue *EvaluatingDeclValue;
841
842 /// Set of objects that are currently being constructed.
843 llvm::DenseMap<ObjectUnderConstruction, ConstructionPhase>
844 ObjectsUnderConstruction;
845
846 /// Current heap allocations, along with the location where each was
847 /// allocated. We use std::map here because we need stable addresses
848 /// for the stored APValues.
849 std::map<DynamicAllocLValue, DynAlloc, DynAllocOrder> HeapAllocs;
850
851 /// The number of heap allocations performed so far in this evaluation.
852 unsigned NumHeapAllocs = 0;
853
854 struct EvaluatingConstructorRAII {
855 EvalInfo &EI;
856 ObjectUnderConstruction Object;
857 bool DidInsert;
858 EvaluatingConstructorRAII(EvalInfo &EI, ObjectUnderConstruction Object,
859 bool HasBases)
860 : EI(EI), Object(Object) {
861 DidInsert =
862 EI.ObjectsUnderConstruction
863 .insert({Object, HasBases ? ConstructionPhase::Bases
864 : ConstructionPhase::AfterBases})
865 .second;
866 }
867 void finishedConstructingBases() {
868 EI.ObjectsUnderConstruction[Object] = ConstructionPhase::AfterBases;
869 }
870 void finishedConstructingFields() {
871 EI.ObjectsUnderConstruction[Object] = ConstructionPhase::AfterFields;
872 }
873 ~EvaluatingConstructorRAII() {
874 if (DidInsert) EI.ObjectsUnderConstruction.erase(Object);
875 }
876 };
877
878 struct EvaluatingDestructorRAII {
879 EvalInfo &EI;
880 ObjectUnderConstruction Object;
881 bool DidInsert;
882 EvaluatingDestructorRAII(EvalInfo &EI, ObjectUnderConstruction Object)
883 : EI(EI), Object(Object) {
884 DidInsert = EI.ObjectsUnderConstruction
885 .insert({Object, ConstructionPhase::Destroying})
886 .second;
887 }
888 void startedDestroyingBases() {
889 EI.ObjectsUnderConstruction[Object] =
890 ConstructionPhase::DestroyingBases;
891 }
892 ~EvaluatingDestructorRAII() {
893 if (DidInsert)
894 EI.ObjectsUnderConstruction.erase(Object);
895 }
896 };
897
898 ConstructionPhase
899 isEvaluatingCtorDtor(APValue::LValueBase Base,
900 ArrayRef<APValue::LValuePathEntry> Path) {
901 return ObjectsUnderConstruction.lookup({Base, Path});
902 }
903
904 /// If we're currently speculatively evaluating, the outermost call stack
905 /// depth at which we can mutate state, otherwise 0.
906 unsigned SpeculativeEvaluationDepth = 0;
907
908 /// The current array initialization index, if we're performing array
909 /// initialization.
910 uint64_t ArrayInitIndex = -1;
911
912 /// HasActiveDiagnostic - Was the previous diagnostic stored? If so, further
913 /// notes attached to it will also be stored, otherwise they will not be.
914 bool HasActiveDiagnostic;
915
916 /// Have we emitted a diagnostic explaining why we couldn't constant
917 /// fold (not just why it's not strictly a constant expression)?
918 bool HasFoldFailureDiagnostic;
919
920 /// Whether or not we're in a context where the front end requires a
921 /// constant value.
922 bool InConstantContext;
923
924 /// Whether we're checking that an expression is a potential constant
925 /// expression. If so, do not fail on constructs that could become constant
926 /// later on (such as a use of an undefined global).
927 bool CheckingPotentialConstantExpression = false;
928
929 /// Whether we're checking for an expression that has undefined behavior.
930 /// If so, we will produce warnings if we encounter an operation that is
931 /// always undefined.
932 ///
933 /// Note that we still need to evaluate the expression normally when this
934 /// is set; this is used when evaluating ICEs in C.
935 bool CheckingForUndefinedBehavior = false;
936
937 enum EvaluationMode {
938 /// Evaluate as a constant expression. Stop if we find that the expression
939 /// is not a constant expression.
940 EM_ConstantExpression,
941
942 /// Evaluate as a constant expression. Stop if we find that the expression
943 /// is not a constant expression. Some expressions can be retried in the
944 /// optimizer if we don't constant fold them here, but in an unevaluated
945 /// context we try to fold them immediately since the optimizer never
946 /// gets a chance to look at it.
947 EM_ConstantExpressionUnevaluated,
948
949 /// Fold the expression to a constant. Stop if we hit a side-effect that
950 /// we can't model.
951 EM_ConstantFold,
952
953 /// Evaluate in any way we know how. Don't worry about side-effects that
954 /// can't be modeled.
955 EM_IgnoreSideEffects,
956 } EvalMode;
957
958 /// Are we checking whether the expression is a potential constant
959 /// expression?
960 bool checkingPotentialConstantExpression() const override {
961 return CheckingPotentialConstantExpression;
19
Returning the value 1, which participates in a condition later
962 }
963
964 /// Are we checking an expression for overflow?
965 // FIXME: We should check for any kind of undefined or suspicious behavior
966 // in such constructs, not just overflow.
967 bool checkingForUndefinedBehavior() const override {
968 return CheckingForUndefinedBehavior;
969 }
970
971 EvalInfo(const ASTContext &C, Expr::EvalStatus &S, EvaluationMode Mode)
972 : Ctx(const_cast<ASTContext &>(C)), EvalStatus(S), CurrentCall(nullptr),
973 CallStackDepth(0), NextCallIndex(1),
974 StepsLeft(C.getLangOpts().ConstexprStepLimit),
975 EnableNewConstInterp(C.getLangOpts().EnableNewConstInterp),
976 BottomFrame(*this, SourceLocation(), nullptr, nullptr, CallRef()),
4
Calling constructor for 'CallStackFrame'
5
Returning from constructor for 'CallStackFrame'
977 EvaluatingDecl((const ValueDecl *)nullptr),
978 EvaluatingDeclValue(nullptr), HasActiveDiagnostic(false),
979 HasFoldFailureDiagnostic(false), InConstantContext(false),
980 EvalMode(Mode) {}
981
982 ~EvalInfo() {
983 discardCleanups();
984 }
985
986 void setEvaluatingDecl(APValue::LValueBase Base, APValue &Value,
987 EvaluatingDeclKind EDK = EvaluatingDeclKind::Ctor) {
988 EvaluatingDecl = Base;
989 IsEvaluatingDecl = EDK;
990 EvaluatingDeclValue = &Value;
991 }
992
993 bool CheckCallLimit(SourceLocation Loc) {
994 // Don't perform any constexpr calls (other than the call we're checking)
995 // when checking a potential constant expression.
996 if (checkingPotentialConstantExpression() && CallStackDepth > 1)
18
Calling 'EvalInfo::checkingPotentialConstantExpression'
20
Returning from 'EvalInfo::checkingPotentialConstantExpression'
21
Assuming field 'CallStackDepth' is <= 1
22
Taking false branch
997 return false;
998 if (NextCallIndex == 0) {
23
Assuming field 'NextCallIndex' is not equal to 0
24
Taking false branch
999 // NextCallIndex has wrapped around.
1000 FFDiag(Loc, diag::note_constexpr_call_limit_exceeded);
1001 return false;
1002 }
1003 if (CallStackDepth <= getLangOpts().ConstexprCallDepth)
25
Assuming field 'CallStackDepth' is <= field 'ConstexprCallDepth'
26
Taking true branch
1004 return true;
27
Returning the value 1, which participates in a condition later
1005 FFDiag(Loc, diag::note_constexpr_depth_limit_exceeded)
1006 << getLangOpts().ConstexprCallDepth;
1007 return false;
1008 }
1009
1010 std::pair<CallStackFrame *, unsigned>
1011 getCallFrameAndDepth(unsigned CallIndex) {
1012 assert(CallIndex && "no call index in getCallFrameAndDepth")((void)0);
1013 // We will eventually hit BottomFrame, which has Index 1, so Frame can't
1014 // be null in this loop.
1015 unsigned Depth = CallStackDepth;
1016 CallStackFrame *Frame = CurrentCall;
1017 while (Frame->Index > CallIndex) {
1018 Frame = Frame->Caller;
1019 --Depth;
1020 }
1021 if (Frame->Index == CallIndex)
1022 return {Frame, Depth};
1023 return {nullptr, 0};
1024 }
1025
1026 bool nextStep(const Stmt *S) {
1027 if (!StepsLeft) {
1028 FFDiag(S->getBeginLoc(), diag::note_constexpr_step_limit_exceeded);
1029 return false;
1030 }
1031 --StepsLeft;
1032 return true;
1033 }
1034
1035 APValue *createHeapAlloc(const Expr *E, QualType T, LValue &LV);
1036
1037 Optional<DynAlloc*> lookupDynamicAlloc(DynamicAllocLValue DA) {
1038 Optional<DynAlloc*> Result;
1039 auto It = HeapAllocs.find(DA);
1040 if (It != HeapAllocs.end())
1041 Result = &It->second;
1042 return Result;
1043 }
1044
1045 /// Get the allocated storage for the given parameter of the given call.
1046 APValue *getParamSlot(CallRef Call, const ParmVarDecl *PVD) {
1047 CallStackFrame *Frame = getCallFrameAndDepth(Call.CallIndex).first;
1048 return Frame
57.1
'Frame' is non-null
57.1
'Frame' is non-null
57.1
'Frame' is non-null
57.1
'Frame' is non-null
57.1
'Frame' is non-null
57.1
'Frame' is non-null
? Frame->getTemporary(Call.getOrigParam(PVD), Call.Version)
58
'?' condition is true
59
Calling 'CallStackFrame::getTemporary'
63
Returning from 'CallStackFrame::getTemporary'
64
Returning pointer, which participates in a condition later
1049 : nullptr;
1050 }
1051
1052 /// Information about a stack frame for std::allocator<T>::[de]allocate.
1053 struct StdAllocatorCaller {
1054 unsigned FrameIndex;
1055 QualType ElemType;
1056 explicit operator bool() const { return FrameIndex != 0; };
1057 };
1058
1059 StdAllocatorCaller getStdAllocatorCaller(StringRef FnName) const {
1060 for (const CallStackFrame *Call = CurrentCall; Call != &BottomFrame;
1061 Call = Call->Caller) {
1062 const auto *MD = dyn_cast_or_null<CXXMethodDecl>(Call->Callee);
1063 if (!MD)
1064 continue;
1065 const IdentifierInfo *FnII = MD->getIdentifier();
1066 if (!FnII || !FnII->isStr(FnName))
1067 continue;
1068
1069 const auto *CTSD =
1070 dyn_cast<ClassTemplateSpecializationDecl>(MD->getParent());
1071 if (!CTSD)
1072 continue;
1073
1074 const IdentifierInfo *ClassII = CTSD->getIdentifier();
1075 const TemplateArgumentList &TAL = CTSD->getTemplateArgs();
1076 if (CTSD->isInStdNamespace() && ClassII &&
1077 ClassII->isStr("allocator") && TAL.size() >= 1 &&
1078 TAL[0].getKind() == TemplateArgument::Type)
1079 return {Call->Index, TAL[0].getAsType()};
1080 }
1081
1082 return {};
1083 }
1084
1085 void performLifetimeExtension() {
1086 // Disable the cleanups for lifetime-extended temporaries.
1087 CleanupStack.erase(std::remove_if(CleanupStack.begin(),
1088 CleanupStack.end(),
1089 [](Cleanup &C) {
1090 return !C.isDestroyedAtEndOf(
1091 ScopeKind::FullExpression);
1092 }),
1093 CleanupStack.end());
1094 }
1095
1096 /// Throw away any remaining cleanups at the end of evaluation. If any
1097 /// cleanups would have had a side-effect, note that as an unmodeled
1098 /// side-effect and return false. Otherwise, return true.
1099 bool discardCleanups() {
1100 for (Cleanup &C : CleanupStack) {
1101 if (C.hasSideEffect() && !noteSideEffect()) {
1102 CleanupStack.clear();
1103 return false;
1104 }
1105 }
1106 CleanupStack.clear();
1107 return true;
1108 }
1109
1110 private:
1111 interp::Frame *getCurrentFrame() override { return CurrentCall; }
1112 const interp::Frame *getBottomFrame() const override { return &BottomFrame; }
1113
1114 bool hasActiveDiagnostic() override { return HasActiveDiagnostic; }
1115 void setActiveDiagnostic(bool Flag) override { HasActiveDiagnostic = Flag; }
1116
1117 void setFoldFailureDiagnostic(bool Flag) override {
1118 HasFoldFailureDiagnostic = Flag;
1119 }
1120
1121 Expr::EvalStatus &getEvalStatus() const override { return EvalStatus; }
1122
1123 ASTContext &getCtx() const override { return Ctx; }
1124
1125 // If we have a prior diagnostic, it will be noting that the expression
1126 // isn't a constant expression. This diagnostic is more important,
1127 // unless we require this evaluation to produce a constant expression.
1128 //
1129 // FIXME: We might want to show both diagnostics to the user in
1130 // EM_ConstantFold mode.
1131 bool hasPriorDiagnostic() override {
1132 if (!EvalStatus.Diag->empty()) {
1133 switch (EvalMode) {
1134 case EM_ConstantFold:
1135 case EM_IgnoreSideEffects:
1136 if (!HasFoldFailureDiagnostic)
1137 break;
1138 // We've already failed to fold something. Keep that diagnostic.
1139 LLVM_FALLTHROUGH[[gnu::fallthrough]];
1140 case EM_ConstantExpression:
1141 case EM_ConstantExpressionUnevaluated:
1142 setActiveDiagnostic(false);
1143 return true;
1144 }
1145 }
1146 return false;
1147 }
1148
1149 unsigned getCallStackDepth() override { return CallStackDepth; }
1150
1151 public:
1152 /// Should we continue evaluation after encountering a side-effect that we
1153 /// couldn't model?
1154 bool keepEvaluatingAfterSideEffect() {
1155 switch (EvalMode) {
1156 case EM_IgnoreSideEffects:
1157 return true;
1158
1159 case EM_ConstantExpression:
1160 case EM_ConstantExpressionUnevaluated:
1161 case EM_ConstantFold:
1162 // By default, assume any side effect might be valid in some other
1163 // evaluation of this expression from a different context.
1164 return checkingPotentialConstantExpression() ||
1165 checkingForUndefinedBehavior();
1166 }
1167 llvm_unreachable("Missed EvalMode case")__builtin_unreachable();
1168 }
1169
1170 /// Note that we have had a side-effect, and determine whether we should
1171 /// keep evaluating.
1172 bool noteSideEffect() {
1173 EvalStatus.HasSideEffects = true;
1174 return keepEvaluatingAfterSideEffect();
1175 }
1176
1177 /// Should we continue evaluation after encountering undefined behavior?
1178 bool keepEvaluatingAfterUndefinedBehavior() {
1179 switch (EvalMode) {
1180 case EM_IgnoreSideEffects:
1181 case EM_ConstantFold:
1182 return true;
1183
1184 case EM_ConstantExpression:
1185 case EM_ConstantExpressionUnevaluated:
1186 return checkingForUndefinedBehavior();
1187 }
1188 llvm_unreachable("Missed EvalMode case")__builtin_unreachable();
1189 }
1190
1191 /// Note that we hit something that was technically undefined behavior, but
1192 /// that we can evaluate past it (such as signed overflow or floating-point
1193 /// division by zero.)
1194 bool noteUndefinedBehavior() override {
1195 EvalStatus.HasUndefinedBehavior = true;
1196 return keepEvaluatingAfterUndefinedBehavior();
1197 }
1198
1199 /// Should we continue evaluation as much as possible after encountering a
1200 /// construct which can't be reduced to a value?
1201 bool keepEvaluatingAfterFailure() const override {
1202 if (!StepsLeft)
1203 return false;
1204
1205 switch (EvalMode) {
1206 case EM_ConstantExpression:
1207 case EM_ConstantExpressionUnevaluated:
1208 case EM_ConstantFold:
1209 case EM_IgnoreSideEffects:
1210 return checkingPotentialConstantExpression() ||
1211 checkingForUndefinedBehavior();
1212 }
1213 llvm_unreachable("Missed EvalMode case")__builtin_unreachable();
1214 }
1215
1216 /// Notes that we failed to evaluate an expression that other expressions
1217 /// directly depend on, and determine if we should keep evaluating. This
1218 /// should only be called if we actually intend to keep evaluating.
1219 ///
1220 /// Call noteSideEffect() instead if we may be able to ignore the value that
1221 /// we failed to evaluate, e.g. if we failed to evaluate Foo() in:
1222 ///
1223 /// (Foo(), 1) // use noteSideEffect
1224 /// (Foo() || true) // use noteSideEffect
1225 /// Foo() + 1 // use noteFailure
1226 LLVM_NODISCARD[[clang::warn_unused_result]] bool noteFailure() {
1227 // Failure when evaluating some expression often means there is some
1228 // subexpression whose evaluation was skipped. Therefore, (because we
1229 // don't track whether we skipped an expression when unwinding after an
1230 // evaluation failure) every evaluation failure that bubbles up from a
1231 // subexpression implies that a side-effect has potentially happened. We
1232 // skip setting the HasSideEffects flag to true until we decide to
1233 // continue evaluating after that point, which happens here.
1234 bool KeepGoing = keepEvaluatingAfterFailure();
1235 EvalStatus.HasSideEffects |= KeepGoing;
1236 return KeepGoing;
1237 }
1238
1239 class ArrayInitLoopIndex {
1240 EvalInfo &Info;
1241 uint64_t OuterIndex;
1242
1243 public:
1244 ArrayInitLoopIndex(EvalInfo &Info)
1245 : Info(Info), OuterIndex(Info.ArrayInitIndex) {
1246 Info.ArrayInitIndex = 0;
1247 }
1248 ~ArrayInitLoopIndex() { Info.ArrayInitIndex = OuterIndex; }
1249
1250 operator uint64_t&() { return Info.ArrayInitIndex; }
1251 };
1252 };
1253
1254 /// Object used to treat all foldable expressions as constant expressions.
1255 struct FoldConstant {
1256 EvalInfo &Info;
1257 bool Enabled;
1258 bool HadNoPriorDiags;
1259 EvalInfo::EvaluationMode OldMode;
1260
1261 explicit FoldConstant(EvalInfo &Info, bool Enabled)
1262 : Info(Info),
1263 Enabled(Enabled),
1264 HadNoPriorDiags(Info.EvalStatus.Diag &&
1265 Info.EvalStatus.Diag->empty() &&
1266 !Info.EvalStatus.HasSideEffects),
1267 OldMode(Info.EvalMode) {
1268 if (Enabled)
1269 Info.EvalMode = EvalInfo::EM_ConstantFold;
1270 }
1271 void keepDiagnostics() { Enabled = false; }
1272 ~FoldConstant() {
1273 if (Enabled && HadNoPriorDiags && !Info.EvalStatus.Diag->empty() &&
1274 !Info.EvalStatus.HasSideEffects)
1275 Info.EvalStatus.Diag->clear();
1276 Info.EvalMode = OldMode;
1277 }
1278 };
1279
1280 /// RAII object used to set the current evaluation mode to ignore
1281 /// side-effects.
1282 struct IgnoreSideEffectsRAII {
1283 EvalInfo &Info;
1284 EvalInfo::EvaluationMode OldMode;
1285 explicit IgnoreSideEffectsRAII(EvalInfo &Info)
1286 : Info(Info), OldMode(Info.EvalMode) {
1287 Info.EvalMode = EvalInfo::EM_IgnoreSideEffects;
1288 }
1289
1290 ~IgnoreSideEffectsRAII() { Info.EvalMode = OldMode; }
1291 };
1292
1293 /// RAII object used to optionally suppress diagnostics and side-effects from
1294 /// a speculative evaluation.
1295 class SpeculativeEvaluationRAII {
1296 EvalInfo *Info = nullptr;
1297 Expr::EvalStatus OldStatus;
1298 unsigned OldSpeculativeEvaluationDepth;
1299
1300 void moveFromAndCancel(SpeculativeEvaluationRAII &&Other) {
1301 Info = Other.Info;
1302 OldStatus = Other.OldStatus;
1303 OldSpeculativeEvaluationDepth = Other.OldSpeculativeEvaluationDepth;
1304 Other.Info = nullptr;
1305 }
1306
1307 void maybeRestoreState() {
1308 if (!Info)
1309 return;
1310
1311 Info->EvalStatus = OldStatus;
1312 Info->SpeculativeEvaluationDepth = OldSpeculativeEvaluationDepth;
1313 }
1314
1315 public:
1316 SpeculativeEvaluationRAII() = default;
1317
1318 SpeculativeEvaluationRAII(
1319 EvalInfo &Info, SmallVectorImpl<PartialDiagnosticAt> *NewDiag = nullptr)
1320 : Info(&Info), OldStatus(Info.EvalStatus),
1321 OldSpeculativeEvaluationDepth(Info.SpeculativeEvaluationDepth) {
1322 Info.EvalStatus.Diag = NewDiag;
1323 Info.SpeculativeEvaluationDepth = Info.CallStackDepth + 1;
1324 }
1325
1326 SpeculativeEvaluationRAII(const SpeculativeEvaluationRAII &Other) = delete;
1327 SpeculativeEvaluationRAII(SpeculativeEvaluationRAII &&Other) {
1328 moveFromAndCancel(std::move(Other));
1329 }
1330
1331 SpeculativeEvaluationRAII &operator=(SpeculativeEvaluationRAII &&Other) {
1332 maybeRestoreState();
1333 moveFromAndCancel(std::move(Other));
1334 return *this;
1335 }
1336
1337 ~SpeculativeEvaluationRAII() { maybeRestoreState(); }
1338 };
1339
1340 /// RAII object wrapping a full-expression or block scope, and handling
1341 /// the ending of the lifetime of temporaries created within it.
1342 template<ScopeKind Kind>
1343 class ScopeRAII {
1344 EvalInfo &Info;
1345 unsigned OldStackSize;
1346 public:
1347 ScopeRAII(EvalInfo &Info)
1348 : Info(Info), OldStackSize(Info.CleanupStack.size()) {
1349 // Push a new temporary version. This is needed to distinguish between
1350 // temporaries created in different iterations of a loop.
1351 Info.CurrentCall->pushTempVersion();
1352 }
1353 bool destroy(bool RunDestructors = true) {
1354 bool OK = cleanup(Info, RunDestructors, OldStackSize);
1355 OldStackSize = -1U;
1356 return OK;
1357 }
1358 ~ScopeRAII() {
1359 if (OldStackSize != -1U)
1360 destroy(false);
1361 // Body moved to a static method to encourage the compiler to inline away
1362 // instances of this class.
1363 Info.CurrentCall->popTempVersion();
1364 }
1365 private:
1366 static bool cleanup(EvalInfo &Info, bool RunDestructors,
1367 unsigned OldStackSize) {
1368 assert(OldStackSize <= Info.CleanupStack.size() &&((void)0)
1369 "running cleanups out of order?")((void)0);
1370
1371 // Run all cleanups for a block scope, and non-lifetime-extended cleanups
1372 // for a full-expression scope.
1373 bool Success = true;
1374 for (unsigned I = Info.CleanupStack.size(); I > OldStackSize; --I) {
1375 if (Info.CleanupStack[I - 1].isDestroyedAtEndOf(Kind)) {
1376 if (!Info.CleanupStack[I - 1].endLifetime(Info, RunDestructors)) {
1377 Success = false;
1378 break;
1379 }
1380 }
1381 }
1382
1383 // Compact any retained cleanups.
1384 auto NewEnd = Info.CleanupStack.begin() + OldStackSize;
1385 if (Kind != ScopeKind::Block)
1386 NewEnd =
1387 std::remove_if(NewEnd, Info.CleanupStack.end(), [](Cleanup &C) {
1388 return C.isDestroyedAtEndOf(Kind);
1389 });
1390 Info.CleanupStack.erase(NewEnd, Info.CleanupStack.end());
1391 return Success;
1392 }
1393 };
1394 typedef ScopeRAII<ScopeKind::Block> BlockScopeRAII;
1395 typedef ScopeRAII<ScopeKind::FullExpression> FullExpressionRAII;
1396 typedef ScopeRAII<ScopeKind::Call> CallScopeRAII;
1397}
1398
1399bool SubobjectDesignator::checkSubobject(EvalInfo &Info, const Expr *E,
1400 CheckSubobjectKind CSK) {
1401 if (Invalid)
1402 return false;
1403 if (isOnePastTheEnd()) {
1404 Info.CCEDiag(E, diag::note_constexpr_past_end_subobject)
1405 << CSK;
1406 setInvalid();
1407 return false;
1408 }
1409 // Note, we do not diagnose if isMostDerivedAnUnsizedArray(), because there
1410 // must actually be at least one array element; even a VLA cannot have a
1411 // bound of zero. And if our index is nonzero, we already had a CCEDiag.
1412 return true;
1413}
1414
1415void SubobjectDesignator::diagnoseUnsizedArrayPointerArithmetic(EvalInfo &Info,
1416 const Expr *E) {
1417 Info.CCEDiag(E, diag::note_constexpr_unsized_array_indexed);
1418 // Do not set the designator as invalid: we can represent this situation,
1419 // and correct handling of __builtin_object_size requires us to do so.
1420}
1421
1422void SubobjectDesignator::diagnosePointerArithmetic(EvalInfo &Info,
1423 const Expr *E,
1424 const APSInt &N) {
1425 // If we're complaining, we must be able to statically determine the size of
1426 // the most derived array.
1427 if (MostDerivedPathLength == Entries.size() && MostDerivedIsArrayElement)
1428 Info.CCEDiag(E, diag::note_constexpr_array_index)
1429 << N << /*array*/ 0
1430 << static_cast<unsigned>(getMostDerivedArraySize());
1431 else
1432 Info.CCEDiag(E, diag::note_constexpr_array_index)
1433 << N << /*non-array*/ 1;
1434 setInvalid();
1435}
1436
1437CallStackFrame::CallStackFrame(EvalInfo &Info, SourceLocation CallLoc,
1438 const FunctionDecl *Callee, const LValue *This,
1439 CallRef Call)
1440 : Info(Info), Caller(Info.CurrentCall), Callee(Callee), This(This),
1441 Arguments(Call), CallLoc(CallLoc), Index(Info.NextCallIndex++) {
1442 Info.CurrentCall = this;
1443 ++Info.CallStackDepth;
1444}
1445
1446CallStackFrame::~CallStackFrame() {
1447 assert(Info.CurrentCall == this && "calls retired out of order")((void)0);
1448 --Info.CallStackDepth;
1449 Info.CurrentCall = Caller;
1450}
1451
1452static bool isRead(AccessKinds AK) {
1453 return AK == AK_Read || AK == AK_ReadObjectRepresentation;
1454}
1455
1456static bool isModification(AccessKinds AK) {
1457 switch (AK) {
1458 case AK_Read:
1459 case AK_ReadObjectRepresentation:
1460 case AK_MemberCall:
1461 case AK_DynamicCast:
1462 case AK_TypeId:
1463 return false;
1464 case AK_Assign:
1465 case AK_Increment:
1466 case AK_Decrement:
1467 case AK_Construct:
1468 case AK_Destroy:
1469 return true;
1470 }
1471 llvm_unreachable("unknown access kind")__builtin_unreachable();
1472}
1473
1474static bool isAnyAccess(AccessKinds AK) {
1475 return isRead(AK) || isModification(AK);
1476}
1477
1478/// Is this an access per the C++ definition?
1479static bool isFormalAccess(AccessKinds AK) {
1480 return isAnyAccess(AK) && AK != AK_Construct && AK != AK_Destroy;
1481}
1482
1483/// Is this kind of axcess valid on an indeterminate object value?
1484static bool isValidIndeterminateAccess(AccessKinds AK) {
1485 switch (AK) {
1486 case AK_Read:
1487 case AK_Increment:
1488 case AK_Decrement:
1489 // These need the object's value.
1490 return false;
1491
1492 case AK_ReadObjectRepresentation:
1493 case AK_Assign:
1494 case AK_Construct:
1495 case AK_Destroy:
1496 // Construction and destruction don't need the value.
1497 return true;
1498
1499 case AK_MemberCall:
1500 case AK_DynamicCast:
1501 case AK_TypeId:
1502 // These aren't really meaningful on scalars.
1503 return true;
1504 }
1505 llvm_unreachable("unknown access kind")__builtin_unreachable();
1506}
1507
1508namespace {
1509 struct ComplexValue {
1510 private:
1511 bool IsInt;
1512
1513 public:
1514 APSInt IntReal, IntImag;
1515 APFloat FloatReal, FloatImag;
1516
1517 ComplexValue() : FloatReal(APFloat::Bogus()), FloatImag(APFloat::Bogus()) {}
1518
1519 void makeComplexFloat() { IsInt = false; }
1520 bool isComplexFloat() const { return !IsInt; }
1521 APFloat &getComplexFloatReal() { return FloatReal; }
1522 APFloat &getComplexFloatImag() { return FloatImag; }
1523
1524 void makeComplexInt() { IsInt = true; }
1525 bool isComplexInt() const { return IsInt; }
1526 APSInt &getComplexIntReal() { return IntReal; }
1527 APSInt &getComplexIntImag() { return IntImag; }
1528
1529 void moveInto(APValue &v) const {
1530 if (isComplexFloat())
1531 v = APValue(FloatReal, FloatImag);
1532 else
1533 v = APValue(IntReal, IntImag);
1534 }
1535 void setFrom(const APValue &v) {
1536 assert(v.isComplexFloat() || v.isComplexInt())((void)0);
1537 if (v.isComplexFloat()) {
1538 makeComplexFloat();
1539 FloatReal = v.getComplexFloatReal();
1540 FloatImag = v.getComplexFloatImag();
1541 } else {
1542 makeComplexInt();
1543 IntReal = v.getComplexIntReal();
1544 IntImag = v.getComplexIntImag();
1545 }
1546 }
1547 };
1548
1549 struct LValue {
1550 APValue::LValueBase Base;
1551 CharUnits Offset;
1552 SubobjectDesignator Designator;
1553 bool IsNullPtr : 1;
1554 bool InvalidBase : 1;
1555
1556 const APValue::LValueBase getLValueBase() const { return Base; }
1557 CharUnits &getLValueOffset() { return Offset; }
1558 const CharUnits &getLValueOffset() const { return Offset; }
1559 SubobjectDesignator &getLValueDesignator() { return Designator; }
1560 const SubobjectDesignator &getLValueDesignator() const { return Designator;}
1561 bool isNullPointer() const { return IsNullPtr;}
1562
1563 unsigned getLValueCallIndex() const { return Base.getCallIndex(); }
1564 unsigned getLValueVersion() const { return Base.getVersion(); }
1565
1566 void moveInto(APValue &V) const {
1567 if (Designator.Invalid)
1568 V = APValue(Base, Offset, APValue::NoLValuePath(), IsNullPtr);
1569 else {
1570 assert(!InvalidBase && "APValues can't handle invalid LValue bases")((void)0);
1571 V = APValue(Base, Offset, Designator.Entries,
1572 Designator.IsOnePastTheEnd, IsNullPtr);
1573 }
1574 }
1575 void setFrom(ASTContext &Ctx, const APValue &V) {
1576 assert(V.isLValue() && "Setting LValue from a non-LValue?")((void)0);
1577 Base = V.getLValueBase();
1578 Offset = V.getLValueOffset();
1579 InvalidBase = false;
1580 Designator = SubobjectDesignator(Ctx, V);
1581 IsNullPtr = V.isNullPointer();
1582 }
1583
1584 void set(APValue::LValueBase B, bool BInvalid = false) {
1585#ifndef NDEBUG1
1586 // We only allow a few types of invalid bases. Enforce that here.
1587 if (BInvalid) {
1588 const auto *E = B.get<const Expr *>();
1589 assert((isa<MemberExpr>(E) || tryUnwrapAllocSizeCall(E)) &&((void)0)
1590 "Unexpected type of invalid base")((void)0);
1591 }
1592#endif
1593
1594 Base = B;
1595 Offset = CharUnits::fromQuantity(0);
1596 InvalidBase = BInvalid;
1597 Designator = SubobjectDesignator(getType(B));
1598 IsNullPtr = false;
1599 }
1600
1601 void setNull(ASTContext &Ctx, QualType PointerTy) {
1602 Base = (const ValueDecl *)nullptr;
1603 Offset =
1604 CharUnits::fromQuantity(Ctx.getTargetNullPointerValue(PointerTy));
1605 InvalidBase = false;
1606 Designator = SubobjectDesignator(PointerTy->getPointeeType());
1607 IsNullPtr = true;
1608 }
1609
1610 void setInvalid(APValue::LValueBase B, unsigned I = 0) {
1611 set(B, true);
1612 }
1613
1614 std::string toString(ASTContext &Ctx, QualType T) const {
1615 APValue Printable;
1616 moveInto(Printable);
1617 return Printable.getAsString(Ctx, T);
1618 }
1619
1620 private:
1621 // Check that this LValue is not based on a null pointer. If it is, produce
1622 // a diagnostic and mark the designator as invalid.
1623 template <typename GenDiagType>
1624 bool checkNullPointerDiagnosingWith(const GenDiagType &GenDiag) {
1625 if (Designator.Invalid)
1626 return false;
1627 if (IsNullPtr) {
1628 GenDiag();
1629 Designator.setInvalid();
1630 return false;
1631 }
1632 return true;
1633 }
1634
1635 public:
1636 bool checkNullPointer(EvalInfo &Info, const Expr *E,
1637 CheckSubobjectKind CSK) {
1638 return checkNullPointerDiagnosingWith([&Info, E, CSK] {
1639 Info.CCEDiag(E, diag::note_constexpr_null_subobject) << CSK;
1640 });
1641 }
1642
1643 bool checkNullPointerForFoldAccess(EvalInfo &Info, const Expr *E,
1644 AccessKinds AK) {
1645 return checkNullPointerDiagnosingWith([&Info, E, AK] {
1646 Info.FFDiag(E, diag::note_constexpr_access_null) << AK;
1647 });
1648 }
1649
1650 // Check this LValue refers to an object. If not, set the designator to be
1651 // invalid and emit a diagnostic.
1652 bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK) {
1653 return (CSK == CSK_ArrayToPointer || checkNullPointer(Info, E, CSK)) &&
1654 Designator.checkSubobject(Info, E, CSK);
1655 }
1656
1657 void addDecl(EvalInfo &Info, const Expr *E,
1658 const Decl *D, bool Virtual = false) {
1659 if (checkSubobject(Info, E, isa<FieldDecl>(D) ? CSK_Field : CSK_Base))
1660 Designator.addDeclUnchecked(D, Virtual);
1661 }
1662 void addUnsizedArray(EvalInfo &Info, const Expr *E, QualType ElemTy) {
1663 if (!Designator.Entries.empty()) {
1664 Info.CCEDiag(E, diag::note_constexpr_unsupported_unsized_array);
1665 Designator.setInvalid();
1666 return;
1667 }
1668 if (checkSubobject(Info, E, CSK_ArrayToPointer)) {
1669 assert(getType(Base)->isPointerType() || getType(Base)->isArrayType())((void)0);
1670 Designator.FirstEntryIsAnUnsizedArray = true;
1671 Designator.addUnsizedArrayUnchecked(ElemTy);
1672 }
1673 }
1674 void addArray(EvalInfo &Info, const Expr *E, const ConstantArrayType *CAT) {
1675 if (checkSubobject(Info, E, CSK_ArrayToPointer))
1676 Designator.addArrayUnchecked(CAT);
1677 }
1678 void addComplex(EvalInfo &Info, const Expr *E, QualType EltTy, bool Imag) {
1679 if (checkSubobject(Info, E, Imag ? CSK_Imag : CSK_Real))
1680 Designator.addComplexUnchecked(EltTy, Imag);
1681 }
1682 void clearIsNullPointer() {
1683 IsNullPtr = false;
1684 }
1685 void adjustOffsetAndIndex(EvalInfo &Info, const Expr *E,
1686 const APSInt &Index, CharUnits ElementSize) {
1687 // An index of 0 has no effect. (In C, adding 0 to a null pointer is UB,
1688 // but we're not required to diagnose it and it's valid in C++.)
1689 if (!Index)
1690 return;
1691
1692 // Compute the new offset in the appropriate width, wrapping at 64 bits.
1693 // FIXME: When compiling for a 32-bit target, we should use 32-bit
1694 // offsets.
1695 uint64_t Offset64 = Offset.getQuantity();
1696 uint64_t ElemSize64 = ElementSize.getQuantity();
1697 uint64_t Index64 = Index.extOrTrunc(64).getZExtValue();
1698 Offset = CharUnits::fromQuantity(Offset64 + ElemSize64 * Index64);
1699
1700 if (checkNullPointer(Info, E, CSK_ArrayIndex))
1701 Designator.adjustIndex(Info, E, Index);
1702 clearIsNullPointer();
1703 }
1704 void adjustOffset(CharUnits N) {
1705 Offset += N;
1706 if (N.getQuantity())
1707 clearIsNullPointer();
1708 }
1709 };
1710
1711 struct MemberPtr {
1712 MemberPtr() {}
1713 explicit MemberPtr(const ValueDecl *Decl) :
1714 DeclAndIsDerivedMember(Decl, false), Path() {}
1715
1716 /// The member or (direct or indirect) field referred to by this member
1717 /// pointer, or 0 if this is a null member pointer.
1718 const ValueDecl *getDecl() const {
1719 return DeclAndIsDerivedMember.getPointer();
1720 }
1721 /// Is this actually a member of some type derived from the relevant class?
1722 bool isDerivedMember() const {
1723 return DeclAndIsDerivedMember.getInt();
1724 }
1725 /// Get the class which the declaration actually lives in.
1726 const CXXRecordDecl *getContainingRecord() const {
1727 return cast<CXXRecordDecl>(
1728 DeclAndIsDerivedMember.getPointer()->getDeclContext());
1729 }
1730
1731 void moveInto(APValue &V) const {
1732 V = APValue(getDecl(), isDerivedMember(), Path);
1733 }
1734 void setFrom(const APValue &V) {
1735 assert(V.isMemberPointer())((void)0);
1736 DeclAndIsDerivedMember.setPointer(V.getMemberPointerDecl());
1737 DeclAndIsDerivedMember.setInt(V.isMemberPointerToDerivedMember());
1738 Path.clear();
1739 ArrayRef<const CXXRecordDecl*> P = V.getMemberPointerPath();
1740 Path.insert(Path.end(), P.begin(), P.end());
1741 }
1742
1743 /// DeclAndIsDerivedMember - The member declaration, and a flag indicating
1744 /// whether the member is a member of some class derived from the class type
1745 /// of the member pointer.
1746 llvm::PointerIntPair<const ValueDecl*, 1, bool> DeclAndIsDerivedMember;
1747 /// Path - The path of base/derived classes from the member declaration's
1748 /// class (exclusive) to the class type of the member pointer (inclusive).
1749 SmallVector<const CXXRecordDecl*, 4> Path;
1750
1751 /// Perform a cast towards the class of the Decl (either up or down the
1752 /// hierarchy).
1753 bool castBack(const CXXRecordDecl *Class) {
1754 assert(!Path.empty())((void)0);
1755 const CXXRecordDecl *Expected;
1756 if (Path.size() >= 2)
1757 Expected = Path[Path.size() - 2];
1758 else
1759 Expected = getContainingRecord();
1760 if (Expected->getCanonicalDecl() != Class->getCanonicalDecl()) {
1761 // C++11 [expr.static.cast]p12: In a conversion from (D::*) to (B::*),
1762 // if B does not contain the original member and is not a base or
1763 // derived class of the class containing the original member, the result
1764 // of the cast is undefined.
1765 // C++11 [conv.mem]p2 does not cover this case for a cast from (B::*) to
1766 // (D::*). We consider that to be a language defect.
1767 return false;
1768 }
1769 Path.pop_back();
1770 return true;
1771 }
1772 /// Perform a base-to-derived member pointer cast.
1773 bool castToDerived(const CXXRecordDecl *Derived) {
1774 if (!getDecl())
1775 return true;
1776 if (!isDerivedMember()) {
1777 Path.push_back(Derived);
1778 return true;
1779 }
1780 if (!castBack(Derived))
1781 return false;
1782 if (Path.empty())
1783 DeclAndIsDerivedMember.setInt(false);
1784 return true;
1785 }
1786 /// Perform a derived-to-base member pointer cast.
1787 bool castToBase(const CXXRecordDecl *Base) {
1788 if (!getDecl())
1789 return true;
1790 if (Path.empty())
1791 DeclAndIsDerivedMember.setInt(true);
1792 if (isDerivedMember()) {
1793 Path.push_back(Base);
1794 return true;
1795 }
1796 return castBack(Base);
1797 }
1798 };
1799
1800 /// Compare two member pointers, which are assumed to be of the same type.
1801 static bool operator==(const MemberPtr &LHS, const MemberPtr &RHS) {
1802 if (!LHS.getDecl() || !RHS.getDecl())
1803 return !LHS.getDecl() && !RHS.getDecl();
1804 if (LHS.getDecl()->getCanonicalDecl() != RHS.getDecl()->getCanonicalDecl())
1805 return false;
1806 return LHS.Path == RHS.Path;
1807 }
1808}
1809
1810static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E);
1811static bool EvaluateInPlace(APValue &Result, EvalInfo &Info,
1812 const LValue &This, const Expr *E,
1813 bool AllowNonLiteralTypes = false);
1814static bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info,
1815 bool InvalidBaseOK = false);
1816static bool EvaluatePointer(const Expr *E, LValue &Result, EvalInfo &Info,
1817 bool InvalidBaseOK = false);
1818static bool EvaluateMemberPointer(const Expr *E, MemberPtr &Result,
1819 EvalInfo &Info);
1820static bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info);
1821static bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info);
1822static bool EvaluateIntegerOrLValue(const Expr *E, APValue &Result,
1823 EvalInfo &Info);
1824static bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
1825static bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info);
1826static bool EvaluateAtomic(const Expr *E, const LValue *This, APValue &Result,
1827 EvalInfo &Info);
1828static bool EvaluateAsRValue(EvalInfo &Info, const Expr *E, APValue &Result);
1829
1830/// Evaluate an integer or fixed point expression into an APResult.
1831static bool EvaluateFixedPointOrInteger(const Expr *E, APFixedPoint &Result,
1832 EvalInfo &Info);
1833
1834/// Evaluate only a fixed point expression into an APResult.
1835static bool EvaluateFixedPoint(const Expr *E, APFixedPoint &Result,
1836 EvalInfo &Info);
1837
1838//===----------------------------------------------------------------------===//
1839// Misc utilities
1840//===----------------------------------------------------------------------===//
1841
1842/// Negate an APSInt in place, converting it to a signed form if necessary, and
1843/// preserving its value (by extending by up to one bit as needed).
1844static void negateAsSigned(APSInt &Int) {
1845 if (Int.isUnsigned() || Int.isMinSignedValue()) {
1846 Int = Int.extend(Int.getBitWidth() + 1);
1847 Int.setIsSigned(true);
1848 }
1849 Int = -Int;
1850}
1851
1852template<typename KeyT>
1853APValue &CallStackFrame::createTemporary(const KeyT *Key, QualType T,
1854 ScopeKind Scope, LValue &LV) {
1855 unsigned Version = getTempVersion();
1856 APValue::LValueBase Base(Key, Index, Version);
1857 LV.set(Base);
1858 return createLocal(Base, Key, T, Scope);
1859}
1860
1861/// Allocate storage for a parameter of a function call made in this frame.
1862APValue &CallStackFrame::createParam(CallRef Args, const ParmVarDecl *PVD,
1863 LValue &LV) {
1864 assert(Args.CallIndex == Index && "creating parameter in wrong frame")((void)0);
1865 APValue::LValueBase Base(PVD, Index, Args.Version);
1866 LV.set(Base);
1867 // We always destroy parameters at the end of the call, even if we'd allow
1868 // them to live to the end of the full-expression at runtime, in order to
1869 // give portable results and match other compilers.
1870 return createLocal(Base, PVD, PVD->getType(), ScopeKind::Call);
1871}
1872
1873APValue &CallStackFrame::createLocal(APValue::LValueBase Base, const void *Key,
1874 QualType T, ScopeKind Scope) {
1875 assert(Base.getCallIndex() == Index && "lvalue for wrong frame")((void)0);
1876 unsigned Version = Base.getVersion();
1877 APValue &Result = Temporaries[MapKeyTy(Key, Version)];
1878 assert(Result.isAbsent() && "local created multiple times")((void)0);
1879
1880 // If we're creating a local immediately in the operand of a speculative
1881 // evaluation, don't register a cleanup to be run outside the speculative
1882 // evaluation context, since we won't actually be able to initialize this
1883 // object.
1884 if (Index <= Info.SpeculativeEvaluationDepth) {
1885 if (T.isDestructedType())
1886 Info.noteSideEffect();
1887 } else {
1888 Info.CleanupStack.push_back(Cleanup(&Result, Base, T, Scope));
1889 }
1890 return Result;
1891}
1892
1893APValue *EvalInfo::createHeapAlloc(const Expr *E, QualType T, LValue &LV) {
1894 if (NumHeapAllocs > DynamicAllocLValue::getMaxIndex()) {
1895 FFDiag(E, diag::note_constexpr_heap_alloc_limit_exceeded);
1896 return nullptr;
1897 }
1898
1899 DynamicAllocLValue DA(NumHeapAllocs++);
1900 LV.set(APValue::LValueBase::getDynamicAlloc(DA, T));
1901 auto Result = HeapAllocs.emplace(std::piecewise_construct,
1902 std::forward_as_tuple(DA), std::tuple<>());
1903 assert(Result.second && "reused a heap alloc index?")((void)0);
1904 Result.first->second.AllocExpr = E;
1905 return &Result.first->second.Value;
1906}
1907
1908/// Produce a string describing the given constexpr call.
1909void CallStackFrame::describe(raw_ostream &Out) {
1910 unsigned ArgIndex = 0;
1911 bool IsMemberCall = isa<CXXMethodDecl>(Callee) &&
1912 !isa<CXXConstructorDecl>(Callee) &&
1913 cast<CXXMethodDecl>(Callee)->isInstance();
1914
1915 if (!IsMemberCall)
1916 Out << *Callee << '(';
1917
1918 if (This && IsMemberCall) {
1919 APValue Val;
1920 This->moveInto(Val);
1921 Val.printPretty(Out, Info.Ctx,
1922 This->Designator.MostDerivedType);
1923 // FIXME: Add parens around Val if needed.
1924 Out << "->" << *Callee << '(';
1925 IsMemberCall = false;
1926 }
1927
1928 for (FunctionDecl::param_const_iterator I = Callee->param_begin(),
1929 E = Callee->param_end(); I != E; ++I, ++ArgIndex) {
1930 if (ArgIndex > (unsigned)IsMemberCall)
1931 Out << ", ";
1932
1933 const ParmVarDecl *Param = *I;
1934 APValue *V = Info.getParamSlot(Arguments, Param);
1935 if (V)
1936 V->printPretty(Out, Info.Ctx, Param->getType());
1937 else
1938 Out << "<...>";
1939
1940 if (ArgIndex == 0 && IsMemberCall)
1941 Out << "->" << *Callee << '(';
1942 }
1943
1944 Out << ')';
1945}
1946
1947/// Evaluate an expression to see if it had side-effects, and discard its
1948/// result.
1949/// \return \c true if the caller should keep evaluating.
1950static bool EvaluateIgnoredValue(EvalInfo &Info, const Expr *E) {
1951 assert(!E->isValueDependent())((void)0);
1952 APValue Scratch;
1953 if (!Evaluate(Scratch, Info, E))
1954 // We don't need the value, but we might have skipped a side effect here.
1955 return Info.noteSideEffect();
1956 return true;
1957}
1958
1959/// Should this call expression be treated as a string literal?
1960static bool IsStringLiteralCall(const CallExpr *E) {
1961 unsigned Builtin = E->getBuiltinCallee();
1962 return (Builtin == Builtin::BI__builtin___CFStringMakeConstantString ||
1963 Builtin == Builtin::BI__builtin___NSStringMakeConstantString);
1964}
1965
1966static bool IsGlobalLValue(APValue::LValueBase B) {
1967 // C++11 [expr.const]p3 An address constant expression is a prvalue core
1968 // constant expression of pointer type that evaluates to...
1969
1970 // ... a null pointer value, or a prvalue core constant expression of type
1971 // std::nullptr_t.
1972 if (!B) return true;
1973
1974 if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) {
1975 // ... the address of an object with static storage duration,
1976 if (const VarDecl *VD = dyn_cast<VarDecl>(D))
1977 return VD->hasGlobalStorage();
1978 if (isa<TemplateParamObjectDecl>(D))
1979 return true;
1980 // ... the address of a function,
1981 // ... the address of a GUID [MS extension],
1982 return isa<FunctionDecl>(D) || isa<MSGuidDecl>(D);
1983 }
1984
1985 if (B.is<TypeInfoLValue>() || B.is<DynamicAllocLValue>())
1986 return true;
1987
1988 const Expr *E = B.get<const Expr*>();
1989 switch (E->getStmtClass()) {
1990 default:
1991 return false;
1992 case Expr::CompoundLiteralExprClass: {
1993 const CompoundLiteralExpr *CLE = cast<CompoundLiteralExpr>(E);
1994 return CLE->isFileScope() && CLE->isLValue();
1995 }
1996 case Expr::MaterializeTemporaryExprClass:
1997 // A materialized temporary might have been lifetime-extended to static
1998 // storage duration.
1999 return cast<MaterializeTemporaryExpr>(E)->getStorageDuration() == SD_Static;
2000 // A string literal has static storage duration.
2001 case Expr::StringLiteralClass:
2002 case Expr::PredefinedExprClass:
2003 case Expr::ObjCStringLiteralClass:
2004 case Expr::ObjCEncodeExprClass:
2005 return true;
2006 case Expr::ObjCBoxedExprClass:
2007 return cast<ObjCBoxedExpr>(E)->isExpressibleAsConstantInitializer();
2008 case Expr::CallExprClass:
2009 return IsStringLiteralCall(cast<CallExpr>(E));
2010 // For GCC compatibility, &&label has static storage duration.
2011 case Expr::AddrLabelExprClass:
2012 return true;
2013 // A Block literal expression may be used as the initialization value for
2014 // Block variables at global or local static scope.
2015 case Expr::BlockExprClass:
2016 return !cast<BlockExpr>(E)->getBlockDecl()->hasCaptures();
2017 case Expr::ImplicitValueInitExprClass:
2018 // FIXME:
2019 // We can never form an lvalue with an implicit value initialization as its
2020 // base through expression evaluation, so these only appear in one case: the
2021 // implicit variable declaration we invent when checking whether a constexpr
2022 // constructor can produce a constant expression. We must assume that such
2023 // an expression might be a global lvalue.
2024 return true;
2025 }
2026}
2027
2028static const ValueDecl *GetLValueBaseDecl(const LValue &LVal) {
2029 return LVal.Base.dyn_cast<const ValueDecl*>();
2030}
2031
2032static bool IsLiteralLValue(const LValue &Value) {
2033 if (Value.getLValueCallIndex())
2034 return false;
2035 const Expr *E = Value.Base.dyn_cast<const Expr*>();
2036 return E && !isa<MaterializeTemporaryExpr>(E);
2037}
2038
2039static bool IsWeakLValue(const LValue &Value) {
2040 const ValueDecl *Decl = GetLValueBaseDecl(Value);
2041 return Decl && Decl->isWeak();
2042}
2043
2044static bool isZeroSized(const LValue &Value) {
2045 const ValueDecl *Decl = GetLValueBaseDecl(Value);
2046 if (Decl && isa<VarDecl>(Decl)) {
2047 QualType Ty = Decl->getType();
2048 if (Ty->isArrayType())
2049 return Ty->isIncompleteType() ||
2050 Decl->getASTContext().getTypeSize(Ty) == 0;
2051 }
2052 return false;
2053}
2054
2055static bool HasSameBase(const LValue &A, const LValue &B) {
2056 if (!A.getLValueBase())
2057 return !B.getLValueBase();
2058 if (!B.getLValueBase())
2059 return false;
2060
2061 if (A.getLValueBase().getOpaqueValue() !=
2062 B.getLValueBase().getOpaqueValue())
2063 return false;
2064
2065 return A.getLValueCallIndex() == B.getLValueCallIndex() &&
2066 A.getLValueVersion() == B.getLValueVersion();
2067}
2068
2069static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) {
2070 assert(Base && "no location for a null lvalue")((void)0);
2071 const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>();
2072
2073 // For a parameter, find the corresponding call stack frame (if it still
2074 // exists), and point at the parameter of the function definition we actually
2075 // invoked.
2076 if (auto *PVD = dyn_cast_or_null<ParmVarDecl>(VD)) {
2077 unsigned Idx = PVD->getFunctionScopeIndex();
2078 for (CallStackFrame *F = Info.CurrentCall; F; F = F->Caller) {
2079 if (F->Arguments.CallIndex == Base.getCallIndex() &&
2080 F->Arguments.Version == Base.getVersion() && F->Callee &&
2081 Idx < F->Callee->getNumParams()) {
2082 VD = F->Callee->getParamDecl(Idx);
2083 break;
2084 }
2085 }
2086 }
2087
2088 if (VD)
2089 Info.Note(VD->getLocation(), diag::note_declared_at);
2090 else if (const Expr *E = Base.dyn_cast<const Expr*>())
2091 Info.Note(E->getExprLoc(), diag::note_constexpr_temporary_here);
2092 else if (DynamicAllocLValue DA = Base.dyn_cast<DynamicAllocLValue>()) {
2093 // FIXME: Produce a note for dangling pointers too.
2094 if (Optional<DynAlloc*> Alloc = Info.lookupDynamicAlloc(DA))
2095 Info.Note((*Alloc)->AllocExpr->getExprLoc(),
2096 diag::note_constexpr_dynamic_alloc_here);
2097 }
2098 // We have no information to show for a typeid(T) object.
2099}
2100
2101enum class CheckEvaluationResultKind {
2102 ConstantExpression,
2103 FullyInitialized,
2104};
2105
2106/// Materialized temporaries that we've already checked to determine if they're
2107/// initializsed by a constant expression.
2108using CheckedTemporaries =
2109 llvm::SmallPtrSet<const MaterializeTemporaryExpr *, 8>;
2110
2111static bool CheckEvaluationResult(CheckEvaluationResultKind CERK,
2112 EvalInfo &Info, SourceLocation DiagLoc,
2113 QualType Type, const APValue &Value,
2114 ConstantExprKind Kind,
2115 SourceLocation SubobjectLoc,
2116 CheckedTemporaries &CheckedTemps);
2117
2118/// Check that this reference or pointer core constant expression is a valid
2119/// value for an address or reference constant expression. Return true if we
2120/// can fold this expression, whether or not it's a constant expression.
2121static bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc,
2122 QualType Type, const LValue &LVal,
2123 ConstantExprKind Kind,
2124 CheckedTemporaries &CheckedTemps) {
2125 bool IsReferenceType = Type->isReferenceType();
2126
2127 APValue::LValueBase Base = LVal.getLValueBase();
2128 const SubobjectDesignator &Designator = LVal.getLValueDesignator();
2129
2130 const Expr *BaseE = Base.dyn_cast<const Expr *>();
2131 const ValueDecl *BaseVD = Base.dyn_cast<const ValueDecl*>();
2132
2133 // Additional restrictions apply in a template argument. We only enforce the
2134 // C++20 restrictions here; additional syntactic and semantic restrictions
2135 // are applied elsewhere.
2136 if (isTemplateArgument(Kind)) {
2137 int InvalidBaseKind = -1;
2138 StringRef Ident;
2139 if (Base.is<TypeInfoLValue>())
2140 InvalidBaseKind = 0;
2141 else if (isa_and_nonnull<StringLiteral>(BaseE))
2142 InvalidBaseKind = 1;
2143 else if (isa_and_nonnull<MaterializeTemporaryExpr>(BaseE) ||
2144 isa_and_nonnull<LifetimeExtendedTemporaryDecl>(BaseVD))
2145 InvalidBaseKind = 2;
2146 else if (auto *PE = dyn_cast_or_null<PredefinedExpr>(BaseE)) {
2147 InvalidBaseKind = 3;
2148 Ident = PE->getIdentKindName();
2149 }
2150
2151 if (InvalidBaseKind != -1) {
2152 Info.FFDiag(Loc, diag::note_constexpr_invalid_template_arg)
2153 << IsReferenceType << !Designator.Entries.empty() << InvalidBaseKind
2154 << Ident;
2155 return false;
2156 }
2157 }
2158
2159 if (auto *FD = dyn_cast_or_null<FunctionDecl>(BaseVD)) {
2160 if (FD->isConsteval()) {
2161 Info.FFDiag(Loc, diag::note_consteval_address_accessible)
2162 << !Type->isAnyPointerType();
2163 Info.Note(FD->getLocation(), diag::note_declared_at);
2164 return false;
2165 }
2166 }
2167
2168 // Check that the object is a global. Note that the fake 'this' object we
2169 // manufacture when checking potential constant expressions is conservatively
2170 // assumed to be global here.
2171 if (!IsGlobalLValue(Base)) {
2172 if (Info.getLangOpts().CPlusPlus11) {
2173 const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>();
2174 Info.FFDiag(Loc, diag::note_constexpr_non_global, 1)
2175 << IsReferenceType << !Designator.Entries.empty()
2176 << !!VD << VD;
2177
2178 auto *VarD = dyn_cast_or_null<VarDecl>(VD);
2179 if (VarD && VarD->isConstexpr()) {
2180 // Non-static local constexpr variables have unintuitive semantics:
2181 // constexpr int a = 1;
2182 // constexpr const int *p = &a;
2183 // ... is invalid because the address of 'a' is not constant. Suggest
2184 // adding a 'static' in this case.
2185 Info.Note(VarD->getLocation(), diag::note_constexpr_not_static)
2186 << VarD
2187 << FixItHint::CreateInsertion(VarD->getBeginLoc(), "static ");
2188 } else {
2189 NoteLValueLocation(Info, Base);
2190 }
2191 } else {
2192 Info.FFDiag(Loc);
2193 }
2194 // Don't allow references to temporaries to escape.
2195 return false;
2196 }
2197 assert((Info.checkingPotentialConstantExpression() ||((void)0)
2198 LVal.getLValueCallIndex() == 0) &&((void)0)
2199 "have call index for global lvalue")((void)0);
2200
2201 if (Base.is<DynamicAllocLValue>()) {
2202 Info.FFDiag(Loc, diag::note_constexpr_dynamic_alloc)
2203 << IsReferenceType << !Designator.Entries.empty();
2204 NoteLValueLocation(Info, Base);
2205 return false;
2206 }
2207
2208 if (BaseVD) {
2209 if (const VarDecl *Var = dyn_cast<const VarDecl>(BaseVD)) {
2210 // Check if this is a thread-local variable.
2211 if (Var->getTLSKind())
2212 // FIXME: Diagnostic!
2213 return false;
2214
2215 // A dllimport variable never acts like a constant, unless we're
2216 // evaluating a value for use only in name mangling.
2217 if (!isForManglingOnly(Kind) && Var->hasAttr<DLLImportAttr>())
2218 // FIXME: Diagnostic!
2219 return false;
2220 }
2221 if (const auto *FD = dyn_cast<const FunctionDecl>(BaseVD)) {
2222 // __declspec(dllimport) must be handled very carefully:
2223 // We must never initialize an expression with the thunk in C++.
2224 // Doing otherwise would allow the same id-expression to yield
2225 // different addresses for the same function in different translation
2226 // units. However, this means that we must dynamically initialize the
2227 // expression with the contents of the import address table at runtime.
2228 //
2229 // The C language has no notion of ODR; furthermore, it has no notion of
2230 // dynamic initialization. This means that we are permitted to
2231 // perform initialization with the address of the thunk.
2232 if (Info.getLangOpts().CPlusPlus && !isForManglingOnly(Kind) &&
2233 FD->hasAttr<DLLImportAttr>())
2234 // FIXME: Diagnostic!
2235 return false;
2236 }
2237 } else if (const auto *MTE =
2238 dyn_cast_or_null<MaterializeTemporaryExpr>(BaseE)) {
2239 if (CheckedTemps.insert(MTE).second) {
2240 QualType TempType = getType(Base);
2241 if (TempType.isDestructedType()) {
2242 Info.FFDiag(MTE->getExprLoc(),
2243 diag::note_constexpr_unsupported_temporary_nontrivial_dtor)
2244 << TempType;
2245 return false;
2246 }
2247
2248 APValue *V = MTE->getOrCreateValue(false);
2249 assert(V && "evasluation result refers to uninitialised temporary")((void)0);
2250 if (!CheckEvaluationResult(CheckEvaluationResultKind::ConstantExpression,
2251 Info, MTE->getExprLoc(), TempType, *V,
2252 Kind, SourceLocation(), CheckedTemps))
2253 return false;
2254 }
2255 }
2256
2257 // Allow address constant expressions to be past-the-end pointers. This is
2258 // an extension: the standard requires them to point to an object.
2259 if (!IsReferenceType)
2260 return true;
2261
2262 // A reference constant expression must refer to an object.
2263 if (!Base) {
2264 // FIXME: diagnostic
2265 Info.CCEDiag(Loc);
2266 return true;
2267 }
2268
2269 // Does this refer one past the end of some object?
2270 if (!Designator.Invalid && Designator.isOnePastTheEnd()) {
2271 Info.FFDiag(Loc, diag::note_constexpr_past_end, 1)
2272 << !Designator.Entries.empty() << !!BaseVD << BaseVD;
2273 NoteLValueLocation(Info, Base);
2274 }
2275
2276 return true;
2277}
2278
2279/// Member pointers are constant expressions unless they point to a
2280/// non-virtual dllimport member function.
2281static bool CheckMemberPointerConstantExpression(EvalInfo &Info,
2282 SourceLocation Loc,
2283 QualType Type,
2284 const APValue &Value,
2285 ConstantExprKind Kind) {
2286 const ValueDecl *Member = Value.getMemberPointerDecl();
2287 const auto *FD = dyn_cast_or_null<CXXMethodDecl>(Member);
2288 if (!FD)
2289 return true;
2290 if (FD->isConsteval()) {
2291 Info.FFDiag(Loc, diag::note_consteval_address_accessible) << /*pointer*/ 0;
2292 Info.Note(FD->getLocation(), diag::note_declared_at);
2293 return false;
2294 }
2295 return isForManglingOnly(Kind) || FD->isVirtual() ||
2296 !FD->hasAttr<DLLImportAttr>();
2297}
2298
2299/// Check that this core constant expression is of literal type, and if not,
2300/// produce an appropriate diagnostic.
2301static bool CheckLiteralType(EvalInfo &Info, const Expr *E,
2302 const LValue *This = nullptr) {
2303 if (!E->isPRValue() || E->getType()->isLiteralType(Info.Ctx))
2304 return true;
2305
2306 // C++1y: A constant initializer for an object o [...] may also invoke
2307 // constexpr constructors for o and its subobjects even if those objects
2308 // are of non-literal class types.
2309 //
2310 // C++11 missed this detail for aggregates, so classes like this:
2311 // struct foo_t { union { int i; volatile int j; } u; };
2312 // are not (obviously) initializable like so:
2313 // __attribute__((__require_constant_initialization__))
2314 // static const foo_t x = {{0}};
2315 // because "i" is a subobject with non-literal initialization (due to the
2316 // volatile member of the union). See:
2317 // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1677
2318 // Therefore, we use the C++1y behavior.
2319 if (This && Info.EvaluatingDecl == This->getLValueBase())
2320 return true;
2321
2322 // Prvalue constant expressions must be of literal types.
2323 if (Info.getLangOpts().CPlusPlus11)
2324 Info.FFDiag(E, diag::note_constexpr_nonliteral)
2325 << E->getType();
2326 else
2327 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr);
2328 return false;
2329}
2330
2331static bool CheckEvaluationResult(CheckEvaluationResultKind CERK,
2332 EvalInfo &Info, SourceLocation DiagLoc,
2333 QualType Type, const APValue &Value,
2334 ConstantExprKind Kind,
2335 SourceLocation SubobjectLoc,
2336 CheckedTemporaries &CheckedTemps) {
2337 if (!Value.hasValue()) {
2338 Info.FFDiag(DiagLoc, diag::note_constexpr_uninitialized)
2339 << true << Type;
2340 if (SubobjectLoc.isValid())
2341 Info.Note(SubobjectLoc, diag::note_constexpr_subobject_declared_here);
2342 return false;
2343 }
2344
2345 // We allow _Atomic(T) to be initialized from anything that T can be
2346 // initialized from.
2347 if (const AtomicType *AT = Type->getAs<AtomicType>())
2348 Type = AT->getValueType();
2349
2350 // Core issue 1454: For a literal constant expression of array or class type,
2351 // each subobject of its value shall have been initialized by a constant
2352 // expression.
2353 if (Value.isArray()) {
2354 QualType EltTy = Type->castAsArrayTypeUnsafe()->getElementType();
2355 for (unsigned I = 0, N = Value.getArrayInitializedElts(); I != N; ++I) {
2356 if (!CheckEvaluationResult(CERK, Info, DiagLoc, EltTy,
2357 Value.getArrayInitializedElt(I), Kind,
2358 SubobjectLoc, CheckedTemps))
2359 return false;
2360 }
2361 if (!Value.hasArrayFiller())
2362 return true;
2363 return CheckEvaluationResult(CERK, Info, DiagLoc, EltTy,
2364 Value.getArrayFiller(), Kind, SubobjectLoc,
2365 CheckedTemps);
2366 }
2367 if (Value.isUnion() && Value.getUnionField()) {
2368 return CheckEvaluationResult(
2369 CERK, Info, DiagLoc, Value.getUnionField()->getType(),
2370 Value.getUnionValue(), Kind, Value.getUnionField()->getLocation(),
2371 CheckedTemps);
2372 }
2373 if (Value.isStruct()) {
2374 RecordDecl *RD = Type->castAs<RecordType>()->getDecl();
2375 if (const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD)) {
2376 unsigned BaseIndex = 0;
2377 for (const CXXBaseSpecifier &BS : CD->bases()) {
2378 if (!CheckEvaluationResult(CERK, Info, DiagLoc, BS.getType(),
2379 Value.getStructBase(BaseIndex), Kind,
2380 BS.getBeginLoc(), CheckedTemps))
2381 return false;
2382 ++BaseIndex;
2383 }
2384 }
2385 for (const auto *I : RD->fields()) {
2386 if (I->isUnnamedBitfield())
2387 continue;
2388
2389 if (!CheckEvaluationResult(CERK, Info, DiagLoc, I->getType(),
2390 Value.getStructField(I->getFieldIndex()),
2391 Kind, I->getLocation(), CheckedTemps))
2392 return false;
2393 }
2394 }
2395
2396 if (Value.isLValue() &&
2397 CERK == CheckEvaluationResultKind::ConstantExpression) {
2398 LValue LVal;
2399 LVal.setFrom(Info.Ctx, Value);
2400 return CheckLValueConstantExpression(Info, DiagLoc, Type, LVal, Kind,
2401 CheckedTemps);
2402 }
2403
2404 if (Value.isMemberPointer() &&
2405 CERK == CheckEvaluationResultKind::ConstantExpression)
2406 return CheckMemberPointerConstantExpression(Info, DiagLoc, Type, Value, Kind);
2407
2408 // Everything else is fine.
2409 return true;
2410}
2411
2412/// Check that this core constant expression value is a valid value for a
2413/// constant expression. If not, report an appropriate diagnostic. Does not
2414/// check that the expression is of literal type.
2415static bool CheckConstantExpression(EvalInfo &Info, SourceLocation DiagLoc,
2416 QualType Type, const APValue &Value,
2417 ConstantExprKind Kind) {
2418 // Nothing to check for a constant expression of type 'cv void'.
2419 if (Type->isVoidType())
2420 return true;
2421
2422 CheckedTemporaries CheckedTemps;
2423 return CheckEvaluationResult(CheckEvaluationResultKind::ConstantExpression,
2424 Info, DiagLoc, Type, Value, Kind,
2425 SourceLocation(), CheckedTemps);
2426}
2427
2428/// Check that this evaluated value is fully-initialized and can be loaded by
2429/// an lvalue-to-rvalue conversion.
2430static bool CheckFullyInitialized(EvalInfo &Info, SourceLocation DiagLoc,
2431 QualType Type, const APValue &Value) {
2432 CheckedTemporaries CheckedTemps;
2433 return CheckEvaluationResult(
2434 CheckEvaluationResultKind::FullyInitialized, Info, DiagLoc, Type, Value,
2435 ConstantExprKind::Normal, SourceLocation(), CheckedTemps);
2436}
2437
2438/// Enforce C++2a [expr.const]/4.17, which disallows new-expressions unless
2439/// "the allocated storage is deallocated within the evaluation".
2440static bool CheckMemoryLeaks(EvalInfo &Info) {
2441 if (!Info.HeapAllocs.empty()) {
2442 // We can still fold to a constant despite a compile-time memory leak,
2443 // so long as the heap allocation isn't referenced in the result (we check
2444 // that in CheckConstantExpression).
2445 Info.CCEDiag(Info.HeapAllocs.begin()->second.AllocExpr,
2446 diag::note_constexpr_memory_leak)
2447 << unsigned(Info.HeapAllocs.size() - 1);
2448 }
2449 return true;
2450}
2451
2452static bool EvalPointerValueAsBool(const APValue &Value, bool &Result) {
2453 // A null base expression indicates a null pointer. These are always
2454 // evaluatable, and they are false unless the offset is zero.
2455 if (!Value.getLValueBase()) {
2456 Result = !Value.getLValueOffset().isZero();
2457 return true;
2458 }
2459
2460 // We have a non-null base. These are generally known to be true, but if it's
2461 // a weak declaration it can be null at runtime.
2462 Result = true;
2463 const ValueDecl *Decl = Value.getLValueBase().dyn_cast<const ValueDecl*>();
2464 return !Decl || !Decl->isWeak();
2465}
2466
2467static bool HandleConversionToBool(const APValue &Val, bool &Result) {
2468 switch (Val.getKind()) {
2469 case APValue::None:
2470 case APValue::Indeterminate:
2471 return false;
2472 case APValue::Int:
2473 Result = Val.getInt().getBoolValue();
2474 return true;
2475 case APValue::FixedPoint:
2476 Result = Val.getFixedPoint().getBoolValue();
2477 return true;
2478 case APValue::Float:
2479 Result = !Val.getFloat().isZero();
2480 return true;
2481 case APValue::ComplexInt:
2482 Result = Val.getComplexIntReal().getBoolValue() ||
2483 Val.getComplexIntImag().getBoolValue();
2484 return true;
2485 case APValue::ComplexFloat:
2486 Result = !Val.getComplexFloatReal().isZero() ||
2487 !Val.getComplexFloatImag().isZero();
2488 return true;
2489 case APValue::LValue:
2490 return EvalPointerValueAsBool(Val, Result);
2491 case APValue::MemberPointer:
2492 Result = Val.getMemberPointerDecl();
2493 return true;
2494 case APValue::Vector:
2495 case APValue::Array:
2496 case APValue::Struct:
2497 case APValue::Union:
2498 case APValue::AddrLabelDiff:
2499 return false;
2500 }
2501
2502 llvm_unreachable("unknown APValue kind")__builtin_unreachable();
2503}
2504
2505static bool EvaluateAsBooleanCondition(const Expr *E, bool &Result,
2506 EvalInfo &Info) {
2507 assert(!E->isValueDependent())((void)0);
2508 assert(E->isPRValue() && "missing lvalue-to-rvalue conv in bool condition")((void)0);
2509 APValue Val;
2510 if (!Evaluate(Val, Info, E))
2511 return false;
2512 return HandleConversionToBool(Val, Result);
2513}
2514
2515template<typename T>
2516static bool HandleOverflow(EvalInfo &Info, const Expr *E,
2517 const T &SrcValue, QualType DestType) {
2518 Info.CCEDiag(E, diag::note_constexpr_overflow)
2519 << SrcValue << DestType;
2520 return Info.noteUndefinedBehavior();
2521}
2522
2523static bool HandleFloatToIntCast(EvalInfo &Info, const Expr *E,
2524 QualType SrcType, const APFloat &Value,
2525 QualType DestType, APSInt &Result) {
2526 unsigned DestWidth = Info.Ctx.getIntWidth(DestType);
2527 // Determine whether we are converting to unsigned or signed.
2528 bool DestSigned = DestType->isSignedIntegerOrEnumerationType();
2529
2530 Result = APSInt(DestWidth, !DestSigned);
2531 bool ignored;
2532 if (Value.convertToInteger(Result, llvm::APFloat::rmTowardZero, &ignored)
2533 & APFloat::opInvalidOp)
2534 return HandleOverflow(Info, E, Value, DestType);
2535 return true;
2536}
2537
2538/// Get rounding mode used for evaluation of the specified expression.
2539/// \param[out] DynamicRM Is set to true is the requested rounding mode is
2540/// dynamic.
2541/// If rounding mode is unknown at compile time, still try to evaluate the
2542/// expression. If the result is exact, it does not depend on rounding mode.
2543/// So return "tonearest" mode instead of "dynamic".
2544static llvm::RoundingMode getActiveRoundingMode(EvalInfo &Info, const Expr *E,
2545 bool &DynamicRM) {
2546 llvm::RoundingMode RM =
2547 E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()).getRoundingMode();
2548 DynamicRM = (RM == llvm::RoundingMode::Dynamic);
2549 if (DynamicRM)
2550 RM = llvm::RoundingMode::NearestTiesToEven;
2551 return RM;
2552}
2553
2554/// Check if the given evaluation result is allowed for constant evaluation.
2555static bool checkFloatingPointResult(EvalInfo &Info, const Expr *E,
2556 APFloat::opStatus St) {
2557 // In a constant context, assume that any dynamic rounding mode or FP
2558 // exception state matches the default floating-point environment.
2559 if (Info.InConstantContext)
2560 return true;
2561
2562 FPOptions FPO = E->getFPFeaturesInEffect(Info.Ctx.getLangOpts());
2563 if ((St & APFloat::opInexact) &&
2564 FPO.getRoundingMode() == llvm::RoundingMode::Dynamic) {
2565 // Inexact result means that it depends on rounding mode. If the requested
2566 // mode is dynamic, the evaluation cannot be made in compile time.
2567 Info.FFDiag(E, diag::note_constexpr_dynamic_rounding);
2568 return false;
2569 }
2570
2571 if ((St != APFloat::opOK) &&
2572 (FPO.getRoundingMode() == llvm::RoundingMode::Dynamic ||
2573 FPO.getFPExceptionMode() != LangOptions::FPE_Ignore ||
2574 FPO.getAllowFEnvAccess())) {
2575 Info.FFDiag(E, diag::note_constexpr_float_arithmetic_strict);
2576 return false;
2577 }
2578
2579 if ((St & APFloat::opStatus::opInvalidOp) &&
2580 FPO.getFPExceptionMode() != LangOptions::FPE_Ignore) {
2581 // There is no usefully definable result.
2582 Info.FFDiag(E);
2583 return false;
2584 }
2585
2586 // FIXME: if:
2587 // - evaluation triggered other FP exception, and
2588 // - exception mode is not "ignore", and
2589 // - the expression being evaluated is not a part of global variable
2590 // initializer,
2591 // the evaluation probably need to be rejected.
2592 return true;
2593}
2594
2595static bool HandleFloatToFloatCast(EvalInfo &Info, const Expr *E,
2596 QualType SrcType, QualType DestType,
2597 APFloat &Result) {
2598 assert(isa<CastExpr>(E) || isa<CompoundAssignOperator>(E))((void)0);
2599 bool DynamicRM;
2600 llvm::RoundingMode RM = getActiveRoundingMode(Info, E, DynamicRM);
2601 APFloat::opStatus St;
2602 APFloat Value = Result;
2603 bool ignored;
2604 St = Result.convert(Info.Ctx.getFloatTypeSemantics(DestType), RM, &ignored);
2605 return checkFloatingPointResult(Info, E, St);
2606}
2607
2608static APSInt HandleIntToIntCast(EvalInfo &Info, const Expr *E,
2609 QualType DestType, QualType SrcType,
2610 const APSInt &Value) {
2611 unsigned DestWidth = Info.Ctx.getIntWidth(DestType);
2612 // Figure out if this is a truncate, extend or noop cast.
2613 // If the input is signed, do a sign extend, noop, or truncate.
2614 APSInt Result = Value.extOrTrunc(DestWidth);
2615 Result.setIsUnsigned(DestType->isUnsignedIntegerOrEnumerationType());
2616 if (DestType->isBooleanType())
2617 Result = Value.getBoolValue();
2618 return Result;
2619}
2620
2621static bool HandleIntToFloatCast(EvalInfo &Info, const Expr *E,
2622 const FPOptions FPO,
2623 QualType SrcType, const APSInt &Value,
2624 QualType DestType, APFloat &Result) {
2625 Result = APFloat(Info.Ctx.getFloatTypeSemantics(DestType), 1);
2626 APFloat::opStatus St = Result.convertFromAPInt(Value, Value.isSigned(),
2627 APFloat::rmNearestTiesToEven);
2628 if (!Info.InConstantContext && St != llvm::APFloatBase::opOK &&
2629 FPO.isFPConstrained()) {
2630 Info.FFDiag(E, diag::note_constexpr_float_arithmetic_strict);
2631 return false;
2632 }
2633 return true;
2634}
2635
2636static bool truncateBitfieldValue(EvalInfo &Info, const Expr *E,
2637 APValue &Value, const FieldDecl *FD) {
2638 assert(FD->isBitField() && "truncateBitfieldValue on non-bitfield")((void)0);
2639
2640 if (!Value.isInt()) {
2641 // Trying to store a pointer-cast-to-integer into a bitfield.
2642 // FIXME: In this case, we should provide the diagnostic for casting
2643 // a pointer to an integer.
2644 assert(Value.isLValue() && "integral value neither int nor lvalue?")((void)0);
2645 Info.FFDiag(E);
2646 return false;
2647 }
2648
2649 APSInt &Int = Value.getInt();
2650 unsigned OldBitWidth = Int.getBitWidth();
2651 unsigned NewBitWidth = FD->getBitWidthValue(Info.Ctx);
2652 if (NewBitWidth < OldBitWidth)
2653 Int = Int.trunc(NewBitWidth).extend(OldBitWidth);
2654 return true;
2655}
2656
2657static bool EvalAndBitcastToAPInt(EvalInfo &Info, const Expr *E,
2658 llvm::APInt &Res) {
2659 APValue SVal;
2660 if (!Evaluate(SVal, Info, E))
2661 return false;
2662 if (SVal.isInt()) {
2663 Res = SVal.getInt();
2664 return true;
2665 }
2666 if (SVal.isFloat()) {
2667 Res = SVal.getFloat().bitcastToAPInt();
2668 return true;
2669 }
2670 if (SVal.isVector()) {
2671 QualType VecTy = E->getType();
2672 unsigned VecSize = Info.Ctx.getTypeSize(VecTy);
2673 QualType EltTy = VecTy->castAs<VectorType>()->getElementType();
2674 unsigned EltSize = Info.Ctx.getTypeSize(EltTy);
2675 bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian();
2676 Res = llvm::APInt::getNullValue(VecSize);
2677 for (unsigned i = 0; i < SVal.getVectorLength(); i++) {
2678 APValue &Elt = SVal.getVectorElt(i);
2679 llvm::APInt EltAsInt;
2680 if (Elt.isInt()) {
2681 EltAsInt = Elt.getInt();
2682 } else if (Elt.isFloat()) {
2683 EltAsInt = Elt.getFloat().bitcastToAPInt();
2684 } else {
2685 // Don't try to handle vectors of anything other than int or float
2686 // (not sure if it's possible to hit this case).
2687 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr);
2688 return false;
2689 }
2690 unsigned BaseEltSize = EltAsInt.getBitWidth();
2691 if (BigEndian)
2692 Res |= EltAsInt.zextOrTrunc(VecSize).rotr(i*EltSize+BaseEltSize);
2693 else
2694 Res |= EltAsInt.zextOrTrunc(VecSize).rotl(i*EltSize);
2695 }
2696 return true;
2697 }
2698 // Give up if the input isn't an int, float, or vector. For example, we
2699 // reject "(v4i16)(intptr_t)&a".
2700 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr);
2701 return false;
2702}
2703
2704/// Perform the given integer operation, which is known to need at most BitWidth
2705/// bits, and check for overflow in the original type (if that type was not an
2706/// unsigned type).
2707template<typename Operation>
2708static bool CheckedIntArithmetic(EvalInfo &Info, const Expr *E,
2709 const APSInt &LHS, const APSInt &RHS,
2710 unsigned BitWidth, Operation Op,
2711 APSInt &Result) {
2712 if (LHS.isUnsigned()) {
2713 Result = Op(LHS, RHS);
2714 return true;
2715 }
2716
2717 APSInt Value(Op(LHS.extend(BitWidth), RHS.extend(BitWidth)), false);
2718 Result = Value.trunc(LHS.getBitWidth());
2719 if (Result.extend(BitWidth) != Value) {
2720 if (Info.checkingForUndefinedBehavior())
2721 Info.Ctx.getDiagnostics().Report(E->getExprLoc(),
2722 diag::warn_integer_constant_overflow)
2723 << toString(Result, 10) << E->getType();
2724 return HandleOverflow(Info, E, Value, E->getType());
2725 }
2726 return true;
2727}
2728
2729/// Perform the given binary integer operation.
2730static bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS,
2731 BinaryOperatorKind Opcode, APSInt RHS,
2732 APSInt &Result) {
2733 switch (Opcode) {
2734 default:
2735 Info.FFDiag(E);
2736 return false;
2737 case BO_Mul:
2738 return CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() * 2,
2739 std::multiplies<APSInt>(), Result);
2740 case BO_Add:
2741 return CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() + 1,
2742 std::plus<APSInt>(), Result);
2743 case BO_Sub:
2744 return CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() + 1,
2745 std::minus<APSInt>(), Result);
2746 case BO_And: Result = LHS & RHS; return true;
2747 case BO_Xor: Result = LHS ^ RHS; return true;
2748 case BO_Or: Result = LHS | RHS; return true;
2749 case BO_Div:
2750 case BO_Rem:
2751 if (RHS == 0) {
2752 Info.FFDiag(E, diag::note_expr_divide_by_zero);
2753 return false;
2754 }
2755 Result = (Opcode == BO_Rem ? LHS % RHS : LHS / RHS);
2756 // Check for overflow case: INT_MIN / -1 or INT_MIN % -1. APSInt supports
2757 // this operation and gives the two's complement result.
2758 if (RHS.isNegative() && RHS.isAllOnesValue() &&
2759 LHS.isSigned() && LHS.isMinSignedValue())
2760 return HandleOverflow(Info, E, -LHS.extend(LHS.getBitWidth() + 1),
2761 E->getType());
2762 return true;
2763 case BO_Shl: {
2764 if (Info.getLangOpts().OpenCL)
2765 // OpenCL 6.3j: shift values are effectively % word size of LHS.
2766 RHS &= APSInt(llvm::APInt(RHS.getBitWidth(),
2767 static_cast<uint64_t>(LHS.getBitWidth() - 1)),
2768 RHS.isUnsigned());
2769 else if (RHS.isSigned() && RHS.isNegative()) {
2770 // During constant-folding, a negative shift is an opposite shift. Such
2771 // a shift is not a constant expression.
2772 Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS;
2773 RHS = -RHS;
2774 goto shift_right;
2775 }
2776 shift_left:
2777 // C++11 [expr.shift]p1: Shift width must be less than the bit width of
2778 // the shifted type.
2779 unsigned SA = (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1);
2780 if (SA != RHS) {
2781 Info.CCEDiag(E, diag::note_constexpr_large_shift)
2782 << RHS << E->getType() << LHS.getBitWidth();
2783 } else if (LHS.isSigned() && !Info.getLangOpts().CPlusPlus20) {
2784 // C++11 [expr.shift]p2: A signed left shift must have a non-negative
2785 // operand, and must not overflow the corresponding unsigned type.
2786 // C++2a [expr.shift]p2: E1 << E2 is the unique value congruent to
2787 // E1 x 2^E2 module 2^N.
2788 if (LHS.isNegative())
2789 Info.CCEDiag(E, diag::note_constexpr_lshift_of_negative) << LHS;
2790 else if (LHS.countLeadingZeros() < SA)
2791 Info.CCEDiag(E, diag::note_constexpr_lshift_discards);
2792 }
2793 Result = LHS << SA;
2794 return true;
2795 }
2796 case BO_Shr: {
2797 if (Info.getLangOpts().OpenCL)
2798 // OpenCL 6.3j: shift values are effectively % word size of LHS.
2799 RHS &= APSInt(llvm::APInt(RHS.getBitWidth(),
2800 static_cast<uint64_t>(LHS.getBitWidth() - 1)),
2801 RHS.isUnsigned());
2802 else if (RHS.isSigned() && RHS.isNegative()) {
2803 // During constant-folding, a negative shift is an opposite shift. Such a
2804 // shift is not a constant expression.
2805 Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS;
2806 RHS = -RHS;
2807 goto shift_left;
2808 }
2809 shift_right:
2810 // C++11 [expr.shift]p1: Shift width must be less than the bit width of the
2811 // shifted type.
2812 unsigned SA = (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1);
2813 if (SA != RHS)
2814 Info.CCEDiag(E, diag::note_constexpr_large_shift)
2815 << RHS << E->getType() << LHS.getBitWidth();
2816 Result = LHS >> SA;
2817 return true;
2818 }
2819
2820 case BO_LT: Result = LHS < RHS; return true;
2821 case BO_GT: Result = LHS > RHS; return true;
2822 case BO_LE: Result = LHS <= RHS; return true;
2823 case BO_GE: Result = LHS >= RHS; return true;
2824 case BO_EQ: Result = LHS == RHS; return true;
2825 case BO_NE: Result = LHS != RHS; return true;
2826 case BO_Cmp:
2827 llvm_unreachable("BO_Cmp should be handled elsewhere")__builtin_unreachable();
2828 }
2829}
2830
2831/// Perform the given binary floating-point operation, in-place, on LHS.
2832static bool handleFloatFloatBinOp(EvalInfo &Info, const BinaryOperator *E,
2833 APFloat &LHS, BinaryOperatorKind Opcode,
2834 const APFloat &RHS) {
2835 bool DynamicRM;
2836 llvm::RoundingMode RM = getActiveRoundingMode(Info, E, DynamicRM);
2837 APFloat::opStatus St;
2838 switch (Opcode) {
2839 default:
2840 Info.FFDiag(E);
2841 return false;
2842 case BO_Mul:
2843 St = LHS.multiply(RHS, RM);
2844 break;
2845 case BO_Add:
2846 St = LHS.add(RHS, RM);
2847 break;
2848 case BO_Sub:
2849 St = LHS.subtract(RHS, RM);
2850 break;
2851 case BO_Div:
2852 // [expr.mul]p4:
2853 // If the second operand of / or % is zero the behavior is undefined.
2854 if (RHS.isZero())
2855 Info.CCEDiag(E, diag::note_expr_divide_by_zero);
2856 St = LHS.divide(RHS, RM);
2857 break;
2858 }
2859
2860 // [expr.pre]p4:
2861 // If during the evaluation of an expression, the result is not
2862 // mathematically defined [...], the behavior is undefined.
2863 // FIXME: C++ rules require us to not conform to IEEE 754 here.
2864 if (LHS.isNaN()) {
2865 Info.CCEDiag(E, diag::note_constexpr_float_arithmetic) << LHS.isNaN();
2866 return Info.noteUndefinedBehavior();
2867 }
2868
2869 return checkFloatingPointResult(Info, E, St);
2870}
2871
2872static bool handleLogicalOpForVector(const APInt &LHSValue,
2873 BinaryOperatorKind Opcode,
2874 const APInt &RHSValue, APInt &Result) {
2875 bool LHS = (LHSValue != 0);
2876 bool RHS = (RHSValue != 0);
2877
2878 if (Opcode == BO_LAnd)
2879 Result = LHS && RHS;
2880 else
2881 Result = LHS || RHS;
2882 return true;
2883}
2884static bool handleLogicalOpForVector(const APFloat &LHSValue,
2885 BinaryOperatorKind Opcode,
2886 const APFloat &RHSValue, APInt &Result) {
2887 bool LHS = !LHSValue.isZero();
2888 bool RHS = !RHSValue.isZero();
2889
2890 if (Opcode == BO_LAnd)
2891 Result = LHS && RHS;
2892 else
2893 Result = LHS || RHS;
2894 return true;
2895}
2896
2897static bool handleLogicalOpForVector(const APValue &LHSValue,
2898 BinaryOperatorKind Opcode,
2899 const APValue &RHSValue, APInt &Result) {
2900 // The result is always an int type, however operands match the first.
2901 if (LHSValue.getKind() == APValue::Int)
2902 return handleLogicalOpForVector(LHSValue.getInt(), Opcode,
2903 RHSValue.getInt(), Result);
2904 assert(LHSValue.getKind() == APValue::Float && "Should be no other options")((void)0);
2905 return handleLogicalOpForVector(LHSValue.getFloat(), Opcode,
2906 RHSValue.getFloat(), Result);
2907}
2908
2909template <typename APTy>
2910static bool
2911handleCompareOpForVectorHelper(const APTy &LHSValue, BinaryOperatorKind Opcode,
2912 const APTy &RHSValue, APInt &Result) {
2913 switch (Opcode) {
2914 default:
2915 llvm_unreachable("unsupported binary operator")__builtin_unreachable();
2916 case BO_EQ:
2917 Result = (LHSValue == RHSValue);
2918 break;
2919 case BO_NE:
2920 Result = (LHSValue != RHSValue);
2921 break;
2922 case BO_LT:
2923 Result = (LHSValue < RHSValue);
2924 break;
2925 case BO_GT:
2926 Result = (LHSValue > RHSValue);
2927 break;
2928 case BO_LE:
2929 Result = (LHSValue <= RHSValue);
2930 break;
2931 case BO_GE:
2932 Result = (LHSValue >= RHSValue);
2933 break;
2934 }
2935
2936 return true;
2937}
2938
2939static bool handleCompareOpForVector(const APValue &LHSValue,
2940 BinaryOperatorKind Opcode,
2941 const APValue &RHSValue, APInt &Result) {
2942 // The result is always an int type, however operands match the first.
2943 if (LHSValue.getKind() == APValue::Int)
2944 return handleCompareOpForVectorHelper(LHSValue.getInt(), Opcode,
2945 RHSValue.getInt(), Result);
2946 assert(LHSValue.getKind() == APValue::Float && "Should be no other options")((void)0);
2947 return handleCompareOpForVectorHelper(LHSValue.getFloat(), Opcode,
2948 RHSValue.getFloat(), Result);
2949}
2950
2951// Perform binary operations for vector types, in place on the LHS.
2952static bool handleVectorVectorBinOp(EvalInfo &Info, const BinaryOperator *E,
2953 BinaryOperatorKind Opcode,
2954 APValue &LHSValue,
2955 const APValue &RHSValue) {
2956 assert(Opcode != BO_PtrMemD && Opcode != BO_PtrMemI &&((void)0)
2957 "Operation not supported on vector types")((void)0);
2958
2959 const auto *VT = E->getType()->castAs<VectorType>();
2960 unsigned NumElements = VT->getNumElements();
2961 QualType EltTy = VT->getElementType();
2962
2963 // In the cases (typically C as I've observed) where we aren't evaluating
2964 // constexpr but are checking for cases where the LHS isn't yet evaluatable,
2965 // just give up.
2966 if (!LHSValue.isVector()) {
2967 assert(LHSValue.isLValue() &&((void)0)
2968 "A vector result that isn't a vector OR uncalculated LValue")((void)0);
2969 Info.FFDiag(E);
2970 return false;
2971 }
2972
2973 assert(LHSValue.getVectorLength() == NumElements &&((void)0)
2974 RHSValue.getVectorLength() == NumElements && "Different vector sizes")((void)0);
2975
2976 SmallVector<APValue, 4> ResultElements;
2977
2978 for (unsigned EltNum = 0; EltNum < NumElements; ++EltNum) {
2979 APValue LHSElt = LHSValue.getVectorElt(EltNum);
2980 APValue RHSElt = RHSValue.getVectorElt(EltNum);
2981
2982 if (EltTy->isIntegerType()) {
2983 APSInt EltResult{Info.Ctx.getIntWidth(EltTy),
2984 EltTy->isUnsignedIntegerType()};
2985 bool Success = true;
2986
2987 if (BinaryOperator::isLogicalOp(Opcode))
2988 Success = handleLogicalOpForVector(LHSElt, Opcode, RHSElt, EltResult);
2989 else if (BinaryOperator::isComparisonOp(Opcode))
2990 Success = handleCompareOpForVector(LHSElt, Opcode, RHSElt, EltResult);
2991 else
2992 Success = handleIntIntBinOp(Info, E, LHSElt.getInt(), Opcode,
2993 RHSElt.getInt(), EltResult);
2994
2995 if (!Success) {
2996 Info.FFDiag(E);
2997 return false;
2998 }
2999 ResultElements.emplace_back(EltResult);
3000
3001 } else if (EltTy->isFloatingType()) {
3002 assert(LHSElt.getKind() == APValue::Float &&((void)0)
3003 RHSElt.getKind() == APValue::Float &&((void)0)
3004 "Mismatched LHS/RHS/Result Type")((void)0);
3005 APFloat LHSFloat = LHSElt.getFloat();
3006
3007 if (!handleFloatFloatBinOp(Info, E, LHSFloat, Opcode,
3008 RHSElt.getFloat())) {
3009 Info.FFDiag(E);
3010 return false;
3011 }
3012
3013 ResultElements.emplace_back(LHSFloat);
3014 }
3015 }
3016
3017 LHSValue = APValue(ResultElements.data(), ResultElements.size());
3018 return true;
3019}
3020
3021/// Cast an lvalue referring to a base subobject to a derived class, by
3022/// truncating the lvalue's path to the given length.
3023static bool CastToDerivedClass(EvalInfo &Info, const Expr *E, LValue &Result,
3024 const RecordDecl *TruncatedType,
3025 unsigned TruncatedElements) {
3026 SubobjectDesignator &D = Result.Designator;
3027
3028 // Check we actually point to a derived class object.
3029 if (TruncatedElements == D.Entries.size())
3030 return true;
3031 assert(TruncatedElements >= D.MostDerivedPathLength &&((void)0)
3032 "not casting to a derived class")((void)0);
3033 if (!Result.checkSubobject(Info, E, CSK_Derived))
3034 return false;
3035
3036 // Truncate the path to the subobject, and remove any derived-to-base offsets.
3037 const RecordDecl *RD = TruncatedType;
3038 for (unsigned I = TruncatedElements, N = D.Entries.size(); I != N; ++I) {
3039 if (RD->isInvalidDecl()) return false;
3040 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD);
3041 const CXXRecordDecl *Base = getAsBaseClass(D.Entries[I]);
3042 if (isVirtualBaseClass(D.Entries[I]))
3043 Result.Offset -= Layout.getVBaseClassOffset(Base);
3044 else
3045 Result.Offset -= Layout.getBaseClassOffset(Base);
3046 RD = Base;
3047 }
3048 D.Entries.resize(TruncatedElements);
3049 return true;
3050}
3051
3052static bool HandleLValueDirectBase(EvalInfo &Info, const Expr *E, LValue &Obj,
3053 const CXXRecordDecl *Derived,
3054 const CXXRecordDecl *Base,
3055 const ASTRecordLayout *RL = nullptr) {
3056 if (!RL) {
3057 if (Derived->isInvalidDecl()) return false;
3058 RL = &Info.Ctx.getASTRecordLayout(Derived);
3059 }
3060
3061 Obj.getLValueOffset() += RL->getBaseClassOffset(Base);
3062 Obj.addDecl(Info, E, Base, /*Virtual*/ false);
3063 return true;
3064}
3065
3066static bool HandleLValueBase(EvalInfo &Info, const Expr *E, LValue &Obj,
3067 const CXXRecordDecl *DerivedDecl,
3068 const CXXBaseSpecifier *Base) {
3069 const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl();
3070
3071 if (!Base->isVirtual())
3072 return HandleLValueDirectBase(Info, E, Obj, DerivedDecl, BaseDecl);
3073
3074 SubobjectDesignator &D = Obj.Designator;
3075 if (D.Invalid)
3076 return false;
3077
3078 // Extract most-derived object and corresponding type.
3079 DerivedDecl = D.MostDerivedType->getAsCXXRecordDecl();
3080 if (!CastToDerivedClass(Info, E, Obj, DerivedDecl, D.MostDerivedPathLength))
3081 return false;
3082
3083 // Find the virtual base class.
3084 if (DerivedDecl->isInvalidDecl()) return false;
3085 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(DerivedDecl);
3086 Obj.getLValueOffset() += Layout.getVBaseClassOffset(BaseDecl);
3087 Obj.addDecl(Info, E, BaseDecl, /*Virtual*/ true);
3088 return true;
3089}
3090
3091static bool HandleLValueBasePath(EvalInfo &Info, const CastExpr *E,
3092 QualType Type, LValue &Result) {
3093 for (CastExpr::path_const_iterator PathI = E->path_begin(),
3094 PathE = E->path_end();
3095 PathI != PathE; ++PathI) {
3096 if (!HandleLValueBase(Info, E, Result, Type->getAsCXXRecordDecl(),
3097 *PathI))
3098 return false;
3099 Type = (*PathI)->getType();
3100 }
3101 return true;
3102}
3103
3104/// Cast an lvalue referring to a derived class to a known base subobject.
3105static bool CastToBaseClass(EvalInfo &Info, const Expr *E, LValue &Result,
3106 const CXXRecordDecl *DerivedRD,
3107 const CXXRecordDecl *BaseRD) {
3108 CXXBasePaths Paths(/*FindAmbiguities=*/false,
3109 /*RecordPaths=*/true, /*DetectVirtual=*/false);
3110 if (!DerivedRD->isDerivedFrom(BaseRD, Paths))
3111 llvm_unreachable("Class must be derived from the passed in base class!")__builtin_unreachable();
3112
3113 for (CXXBasePathElement &Elem : Paths.front())
3114 if (!HandleLValueBase(Info, E, Result, Elem.Class, Elem.Base))
3115 return false;
3116 return true;
3117}
3118
3119/// Update LVal to refer to the given field, which must be a member of the type
3120/// currently described by LVal.
3121static bool HandleLValueMember(EvalInfo &Info, const Expr *E, LValue &LVal,
3122 const FieldDecl *FD,
3123 const ASTRecordLayout *RL = nullptr) {
3124 if (!RL) {
3125 if (FD->getParent()->isInvalidDecl()) return false;
3126 RL = &Info.Ctx.getASTRecordLayout(FD->getParent());
3127 }
3128
3129 unsigned I = FD->getFieldIndex();
3130 LVal.adjustOffset(Info.Ctx.toCharUnitsFromBits(RL->getFieldOffset(I)));
3131 LVal.addDecl(Info, E, FD);
3132 return true;
3133}
3134
3135/// Update LVal to refer to the given indirect field.
3136static bool HandleLValueIndirectMember(EvalInfo &Info, const Expr *E,
3137 LValue &LVal,
3138 const IndirectFieldDecl *IFD) {
3139 for (const auto *C : IFD->chain())
3140 if (!HandleLValueMember(Info, E, LVal, cast<FieldDecl>(C)))
3141 return false;
3142 return true;
3143}
3144
3145/// Get the size of the given type in char units.
3146static bool HandleSizeof(EvalInfo &Info, SourceLocation Loc,
3147 QualType Type, CharUnits &Size) {
3148 // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc
3149 // extension.
3150 if (Type->isVoidType() || Type->isFunctionType()) {
3151 Size = CharUnits::One();
3152 return true;
3153 }
3154
3155 if (Type->isDependentType()) {
3156 Info.FFDiag(Loc);
3157 return false;
3158 }
3159
3160 if (!Type->isConstantSizeType()) {
3161 // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
3162 // FIXME: Better diagnostic.
3163 Info.FFDiag(Loc);
3164 return false;
3165 }
3166
3167 Size = Info.Ctx.getTypeSizeInChars(Type);
3168 return true;
3169}
3170
3171/// Update a pointer value to model pointer arithmetic.
3172/// \param Info - Information about the ongoing evaluation.
3173/// \param E - The expression being evaluated, for diagnostic purposes.
3174/// \param LVal - The pointer value to be updated.
3175/// \param EltTy - The pointee type represented by LVal.
3176/// \param Adjustment - The adjustment, in objects of type EltTy, to add.
3177static bool HandleLValueArrayAdjustment(EvalInfo &Info, const Expr *E,
3178 LValue &LVal, QualType EltTy,
3179 APSInt Adjustment) {
3180 CharUnits SizeOfPointee;
3181 if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfPointee))
3182 return false;
3183
3184 LVal.adjustOffsetAndIndex(Info, E, Adjustment, SizeOfPointee);
3185 return true;
3186}
3187
3188static bool HandleLValueArrayAdjustment(EvalInfo &Info, const Expr *E,
3189 LValue &LVal, QualType EltTy,
3190 int64_t Adjustment) {
3191 return HandleLValueArrayAdjustment(Info, E, LVal, EltTy,
3192 APSInt::get(Adjustment));
3193}
3194
3195/// Update an lvalue to refer to a component of a complex number.
3196/// \param Info - Information about the ongoing evaluation.
3197/// \param LVal - The lvalue to be updated.
3198/// \param EltTy - The complex number's component type.
3199/// \param Imag - False for the real component, true for the imaginary.
3200static bool HandleLValueComplexElement(EvalInfo &Info, const Expr *E,
3201 LValue &LVal, QualType EltTy,
3202 bool Imag) {
3203 if (Imag) {
3204 CharUnits SizeOfComponent;
3205 if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfComponent))
3206 return false;
3207 LVal.Offset += SizeOfComponent;
3208 }
3209 LVal.addComplex(Info, E, EltTy, Imag);
3210 return true;
3211}
3212
3213/// Try to evaluate the initializer for a variable declaration.
3214///
3215/// \param Info Information about the ongoing evaluation.
3216/// \param E An expression to be used when printing diagnostics.
3217/// \param VD The variable whose initializer should be obtained.
3218/// \param Version The version of the variable within the frame.
3219/// \param Frame The frame in which the variable was created. Must be null
3220/// if this variable is not local to the evaluation.
3221/// \param Result Filled in with a pointer to the value of the variable.
3222static bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E,
3223 const VarDecl *VD, CallStackFrame *Frame,
3224 unsigned Version, APValue *&Result) {
3225 APValue::LValueBase Base(VD, Frame ? Frame->Index : 0, Version);
3226
3227 // If this is a local variable, dig out its value.
3228 if (Frame) {
3229 Result = Frame->getTemporary(VD, Version);
3230 if (Result)
3231 return true;
3232
3233 if (!isa<ParmVarDecl>(VD)) {
3234 // Assume variables referenced within a lambda's call operator that were
3235 // not declared within the call operator are captures and during checking
3236 // of a potential constant expression, assume they are unknown constant
3237 // expressions.
3238 assert(isLambdaCallOperator(Frame->Callee) &&((void)0)
3239 (VD->getDeclContext() != Frame->Callee || VD->isInitCapture()) &&((void)0)
3240 "missing value for local variable")((void)0);
3241 if (Info.checkingPotentialConstantExpression())
3242 return false;
3243 // FIXME: This diagnostic is bogus; we do support captures. Is this code
3244 // still reachable at all?
3245 Info.FFDiag(E->getBeginLoc(),
3246 diag::note_unimplemented_constexpr_lambda_feature_ast)
3247 << "captures not currently allowed";
3248 return false;
3249 }
3250 }
3251
3252 // If we're currently evaluating the initializer of this declaration, use that
3253 // in-flight value.
3254 if (Info.EvaluatingDecl == Base) {
3255 Result = Info.EvaluatingDeclValue;
3256 return true;
3257 }
3258
3259 if (isa<ParmVarDecl>(VD)) {
3260 // Assume parameters of a potential constant expression are usable in
3261 // constant expressions.
3262 if (!Info.checkingPotentialConstantExpression() ||
3263 !Info.CurrentCall->Callee ||
3264 !Info.CurrentCall->Callee->Equals(VD->getDeclContext())) {
3265 if (Info.getLangOpts().CPlusPlus11) {
3266 Info.FFDiag(E, diag::note_constexpr_function_param_value_unknown)
3267 << VD;
3268 NoteLValueLocation(Info, Base);
3269 } else {
3270 Info.FFDiag(E);
3271 }
3272 }
3273 return false;
3274 }
3275
3276 // Dig out the initializer, and use the declaration which it's attached to.
3277 // FIXME: We should eventually check whether the variable has a reachable
3278 // initializing declaration.
3279 const Expr *Init = VD->getAnyInitializer(VD);
3280 if (!Init) {
3281 // Don't diagnose during potential constant expression checking; an
3282 // initializer might be added later.
3283 if (!Info.checkingPotentialConstantExpression()) {
3284 Info.FFDiag(E, diag::note_constexpr_var_init_unknown, 1)
3285 << VD;
3286 NoteLValueLocation(Info, Base);
3287 }
3288 return false;
3289 }
3290
3291 if (Init->isValueDependent()) {
3292 // The DeclRefExpr is not value-dependent, but the variable it refers to
3293 // has a value-dependent initializer. This should only happen in
3294 // constant-folding cases, where the variable is not actually of a suitable
3295 // type for use in a constant expression (otherwise the DeclRefExpr would
3296 // have been value-dependent too), so diagnose that.
3297 assert(!VD->mightBeUsableInConstantExpressions(Info.Ctx))((void)0);
3298 if (!Info.checkingPotentialConstantExpression()) {
3299 Info.FFDiag(E, Info.getLangOpts().CPlusPlus11
3300 ? diag::note_constexpr_ltor_non_constexpr
3301 : diag::note_constexpr_ltor_non_integral, 1)
3302 << VD << VD->getType();
3303 NoteLValueLocation(Info, Base);
3304 }
3305 return false;
3306 }
3307
3308 // Check that we can fold the initializer. In C++, we will have already done
3309 // this in the cases where it matters for conformance.
3310 if (!VD->evaluateValue()) {
3311 Info.FFDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD;
3312 NoteLValueLocation(Info, Base);
3313 return false;
3314 }
3315
3316 // Check that the variable is actually usable in constant expressions. For a
3317 // const integral variable or a reference, we might have a non-constant
3318 // initializer that we can nonetheless evaluate the initializer for. Such
3319 // variables are not usable in constant expressions. In C++98, the
3320 // initializer also syntactically needs to be an ICE.
3321 //
3322 // FIXME: We don't diagnose cases that aren't potentially usable in constant
3323 // expressions here; doing so would regress diagnostics for things like
3324 // reading from a volatile constexpr variable.
3325 if ((Info.getLangOpts().CPlusPlus && !VD->hasConstantInitialization() &&
3326 VD->mightBeUsableInConstantExpressions(Info.Ctx)) ||
3327 ((Info.getLangOpts().CPlusPlus || Info.getLangOpts().OpenCL) &&
3328 !Info.getLangOpts().CPlusPlus11 && !VD->hasICEInitializer(Info.Ctx))) {
3329 Info.CCEDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD;
3330 NoteLValueLocation(Info, Base);
3331 }
3332
3333 // Never use the initializer of a weak variable, not even for constant
3334 // folding. We can't be sure that this is the definition that will be used.
3335 if (VD->isWeak()) {
3336 Info.FFDiag(E, diag::note_constexpr_var_init_weak) << VD;
3337 NoteLValueLocation(Info, Base);
3338 return false;
3339 }
3340
3341 Result = VD->getEvaluatedValue();
3342 return true;
3343}
3344
3345/// Get the base index of the given base class within an APValue representing
3346/// the given derived class.
3347static unsigned getBaseIndex(const CXXRecordDecl *Derived,
3348 const CXXRecordDecl *Base) {
3349 Base = Base->getCanonicalDecl();
3350 unsigned Index = 0;
3351 for (CXXRecordDecl::base_class_const_iterator I = Derived->bases_begin(),
3352 E = Derived->bases_end(); I != E; ++I, ++Index) {
3353 if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == Base)
3354 return Index;
3355 }
3356
3357 llvm_unreachable("base class missing from derived class's bases list")__builtin_unreachable();
3358}
3359
3360/// Extract the value of a character from a string literal.
3361static APSInt extractStringLiteralCharacter(EvalInfo &Info, const Expr *Lit,
3362 uint64_t Index) {
3363 assert(!isa<SourceLocExpr>(Lit) &&((void)0)
3364 "SourceLocExpr should have already been converted to a StringLiteral")((void)0);
3365
3366 // FIXME: Support MakeStringConstant
3367 if (const auto *ObjCEnc = dyn_cast<ObjCEncodeExpr>(Lit)) {
3368 std::string Str;
3369 Info.Ctx.getObjCEncodingForType(ObjCEnc->getEncodedType(), Str);
3370 assert(Index <= Str.size() && "Index too large")((void)0);
3371 return APSInt::getUnsigned(Str.c_str()[Index]);
3372 }
3373
3374 if (auto PE = dyn_cast<PredefinedExpr>(Lit))
3375 Lit = PE->getFunctionName();
3376 const StringLiteral *S = cast<StringLiteral>(Lit);
3377 const ConstantArrayType *CAT =
3378 Info.Ctx.getAsConstantArrayType(S->getType());
3379 assert(CAT && "string literal isn't an array")((void)0);
3380 QualType CharType = CAT->getElementType();
3381 assert(CharType->isIntegerType() && "unexpected character type")((void)0);
3382
3383 APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(),
3384 CharType->isUnsignedIntegerType());
3385 if (Index < S->getLength())
3386 Value = S->getCodeUnit(Index);
3387 return Value;
3388}
3389
3390// Expand a string literal into an array of characters.
3391//
3392// FIXME: This is inefficient; we should probably introduce something similar
3393// to the LLVM ConstantDataArray to make this cheaper.
3394static void expandStringLiteral(EvalInfo &Info, const StringLiteral *S,
3395 APValue &Result,
3396 QualType AllocType = QualType()) {
3397 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(
3398 AllocType.isNull() ? S->getType() : AllocType);
3399 assert(CAT && "string literal isn't an array")((void)0);
3400 QualType CharType = CAT->getElementType();
3401 assert(CharType->isIntegerType() && "unexpected character type")((void)0);
3402
3403 unsigned Elts = CAT->getSize().getZExtValue();
3404 Result = APValue(APValue::UninitArray(),
3405 std::min(S->getLength(), Elts), Elts);
3406 APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(),
3407 CharType->isUnsignedIntegerType());
3408 if (Result.hasArrayFiller())
3409 Result.getArrayFiller() = APValue(Value);
3410 for (unsigned I = 0, N = Result.getArrayInitializedElts(); I != N; ++I) {
3411 Value = S->getCodeUnit(I);
3412 Result.getArrayInitializedElt(I) = APValue(Value);
3413 }
3414}
3415
3416// Expand an array so that it has more than Index filled elements.
3417static void expandArray(APValue &Array, unsigned Index) {
3418 unsigned Size = Array.getArraySize();
3419 assert(Index < Size)((void)0);
3420
3421 // Always at least double the number of elements for which we store a value.
3422 unsigned OldElts = Array.getArrayInitializedElts();
3423 unsigned NewElts = std::max(Index+1, OldElts * 2);
3424 NewElts = std::min(Size, std::max(NewElts, 8u));
3425
3426 // Copy the data across.
3427 APValue NewValue(APValue::UninitArray(), NewElts, Size);
3428 for (unsigned I = 0; I != OldElts; ++I)
3429 NewValue.getArrayInitializedElt(I).swap(Array.getArrayInitializedElt(I));
3430 for (unsigned I = OldElts; I != NewElts; ++I)
3431 NewValue.getArrayInitializedElt(I) = Array.getArrayFiller();
3432 if (NewValue.hasArrayFiller())
3433 NewValue.getArrayFiller() = Array.getArrayFiller();
3434 Array.swap(NewValue);
3435}
3436
3437/// Determine whether a type would actually be read by an lvalue-to-rvalue
3438/// conversion. If it's of class type, we may assume that the copy operation
3439/// is trivial. Note that this is never true for a union type with fields
3440/// (because the copy always "reads" the active member) and always true for
3441/// a non-class type.
3442static bool isReadByLvalueToRvalueConversion(const CXXRecordDecl *RD);
3443static bool isReadByLvalueToRvalueConversion(QualType T) {
3444 CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
3445 return !RD || isReadByLvalueToRvalueConversion(RD);
3446}
3447static bool isReadByLvalueToRvalueConversion(const CXXRecordDecl *RD) {
3448 // FIXME: A trivial copy of a union copies the object representation, even if
3449 // the union is empty.
3450 if (RD->isUnion())
38
Calling 'TagDecl::isUnion'
41
Returning from 'TagDecl::isUnion'
42
Taking true branch
3451 return !RD->field_empty();
43
Calling 'RecordDecl::field_empty'
52
Returning from 'RecordDecl::field_empty'
53
Returning the value 1, which participates in a condition later
3452 if (RD->isEmpty())
3453 return false;
3454
3455 for (auto *Field : RD->fields())
3456 if (!Field->isUnnamedBitfield() &&
3457 isReadByLvalueToRvalueConversion(Field->getType()))
3458 return true;
3459
3460 for (auto &BaseSpec : RD->bases())
3461 if (isReadByLvalueToRvalueConversion(BaseSpec.getType()))
3462 return true;
3463
3464 return false;
3465}
3466
3467/// Diagnose an attempt to read from any unreadable field within the specified
3468/// type, which might be a class type.
3469static bool diagnoseMutableFields(EvalInfo &Info, const Expr *E, AccessKinds AK,
3470 QualType T) {
3471 CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
3472 if (!RD)
3473 return false;
3474
3475 if (!RD->hasMutableFields())
3476 return false;
3477
3478 for (auto *Field : RD->fields()) {
3479 // If we're actually going to read this field in some way, then it can't
3480 // be mutable. If we're in a union, then assigning to a mutable field
3481 // (even an empty one) can change the active member, so that's not OK.
3482 // FIXME: Add core issue number for the union case.
3483 if (Field->isMutable() &&
3484 (RD->isUnion() || isReadByLvalueToRvalueConversion(Field->getType()))) {
3485 Info.FFDiag(E, diag::note_constexpr_access_mutable, 1) << AK << Field;
3486 Info.Note(Field->getLocation(), diag::note_declared_at);
3487 return true;
3488 }
3489
3490 if (diagnoseMutableFields(Info, E, AK, Field->getType()))
3491 return true;
3492 }
3493
3494 for (auto &BaseSpec : RD->bases())
3495 if (diagnoseMutableFields(Info, E, AK, BaseSpec.getType()))
3496 return true;
3497
3498 // All mutable fields were empty, and thus not actually read.
3499 return false;
3500}
3501
3502static bool lifetimeStartedInEvaluation(EvalInfo &Info,
3503 APValue::LValueBase Base,
3504 bool MutableSubobject = false) {
3505 // A temporary or transient heap allocation we created.
3506 if (Base.getCallIndex() || Base.is<DynamicAllocLValue>())
3507 return true;
3508
3509 switch (Info.IsEvaluatingDecl) {
3510 case EvalInfo::EvaluatingDeclKind::None:
3511 return false;
3512
3513 case EvalInfo::EvaluatingDeclKind::Ctor:
3514 // The variable whose initializer we're evaluating.
3515 if (Info.EvaluatingDecl == Base)
3516 return true;
3517
3518 // A temporary lifetime-extended by the variable whose initializer we're
3519 // evaluating.
3520 if (auto *BaseE = Base.dyn_cast<const Expr *>())
3521 if (auto *BaseMTE = dyn_cast<MaterializeTemporaryExpr>(BaseE))
3522 return Info.EvaluatingDecl == BaseMTE->getExtendingDecl();
3523 return false;
3524
3525 case EvalInfo::EvaluatingDeclKind::Dtor:
3526 // C++2a [expr.const]p6:
3527 // [during constant destruction] the lifetime of a and its non-mutable
3528 // subobjects (but not its mutable subobjects) [are] considered to start
3529 // within e.
3530 if (MutableSubobject || Base != Info.EvaluatingDecl)
3531 return false;
3532 // FIXME: We can meaningfully extend this to cover non-const objects, but
3533 // we will need special handling: we should be able to access only
3534 // subobjects of such objects that are themselves declared const.
3535 QualType T = getType(Base);
3536 return T.isConstQualified() || T->isReferenceType();
3537 }
3538
3539 llvm_unreachable("unknown evaluating decl kind")__builtin_unreachable();
3540}
3541
3542namespace {
3543/// A handle to a complete object (an object that is not a subobject of
3544/// another object).
3545struct CompleteObject {
3546 /// The identity of the object.
3547 APValue::LValueBase Base;
3548 /// The value of the complete object.
3549 APValue *Value;
3550 /// The type of the complete object.
3551 QualType Type;
3552
3553 CompleteObject() : Value(nullptr) {}
3554 CompleteObject(APValue::LValueBase Base, APValue *Value, QualType Type)
3555 : Base(Base), Value(Value), Type(Type) {}
3556
3557 bool mayAccessMutableMembers(EvalInfo &Info, AccessKinds AK) const {
3558 // If this isn't a "real" access (eg, if it's just accessing the type
3559 // info), allow it. We assume the type doesn't change dynamically for
3560 // subobjects of constexpr objects (even though we'd hit UB here if it
3561 // did). FIXME: Is this right?
3562 if (!isAnyAccess(AK))
3563 return true;
3564
3565 // In C++14 onwards, it is permitted to read a mutable member whose
3566 // lifetime began within the evaluation.
3567 // FIXME: Should we also allow this in C++11?
3568 if (!Info.getLangOpts().CPlusPlus14)
3569 return false;
3570 return lifetimeStartedInEvaluation(Info, Base, /*MutableSubobject*/true);
3571 }
3572
3573 explicit operator bool() const { return !Type.isNull(); }
3574};
3575} // end anonymous namespace
3576
3577static QualType getSubobjectType(QualType ObjType, QualType SubobjType,
3578 bool IsMutable = false) {
3579 // C++ [basic.type.qualifier]p1:
3580 // - A const object is an object of type const T or a non-mutable subobject
3581 // of a const object.
3582 if (ObjType.isConstQualified() && !IsMutable)
3583 SubobjType.addConst();
3584 // - A volatile object is an object of type const T or a subobject of a
3585 // volatile object.
3586 if (ObjType.isVolatileQualified())
3587 SubobjType.addVolatile();
3588 return SubobjType;
3589}
3590
3591/// Find the designated sub-object of an rvalue.
3592template<typename SubobjectHandler>
3593typename SubobjectHandler::result_type
3594findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj,
3595 const SubobjectDesignator &Sub, SubobjectHandler &handler) {
3596 if (Sub.Invalid)
3597 // A diagnostic will have already been produced.
3598 return handler.failed();
3599 if (Sub.isOnePastTheEnd() || Sub.isMostDerivedAnUnsizedArray()) {
3600 if (Info.getLangOpts().CPlusPlus11)
3601 Info.FFDiag(E, Sub.isOnePastTheEnd()
3602 ? diag::note_constexpr_access_past_end
3603 : diag::note_constexpr_access_unsized_array)
3604 << handler.AccessKind;
3605 else
3606 Info.FFDiag(E);
3607 return handler.failed();
3608 }
3609
3610 APValue *O = Obj.Value;
3611 QualType ObjType = Obj.Type;
3612 const FieldDecl *LastField = nullptr;
3613 const FieldDecl *VolatileField = nullptr;
3614
3615 // Walk the designator's path to find the subobject.
3616 for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {
3617 // Reading an indeterminate value is undefined, but assigning over one is OK.
3618 if ((O->isAbsent() && !(handler.AccessKind == AK_Construct && I == N)) ||
3619 (O->isIndeterminate() &&
3620 !isValidIndeterminateAccess(handler.AccessKind))) {
3621 if (!Info.checkingPotentialConstantExpression())
3622 Info.FFDiag(E, diag::note_constexpr_access_uninit)
3623 << handler.AccessKind << O->isIndeterminate();
3624 return handler.failed();
3625 }
3626
3627 // C++ [class.ctor]p5, C++ [class.dtor]p5:
3628 // const and volatile semantics are not applied on an object under
3629 // {con,de}struction.
3630 if ((ObjType.isConstQualified() || ObjType.isVolatileQualified()) &&
3631 ObjType->isRecordType() &&
3632 Info.isEvaluatingCtorDtor(
3633 Obj.Base, llvm::makeArrayRef(Sub.Entries.begin(),
3634 Sub.Entries.begin() + I)) !=
3635 ConstructionPhase::None) {
3636 ObjType = Info.Ctx.getCanonicalType(ObjType);
3637 ObjType.removeLocalConst();
3638 ObjType.removeLocalVolatile();
3639 }
3640
3641 // If this is our last pass, check that the final object type is OK.
3642 if (I == N || (I == N - 1 && ObjType->isAnyComplexType())) {
3643 // Accesses to volatile objects are prohibited.
3644 if (ObjType.isVolatileQualified() && isFormalAccess(handler.AccessKind)) {
3645 if (Info.getLangOpts().CPlusPlus) {
3646 int DiagKind;
3647 SourceLocation Loc;
3648 const NamedDecl *Decl = nullptr;
3649 if (VolatileField) {
3650 DiagKind = 2;
3651 Loc = VolatileField->getLocation();
3652 Decl = VolatileField;
3653 } else if (auto *VD = Obj.Base.dyn_cast<const ValueDecl*>()) {
3654 DiagKind = 1;
3655 Loc = VD->getLocation();
3656 Decl = VD;
3657 } else {
3658 DiagKind = 0;
3659 if (auto *E = Obj.Base.dyn_cast<const Expr *>())
3660 Loc = E->getExprLoc();
3661 }
3662 Info.FFDiag(E, diag::note_constexpr_access_volatile_obj, 1)
3663 << handler.AccessKind << DiagKind << Decl;
3664 Info.Note(Loc, diag::note_constexpr_volatile_here) << DiagKind;
3665 } else {
3666 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr);
3667 }
3668 return handler.failed();
3669 }
3670
3671 // If we are reading an object of class type, there may still be more
3672 // things we need to check: if there are any mutable subobjects, we
3673 // cannot perform this read. (This only happens when performing a trivial
3674 // copy or assignment.)
3675 if (ObjType->isRecordType() &&
3676 !Obj.mayAccessMutableMembers(Info, handler.AccessKind) &&
3677 diagnoseMutableFields(Info, E, handler.AccessKind, ObjType))
3678 return handler.failed();
3679 }
3680
3681 if (I == N) {
3682 if (!handler.found(*O, ObjType))
3683 return false;
3684
3685 // If we modified a bit-field, truncate it to the right width.
3686 if (isModification(handler.AccessKind) &&
3687 LastField && LastField->isBitField() &&
3688 !truncateBitfieldValue(Info, E, *O, LastField))
3689 return false;
3690
3691 return true;
3692 }
3693
3694 LastField = nullptr;
3695 if (ObjType->isArrayType()) {
3696 // Next subobject is an array element.
3697 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(ObjType);
3698 assert(CAT && "vla in literal type?")((void)0);
3699 uint64_t Index = Sub.Entries[I].getAsArrayIndex();
3700 if (CAT->getSize().ule(Index)) {
3701 // Note, it should not be possible to form a pointer with a valid
3702 // designator which points more than one past the end of the array.
3703 if (Info.getLangOpts().CPlusPlus11)
3704 Info.FFDiag(E, diag::note_constexpr_access_past_end)
3705 << handler.AccessKind;
3706 else
3707 Info.FFDiag(E);
3708 return handler.failed();
3709 }
3710
3711 ObjType = CAT->getElementType();
3712
3713 if (O->getArrayInitializedElts() > Index)
3714 O = &O->getArrayInitializedElt(Index);
3715 else if (!isRead(handler.AccessKind)) {
3716 expandArray(*O, Index);
3717 O = &O->getArrayInitializedElt(Index);
3718 } else
3719 O = &O->getArrayFiller();
3720 } else if (ObjType->isAnyComplexType()) {
3721 // Next subobject is a complex number.
3722 uint64_t Index = Sub.Entries[I].getAsArrayIndex();
3723 if (Index > 1) {
3724 if (Info.getLangOpts().CPlusPlus11)
3725 Info.FFDiag(E, diag::note_constexpr_access_past_end)
3726 << handler.AccessKind;
3727 else
3728 Info.FFDiag(E);
3729 return handler.failed();
3730 }
3731
3732 ObjType = getSubobjectType(
3733 ObjType, ObjType->castAs<ComplexType>()->getElementType());
3734
3735 assert(I == N - 1 && "extracting subobject of scalar?")((void)0);
3736 if (O->isComplexInt()) {
3737 return handler.found(Index ? O->getComplexIntImag()
3738 : O->getComplexIntReal(), ObjType);
3739 } else {
3740 assert(O->isComplexFloat())((void)0);
3741 return handler.found(Index ? O->getComplexFloatImag()
3742 : O->getComplexFloatReal(), ObjType);
3743 }
3744 } else if (const FieldDecl *Field = getAsField(Sub.Entries[I])) {
3745 if (Field->isMutable() &&
3746 !Obj.mayAccessMutableMembers(Info, handler.AccessKind)) {
3747 Info.FFDiag(E, diag::note_constexpr_access_mutable, 1)
3748 << handler.AccessKind << Field;
3749 Info.Note(Field->getLocation(), diag::note_declared_at);
3750 return handler.failed();
3751 }
3752
3753 // Next subobject is a class, struct or union field.
3754 RecordDecl *RD = ObjType->castAs<RecordType>()->getDecl();
3755 if (RD->isUnion()) {
3756 const FieldDecl *UnionField = O->getUnionField();
3757 if (!UnionField ||
3758 UnionField->getCanonicalDecl() != Field->getCanonicalDecl()) {
3759 if (I == N - 1 && handler.AccessKind == AK_Construct) {
3760 // Placement new onto an inactive union member makes it active.
3761 O->setUnion(Field, APValue());
3762 } else {
3763 // FIXME: If O->getUnionValue() is absent, report that there's no
3764 // active union member rather than reporting the prior active union
3765 // member. We'll need to fix nullptr_t to not use APValue() as its
3766 // representation first.
3767 Info.FFDiag(E, diag::note_constexpr_access_inactive_union_member)
3768 << handler.AccessKind << Field << !UnionField << UnionField;
3769 return handler.failed();
3770 }
3771 }
3772 O = &O->getUnionValue();
3773 } else
3774 O = &O->getStructField(Field->getFieldIndex());
3775
3776 ObjType = getSubobjectType(ObjType, Field->getType(), Field->isMutable());
3777 LastField = Field;
3778 if (Field->getType().isVolatileQualified())
3779 VolatileField = Field;
3780 } else {
3781 // Next subobject is a base class.
3782 const CXXRecordDecl *Derived = ObjType->getAsCXXRecordDecl();
3783 const CXXRecordDecl *Base = getAsBaseClass(Sub.Entries[I]);
3784 O = &O->getStructBase(getBaseIndex(Derived, Base));
3785
3786 ObjType = getSubobjectType(ObjType, Info.Ctx.getRecordType(Base));
3787 }
3788 }
3789}
3790
3791namespace {
3792struct ExtractSubobjectHandler {
3793 EvalInfo &Info;
3794 const Expr *E;
3795 APValue &Result;
3796 const AccessKinds AccessKind;
3797
3798 typedef bool result_type;
3799 bool failed() { return false; }
3800 bool found(APValue &Subobj, QualType SubobjType) {
3801 Result = Subobj;
3802 if (AccessKind == AK_ReadObjectRepresentation)
3803 return true;
3804 return CheckFullyInitialized(Info, E->getExprLoc(), SubobjType, Result);
3805 }
3806 bool found(APSInt &Value, QualType SubobjType) {
3807 Result = APValue(Value);
3808 return true;
3809 }
3810 bool found(APFloat &Value, QualType SubobjType) {
3811 Result = APValue(Value);
3812 return true;
3813 }
3814};
3815} // end anonymous namespace
3816
3817/// Extract the designated sub-object of an rvalue.
3818static bool extractSubobject(EvalInfo &Info, const Expr *E,
3819 const CompleteObject &Obj,
3820 const SubobjectDesignator &Sub, APValue &Result,
3821 AccessKinds AK = AK_Read) {
3822 assert(AK == AK_Read || AK == AK_ReadObjectRepresentation)((void)0);
3823 ExtractSubobjectHandler Handler = {Info, E, Result, AK};
3824 return findSubobject(Info, E, Obj, Sub, Handler);
3825}
3826
3827namespace {
3828struct ModifySubobjectHandler {
3829 EvalInfo &Info;
3830 APValue &NewVal;
3831 const Expr *E;
3832
3833 typedef bool result_type;
3834 static const AccessKinds AccessKind = AK_Assign;
3835
3836 bool checkConst(QualType QT) {
3837 // Assigning to a const object has undefined behavior.
3838 if (QT.isConstQualified()) {
3839 Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT;
3840 return false;
3841 }
3842 return true;
3843 }
3844
3845 bool failed() { return false; }
3846 bool found(APValue &Subobj, QualType SubobjType) {
3847 if (!checkConst(SubobjType))
3848 return false;
3849 // We've been given ownership of NewVal, so just swap it in.
3850 Subobj.swap(NewVal);
3851 return true;
3852 }
3853 bool found(APSInt &Value, QualType SubobjType) {
3854 if (!checkConst(SubobjType))
3855 return false;
3856 if (!NewVal.isInt()) {
3857 // Maybe trying to write a cast pointer value into a complex?
3858 Info.FFDiag(E);
3859 return false;
3860 }
3861 Value = NewVal.getInt();
3862 return true;
3863 }
3864 bool found(APFloat &Value, QualType SubobjType) {
3865 if (!checkConst(SubobjType))
3866 return false;
3867 Value = NewVal.getFloat();
3868 return true;
3869 }
3870};
3871} // end anonymous namespace
3872
3873const AccessKinds ModifySubobjectHandler::AccessKind;
3874
3875/// Update the designated sub-object of an rvalue to the given value.
3876static bool modifySubobject(EvalInfo &Info, const Expr *E,
3877 const CompleteObject &Obj,
3878 const SubobjectDesignator &Sub,
3879 APValue &NewVal) {
3880 ModifySubobjectHandler Handler = { Info, NewVal, E };
3881 return findSubobject(Info, E, Obj, Sub, Handler);
3882}
3883
3884/// Find the position where two subobject designators diverge, or equivalently
3885/// the length of the common initial subsequence.
3886static unsigned FindDesignatorMismatch(QualType ObjType,
3887 const SubobjectDesignator &A,
3888 const SubobjectDesignator &B,
3889 bool &WasArrayIndex) {
3890 unsigned I = 0, N = std::min(A.Entries.size(), B.Entries.size());
3891 for (/**/; I != N; ++I) {
3892 if (!ObjType.isNull() &&
3893 (ObjType->isArrayType() || ObjType->isAnyComplexType())) {
3894 // Next subobject is an array element.
3895 if (A.Entries[I].getAsArrayIndex() != B.Entries[I].getAsArrayIndex()) {
3896 WasArrayIndex = true;
3897 return I;
3898 }
3899 if (ObjType->isAnyComplexType())
3900 ObjType = ObjType->castAs<ComplexType>()->getElementType();
3901 else
3902 ObjType = ObjType->castAsArrayTypeUnsafe()->getElementType();
3903 } else {
3904 if (A.Entries[I].getAsBaseOrMember() !=
3905 B.Entries[I].getAsBaseOrMember()) {
3906 WasArrayIndex = false;
3907 return I;
3908 }
3909 if (const FieldDecl *FD = getAsField(A.Entries[I]))
3910 // Next subobject is a field.
3911 ObjType = FD->getType();
3912 else
3913 // Next subobject is a base class.
3914 ObjType = QualType();
3915 }
3916 }
3917 WasArrayIndex = false;
3918 return I;
3919}
3920
3921/// Determine whether the given subobject designators refer to elements of the
3922/// same array object.
3923static bool AreElementsOfSameArray(QualType ObjType,
3924 const SubobjectDesignator &A,
3925 const SubobjectDesignator &B) {
3926 if (A.Entries.size() != B.Entries.size())
3927 return false;
3928
3929 bool IsArray = A.MostDerivedIsArrayElement;
3930 if (IsArray && A.MostDerivedPathLength != A.Entries.size())
3931 // A is a subobject of the array element.
3932 return false;
3933
3934 // If A (and B) designates an array element, the last entry will be the array
3935 // index. That doesn't have to match. Otherwise, we're in the 'implicit array
3936 // of length 1' case, and the entire path must match.
3937 bool WasArrayIndex;
3938 unsigned CommonLength = FindDesignatorMismatch(ObjType, A, B, WasArrayIndex);
3939 return CommonLength >= A.Entries.size() - IsArray;
3940}
3941
3942/// Find the complete object to which an LValue refers.
3943static CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E,
3944 AccessKinds AK, const LValue &LVal,
3945 QualType LValType) {
3946 if (LVal.InvalidBase) {
3947 Info.FFDiag(E);
3948 return CompleteObject();
3949 }
3950
3951 if (!LVal.Base) {
3952 Info.FFDiag(E, diag::note_constexpr_access_null) << AK;
3953 return CompleteObject();
3954 }
3955
3956 CallStackFrame *Frame = nullptr;
3957 unsigned Depth = 0;
3958 if (LVal.getLValueCallIndex()) {
3959 std::tie(Frame, Depth) =
3960 Info.getCallFrameAndDepth(LVal.getLValueCallIndex());
3961 if (!Frame) {
3962 Info.FFDiag(E, diag::note_constexpr_lifetime_ended, 1)
3963 << AK << LVal.Base.is<const ValueDecl*>();
3964 NoteLValueLocation(Info, LVal.Base);
3965 return CompleteObject();
3966 }
3967 }
3968
3969 bool IsAccess = isAnyAccess(AK);
3970
3971 // C++11 DR1311: An lvalue-to-rvalue conversion on a volatile-qualified type
3972 // is not a constant expression (even if the object is non-volatile). We also
3973 // apply this rule to C++98, in order to conform to the expected 'volatile'
3974 // semantics.
3975 if (isFormalAccess(AK) && LValType.isVolatileQualified()) {
3976 if (Info.getLangOpts().CPlusPlus)
3977 Info.FFDiag(E, diag::note_constexpr_access_volatile_type)
3978 << AK << LValType;
3979 else
3980 Info.FFDiag(E);
3981 return CompleteObject();
3982 }
3983
3984 // Compute value storage location and type of base object.
3985 APValue *BaseVal = nullptr;
3986 QualType BaseType = getType(LVal.Base);
3987
3988 if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl &&
3989 lifetimeStartedInEvaluation(Info, LVal.Base)) {
3990 // This is the object whose initializer we're evaluating, so its lifetime
3991 // started in the current evaluation.
3992 BaseVal = Info.EvaluatingDeclValue;
3993 } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {
3994 // Allow reading from a GUID declaration.
3995 if (auto *GD = dyn_cast<MSGuidDecl>(D)) {
3996 if (isModification(AK)) {
3997 // All the remaining cases do not permit modification of the object.
3998 Info.FFDiag(E, diag::note_constexpr_modify_global);
3999 return CompleteObject();
4000 }
4001 APValue &V = GD->getAsAPValue();
4002 if (V.isAbsent()) {
4003 Info.FFDiag(E, diag::note_constexpr_unsupported_layout)
4004 << GD->getType();
4005 return CompleteObject();
4006 }
4007 return CompleteObject(LVal.Base, &V, GD->getType());
4008 }
4009
4010 // Allow reading from template parameter objects.
4011 if (auto *TPO = dyn_cast<TemplateParamObjectDecl>(D)) {
4012 if (isModification(AK)) {
4013 Info.FFDiag(E, diag::note_constexpr_modify_global);
4014 return CompleteObject();
4015 }
4016 return CompleteObject(LVal.Base, const_cast<APValue *>(&TPO->getValue()),
4017 TPO->getType());
4018 }
4019
4020 // In C++98, const, non-volatile integers initialized with ICEs are ICEs.
4021 // In C++11, constexpr, non-volatile variables initialized with constant
4022 // expressions are constant expressions too. Inside constexpr functions,
4023 // parameters are constant expressions even if they're non-const.
4024 // In C++1y, objects local to a constant expression (those with a Frame) are
4025 // both readable and writable inside constant expressions.
4026 // In C, such things can also be folded, although they are not ICEs.
4027 const VarDecl *VD = dyn_cast<VarDecl>(D);
4028 if (VD) {
4029 if (const VarDecl *VDef = VD->getDefinition(Info.Ctx))
4030 VD = VDef;
4031 }
4032 if (!VD || VD->isInvalidDecl()) {
4033 Info.FFDiag(E);
4034 return CompleteObject();
4035 }
4036
4037 bool IsConstant = BaseType.isConstant(Info.Ctx);
4038
4039 // Unless we're looking at a local variable or argument in a constexpr call,
4040 // the variable we're reading must be const.
4041 if (!Frame) {
4042 if (IsAccess && isa<ParmVarDecl>(VD)) {
4043 // Access of a parameter that's not associated with a frame isn't going
4044 // to work out, but we can leave it to evaluateVarDeclInit to provide a
4045 // suitable diagnostic.
4046 } else if (Info.getLangOpts().CPlusPlus14 &&
4047 lifetimeStartedInEvaluation(Info, LVal.Base)) {
4048 // OK, we can read and modify an object if we're in the process of
4049 // evaluating its initializer, because its lifetime began in this
4050 // evaluation.
4051 } else if (isModification(AK)) {
4052 // All the remaining cases do not permit modification of the object.
4053 Info.FFDiag(E, diag::note_constexpr_modify_global);
4054 return CompleteObject();
4055 } else if (VD->isConstexpr()) {
4056 // OK, we can read this variable.
4057 } else if (BaseType->isIntegralOrEnumerationType()) {
4058 if (!IsConstant) {
4059 if (!IsAccess)
4060 return CompleteObject(LVal.getLValueBase(), nullptr, BaseType);
4061 if (Info.getLangOpts().CPlusPlus) {
4062 Info.FFDiag(E, diag::note_constexpr_ltor_non_const_int, 1) << VD;
4063 Info.Note(VD->getLocation(), diag::note_declared_at);
4064 } else {
4065 Info.FFDiag(E);
4066 }
4067 return CompleteObject();
4068 }
4069 } else if (!IsAccess) {
4070 return CompleteObject(LVal.getLValueBase(), nullptr, BaseType);
4071 } else if (IsConstant && Info.checkingPotentialConstantExpression() &&
4072 BaseType->isLiteralType(Info.Ctx) && !VD->hasDefinition()) {
4073 // This variable might end up being constexpr. Don't diagnose it yet.
4074 } else if (IsConstant) {
4075 // Keep evaluating to see what we can do. In particular, we support
4076 // folding of const floating-point types, in order to make static const
4077 // data members of such types (supported as an extension) more useful.
4078 if (Info.getLangOpts().CPlusPlus) {
4079 Info.CCEDiag(E, Info.getLangOpts().CPlusPlus11
4080 ? diag::note_constexpr_ltor_non_constexpr
4081 : diag::note_constexpr_ltor_non_integral, 1)
4082 << VD << BaseType;
4083 Info.Note(VD->getLocation(), diag::note_declared_at);
4084 } else {
4085 Info.CCEDiag(E);
4086 }
4087 } else {
4088 // Never allow reading a non-const value.
4089 if (Info.getLangOpts().CPlusPlus) {
4090 Info.FFDiag(E, Info.getLangOpts().CPlusPlus11
4091 ? diag::note_constexpr_ltor_non_constexpr
4092 : diag::note_constexpr_ltor_non_integral, 1)
4093 << VD << BaseType;
4094 Info.Note(VD->getLocation(), diag::note_declared_at);
4095 } else {
4096 Info.FFDiag(E);
4097 }
4098 return CompleteObject();
4099 }
4100 }
4101
4102 if (!evaluateVarDeclInit(Info, E, VD, Frame, LVal.getLValueVersion(), BaseVal))
4103 return CompleteObject();
4104 } else if (DynamicAllocLValue DA = LVal.Base.dyn_cast<DynamicAllocLValue>()) {
4105 Optional<DynAlloc*> Alloc = Info.lookupDynamicAlloc(DA);
4106 if (!Alloc) {
4107 Info.FFDiag(E, diag::note_constexpr_access_deleted_object) << AK;
4108 return CompleteObject();
4109 }
4110 return CompleteObject(LVal.Base, &(*Alloc)->Value,
4111 LVal.Base.getDynamicAllocType());
4112 } else {
4113 const Expr *Base = LVal.Base.dyn_cast<const Expr*>();
4114
4115 if (!Frame) {
4116 if (const MaterializeTemporaryExpr *MTE =
4117 dyn_cast_or_null<MaterializeTemporaryExpr>(Base)) {
4118 assert(MTE->getStorageDuration() == SD_Static &&((void)0)
4119 "should have a frame for a non-global materialized temporary")((void)0);
4120
4121 // C++20 [expr.const]p4: [DR2126]
4122 // An object or reference is usable in constant expressions if it is
4123 // - a temporary object of non-volatile const-qualified literal type
4124 // whose lifetime is extended to that of a variable that is usable
4125 // in constant expressions
4126 //
4127 // C++20 [expr.const]p5:
4128 // an lvalue-to-rvalue conversion [is not allowed unless it applies to]
4129 // - a non-volatile glvalue that refers to an object that is usable
4130 // in constant expressions, or
4131 // - a non-volatile glvalue of literal type that refers to a
4132 // non-volatile object whose lifetime began within the evaluation
4133 // of E;
4134 //
4135 // C++11 misses the 'began within the evaluation of e' check and
4136 // instead allows all temporaries, including things like:
4137 // int &&r = 1;
4138 // int x = ++r;
4139 // constexpr int k = r;
4140 // Therefore we use the C++14-onwards rules in C++11 too.
4141 //
4142 // Note that temporaries whose lifetimes began while evaluating a
4143 // variable's constructor are not usable while evaluating the
4144 // corresponding destructor, not even if they're of const-qualified
4145 // types.
4146 if (!MTE->isUsableInConstantExpressions(Info.Ctx) &&
4147 !lifetimeStartedInEvaluation(Info, LVal.Base)) {
4148 if (!IsAccess)
4149 return CompleteObject(LVal.getLValueBase(), nullptr, BaseType);
4150 Info.FFDiag(E, diag::note_constexpr_access_static_temporary, 1) << AK;
4151 Info.Note(MTE->getExprLoc(), diag::note_constexpr_temporary_here);
4152 return CompleteObject();
4153 }
4154
4155 BaseVal = MTE->getOrCreateValue(false);
4156 assert(BaseVal && "got reference to unevaluated temporary")((void)0);
4157 } else {
4158 if (!IsAccess)
4159 return CompleteObject(LVal.getLValueBase(), nullptr, BaseType);
4160 APValue Val;
4161 LVal.moveInto(Val);
4162 Info.FFDiag(E, diag::note_constexpr_access_unreadable_object)
4163 << AK
4164 << Val.getAsString(Info.Ctx,
4165 Info.Ctx.getLValueReferenceType(LValType));
4166 NoteLValueLocation(Info, LVal.Base);
4167 return CompleteObject();
4168 }
4169 } else {
4170 BaseVal = Frame->getTemporary(Base, LVal.Base.getVersion());
4171 assert(BaseVal && "missing value for temporary")((void)0);
4172 }
4173 }
4174
4175 // In C++14, we can't safely access any mutable state when we might be
4176 // evaluating after an unmodeled side effect. Parameters are modeled as state
4177 // in the caller, but aren't visible once the call returns, so they can be
4178 // modified in a speculatively-evaluated call.
4179 //
4180 // FIXME: Not all local state is mutable. Allow local constant subobjects
4181 // to be read here (but take care with 'mutable' fields).
4182 unsigned VisibleDepth = Depth;
4183 if (llvm::isa_and_nonnull<ParmVarDecl>(
4184 LVal.Base.dyn_cast<const ValueDecl *>()))
4185 ++VisibleDepth;
4186 if ((Frame && Info.getLangOpts().CPlusPlus14 &&
4187 Info.EvalStatus.HasSideEffects) ||
4188 (isModification(AK) && VisibleDepth < Info.SpeculativeEvaluationDepth))
4189 return CompleteObject();
4190
4191 return CompleteObject(LVal.getLValueBase(), BaseVal, BaseType);
4192}
4193
4194/// Perform an lvalue-to-rvalue conversion on the given glvalue. This
4195/// can also be used for 'lvalue-to-lvalue' conversions for looking up the
4196/// glvalue referred to by an entity of reference type.
4197///
4198/// \param Info - Information about the ongoing evaluation.
4199/// \param Conv - The expression for which we are performing the conversion.
4200/// Used for diagnostics.
4201/// \param Type - The type of the glvalue (before stripping cv-qualifiers in the
4202/// case of a non-class type).
4203/// \param LVal - The glvalue on which we are attempting to perform this action.
4204/// \param RVal - The produced value will be placed here.
4205/// \param WantObjectRepresentation - If true, we're looking for the object
4206/// representation rather than the value, and in particular,
4207/// there is no requirement that the result be fully initialized.
4208static bool
4209handleLValueToRValueConversion(EvalInfo &Info, const Expr *Conv, QualType Type,
4210 const LValue &LVal, APValue &RVal,
4211 bool WantObjectRepresentation = false) {
4212 if (LVal.Designator.Invalid)
69
Assuming field 'Invalid' is 0
70
Taking false branch
4213 return false;
4214
4215 // Check for special cases where there is no existing APValue to look at.
4216 const Expr *Base = LVal.Base.dyn_cast<const Expr*>();
71
Calling 'LValueBase::dyn_cast'
81
Returning from 'LValueBase::dyn_cast'
4217
4218 AccessKinds AK =
4219 WantObjectRepresentation
81.1
'WantObjectRepresentation' is false
81.1
'WantObjectRepresentation' is false
81.1
'WantObjectRepresentation' is false
81.1
'WantObjectRepresentation' is false
81.1
'WantObjectRepresentation' is false
81.1
'WantObjectRepresentation' is false
? AK_ReadObjectRepresentation : AK_Read;
82
'?' condition is false
4220
4221 if (Base
82.1
'Base' is null
82.1
'Base' is null
82.1
'Base' is null
82.1
'Base' is null
82.1
'Base' is null
82.1
'Base' is null
&& !LVal.getLValueCallIndex() && !Type.isVolatileQualified()) {
4222 if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(Base)) {
4223 // In C99, a CompoundLiteralExpr is an lvalue, and we defer evaluating the
4224 // initializer until now for such expressions. Such an expression can't be
4225 // an ICE in C, so this only matters for fold.
4226 if (Type.isVolatileQualified()) {
4227 Info.FFDiag(Conv);
4228 return false;
4229 }
4230 APValue Lit;
4231 if (!Evaluate(Lit, Info, CLE->getInitializer()))
4232 return false;
4233 CompleteObject LitObj(LVal.Base, &Lit, Base->getType());
4234 return extractSubobject(Info, Conv, LitObj, LVal.Designator, RVal, AK);
4235 } else if (isa<StringLiteral>(Base) || isa<PredefinedExpr>(Base)) {
4236 // Special-case character extraction so we don't have to construct an
4237 // APValue for the whole string.
4238 assert(LVal.Designator.Entries.size() <= 1 &&((void)0)
4239 "Can only read characters from string literals")((void)0);
4240 if (LVal.Designator.Entries.empty()) {
4241 // Fail for now for LValue to RValue conversion of an array.
4242 // (This shouldn't show up in C/C++, but it could be triggered by a
4243 // weird EvaluateAsRValue call from a tool.)
4244 Info.FFDiag(Conv);
4245 return false;
4246 }
4247 if (LVal.Designator.isOnePastTheEnd()) {
4248 if (Info.getLangOpts().CPlusPlus11)
4249 Info.FFDiag(Conv, diag::note_constexpr_access_past_end) << AK;
4250 else
4251 Info.FFDiag(Conv);
4252 return false;
4253 }
4254 uint64_t CharIndex = LVal.Designator.Entries[0].getAsArrayIndex();
4255 RVal = APValue(extractStringLiteralCharacter(Info, Base, CharIndex));
4256 return true;
4257 }
4258 }
4259
4260 CompleteObject Obj = findCompleteObject(Info, Conv, AK, LVal, Type);
4261 return Obj && extractSubobject(Info, Conv, Obj, LVal.Designator, RVal, AK);
83
Returning value, which participates in a condition later
4262}
4263
4264/// Perform an assignment of Val to LVal. Takes ownership of Val.
4265static bool handleAssignment(EvalInfo &Info, const Expr *E, const LValue &LVal,
4266 QualType LValType, APValue &Val) {
4267 if (LVal.Designator.Invalid)
4268 return false;
4269
4270 if (!Info.getLangOpts().CPlusPlus14) {
4271 Info.FFDiag(E);
4272 return false;
4273 }
4274
4275 CompleteObject Obj = findCompleteObject(Info, E, AK_Assign, LVal, LValType);
4276 return Obj && modifySubobject(Info, E, Obj, LVal.Designator, Val);
4277}
4278
4279namespace {
4280struct CompoundAssignSubobjectHandler {
4281 EvalInfo &Info;
4282 const CompoundAssignOperator *E;
4283 QualType PromotedLHSType;
4284 BinaryOperatorKind Opcode;
4285 const APValue &RHS;
4286
4287 static const AccessKinds AccessKind = AK_Assign;
4288
4289 typedef bool result_type;
4290
4291 bool checkConst(QualType QT) {
4292 // Assigning to a const object has undefined behavior.
4293 if (QT.isConstQualified()) {
4294 Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT;
4295 return false;
4296 }
4297 return true;
4298 }
4299
4300 bool failed() { return false; }
4301 bool found(APValue &Subobj, QualType SubobjType) {
4302 switch (Subobj.getKind()) {
4303 case APValue::Int:
4304 return found(Subobj.getInt(), SubobjType);
4305 case APValue::Float:
4306 return found(Subobj.getFloat(), SubobjType);
4307 case APValue::ComplexInt:
4308 case APValue::ComplexFloat:
4309 // FIXME: Implement complex compound assignment.
4310 Info.FFDiag(E);
4311 return false;
4312 case APValue::LValue:
4313 return foundPointer(Subobj, SubobjType);
4314 case APValue::Vector:
4315 return foundVector(Subobj, SubobjType);
4316 default:
4317 // FIXME: can this happen?
4318 Info.FFDiag(E);
4319 return false;
4320 }
4321 }
4322
4323 bool foundVector(APValue &Value, QualType SubobjType) {
4324 if (!checkConst(SubobjType))
4325 return false;
4326
4327 if (!SubobjType->isVectorType()) {
4328 Info.FFDiag(E);
4329 return false;
4330 }
4331 return handleVectorVectorBinOp(Info, E, Opcode, Value, RHS);
4332 }
4333
4334 bool found(APSInt &Value, QualType SubobjType) {
4335 if (!checkConst(SubobjType))
4336 return false;
4337
4338 if (!SubobjType->isIntegerType()) {
4339 // We don't support compound assignment on integer-cast-to-pointer
4340 // values.
4341 Info.FFDiag(E);
4342 return false;
4343 }
4344
4345 if (RHS.isInt()) {
4346 APSInt LHS =
4347 HandleIntToIntCast(Info, E, PromotedLHSType, SubobjType, Value);
4348 if (!handleIntIntBinOp(Info, E, LHS, Opcode, RHS.getInt(), LHS))
4349 return false;
4350 Value = HandleIntToIntCast(Info, E, SubobjType, PromotedLHSType, LHS);
4351 return true;
4352 } else if (RHS.isFloat()) {
4353 const FPOptions FPO = E->getFPFeaturesInEffect(
4354 Info.Ctx.getLangOpts());
4355 APFloat FValue(0.0);
4356 return HandleIntToFloatCast(Info, E, FPO, SubobjType, Value,
4357 PromotedLHSType, FValue) &&
4358 handleFloatFloatBinOp(Info, E, FValue, Opcode, RHS.getFloat()) &&
4359 HandleFloatToIntCast(Info, E, PromotedLHSType, FValue, SubobjType,
4360 Value);
4361 }
4362
4363 Info.FFDiag(E);
4364 return false;
4365 }
4366 bool found(APFloat &Value, QualType SubobjType) {
4367 return checkConst(SubobjType) &&
4368 HandleFloatToFloatCast(Info, E, SubobjType, PromotedLHSType,
4369 Value) &&
4370 handleFloatFloatBinOp(Info, E, Value, Opcode, RHS.getFloat()) &&
4371 HandleFloatToFloatCast(Info, E, PromotedLHSType, SubobjType, Value);
4372 }
4373 bool foundPointer(APValue &Subobj, QualType SubobjType) {
4374 if (!checkConst(SubobjType))
4375 return false;
4376
4377 QualType PointeeType;
4378 if (const PointerType *PT = SubobjType->getAs<PointerType>())
4379 PointeeType = PT->getPointeeType();
4380
4381 if (PointeeType.isNull() || !RHS.isInt() ||
4382 (Opcode != BO_Add && Opcode != BO_Sub)) {
4383 Info.FFDiag(E);
4384 return false;
4385 }
4386
4387 APSInt Offset = RHS.getInt();
4388 if (Opcode == BO_Sub)
4389 negateAsSigned(Offset);
4390
4391 LValue LVal;
4392 LVal.setFrom(Info.Ctx, Subobj);
4393 if (!HandleLValueArrayAdjustment(Info, E, LVal, PointeeType, Offset))
4394 return false;
4395 LVal.moveInto(Subobj);
4396 return true;
4397 }
4398};
4399} // end anonymous namespace
4400
4401const AccessKinds CompoundAssignSubobjectHandler::AccessKind;
4402
4403/// Perform a compound assignment of LVal <op>= RVal.
4404static bool handleCompoundAssignment(EvalInfo &Info,
4405 const CompoundAssignOperator *E,
4406 const LValue &LVal, QualType LValType,
4407 QualType PromotedLValType,
4408 BinaryOperatorKind Opcode,
4409 const APValue &RVal) {
4410 if (LVal.Designator.Invalid)
4411 return false;
4412
4413 if (!Info.getLangOpts().CPlusPlus14) {
4414 Info.FFDiag(E);
4415 return false;
4416 }
4417
4418 CompleteObject Obj = findCompleteObject(Info, E, AK_Assign, LVal, LValType);
4419 CompoundAssignSubobjectHandler Handler = { Info, E, PromotedLValType, Opcode,
4420 RVal };
4421 return Obj && findSubobject(Info, E, Obj, LVal.Designator, Handler);
4422}
4423
4424namespace {
4425struct IncDecSubobjectHandler {
4426 EvalInfo &Info;
4427 const UnaryOperator *E;
4428 AccessKinds AccessKind;
4429 APValue *Old;
4430
4431 typedef bool result_type;
4432
4433 bool checkConst(QualType QT) {
4434 // Assigning to a const object has undefined behavior.
4435 if (QT.isConstQualified()) {
4436 Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT;
4437 return false;
4438 }
4439 return true;
4440 }
4441
4442 bool failed() { return false; }
4443 bool found(APValue &Subobj, QualType SubobjType) {
4444 // Stash the old value. Also clear Old, so we don't clobber it later
4445 // if we're post-incrementing a complex.
4446 if (Old) {
4447 *Old = Subobj;
4448 Old = nullptr;
4449 }
4450
4451 switch (Subobj.getKind()) {
4452 case APValue::Int:
4453 return found(Subobj.getInt(), SubobjType);
4454 case APValue::Float:
4455 return found(Subobj.getFloat(), SubobjType);
4456 case APValue::ComplexInt:
4457 return found(Subobj.getComplexIntReal(),
4458 SubobjType->castAs<ComplexType>()->getElementType()
4459 .withCVRQualifiers(SubobjType.getCVRQualifiers()));
4460 case APValue::ComplexFloat:
4461 return found(Subobj.getComplexFloatReal(),
4462 SubobjType->castAs<ComplexType>()->getElementType()
4463 .withCVRQualifiers(SubobjType.getCVRQualifiers()));
4464 case APValue::LValue:
4465 return foundPointer(Subobj, SubobjType);
4466 default:
4467 // FIXME: can this happen?
4468 Info.FFDiag(E);
4469 return false;
4470 }
4471 }
4472 bool found(APSInt &Value, QualType SubobjType) {
4473 if (!checkConst(SubobjType))
4474 return false;
4475
4476 if (!SubobjType->isIntegerType()) {
4477 // We don't support increment / decrement on integer-cast-to-pointer
4478 // values.
4479 Info.FFDiag(E);
4480 return false;
4481 }
4482
4483 if (Old) *Old = APValue(Value);
4484
4485 // bool arithmetic promotes to int, and the conversion back to bool
4486 // doesn't reduce mod 2^n, so special-case it.
4487 if (SubobjType->isBooleanType()) {
4488 if (AccessKind == AK_Increment)
4489 Value = 1;
4490 else
4491 Value = !Value;
4492 return true;
4493 }
4494
4495 bool WasNegative = Value.isNegative();
4496 if (AccessKind == AK_Increment) {
4497 ++Value;
4498
4499 if (!WasNegative && Value.isNegative() && E->canOverflow()) {
4500 APSInt ActualValue(Value, /*IsUnsigned*/true);
4501 return HandleOverflow(Info, E, ActualValue, SubobjType);
4502 }
4503 } else {
4504 --Value;
4505
4506 if (WasNegative && !Value.isNegative() && E->canOverflow()) {
4507 unsigned BitWidth = Value.getBitWidth();
4508 APSInt ActualValue(Value.sext(BitWidth + 1), /*IsUnsigned*/false);
4509 ActualValue.setBit(BitWidth);
4510 return HandleOverflow(Info, E, ActualValue, SubobjType);
4511 }
4512 }
4513 return true;
4514 }
4515 bool found(APFloat &Value, QualType SubobjType) {
4516 if (!checkConst(SubobjType))
4517 return false;
4518
4519 if (Old) *Old = APValue(Value);
4520
4521 APFloat One(Value.getSemantics(), 1);
4522 if (AccessKind == AK_Increment)
4523 Value.add(One, APFloat::rmNearestTiesToEven);
4524 else
4525 Value.subtract(One, APFloat::rmNearestTiesToEven);
4526 return true;
4527 }
4528 bool foundPointer(APValue &Subobj, QualType SubobjType) {
4529 if (!checkConst(SubobjType))
4530 return false;
4531
4532 QualType PointeeType;
4533 if (const PointerType *PT = SubobjType->getAs<PointerType>())
4534 PointeeType = PT->getPointeeType();
4535 else {
4536 Info.FFDiag(E);
4537 return false;
4538 }
4539
4540 LValue LVal;
4541 LVal.setFrom(Info.Ctx, Subobj);
4542 if (!HandleLValueArrayAdjustment(Info, E, LVal, PointeeType,
4543 AccessKind == AK_Increment ? 1 : -1))
4544 return false;
4545 LVal.moveInto(Subobj);
4546 return true;
4547 }
4548};
4549} // end anonymous namespace
4550
4551/// Perform an increment or decrement on LVal.
4552static bool handleIncDec(EvalInfo &Info, const Expr *E, const LValue &LVal,
4553 QualType LValType, bool IsIncrement, APValue *Old) {
4554 if (LVal.Designator.Invalid)
4555 return false;
4556
4557 if (!Info.getLangOpts().CPlusPlus14) {
4558 Info.FFDiag(E);
4559 return false;
4560 }
4561
4562 AccessKinds AK = IsIncrement ? AK_Increment : AK_Decrement;
4563 CompleteObject Obj = findCompleteObject(Info, E, AK, LVal, LValType);
4564 IncDecSubobjectHandler Handler = {Info, cast<UnaryOperator>(E), AK, Old};
4565 return Obj && findSubobject(Info, E, Obj, LVal.Designator, Handler);
4566}
4567
4568/// Build an lvalue for the object argument of a member function call.
4569static bool EvaluateObjectArgument(EvalInfo &Info, const Expr *Object,
4570 LValue &This) {
4571 if (Object->getType()->isPointerType() && Object->isPRValue())
4572 return EvaluatePointer(Object, This, Info);
4573
4574 if (Object->isGLValue())
4575 return EvaluateLValue(Object, This, Info);
4576
4577 if (Object->getType()->isLiteralType(Info.Ctx))
4578 return EvaluateTemporary(Object, This, Info);
4579
4580 Info.FFDiag(Object, diag::note_constexpr_nonliteral) << Object->getType();
4581 return false;
4582}
4583
4584/// HandleMemberPointerAccess - Evaluate a member access operation and build an
4585/// lvalue referring to the result.
4586///
4587/// \param Info - Information about the ongoing evaluation.
4588/// \param LV - An lvalue referring to the base of the member pointer.
4589/// \param RHS - The member pointer expression.
4590/// \param IncludeMember - Specifies whether the member itself is included in
4591/// the resulting LValue subobject designator. This is not possible when
4592/// creating a bound member function.
4593/// \return The field or method declaration to which the member pointer refers,
4594/// or 0 if evaluation fails.
4595static const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info,
4596 QualType LVType,
4597 LValue &LV,
4598 const Expr *RHS,
4599 bool IncludeMember = true) {
4600 MemberPtr MemPtr;
4601 if (!EvaluateMemberPointer(RHS, MemPtr, Info))
4602 return nullptr;
4603
4604 // C++11 [expr.mptr.oper]p6: If the second operand is the null pointer to
4605 // member value, the behavior is undefined.
4606 if (!MemPtr.getDecl()) {
4607 // FIXME: Specific diagnostic.
4608 Info.FFDiag(RHS);
4609 return nullptr;
4610 }
4611
4612 if (MemPtr.isDerivedMember()) {
4613 // This is a member of some derived class. Truncate LV appropriately.
4614 // The end of the derived-to-base path for the base object must match the
4615 // derived-to-base path for the member pointer.
4616 if (LV.Designator.MostDerivedPathLength + MemPtr.Path.size() >
4617 LV.Designator.Entries.size()) {
4618 Info.FFDiag(RHS);
4619 return nullptr;
4620 }
4621 unsigned PathLengthToMember =
4622 LV.Designator.Entries.size() - MemPtr.Path.size();
4623 for (unsigned I = 0, N = MemPtr.Path.size(); I != N; ++I) {
4624 const CXXRecordDecl *LVDecl = getAsBaseClass(
4625 LV.Designator.Entries[PathLengthToMember + I]);
4626 const CXXRecordDecl *MPDecl = MemPtr.Path[I];
4627 if (LVDecl->getCanonicalDecl() != MPDecl->getCanonicalDecl()) {
4628 Info.FFDiag(RHS);
4629 return nullptr;
4630 }
4631 }
4632
4633 // Truncate the lvalue to the appropriate derived class.
4634 if (!CastToDerivedClass(Info, RHS, LV, MemPtr.getContainingRecord(),
4635 PathLengthToMember))
4636 return nullptr;
4637 } else if (!MemPtr.Path.empty()) {
4638 // Extend the LValue path with the member pointer's path.
4639 LV.Designator.Entries.reserve(LV.Designator.Entries.size() +
4640 MemPtr.Path.size() + IncludeMember);
4641
4642 // Walk down to the appropriate base class.
4643 if (const PointerType *PT = LVType->getAs<PointerType>())
4644 LVType = PT->getPointeeType();
4645 const CXXRecordDecl *RD = LVType->getAsCXXRecordDecl();
4646 assert(RD && "member pointer access on non-class-type expression")((void)0);
4647 // The first class in the path is that of the lvalue.
4648 for (unsigned I = 1, N = MemPtr.Path.size(); I != N; ++I) {
4649 const CXXRecordDecl *Base = MemPtr.Path[N - I - 1];
4650 if (!HandleLValueDirectBase(Info, RHS, LV, RD, Base))
4651 return nullptr;
4652 RD = Base;
4653 }
4654 // Finally cast to the class containing the member.
4655 if (!HandleLValueDirectBase(Info, RHS, LV, RD,
4656 MemPtr.getContainingRecord()))
4657 return nullptr;
4658 }
4659
4660 // Add the member. Note that we cannot build bound member functions here.
4661 if (IncludeMember) {
4662 if (const FieldDecl *FD = dyn_cast<FieldDecl>(MemPtr.getDecl())) {
4663 if (!HandleLValueMember(Info, RHS, LV, FD))
4664 return nullptr;
4665 } else if (const IndirectFieldDecl *IFD =
4666 dyn_cast<IndirectFieldDecl>(MemPtr.getDecl())) {
4667 if (!HandleLValueIndirectMember(Info, RHS, LV, IFD))
4668 return nullptr;
4669 } else {
4670 llvm_unreachable("can't construct reference to bound member function")__builtin_unreachable();
4671 }
4672 }
4673
4674 return MemPtr.getDecl();
4675}
4676
4677static const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info,
4678 const BinaryOperator *BO,
4679 LValue &LV,
4680 bool IncludeMember = true) {
4681 assert(BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI)((void)0);
4682
4683 if (!EvaluateObjectArgument(Info, BO->getLHS(), LV)) {
4684 if (Info.noteFailure()) {
4685 MemberPtr MemPtr;
4686 EvaluateMemberPointer(BO->getRHS(), MemPtr, Info);
4687 }
4688 return nullptr;
4689 }
4690
4691 return HandleMemberPointerAccess(Info, BO->getLHS()->getType(), LV,
4692 BO->getRHS(), IncludeMember);
4693}
4694
4695/// HandleBaseToDerivedCast - Apply the given base-to-derived cast operation on
4696/// the provided lvalue, which currently refers to the base object.
4697static bool HandleBaseToDerivedCast(EvalInfo &Info, const CastExpr *E,
4698 LValue &Result) {
4699 SubobjectDesignator &D = Result.Designator;
4700 if (D.Invalid || !Result.checkNullPointer(Info, E, CSK_Derived))
4701 return false;
4702
4703 QualType TargetQT = E->getType();
4704 if (const PointerType *PT = TargetQT->getAs<PointerType>())
4705 TargetQT = PT->getPointeeType();
4706
4707 // Check this cast lands within the final derived-to-base subobject path.
4708 if (D.MostDerivedPathLength + E->path_size() > D.Entries.size()) {
4709 Info.CCEDiag(E, diag::note_constexpr_invalid_downcast)
4710 << D.MostDerivedType << TargetQT;
4711 return false;
4712 }
4713
4714 // Check the type of the final cast. We don't need to check the path,
4715 // since a cast can only be formed if the path is unique.
4716 unsigned NewEntriesSize = D.Entries.size() - E->path_size();
4717 const CXXRecordDecl *TargetType = TargetQT->getAsCXXRecordDecl();
4718 const CXXRecordDecl *FinalType;
4719 if (NewEntriesSize == D.MostDerivedPathLength)
4720 FinalType = D.MostDerivedType->getAsCXXRecordDecl();
4721 else
4722 FinalType = getAsBaseClass(D.Entries[NewEntriesSize - 1]);
4723 if (FinalType->getCanonicalDecl() != TargetType->getCanonicalDecl()) {
4724 Info.CCEDiag(E, diag::note_constexpr_invalid_downcast)
4725 << D.MostDerivedType << TargetQT;
4726 return false;
4727 }
4728
4729 // Truncate the lvalue to the appropriate derived class.
4730 return CastToDerivedClass(Info, E, Result, TargetType, NewEntriesSize);
4731}
4732
4733/// Get the value to use for a default-initialized object of type T.
4734/// Return false if it encounters something invalid.
4735static bool getDefaultInitValue(QualType T, APValue &Result) {
4736 bool Success = true;
4737 if (auto *RD = T->getAsCXXRecordDecl()) {
4738 if (RD->isInvalidDecl()) {
4739 Result = APValue();
4740 return false;
4741 }
4742 if (RD->isUnion()) {
4743 Result = APValue((const FieldDecl *)nullptr);
4744 return true;
4745 }
4746 Result = APValue(APValue::UninitStruct(), RD->getNumBases(),
4747 std::distance(RD->field_begin(), RD->field_end()));
4748
4749 unsigned Index = 0;
4750 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
4751 End = RD->bases_end();
4752 I != End; ++I, ++Index)
4753 Success &= getDefaultInitValue(I->getType(), Result.getStructBase(Index));
4754
4755 for (const auto *I : RD->fields()) {
4756 if (I->isUnnamedBitfield())
4757 continue;
4758 Success &= getDefaultInitValue(I->getType(),
4759 Result.getStructField(I->getFieldIndex()));
4760 }
4761 return Success;
4762 }
4763
4764 if (auto *AT =
4765 dyn_cast_or_null<ConstantArrayType>(T->getAsArrayTypeUnsafe())) {
4766 Result = APValue(APValue::UninitArray(), 0, AT->getSize().getZExtValue());
4767 if (Result.hasArrayFiller())
4768 Success &=
4769 getDefaultInitValue(AT->getElementType(), Result.getArrayFiller());
4770
4771 return Success;
4772 }
4773
4774 Result = APValue::IndeterminateValue();
4775 return true;
4776}
4777
4778namespace {
4779enum EvalStmtResult {
4780 /// Evaluation failed.
4781 ESR_Failed,
4782 /// Hit a 'return' statement.
4783 ESR_Returned,
4784 /// Evaluation succeeded.
4785 ESR_Succeeded,
4786 /// Hit a 'continue' statement.
4787 ESR_Continue,
4788 /// Hit a 'break' statement.
4789 ESR_Break,
4790 /// Still scanning for 'case' or 'default' statement.
4791 ESR_CaseNotFound
4792};
4793}
4794
4795static bool EvaluateVarDecl(EvalInfo &Info, const VarDecl *VD) {
4796 // We don't need to evaluate the initializer for a static local.
4797 if (!VD->hasLocalStorage())
4798 return true;
4799
4800 LValue Result;
4801 APValue &Val = Info.CurrentCall->createTemporary(VD, VD->getType(),
4802 ScopeKind::Block, Result);
4803
4804 const Expr *InitE = VD->getInit();
4805 if (!InitE) {
4806 if (VD->getType()->isDependentType())
4807 return Info.noteSideEffect();
4808 return getDefaultInitValue(VD->getType(), Val);
4809 }
4810 if (InitE->isValueDependent())
4811 return false;
4812
4813 if (!EvaluateInPlace(Val, Info, Result, InitE)) {
4814 // Wipe out any partially-computed value, to allow tracking that this
4815 // evaluation failed.
4816 Val = APValue();
4817 return false;
4818 }
4819
4820 return true;
4821}
4822
4823static bool EvaluateDecl(EvalInfo &Info, const Decl *D) {
4824 bool OK = true;
4825
4826 if (const VarDecl *VD = dyn_cast<VarDecl>(D))
4827 OK &= EvaluateVarDecl(Info, VD);
4828
4829 if (const DecompositionDecl *DD = dyn_cast<DecompositionDecl>(D))
4830 for (auto *BD : DD->bindings())
4831 if (auto *VD = BD->getHoldingVar())
4832 OK &= EvaluateDecl(Info, VD);
4833
4834 return OK;
4835}
4836
4837static bool EvaluateDependentExpr(const Expr *E, EvalInfo &Info) {
4838 assert(E->isValueDependent())((void)0);
4839 if (Info.noteSideEffect())
4840 return true;
4841 assert(E->containsErrors() && "valid value-dependent expression should never "((void)0)
4842 "reach invalid code path.")((void)0);
4843 return false;
4844}
4845
4846/// Evaluate a condition (either a variable declaration or an expression).
4847static bool EvaluateCond(EvalInfo &Info, const VarDecl *CondDecl,
4848 const Expr *Cond, bool &Result) {
4849 if (Cond->isValueDependent())
4850 return false;
4851 FullExpressionRAII Scope(Info);
4852 if (CondDecl && !EvaluateDecl(Info, CondDecl))
4853 return false;
4854 if (!EvaluateAsBooleanCondition(Cond, Result, Info))
4855 return false;
4856 return Scope.destroy();
4857}
4858
4859namespace {
4860/// A location where the result (returned value) of evaluating a
4861/// statement should be stored.
4862struct StmtResult {
4863 /// The APValue that should be filled in with the returned value.
4864 APValue &Value;
4865 /// The location containing the result, if any (used to support RVO).
4866 const LValue *Slot;
4867};
4868
4869struct TempVersionRAII {
4870 CallStackFrame &Frame;
4871
4872 TempVersionRAII(CallStackFrame &Frame) : Frame(Frame) {
4873 Frame.pushTempVersion();
4874 }
4875
4876 ~TempVersionRAII() {
4877 Frame.popTempVersion();
4878 }
4879};
4880
4881}
4882
4883static EvalStmtResult EvaluateStmt(StmtResult &Result, EvalInfo &Info,
4884 const Stmt *S,
4885 const SwitchCase *SC = nullptr);
4886
4887/// Evaluate the body of a loop, and translate the result as appropriate.
4888static EvalStmtResult EvaluateLoopBody(StmtResult &Result, EvalInfo &Info,
4889 const Stmt *Body,
4890 const SwitchCase *Case = nullptr) {
4891 BlockScopeRAII Scope(Info);
4892
4893 EvalStmtResult ESR = EvaluateStmt(Result, Info, Body, Case);
4894 if (ESR != ESR_Failed && ESR != ESR_CaseNotFound && !Scope.destroy())
4895 ESR = ESR_Failed;
4896
4897 switch (ESR) {
4898 case ESR_Break:
4899 return ESR_Succeeded;
4900 case ESR_Succeeded:
4901 case ESR_Continue:
4902 return ESR_Continue;
4903 case ESR_Failed:
4904 case ESR_Returned:
4905 case ESR_CaseNotFound:
4906 return ESR;
4907 }
4908 llvm_unreachable("Invalid EvalStmtResult!")__builtin_unreachable();
4909}
4910
4911/// Evaluate a switch statement.
4912static EvalStmtResult EvaluateSwitch(StmtResult &Result, EvalInfo &Info,
4913 const SwitchStmt *SS) {
4914 BlockScopeRAII Scope(Info);
4915
4916 // Evaluate the switch condition.
4917 APSInt Value;
4918 {
4919 if (const Stmt *Init = SS->getInit()) {
4920 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init);
4921 if (ESR != ESR_Succeeded) {
4922 if (ESR != ESR_Failed && !Scope.destroy())
4923 ESR = ESR_Failed;
4924 return ESR;
4925 }
4926 }
4927
4928 FullExpressionRAII CondScope(Info);
4929 if (SS->getConditionVariable() &&
4930 !EvaluateDecl(Info, SS->getConditionVariable()))
4931 return ESR_Failed;
4932 if (!EvaluateInteger(SS->getCond(), Value, Info))
4933 return ESR_Failed;
4934 if (!CondScope.destroy())
4935 return ESR_Failed;
4936 }
4937
4938 // Find the switch case corresponding to the value of the condition.
4939 // FIXME: Cache this lookup.
4940 const SwitchCase *Found = nullptr;
4941 for (const SwitchCase *SC = SS->getSwitchCaseList(); SC;
4942 SC = SC->getNextSwitchCase()) {
4943 if (isa<DefaultStmt>(SC)) {
4944 Found = SC;
4945 continue;
4946 }
4947
4948 const CaseStmt *CS = cast<CaseStmt>(SC);
4949 APSInt LHS = CS->getLHS()->EvaluateKnownConstInt(Info.Ctx);
4950 APSInt RHS = CS->getRHS() ? CS->getRHS()->EvaluateKnownConstInt(Info.Ctx)
4951 : LHS;
4952 if (LHS <= Value && Value <= RHS) {
4953 Found = SC;
4954 break;
4955 }
4956 }
4957
4958 if (!Found)
4959 return Scope.destroy() ? ESR_Succeeded : ESR_Failed;
4960
4961 // Search the switch body for the switch case and evaluate it from there.
4962 EvalStmtResult ESR = EvaluateStmt(Result, Info, SS->getBody(), Found);
4963 if (ESR != ESR_Failed && ESR != ESR_CaseNotFound && !Scope.destroy())
4964 return ESR_Failed;
4965
4966 switch (ESR) {
4967 case ESR_Break:
4968 return ESR_Succeeded;
4969 case ESR_Succeeded:
4970 case ESR_Continue:
4971 case ESR_Failed:
4972 case ESR_Returned:
4973 return ESR;
4974 case ESR_CaseNotFound:
4975 // This can only happen if the switch case is nested within a statement
4976 // expression. We have no intention of supporting that.
4977 Info.FFDiag(Found->getBeginLoc(),
4978 diag::note_constexpr_stmt_expr_unsupported);
4979 return ESR_Failed;
4980 }
4981 llvm_unreachable("Invalid EvalStmtResult!")__builtin_unreachable();
4982}
4983
4984// Evaluate a statement.
4985static EvalStmtResult EvaluateStmt(StmtResult &Result, EvalInfo &Info,
4986 const Stmt *S, const SwitchCase *Case) {
4987 if (!Info.nextStep(S))
4988 return ESR_Failed;
4989
4990 // If we're hunting down a 'case' or 'default' label, recurse through
4991 // substatements until we hit the label.
4992 if (Case) {
4993 switch (S->getStmtClass()) {
4994 case Stmt::CompoundStmtClass:
4995 // FIXME: Precompute which substatement of a compound statement we
4996 // would jump to, and go straight there rather than performing a
4997 // linear scan each time.
4998 case Stmt::LabelStmtClass:
4999 case Stmt::AttributedStmtClass:
5000 case Stmt::DoStmtClass:
5001 break;
5002
5003 case Stmt::CaseStmtClass:
5004 case Stmt::DefaultStmtClass:
5005 if (Case == S)
5006 Case = nullptr;
5007 break;
5008
5009 case Stmt::IfStmtClass: {
5010 // FIXME: Precompute which side of an 'if' we would jump to, and go
5011 // straight there rather than scanning both sides.
5012 const IfStmt *IS = cast<IfStmt>(S);
5013
5014 // Wrap the evaluation in a block scope, in case it's a DeclStmt
5015 // preceded by our switch label.
5016 BlockScopeRAII Scope(Info);
5017
5018 // Step into the init statement in case it brings an (uninitialized)
5019 // variable into scope.
5020 if (const Stmt *Init = IS->getInit()) {
5021 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init, Case);
5022 if (ESR != ESR_CaseNotFound) {
5023 assert(ESR != ESR_Succeeded)((void)0);
5024 return ESR;
5025 }
5026 }
5027
5028 // Condition variable must be initialized if it exists.
5029 // FIXME: We can skip evaluating the body if there's a condition
5030 // variable, as there can't be any case labels within it.
5031 // (The same is true for 'for' statements.)
5032
5033 EvalStmtResult ESR = EvaluateStmt(Result, Info, IS->getThen(), Case);
5034 if (ESR == ESR_Failed)
5035 return ESR;
5036 if (ESR != ESR_CaseNotFound)
5037 return Scope.destroy() ? ESR : ESR_Failed;
5038 if (!IS->getElse())
5039 return ESR_CaseNotFound;
5040
5041 ESR = EvaluateStmt(Result, Info, IS->getElse(), Case);
5042 if (ESR == ESR_Failed)
5043 return ESR;
5044 if (ESR != ESR_CaseNotFound)
5045 return Scope.destroy() ? ESR : ESR_Failed;
5046 return ESR_CaseNotFound;
5047 }
5048
5049 case Stmt::WhileStmtClass: {
5050 EvalStmtResult ESR =
5051 EvaluateLoopBody(Result, Info, cast<WhileStmt>(S)->getBody(), Case);
5052 if (ESR != ESR_Continue)
5053 return ESR;
5054 break;
5055 }
5056
5057 case Stmt::ForStmtClass: {
5058 const ForStmt *FS = cast<ForStmt>(S);
5059 BlockScopeRAII Scope(Info);
5060
5061 // Step into the init statement in case it brings an (uninitialized)
5062 // variable into scope.
5063 if (const Stmt *Init = FS->getInit()) {
5064 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init, Case);
5065 if (ESR != ESR_CaseNotFound) {
5066 assert(ESR != ESR_Succeeded)((void)0);
5067 return ESR;
5068 }
5069 }
5070
5071 EvalStmtResult ESR =
5072 EvaluateLoopBody(Result, Info, FS->getBody(), Case);
5073 if (ESR != ESR_Continue)
5074 return ESR;
5075 if (const auto *Inc = FS->getInc()) {
5076 if (Inc->isValueDependent()) {
5077 if (!EvaluateDependentExpr(Inc, Info))
5078 return ESR_Failed;
5079 } else {
5080 FullExpressionRAII IncScope(Info);
5081 if (!EvaluateIgnoredValue(Info, Inc) || !IncScope.destroy())
5082 return ESR_Failed;
5083 }
5084 }
5085 break;
5086 }
5087
5088 case Stmt::DeclStmtClass: {
5089 // Start the lifetime of any uninitialized variables we encounter. They
5090 // might be used by the selected branch of the switch.
5091 const DeclStmt *DS = cast<DeclStmt>(S);
5092 for (const auto *D : DS->decls()) {
5093 if (const auto *VD = dyn_cast<VarDecl>(D)) {
5094 if (VD->hasLocalStorage() && !VD->getInit())
5095 if (!EvaluateVarDecl(Info, VD))
5096 return ESR_Failed;
5097 // FIXME: If the variable has initialization that can't be jumped
5098 // over, bail out of any immediately-surrounding compound-statement
5099 // too. There can't be any case labels here.
5100 }
5101 }
5102 return ESR_CaseNotFound;
5103 }
5104
5105 default:
5106 return ESR_CaseNotFound;
5107 }
5108 }
5109
5110 switch (S->getStmtClass()) {
5111 default:
5112 if (const Expr *E = dyn_cast<Expr>(S)) {
5113 if (E->isValueDependent()) {
5114 if (!EvaluateDependentExpr(E, Info))
5115 return ESR_Failed;
5116 } else {
5117 // Don't bother evaluating beyond an expression-statement which couldn't
5118 // be evaluated.
5119 // FIXME: Do we need the FullExpressionRAII object here?
5120 // VisitExprWithCleanups should create one when necessary.
5121 FullExpressionRAII Scope(Info);
5122 if (!EvaluateIgnoredValue(Info, E) || !Scope.destroy())
5123 return ESR_Failed;
5124 }
5125 return ESR_Succeeded;
5126 }
5127
5128 Info.FFDiag(S->getBeginLoc());
5129 return ESR_Failed;
5130
5131 case Stmt::NullStmtClass:
5132 return ESR_Succeeded;
5133
5134 case Stmt::DeclStmtClass: {
5135 const DeclStmt *DS = cast<DeclStmt>(S);
5136 for (const auto *D : DS->decls()) {
5137 // Each declaration initialization is its own full-expression.
5138 FullExpressionRAII Scope(Info);
5139 if (!EvaluateDecl(Info, D) && !Info.noteFailure())
5140 return ESR_Failed;
5141 if (!Scope.destroy())
5142 return ESR_Failed;
5143 }
5144 return ESR_Succeeded;
5145 }
5146
5147 case Stmt::ReturnStmtClass: {
5148 const Expr *RetExpr = cast<ReturnStmt>(S)->getRetValue();
5149 FullExpressionRAII Scope(Info);
5150 if (RetExpr && RetExpr->isValueDependent()) {
5151 EvaluateDependentExpr(RetExpr, Info);
5152 // We know we returned, but we don't know what the value is.
5153 return ESR_Failed;
5154 }
5155 if (RetExpr &&
5156 !(Result.Slot
5157 ? EvaluateInPlace(Result.Value, Info, *Result.Slot, RetExpr)
5158 : Evaluate(Result.Value, Info, RetExpr)))
5159 return ESR_Failed;
5160 return Scope.destroy() ? ESR_Returned : ESR_Failed;
5161 }
5162
5163 case Stmt::CompoundStmtClass: {
5164 BlockScopeRAII Scope(Info);
5165
5166 const CompoundStmt *CS = cast<CompoundStmt>(S);
5167 for (const auto *BI : CS->body()) {
5168 EvalStmtResult ESR = EvaluateStmt(Result, Info, BI, Case);
5169 if (ESR == ESR_Succeeded)
5170 Case = nullptr;
5171 else if (ESR != ESR_CaseNotFound) {
5172 if (ESR != ESR_Failed && !Scope.destroy())
5173 return ESR_Failed;
5174 return ESR;
5175 }
5176 }
5177 if (Case)
5178 return ESR_CaseNotFound;
5179 return Scope.destroy() ? ESR_Succeeded : ESR_Failed;
5180 }
5181
5182 case Stmt::IfStmtClass: {
5183 const IfStmt *IS = cast<IfStmt>(S);
5184
5185 // Evaluate the condition, as either a var decl or as an expression.
5186 BlockScopeRAII Scope(Info);
5187 if (const Stmt *Init = IS->getInit()) {
5188 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init);
5189 if (ESR != ESR_Succeeded) {
5190 if (ESR != ESR_Failed && !Scope.destroy())
5191 return ESR_Failed;
5192 return ESR;
5193 }
5194 }
5195 bool Cond;
5196 if (!EvaluateCond(Info, IS->getConditionVariable(), IS->getCond(), Cond))
5197 return ESR_Failed;
5198
5199 if (const Stmt *SubStmt = Cond ? IS->getThen() : IS->getElse()) {
5200 EvalStmtResult ESR = EvaluateStmt(Result, Info, SubStmt);
5201 if (ESR != ESR_Succeeded) {
5202 if (ESR != ESR_Failed && !Scope.destroy())
5203 return ESR_Failed;
5204 return ESR;
5205 }
5206 }
5207 return Scope.destroy() ? ESR_Succeeded : ESR_Failed;
5208 }
5209
5210 case Stmt::WhileStmtClass: {
5211 const WhileStmt *WS = cast<WhileStmt>(S);
5212 while (true) {
5213 BlockScopeRAII Scope(Info);
5214 bool Continue;
5215 if (!EvaluateCond(Info, WS->getConditionVariable(), WS->getCond(),
5216 Continue))
5217 return ESR_Failed;
5218 if (!Continue)
5219 break;
5220
5221 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, WS->getBody());
5222 if (ESR != ESR_Continue) {
5223 if (ESR != ESR_Failed && !Scope.destroy())
5224 return ESR_Failed;
5225 return ESR;
5226 }
5227 if (!Scope.destroy())
5228 return ESR_Failed;
5229 }
5230 return ESR_Succeeded;
5231 }
5232
5233 case Stmt::DoStmtClass: {
5234 const DoStmt *DS = cast<DoStmt>(S);
5235 bool Continue;
5236 do {
5237 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, DS->getBody(), Case);
5238 if (ESR != ESR_Continue)
5239 return ESR;
5240 Case = nullptr;
5241
5242 if (DS->getCond()->isValueDependent()) {
5243 EvaluateDependentExpr(DS->getCond(), Info);
5244 // Bailout as we don't know whether to keep going or terminate the loop.
5245 return ESR_Failed;
5246 }
5247 FullExpressionRAII CondScope(Info);
5248 if (!EvaluateAsBooleanCondition(DS->getCond(), Continue, Info) ||
5249 !CondScope.destroy())
5250 return ESR_Failed;
5251 } while (Continue);
5252 return ESR_Succeeded;
5253 }
5254
5255 case Stmt::ForStmtClass: {
5256 const ForStmt *FS = cast<ForStmt>(S);
5257 BlockScopeRAII ForScope(Info);
5258 if (FS->getInit()) {
5259 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getInit());
5260 if (ESR != ESR_Succeeded) {
5261 if (ESR != ESR_Failed && !ForScope.destroy())
5262 return ESR_Failed;
5263 return ESR;
5264 }
5265 }
5266 while (true) {
5267 BlockScopeRAII IterScope(Info);
5268 bool Continue = true;
5269 if (FS->getCond() && !EvaluateCond(Info, FS->getConditionVariable(),
5270 FS->getCond(), Continue))
5271 return ESR_Failed;
5272 if (!Continue)
5273 break;
5274
5275 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, FS->getBody());
5276 if (ESR != ESR_Continue) {
5277 if (ESR != ESR_Failed && (!IterScope.destroy() || !ForScope.destroy()))
5278 return ESR_Failed;
5279 return ESR;
5280 }
5281
5282 if (const auto *Inc = FS->getInc()) {
5283 if (Inc->isValueDependent()) {
5284 if (!EvaluateDependentExpr(Inc, Info))
5285 return ESR_Failed;
5286 } else {
5287 FullExpressionRAII IncScope(Info);
5288 if (!EvaluateIgnoredValue(Info, Inc) || !IncScope.destroy())
5289 return ESR_Failed;
5290 }
5291 }
5292
5293 if (!IterScope.destroy())
5294 return ESR_Failed;
5295 }
5296 return ForScope.destroy() ? ESR_Succeeded : ESR_Failed;
5297 }
5298
5299 case Stmt::CXXForRangeStmtClass: {
5300 const CXXForRangeStmt *FS = cast<CXXForRangeStmt>(S);
5301 BlockScopeRAII Scope(Info);
5302
5303 // Evaluate the init-statement if present.
5304 if (FS->getInit()) {
5305 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getInit());
5306 if (ESR != ESR_Succeeded) {
5307 if (ESR != ESR_Failed && !Scope.destroy())
5308 return ESR_Failed;
5309 return ESR;
5310 }
5311 }
5312
5313 // Initialize the __range variable.
5314 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getRangeStmt());
5315 if (ESR != ESR_Succeeded) {
5316 if (ESR != ESR_Failed && !Scope.destroy())
5317 return ESR_Failed;
5318 return ESR;
5319 }
5320
5321 // Create the __begin and __end iterators.
5322 ESR = EvaluateStmt(Result, Info, FS->getBeginStmt());
5323 if (ESR != ESR_Succeeded) {
5324 if (ESR != ESR_Failed && !Scope.destroy())
5325 return ESR_Failed;
5326 return ESR;
5327 }
5328 ESR = EvaluateStmt(Result, Info, FS->getEndStmt());
5329 if (ESR != ESR_Succeeded) {
5330 if (ESR != ESR_Failed && !Scope.destroy())
5331 return ESR_Failed;
5332 return ESR;
5333 }
5334
5335 while (true) {
5336 // Condition: __begin != __end.
5337 {
5338 if (FS->getCond()->isValueDependent()) {
5339 EvaluateDependentExpr(FS->getCond(), Info);
5340 // We don't know whether to keep going or terminate the loop.
5341 return ESR_Failed;
5342 }
5343 bool Continue = true;
5344 FullExpressionRAII CondExpr(Info);
5345 if (!EvaluateAsBooleanCondition(FS->getCond(), Continue, Info))
5346 return ESR_Failed;
5347 if (!Continue)
5348 break;
5349 }
5350
5351 // User's variable declaration, initialized by *__begin.
5352 BlockScopeRAII InnerScope(Info);
5353 ESR = EvaluateStmt(Result, Info, FS->getLoopVarStmt());
5354 if (ESR != ESR_Succeeded) {
5355 if (ESR != ESR_Failed && (!InnerScope.destroy() || !Scope.destroy()))
5356 return ESR_Failed;
5357 return ESR;
5358 }
5359
5360 // Loop body.
5361 ESR = EvaluateLoopBody(Result, Info, FS->getBody());
5362 if (ESR != ESR_Continue) {
5363 if (ESR != ESR_Failed && (!InnerScope.destroy() || !Scope.destroy()))
5364 return ESR_Failed;
5365 return ESR;
5366 }
5367 if (FS->getInc()->isValueDependent()) {
5368 if (!EvaluateDependentExpr(FS->getInc(), Info))
5369 return ESR_Failed;
5370 } else {
5371 // Increment: ++__begin
5372 if (!EvaluateIgnoredValue(Info, FS->getInc()))
5373 return ESR_Failed;
5374 }
5375
5376 if (!InnerScope.destroy())
5377 return ESR_Failed;
5378 }
5379
5380 return Scope.destroy() ? ESR_Succeeded : ESR_Failed;
5381 }
5382
5383 case Stmt::SwitchStmtClass:
5384 return EvaluateSwitch(Result, Info, cast<SwitchStmt>(S));
5385
5386 case Stmt::ContinueStmtClass:
5387 return ESR_Continue;
5388
5389 case Stmt::BreakStmtClass:
5390 return ESR_Break;
5391
5392 case Stmt::LabelStmtClass:
5393 return EvaluateStmt(Result, Info, cast<LabelStmt>(S)->getSubStmt(), Case);
5394
5395 case Stmt::AttributedStmtClass:
5396 // As a general principle, C++11 attributes can be ignored without
5397 // any semantic impact.
5398 return EvaluateStmt(Result, Info, cast<AttributedStmt>(S)->getSubStmt(),
5399 Case);
5400
5401 case Stmt::CaseStmtClass:
5402 case Stmt::DefaultStmtClass:
5403 return EvaluateStmt(Result, Info, cast<SwitchCase>(S)->getSubStmt(), Case);
5404 case Stmt::CXXTryStmtClass:
5405 // Evaluate try blocks by evaluating all sub statements.
5406 return EvaluateStmt(Result, Info, cast<CXXTryStmt>(S)->getTryBlock(), Case);
5407 }
5408}
5409
5410/// CheckTrivialDefaultConstructor - Check whether a constructor is a trivial
5411/// default constructor. If so, we'll fold it whether or not it's marked as
5412/// constexpr. If it is marked as constexpr, we will never implicitly define it,
5413/// so we need special handling.
5414static bool CheckTrivialDefaultConstructor(EvalInfo &Info, SourceLocation Loc,
5415 const CXXConstructorDecl *CD,
5416 bool IsValueInitialization) {
5417 if (!CD->isTrivial() || !CD->isDefaultConstructor())
5418 return false;
5419
5420 // Value-initialization does not call a trivial default constructor, so such a
5421 // call is a core constant expression whether or not the constructor is
5422 // constexpr.
5423 if (!CD->isConstexpr() && !IsValueInitialization) {
5424 if (Info.getLangOpts().CPlusPlus11) {
5425 // FIXME: If DiagDecl is an implicitly-declared special member function,
5426 // we should be much more explicit about why it's not constexpr.
5427 Info.CCEDiag(Loc, diag::note_constexpr_invalid_function, 1)
5428 << /*IsConstexpr*/0 << /*IsConstructor*/1 << CD;
5429 Info.Note(CD->getLocation(), diag::note_declared_at);
5430 } else {
5431 Info.CCEDiag(Loc, diag::note_invalid_subexpr_in_const_expr);
5432 }
5433 }
5434 return true;
5435}
5436
5437/// CheckConstexprFunction - Check that a function can be called in a constant
5438/// expression.
5439static bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc,
5440 const FunctionDecl *Declaration,
5441 const FunctionDecl *Definition,
5442 const Stmt *Body) {
5443 // Potential constant expressions can contain calls to declared, but not yet
5444 // defined, constexpr functions.
5445 if (Info.checkingPotentialConstantExpression() && !Definition &&
5446 Declaration->isConstexpr())
5447 return false;
5448
5449 // Bail out if the function declaration itself is invalid. We will
5450 // have produced a relevant diagnostic while parsing it, so just
5451 // note the problematic sub-expression.
5452 if (Declaration->isInvalidDecl()) {
5453 Info.FFDiag(CallLoc, diag::note_invalid_subexpr_in_const_expr);
5454 return false;
5455 }
5456
5457 // DR1872: An instantiated virtual constexpr function can't be called in a
5458 // constant expression (prior to C++20). We can still constant-fold such a
5459 // call.
5460 if (!Info.Ctx.getLangOpts().CPlusPlus20 && isa<CXXMethodDecl>(Declaration) &&
5461 cast<CXXMethodDecl>(Declaration)->isVirtual())
5462 Info.CCEDiag(CallLoc, diag::note_constexpr_virtual_call);
5463
5464 if (Definition && Definition->isInvalidDecl()) {
5465 Info.FFDiag(CallLoc, diag::note_invalid_subexpr_in_const_expr);
5466 return false;
5467 }
5468
5469 // Can we evaluate this function call?
5470 if (Definition && Definition->isConstexpr() && Body)
5471 return true;
5472
5473 if (Info.getLangOpts().CPlusPlus11) {
5474 const FunctionDecl *DiagDecl = Definition ? Definition : Declaration;
5475
5476 // If this function is not constexpr because it is an inherited
5477 // non-constexpr constructor, diagnose that directly.
5478 auto *CD = dyn_cast<CXXConstructorDecl>(DiagDecl);
5479 if (CD && CD->isInheritingConstructor()) {
5480 auto *Inherited = CD->getInheritedConstructor().getConstructor();
5481 if (!Inherited->isConstexpr())
5482 DiagDecl = CD = Inherited;
5483 }
5484
5485 // FIXME: If DiagDecl is an implicitly-declared special member function
5486 // or an inheriting constructor, we should be much more explicit about why
5487 // it's not constexpr.
5488 if (CD && CD->isInheritingConstructor())
5489 Info.FFDiag(CallLoc, diag::note_constexpr_invalid_inhctor, 1)
5490 << CD->getInheritedConstructor().getConstructor()->getParent();
5491 else
5492 Info.FFDiag(CallLoc, diag::note_constexpr_invalid_function, 1)
5493 << DiagDecl->isConstexpr() << (bool)CD << DiagDecl;
5494 Info.Note(DiagDecl->getLocation(), diag::note_declared_at);
5495 } else {
5496 Info.FFDiag(CallLoc, diag::note_invalid_subexpr_in_const_expr);
5497 }
5498 return false;
5499}
5500
5501namespace {
5502struct CheckDynamicTypeHandler {
5503 AccessKinds AccessKind;
5504 typedef bool result_type;
5505 bool failed() { return false; }
5506 bool found(APValue &Subobj, QualType SubobjType) { return true; }
5507 bool found(APSInt &Value, QualType SubobjType) { return true; }
5508 bool found(APFloat &Value, QualType SubobjType) { return true; }
5509};
5510} // end anonymous namespace
5511
5512/// Check that we can access the notional vptr of an object / determine its
5513/// dynamic type.
5514static bool checkDynamicType(EvalInfo &Info, const Expr *E, const LValue &This,
5515 AccessKinds AK, bool Polymorphic) {
5516 if (This.Designator.Invalid)
5517 return false;
5518
5519 CompleteObject Obj = findCompleteObject(Info, E, AK, This, QualType());
5520
5521 if (!Obj)
5522 return false;
5523
5524 if (!Obj.Value) {
5525 // The object is not usable in constant expressions, so we can't inspect
5526 // its value to see if it's in-lifetime or what the active union members
5527 // are. We can still check for a one-past-the-end lvalue.
5528 if (This.Designator.isOnePastTheEnd() ||
5529 This.Designator.isMostDerivedAnUnsizedArray()) {
5530 Info.FFDiag(E, This.Designator.isOnePastTheEnd()
5531 ? diag::note_constexpr_access_past_end
5532 : diag::note_constexpr_access_unsized_array)
5533 << AK;
5534 return false;
5535 } else if (Polymorphic) {
5536 // Conservatively refuse to perform a polymorphic operation if we would
5537 // not be able to read a notional 'vptr' value.
5538 APValue Val;
5539 This.moveInto(Val);
5540 QualType StarThisType =
5541 Info.Ctx.getLValueReferenceType(This.Designator.getType(Info.Ctx));
5542 Info.FFDiag(E, diag::note_constexpr_polymorphic_unknown_dynamic_type)
5543 << AK << Val.getAsString(Info.Ctx, StarThisType);
5544 return false;
5545 }
5546 return true;
5547 }
5548
5549 CheckDynamicTypeHandler Handler{AK};
5550 return Obj && findSubobject(Info, E, Obj, This.Designator, Handler);
5551}
5552
5553/// Check that the pointee of the 'this' pointer in a member function call is
5554/// either within its lifetime or in its period of construction or destruction.
5555static bool
5556checkNonVirtualMemberCallThisPointer(EvalInfo &Info, const Expr *E,
5557 const LValue &This,
5558 const CXXMethodDecl *NamedMember) {
5559 return checkDynamicType(
5560 Info, E, This,
5561 isa<CXXDestructorDecl>(NamedMember) ? AK_Destroy : AK_MemberCall, false);
5562}
5563
5564struct DynamicType {
5565 /// The dynamic class type of the object.
5566 const CXXRecordDecl *Type;
5567 /// The corresponding path length in the lvalue.
5568 unsigned PathLength;
5569};
5570
5571static const CXXRecordDecl *getBaseClassType(SubobjectDesignator &Designator,
5572 unsigned PathLength) {
5573 assert(PathLength >= Designator.MostDerivedPathLength && PathLength <=((void)0)
5574 Designator.Entries.size() && "invalid path length")((void)0);
5575 return (PathLength == Designator.MostDerivedPathLength)
5576 ? Designator.MostDerivedType->getAsCXXRecordDecl()
5577 : getAsBaseClass(Designator.Entries[PathLength - 1]);
5578}
5579
5580/// Determine the dynamic type of an object.
5581static Optional<DynamicType> ComputeDynamicType(EvalInfo &Info, const Expr *E,
5582 LValue &This, AccessKinds AK) {
5583 // If we don't have an lvalue denoting an object of class type, there is no
5584 // meaningful dynamic type. (We consider objects of non-class type to have no
5585 // dynamic type.)
5586 if (!checkDynamicType(Info, E, This, AK, true))
5587 return None;
5588
5589 // Refuse to compute a dynamic type in the presence of virtual bases. This
5590 // shouldn't happen other than in constant-folding situations, since literal
5591 // types can't have virtual bases.
5592 //
5593 // Note that consumers of DynamicType assume that the type has no virtual
5594 // bases, and will need modifications if this restriction is relaxed.
5595 const CXXRecordDecl *Class =
5596 This.Designator.MostDerivedType->getAsCXXRecordDecl();
5597 if (!Class || Class->getNumVBases()) {
5598 Info.FFDiag(E);
5599 return None;
5600 }
5601
5602 // FIXME: For very deep class hierarchies, it might be beneficial to use a
5603 // binary search here instead. But the overwhelmingly common case is that
5604 // we're not in the middle of a constructor, so it probably doesn't matter
5605 // in practice.
5606 ArrayRef<APValue::LValuePathEntry> Path = This.Designator.Entries;
5607 for (unsigned PathLength = This.Designator.MostDerivedPathLength;
5608 PathLength <= Path.size(); ++PathLength) {
5609 switch (Info.isEvaluatingCtorDtor(This.getLValueBase(),
5610 Path.slice(0, PathLength))) {
5611 case ConstructionPhase::Bases:
5612 case ConstructionPhase::DestroyingBases:
5613 // We're constructing or destroying a base class. This is not the dynamic
5614 // type.
5615 break;
5616
5617 case ConstructionPhase::None:
5618 case ConstructionPhase::AfterBases:
5619 case ConstructionPhase::AfterFields:
5620 case ConstructionPhase::Destroying:
5621 // We've finished constructing the base classes and not yet started
5622 // destroying them again, so this is the dynamic type.
5623 return DynamicType{getBaseClassType(This.Designator, PathLength),
5624 PathLength};
5625 }
5626 }
5627
5628 // CWG issue 1517: we're constructing a base class of the object described by
5629 // 'This', so that object has not yet begun its period of construction and
5630 // any polymorphic operation on it results in undefined behavior.
5631 Info.FFDiag(E);
5632 return None;
5633}
5634
5635/// Perform virtual dispatch.
5636static const CXXMethodDecl *HandleVirtualDispatch(
5637 EvalInfo &Info, const Expr *E, LValue &This, const CXXMethodDecl *Found,
5638 llvm::SmallVectorImpl<QualType> &CovariantAdjustmentPath) {
5639 Optional<DynamicType> DynType = ComputeDynamicType(
5640 Info, E, This,
5641 isa<CXXDestructorDecl>(Found) ? AK_Destroy : AK_MemberCall);
5642 if (!DynType)
5643 return nullptr;
5644
5645 // Find the final overrider. It must be declared in one of the classes on the
5646 // path from the dynamic type to the static type.
5647 // FIXME: If we ever allow literal types to have virtual base classes, that
5648 // won't be true.
5649 const CXXMethodDecl *Callee = Found;
5650 unsigned PathLength = DynType->PathLength;
5651 for (/**/; PathLength <= This.Designator.Entries.size(); ++PathLength) {
5652 const CXXRecordDecl *Class = getBaseClassType(This.Designator, PathLength);
5653 const CXXMethodDecl *Overrider =
5654 Found->getCorrespondingMethodDeclaredInClass(Class, false);
5655 if (Overrider) {
5656 Callee = Overrider;
5657 break;
5658 }
5659 }
5660
5661 // C++2a [class.abstract]p6:
5662 // the effect of making a virtual call to a pure virtual function [...] is
5663 // undefined
5664 if (Callee->isPure()) {
5665 Info.FFDiag(E, diag::note_constexpr_pure_virtual_call, 1) << Callee;
5666 Info.Note(Callee->getLocation(), diag::note_declared_at);
5667 return nullptr;
5668 }
5669
5670 // If necessary, walk the rest of the path to determine the sequence of
5671 // covariant adjustment steps to apply.
5672 if (!Info.Ctx.hasSameUnqualifiedType(Callee->getReturnType(),
5673 Found->getReturnType())) {
5674 CovariantAdjustmentPath.push_back(Callee->getReturnType());
5675 for (unsigned CovariantPathLength = PathLength + 1;
5676 CovariantPathLength != This.Designator.Entries.size();
5677 ++CovariantPathLength) {
5678 const CXXRecordDecl *NextClass =
5679 getBaseClassType(This.Designator, CovariantPathLength);
5680 const CXXMethodDecl *Next =
5681 Found->getCorrespondingMethodDeclaredInClass(NextClass, false);
5682 if (Next && !Info.Ctx.hasSameUnqualifiedType(
5683 Next->getReturnType(), CovariantAdjustmentPath.back()))
5684 CovariantAdjustmentPath.push_back(Next->getReturnType());
5685 }
5686 if (!Info.Ctx.hasSameUnqualifiedType(Found->getReturnType(),
5687 CovariantAdjustmentPath.back()))
5688 CovariantAdjustmentPath.push_back(Found->getReturnType());
5689 }
5690
5691 // Perform 'this' adjustment.
5692 if (!CastToDerivedClass(Info, E, This, Callee->getParent(), PathLength))
5693 return nullptr;
5694
5695 return Callee;
5696}
5697
5698/// Perform the adjustment from a value returned by a virtual function to
5699/// a value of the statically expected type, which may be a pointer or
5700/// reference to a base class of the returned type.
5701static bool HandleCovariantReturnAdjustment(EvalInfo &Info, const Expr *E,
5702 APValue &Result,
5703 ArrayRef<QualType> Path) {
5704 assert(Result.isLValue() &&((void)0)
5705 "unexpected kind of APValue for covariant return")((void)0);
5706 if (Result.isNullPointer())
5707 return true;
5708
5709 LValue LVal;
5710 LVal.setFrom(Info.Ctx, Result);
5711
5712 const CXXRecordDecl *OldClass = Path[0]->getPointeeCXXRecordDecl();
5713 for (unsigned I = 1; I != Path.size(); ++I) {
5714 const CXXRecordDecl *NewClass = Path[I]->getPointeeCXXRecordDecl();
5715 assert(OldClass && NewClass && "unexpected kind of covariant return")((void)0);
5716 if (OldClass != NewClass &&
5717 !CastToBaseClass(Info, E, LVal, OldClass, NewClass))
5718 return false;
5719 OldClass = NewClass;
5720 }
5721
5722 LVal.moveInto(Result);
5723 return true;
5724}
5725
5726/// Determine whether \p Base, which is known to be a direct base class of
5727/// \p Derived, is a public base class.
5728static bool isBaseClassPublic(const CXXRecordDecl *Derived,
5729 const CXXRecordDecl *Base) {
5730 for (const CXXBaseSpecifier &BaseSpec : Derived->bases()) {
5731 auto *BaseClass = BaseSpec.getType()->getAsCXXRecordDecl();
5732 if (BaseClass && declaresSameEntity(BaseClass, Base))
5733 return BaseSpec.getAccessSpecifier() == AS_public;
5734 }
5735 llvm_unreachable("Base is not a direct base of Derived")__builtin_unreachable();
5736}
5737
5738/// Apply the given dynamic cast operation on the provided lvalue.
5739///
5740/// This implements the hard case of dynamic_cast, requiring a "runtime check"
5741/// to find a suitable target subobject.
5742static bool HandleDynamicCast(EvalInfo &Info, const ExplicitCastExpr *E,
5743 LValue &Ptr) {
5744 // We can't do anything with a non-symbolic pointer value.
5745 SubobjectDesignator &D = Ptr.Designator;
5746 if (D.Invalid)
5747 return false;
5748
5749 // C++ [expr.dynamic.cast]p6:
5750 // If v is a null pointer value, the result is a null pointer value.
5751 if (Ptr.isNullPointer() && !E->isGLValue())
5752 return true;
5753
5754 // For all the other cases, we need the pointer to point to an object within
5755 // its lifetime / period of construction / destruction, and we need to know
5756 // its dynamic type.
5757 Optional<DynamicType> DynType =
5758 ComputeDynamicType(Info, E, Ptr, AK_DynamicCast);
5759 if (!DynType)
5760 return false;
5761
5762 // C++ [expr.dynamic.cast]p7:
5763 // If T is "pointer to cv void", then the result is a pointer to the most
5764 // derived object
5765 if (E->getType()->isVoidPointerType())
5766 return CastToDerivedClass(Info, E, Ptr, DynType->Type, DynType->PathLength);
5767
5768 const CXXRecordDecl *C = E->getTypeAsWritten()->getPointeeCXXRecordDecl();
5769 assert(C && "dynamic_cast target is not void pointer nor class")((void)0);
5770 CanQualType CQT = Info.Ctx.getCanonicalType(Info.Ctx.getRecordType(C));
5771
5772 auto RuntimeCheckFailed = [&] (CXXBasePaths *Paths) {
5773 // C++ [expr.dynamic.cast]p9:
5774 if (!E->isGLValue()) {
5775 // The value of a failed cast to pointer type is the null pointer value
5776 // of the required result type.
5777 Ptr.setNull(Info.Ctx, E->getType());
5778 return true;
5779 }
5780
5781 // A failed cast to reference type throws [...] std::bad_cast.
5782 unsigned DiagKind;
5783 if (!Paths && (declaresSameEntity(DynType->Type, C) ||
5784 DynType->Type->isDerivedFrom(C)))
5785 DiagKind = 0;
5786 else if (!Paths || Paths->begin() == Paths->end())
5787 DiagKind = 1;
5788 else if (Paths->isAmbiguous(CQT))
5789 DiagKind = 2;
5790 else {
5791 assert(Paths->front().Access != AS_public && "why did the cast fail?")((void)0);
5792 DiagKind = 3;
5793 }
5794 Info.FFDiag(E, diag::note_constexpr_dynamic_cast_to_reference_failed)
5795 << DiagKind << Ptr.Designator.getType(Info.Ctx)
5796 << Info.Ctx.getRecordType(DynType->Type)
5797 << E->getType().getUnqualifiedType();
5798 return false;
5799 };
5800
5801 // Runtime check, phase 1:
5802 // Walk from the base subobject towards the derived object looking for the
5803 // target type.
5804 for (int PathLength = Ptr.Designator.Entries.size();
5805 PathLength >= (int)DynType->PathLength; --PathLength) {
5806 const CXXRecordDecl *Class = getBaseClassType(Ptr.Designator, PathLength);
5807 if (declaresSameEntity(Class, C))
5808 return CastToDerivedClass(Info, E, Ptr, Class, PathLength);
5809 // We can only walk across public inheritance edges.
5810 if (PathLength > (int)DynType->PathLength &&
5811 !isBaseClassPublic(getBaseClassType(Ptr.Designator, PathLength - 1),
5812 Class))
5813 return RuntimeCheckFailed(nullptr);
5814 }
5815
5816 // Runtime check, phase 2:
5817 // Search the dynamic type for an unambiguous public base of type C.
5818 CXXBasePaths Paths(/*FindAmbiguities=*/true,
5819 /*RecordPaths=*/true, /*DetectVirtual=*/false);
5820 if (DynType->Type->isDerivedFrom(C, Paths) && !Paths.isAmbiguous(CQT) &&
5821 Paths.front().Access == AS_public) {
5822 // Downcast to the dynamic type...
5823 if (!CastToDerivedClass(Info, E, Ptr, DynType->Type, DynType->PathLength))
5824 return false;
5825 // ... then upcast to the chosen base class subobject.
5826 for (CXXBasePathElement &Elem : Paths.front())
5827 if (!HandleLValueBase(Info, E, Ptr, Elem.Class, Elem.Base))
5828 return false;
5829 return true;
5830 }
5831
5832 // Otherwise, the runtime check fails.
5833 return RuntimeCheckFailed(&Paths);
5834}
5835
5836namespace {
5837struct StartLifetimeOfUnionMemberHandler {
5838 EvalInfo &Info;
5839 const Expr *LHSExpr;
5840 const FieldDecl *Field;
5841 bool DuringInit;
5842 bool Failed = false;
5843 static const AccessKinds AccessKind = AK_Assign;
5844
5845 typedef bool result_type;
5846 bool failed() { return Failed; }
5847 bool found(APValue &Subobj, QualType SubobjType) {
5848 // We are supposed to perform no initialization but begin the lifetime of
5849 // the object. We interpret that as meaning to do what default
5850 // initialization of the object would do if all constructors involved were
5851 // trivial:
5852 // * All base, non-variant member, and array element subobjects' lifetimes
5853 // begin
5854 // * No variant members' lifetimes begin
5855 // * All scalar subobjects whose lifetimes begin have indeterminate values
5856 assert(SubobjType->isUnionType())((void)0);
5857 if (declaresSameEntity(Subobj.getUnionField(), Field)) {
5858 // This union member is already active. If it's also in-lifetime, there's
5859 // nothing to do.
5860 if (Subobj.getUnionValue().hasValue())
5861 return true;
5862 } else if (DuringInit) {
5863 // We're currently in the process of initializing a different union
5864 // member. If we carried on, that initialization would attempt to
5865 // store to an inactive union member, resulting in undefined behavior.
5866 Info.FFDiag(LHSExpr,
5867 diag::note_constexpr_union_member_change_during_init);
5868 return false;
5869 }
5870 APValue Result;
5871 Failed = !getDefaultInitValue(Field->getType(), Result);
5872 Subobj.setUnion(Field, Result);
5873 return true;
5874 }
5875 bool found(APSInt &Value, QualType SubobjType) {
5876 llvm_unreachable("wrong value kind for union object")__builtin_unreachable();
5877 }
5878 bool found(APFloat &Value, QualType SubobjType) {
5879 llvm_unreachable("wrong value kind for union object")__builtin_unreachable();
5880 }
5881};
5882} // end anonymous namespace
5883
5884const AccessKinds StartLifetimeOfUnionMemberHandler::AccessKind;
5885
5886/// Handle a builtin simple-assignment or a call to a trivial assignment
5887/// operator whose left-hand side might involve a union member access. If it
5888/// does, implicitly start the lifetime of any accessed union elements per
5889/// C++20 [class.union]5.
5890static bool HandleUnionActiveMemberChange(EvalInfo &Info, const Expr *LHSExpr,
5891 const LValue &LHS) {
5892 if (LHS.InvalidBase || LHS.Designator.Invalid)
92
Assuming field 'InvalidBase' is false
93
Assuming field 'Invalid' is 0
94
Taking false branch
5893 return false;
5894
5895 llvm::SmallVector<std::pair<unsigned, const FieldDecl*>, 4> UnionPathLengths;
5896 // C++ [class.union]p5:
5897 // define the set S(E) of subexpressions of E as follows:
5898 unsigned PathLength = LHS.Designator.Entries.size();
5899 for (const Expr *E = LHSExpr; E != nullptr;) {
95
Assuming pointer value is null
96
Loop condition is false. Execution continues on line 5960
5900 // -- If E is of the form A.B, S(E) contains the elements of S(A)...
5901 if (auto *ME = dyn_cast<MemberExpr>(E)) {
5902 auto *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
5903 // Note that we can't implicitly start the lifetime of a reference,
5904 // so we don't need to proceed any further if we reach one.
5905 if (!FD || FD->getType()->isReferenceType())
5906 break;
5907
5908 // ... and also contains A.B if B names a union member ...
5909 if (FD->getParent()->isUnion()) {
5910 // ... of a non-class, non-array type, or of a class type with a
5911 // trivial default constructor that is not deleted, or an array of
5912 // such types.
5913 auto *RD =
5914 FD->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
5915 if (!RD || RD->hasTrivialDefaultConstructor())
5916 UnionPathLengths.push_back({PathLength - 1, FD});
5917 }
5918
5919 E = ME->getBase();
5920 --PathLength;
5921 assert(declaresSameEntity(FD,((void)0)
5922 LHS.Designator.Entries[PathLength]((void)0)
5923 .getAsBaseOrMember().getPointer()))((void)0);
5924
5925 // -- If E is of the form A[B] and is interpreted as a built-in array
5926 // subscripting operator, S(E) is [S(the array operand, if any)].
5927 } else if (auto *ASE = dyn_cast<ArraySubscriptExpr>(E)) {
5928 // Step over an ArrayToPointerDecay implicit cast.
5929 auto *Base = ASE->getBase()->IgnoreImplicit();
5930 if (!Base->getType()->isArrayType())
5931 break;
5932
5933 E = Base;
5934 --PathLength;
5935
5936 } else if (auto *ICE = dyn_cast<ImplicitCastExpr>(E)) {
5937 // Step over a derived-to-base conversion.
5938 E = ICE->getSubExpr();
5939 if (ICE->getCastKind() == CK_NoOp)
5940 continue;
5941 if (ICE->getCastKind() != CK_DerivedToBase &&
5942 ICE->getCastKind() != CK_UncheckedDerivedToBase)
5943 break;
5944 // Walk path backwards as we walk up from the base to the derived class.
5945 for (const CXXBaseSpecifier *Elt : llvm::reverse(ICE->path())) {
5946 --PathLength;
5947 (void)Elt;
5948 assert(declaresSameEntity(Elt->getType()->getAsCXXRecordDecl(),((void)0)
5949 LHS.Designator.Entries[PathLength]((void)0)
5950 .getAsBaseOrMember().getPointer()))((void)0);
5951 }
5952
5953 // -- Otherwise, S(E) is empty.
5954 } else {
5955 break;
5956 }
5957 }
5958
5959 // Common case: no unions' lifetimes are started.
5960 if (UnionPathLengths.empty())
97
Calling 'SmallVectorBase::empty'
100
Returning from 'SmallVectorBase::empty'
101
Taking false branch
5961 return true;
5962
5963 // if modification of X [would access an inactive union member], an object
5964 // of the type of X is implicitly created
5965 CompleteObject Obj =
5966 findCompleteObject(Info, LHSExpr, AK_Assign, LHS, LHSExpr->getType());
102
Called C++ object pointer is null