Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/clang/lib/Sema/SemaInit.cpp
35234 views
1
//===--- SemaInit.cpp - Semantic Analysis for Initializers ----------------===//
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 semantic analysis for initializers.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "CheckExprLifetime.h"
14
#include "clang/AST/ASTContext.h"
15
#include "clang/AST/DeclObjC.h"
16
#include "clang/AST/Expr.h"
17
#include "clang/AST/ExprCXX.h"
18
#include "clang/AST/ExprObjC.h"
19
#include "clang/AST/ExprOpenMP.h"
20
#include "clang/AST/IgnoreExpr.h"
21
#include "clang/AST/TypeLoc.h"
22
#include "clang/Basic/CharInfo.h"
23
#include "clang/Basic/SourceManager.h"
24
#include "clang/Basic/Specifiers.h"
25
#include "clang/Basic/TargetInfo.h"
26
#include "clang/Sema/Designator.h"
27
#include "clang/Sema/EnterExpressionEvaluationContext.h"
28
#include "clang/Sema/Initialization.h"
29
#include "clang/Sema/Lookup.h"
30
#include "clang/Sema/Ownership.h"
31
#include "clang/Sema/SemaInternal.h"
32
#include "clang/Sema/SemaObjC.h"
33
#include "llvm/ADT/APInt.h"
34
#include "llvm/ADT/FoldingSet.h"
35
#include "llvm/ADT/PointerIntPair.h"
36
#include "llvm/ADT/STLForwardCompat.h"
37
#include "llvm/ADT/SmallString.h"
38
#include "llvm/ADT/SmallVector.h"
39
#include "llvm/ADT/StringExtras.h"
40
#include "llvm/Support/ErrorHandling.h"
41
#include "llvm/Support/raw_ostream.h"
42
43
using namespace clang;
44
45
//===----------------------------------------------------------------------===//
46
// Sema Initialization Checking
47
//===----------------------------------------------------------------------===//
48
49
/// Check whether T is compatible with a wide character type (wchar_t,
50
/// char16_t or char32_t).
51
static bool IsWideCharCompatible(QualType T, ASTContext &Context) {
52
if (Context.typesAreCompatible(Context.getWideCharType(), T))
53
return true;
54
if (Context.getLangOpts().CPlusPlus || Context.getLangOpts().C11) {
55
return Context.typesAreCompatible(Context.Char16Ty, T) ||
56
Context.typesAreCompatible(Context.Char32Ty, T);
57
}
58
return false;
59
}
60
61
enum StringInitFailureKind {
62
SIF_None,
63
SIF_NarrowStringIntoWideChar,
64
SIF_WideStringIntoChar,
65
SIF_IncompatWideStringIntoWideChar,
66
SIF_UTF8StringIntoPlainChar,
67
SIF_PlainStringIntoUTF8Char,
68
SIF_Other
69
};
70
71
/// Check whether the array of type AT can be initialized by the Init
72
/// expression by means of string initialization. Returns SIF_None if so,
73
/// otherwise returns a StringInitFailureKind that describes why the
74
/// initialization would not work.
75
static StringInitFailureKind IsStringInit(Expr *Init, const ArrayType *AT,
76
ASTContext &Context) {
77
if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT))
78
return SIF_Other;
79
80
// See if this is a string literal or @encode.
81
Init = Init->IgnoreParens();
82
83
// Handle @encode, which is a narrow string.
84
if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType())
85
return SIF_None;
86
87
// Otherwise we can only handle string literals.
88
StringLiteral *SL = dyn_cast<StringLiteral>(Init);
89
if (!SL)
90
return SIF_Other;
91
92
const QualType ElemTy =
93
Context.getCanonicalType(AT->getElementType()).getUnqualifiedType();
94
95
auto IsCharOrUnsignedChar = [](const QualType &T) {
96
const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr());
97
return BT && BT->isCharType() && BT->getKind() != BuiltinType::SChar;
98
};
99
100
switch (SL->getKind()) {
101
case StringLiteralKind::UTF8:
102
// char8_t array can be initialized with a UTF-8 string.
103
// - C++20 [dcl.init.string] (DR)
104
// Additionally, an array of char or unsigned char may be initialized
105
// by a UTF-8 string literal.
106
if (ElemTy->isChar8Type() ||
107
(Context.getLangOpts().Char8 &&
108
IsCharOrUnsignedChar(ElemTy.getCanonicalType())))
109
return SIF_None;
110
[[fallthrough]];
111
case StringLiteralKind::Ordinary:
112
// char array can be initialized with a narrow string.
113
// Only allow char x[] = "foo"; not char x[] = L"foo";
114
if (ElemTy->isCharType())
115
return (SL->getKind() == StringLiteralKind::UTF8 &&
116
Context.getLangOpts().Char8)
117
? SIF_UTF8StringIntoPlainChar
118
: SIF_None;
119
if (ElemTy->isChar8Type())
120
return SIF_PlainStringIntoUTF8Char;
121
if (IsWideCharCompatible(ElemTy, Context))
122
return SIF_NarrowStringIntoWideChar;
123
return SIF_Other;
124
// C99 6.7.8p15 (with correction from DR343), or C11 6.7.9p15:
125
// "An array with element type compatible with a qualified or unqualified
126
// version of wchar_t, char16_t, or char32_t may be initialized by a wide
127
// string literal with the corresponding encoding prefix (L, u, or U,
128
// respectively), optionally enclosed in braces.
129
case StringLiteralKind::UTF16:
130
if (Context.typesAreCompatible(Context.Char16Ty, ElemTy))
131
return SIF_None;
132
if (ElemTy->isCharType() || ElemTy->isChar8Type())
133
return SIF_WideStringIntoChar;
134
if (IsWideCharCompatible(ElemTy, Context))
135
return SIF_IncompatWideStringIntoWideChar;
136
return SIF_Other;
137
case StringLiteralKind::UTF32:
138
if (Context.typesAreCompatible(Context.Char32Ty, ElemTy))
139
return SIF_None;
140
if (ElemTy->isCharType() || ElemTy->isChar8Type())
141
return SIF_WideStringIntoChar;
142
if (IsWideCharCompatible(ElemTy, Context))
143
return SIF_IncompatWideStringIntoWideChar;
144
return SIF_Other;
145
case StringLiteralKind::Wide:
146
if (Context.typesAreCompatible(Context.getWideCharType(), ElemTy))
147
return SIF_None;
148
if (ElemTy->isCharType() || ElemTy->isChar8Type())
149
return SIF_WideStringIntoChar;
150
if (IsWideCharCompatible(ElemTy, Context))
151
return SIF_IncompatWideStringIntoWideChar;
152
return SIF_Other;
153
case StringLiteralKind::Unevaluated:
154
assert(false && "Unevaluated string literal in initialization");
155
break;
156
}
157
158
llvm_unreachable("missed a StringLiteral kind?");
159
}
160
161
static StringInitFailureKind IsStringInit(Expr *init, QualType declType,
162
ASTContext &Context) {
163
const ArrayType *arrayType = Context.getAsArrayType(declType);
164
if (!arrayType)
165
return SIF_Other;
166
return IsStringInit(init, arrayType, Context);
167
}
168
169
bool Sema::IsStringInit(Expr *Init, const ArrayType *AT) {
170
return ::IsStringInit(Init, AT, Context) == SIF_None;
171
}
172
173
/// Update the type of a string literal, including any surrounding parentheses,
174
/// to match the type of the object which it is initializing.
175
static void updateStringLiteralType(Expr *E, QualType Ty) {
176
while (true) {
177
E->setType(Ty);
178
E->setValueKind(VK_PRValue);
179
if (isa<StringLiteral>(E) || isa<ObjCEncodeExpr>(E))
180
break;
181
E = IgnoreParensSingleStep(E);
182
}
183
}
184
185
/// Fix a compound literal initializing an array so it's correctly marked
186
/// as an rvalue.
187
static void updateGNUCompoundLiteralRValue(Expr *E) {
188
while (true) {
189
E->setValueKind(VK_PRValue);
190
if (isa<CompoundLiteralExpr>(E))
191
break;
192
E = IgnoreParensSingleStep(E);
193
}
194
}
195
196
static bool initializingConstexprVariable(const InitializedEntity &Entity) {
197
Decl *D = Entity.getDecl();
198
const InitializedEntity *Parent = &Entity;
199
200
while (Parent) {
201
D = Parent->getDecl();
202
Parent = Parent->getParent();
203
}
204
205
if (const auto *VD = dyn_cast_if_present<VarDecl>(D); VD && VD->isConstexpr())
206
return true;
207
208
return false;
209
}
210
211
static void CheckC23ConstexprInitStringLiteral(const StringLiteral *SE,
212
Sema &SemaRef, QualType &TT);
213
214
static void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT,
215
Sema &S, bool CheckC23ConstexprInit = false) {
216
// Get the length of the string as parsed.
217
auto *ConstantArrayTy =
218
cast<ConstantArrayType>(Str->getType()->getAsArrayTypeUnsafe());
219
uint64_t StrLength = ConstantArrayTy->getZExtSize();
220
221
if (CheckC23ConstexprInit)
222
if (const StringLiteral *SL = dyn_cast<StringLiteral>(Str->IgnoreParens()))
223
CheckC23ConstexprInitStringLiteral(SL, S, DeclT);
224
225
if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) {
226
// C99 6.7.8p14. We have an array of character type with unknown size
227
// being initialized to a string literal.
228
llvm::APInt ConstVal(32, StrLength);
229
// Return a new array type (C99 6.7.8p22).
230
DeclT = S.Context.getConstantArrayType(
231
IAT->getElementType(), ConstVal, nullptr, ArraySizeModifier::Normal, 0);
232
updateStringLiteralType(Str, DeclT);
233
return;
234
}
235
236
const ConstantArrayType *CAT = cast<ConstantArrayType>(AT);
237
238
// We have an array of character type with known size. However,
239
// the size may be smaller or larger than the string we are initializing.
240
// FIXME: Avoid truncation for 64-bit length strings.
241
if (S.getLangOpts().CPlusPlus) {
242
if (StringLiteral *SL = dyn_cast<StringLiteral>(Str->IgnoreParens())) {
243
// For Pascal strings it's OK to strip off the terminating null character,
244
// so the example below is valid:
245
//
246
// unsigned char a[2] = "\pa";
247
if (SL->isPascal())
248
StrLength--;
249
}
250
251
// [dcl.init.string]p2
252
if (StrLength > CAT->getZExtSize())
253
S.Diag(Str->getBeginLoc(),
254
diag::err_initializer_string_for_char_array_too_long)
255
<< CAT->getZExtSize() << StrLength << Str->getSourceRange();
256
} else {
257
// C99 6.7.8p14.
258
if (StrLength - 1 > CAT->getZExtSize())
259
S.Diag(Str->getBeginLoc(),
260
diag::ext_initializer_string_for_char_array_too_long)
261
<< Str->getSourceRange();
262
}
263
264
// Set the type to the actual size that we are initializing. If we have
265
// something like:
266
// char x[1] = "foo";
267
// then this will set the string literal's type to char[1].
268
updateStringLiteralType(Str, DeclT);
269
}
270
271
//===----------------------------------------------------------------------===//
272
// Semantic checking for initializer lists.
273
//===----------------------------------------------------------------------===//
274
275
namespace {
276
277
/// Semantic checking for initializer lists.
278
///
279
/// The InitListChecker class contains a set of routines that each
280
/// handle the initialization of a certain kind of entity, e.g.,
281
/// arrays, vectors, struct/union types, scalars, etc. The
282
/// InitListChecker itself performs a recursive walk of the subobject
283
/// structure of the type to be initialized, while stepping through
284
/// the initializer list one element at a time. The IList and Index
285
/// parameters to each of the Check* routines contain the active
286
/// (syntactic) initializer list and the index into that initializer
287
/// list that represents the current initializer. Each routine is
288
/// responsible for moving that Index forward as it consumes elements.
289
///
290
/// Each Check* routine also has a StructuredList/StructuredIndex
291
/// arguments, which contains the current "structured" (semantic)
292
/// initializer list and the index into that initializer list where we
293
/// are copying initializers as we map them over to the semantic
294
/// list. Once we have completed our recursive walk of the subobject
295
/// structure, we will have constructed a full semantic initializer
296
/// list.
297
///
298
/// C99 designators cause changes in the initializer list traversal,
299
/// because they make the initialization "jump" into a specific
300
/// subobject and then continue the initialization from that
301
/// point. CheckDesignatedInitializer() recursively steps into the
302
/// designated subobject and manages backing out the recursion to
303
/// initialize the subobjects after the one designated.
304
///
305
/// If an initializer list contains any designators, we build a placeholder
306
/// structured list even in 'verify only' mode, so that we can track which
307
/// elements need 'empty' initializtion.
308
class InitListChecker {
309
Sema &SemaRef;
310
bool hadError = false;
311
bool VerifyOnly; // No diagnostics.
312
bool TreatUnavailableAsInvalid; // Used only in VerifyOnly mode.
313
bool InOverloadResolution;
314
InitListExpr *FullyStructuredList = nullptr;
315
NoInitExpr *DummyExpr = nullptr;
316
SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes = nullptr;
317
EmbedExpr *CurEmbed = nullptr; // Save current embed we're processing.
318
unsigned CurEmbedIndex = 0;
319
320
NoInitExpr *getDummyInit() {
321
if (!DummyExpr)
322
DummyExpr = new (SemaRef.Context) NoInitExpr(SemaRef.Context.VoidTy);
323
return DummyExpr;
324
}
325
326
void CheckImplicitInitList(const InitializedEntity &Entity,
327
InitListExpr *ParentIList, QualType T,
328
unsigned &Index, InitListExpr *StructuredList,
329
unsigned &StructuredIndex);
330
void CheckExplicitInitList(const InitializedEntity &Entity,
331
InitListExpr *IList, QualType &T,
332
InitListExpr *StructuredList,
333
bool TopLevelObject = false);
334
void CheckListElementTypes(const InitializedEntity &Entity,
335
InitListExpr *IList, QualType &DeclType,
336
bool SubobjectIsDesignatorContext,
337
unsigned &Index,
338
InitListExpr *StructuredList,
339
unsigned &StructuredIndex,
340
bool TopLevelObject = false);
341
void CheckSubElementType(const InitializedEntity &Entity,
342
InitListExpr *IList, QualType ElemType,
343
unsigned &Index,
344
InitListExpr *StructuredList,
345
unsigned &StructuredIndex,
346
bool DirectlyDesignated = false);
347
void CheckComplexType(const InitializedEntity &Entity,
348
InitListExpr *IList, QualType DeclType,
349
unsigned &Index,
350
InitListExpr *StructuredList,
351
unsigned &StructuredIndex);
352
void CheckScalarType(const InitializedEntity &Entity,
353
InitListExpr *IList, QualType DeclType,
354
unsigned &Index,
355
InitListExpr *StructuredList,
356
unsigned &StructuredIndex);
357
void CheckReferenceType(const InitializedEntity &Entity,
358
InitListExpr *IList, QualType DeclType,
359
unsigned &Index,
360
InitListExpr *StructuredList,
361
unsigned &StructuredIndex);
362
void CheckVectorType(const InitializedEntity &Entity,
363
InitListExpr *IList, QualType DeclType, unsigned &Index,
364
InitListExpr *StructuredList,
365
unsigned &StructuredIndex);
366
void CheckStructUnionTypes(const InitializedEntity &Entity,
367
InitListExpr *IList, QualType DeclType,
368
CXXRecordDecl::base_class_const_range Bases,
369
RecordDecl::field_iterator Field,
370
bool SubobjectIsDesignatorContext, unsigned &Index,
371
InitListExpr *StructuredList,
372
unsigned &StructuredIndex,
373
bool TopLevelObject = false);
374
void CheckArrayType(const InitializedEntity &Entity,
375
InitListExpr *IList, QualType &DeclType,
376
llvm::APSInt elementIndex,
377
bool SubobjectIsDesignatorContext, unsigned &Index,
378
InitListExpr *StructuredList,
379
unsigned &StructuredIndex);
380
bool CheckDesignatedInitializer(const InitializedEntity &Entity,
381
InitListExpr *IList, DesignatedInitExpr *DIE,
382
unsigned DesigIdx,
383
QualType &CurrentObjectType,
384
RecordDecl::field_iterator *NextField,
385
llvm::APSInt *NextElementIndex,
386
unsigned &Index,
387
InitListExpr *StructuredList,
388
unsigned &StructuredIndex,
389
bool FinishSubobjectInit,
390
bool TopLevelObject);
391
InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
392
QualType CurrentObjectType,
393
InitListExpr *StructuredList,
394
unsigned StructuredIndex,
395
SourceRange InitRange,
396
bool IsFullyOverwritten = false);
397
void UpdateStructuredListElement(InitListExpr *StructuredList,
398
unsigned &StructuredIndex,
399
Expr *expr);
400
InitListExpr *createInitListExpr(QualType CurrentObjectType,
401
SourceRange InitRange,
402
unsigned ExpectedNumInits);
403
int numArrayElements(QualType DeclType);
404
int numStructUnionElements(QualType DeclType);
405
static RecordDecl *getRecordDecl(QualType DeclType);
406
407
ExprResult PerformEmptyInit(SourceLocation Loc,
408
const InitializedEntity &Entity);
409
410
/// Diagnose that OldInit (or part thereof) has been overridden by NewInit.
411
void diagnoseInitOverride(Expr *OldInit, SourceRange NewInitRange,
412
bool UnionOverride = false,
413
bool FullyOverwritten = true) {
414
// Overriding an initializer via a designator is valid with C99 designated
415
// initializers, but ill-formed with C++20 designated initializers.
416
unsigned DiagID =
417
SemaRef.getLangOpts().CPlusPlus
418
? (UnionOverride ? diag::ext_initializer_union_overrides
419
: diag::ext_initializer_overrides)
420
: diag::warn_initializer_overrides;
421
422
if (InOverloadResolution && SemaRef.getLangOpts().CPlusPlus) {
423
// In overload resolution, we have to strictly enforce the rules, and so
424
// don't allow any overriding of prior initializers. This matters for a
425
// case such as:
426
//
427
// union U { int a, b; };
428
// struct S { int a, b; };
429
// void f(U), f(S);
430
//
431
// Here, f({.a = 1, .b = 2}) is required to call the struct overload. For
432
// consistency, we disallow all overriding of prior initializers in
433
// overload resolution, not only overriding of union members.
434
hadError = true;
435
} else if (OldInit->getType().isDestructedType() && !FullyOverwritten) {
436
// If we'll be keeping around the old initializer but overwriting part of
437
// the object it initialized, and that object is not trivially
438
// destructible, this can leak. Don't allow that, not even as an
439
// extension.
440
//
441
// FIXME: It might be reasonable to allow this in cases where the part of
442
// the initializer that we're overriding has trivial destruction.
443
DiagID = diag::err_initializer_overrides_destructed;
444
} else if (!OldInit->getSourceRange().isValid()) {
445
// We need to check on source range validity because the previous
446
// initializer does not have to be an explicit initializer. e.g.,
447
//
448
// struct P { int a, b; };
449
// struct PP { struct P p } l = { { .a = 2 }, .p.b = 3 };
450
//
451
// There is an overwrite taking place because the first braced initializer
452
// list "{ .a = 2 }" already provides value for .p.b (which is zero).
453
//
454
// Such overwrites are harmless, so we don't diagnose them. (Note that in
455
// C++, this cannot be reached unless we've already seen and diagnosed a
456
// different conformance issue, such as a mixture of designated and
457
// non-designated initializers or a multi-level designator.)
458
return;
459
}
460
461
if (!VerifyOnly) {
462
SemaRef.Diag(NewInitRange.getBegin(), DiagID)
463
<< NewInitRange << FullyOverwritten << OldInit->getType();
464
SemaRef.Diag(OldInit->getBeginLoc(), diag::note_previous_initializer)
465
<< (OldInit->HasSideEffects(SemaRef.Context) && FullyOverwritten)
466
<< OldInit->getSourceRange();
467
}
468
}
469
470
// Explanation on the "FillWithNoInit" mode:
471
//
472
// Assume we have the following definitions (Case#1):
473
// struct P { char x[6][6]; } xp = { .x[1] = "bar" };
474
// struct PP { struct P lp; } l = { .lp = xp, .lp.x[1][2] = 'f' };
475
//
476
// l.lp.x[1][0..1] should not be filled with implicit initializers because the
477
// "base" initializer "xp" will provide values for them; l.lp.x[1] will be "baf".
478
//
479
// But if we have (Case#2):
480
// struct PP l = { .lp = xp, .lp.x[1] = { [2] = 'f' } };
481
//
482
// l.lp.x[1][0..1] are implicitly initialized and do not use values from the
483
// "base" initializer; l.lp.x[1] will be "\0\0f\0\0\0".
484
//
485
// To distinguish Case#1 from Case#2, and also to avoid leaving many "holes"
486
// in the InitListExpr, the "holes" in Case#1 are filled not with empty
487
// initializers but with special "NoInitExpr" place holders, which tells the
488
// CodeGen not to generate any initializers for these parts.
489
void FillInEmptyInitForBase(unsigned Init, const CXXBaseSpecifier &Base,
490
const InitializedEntity &ParentEntity,
491
InitListExpr *ILE, bool &RequiresSecondPass,
492
bool FillWithNoInit);
493
void FillInEmptyInitForField(unsigned Init, FieldDecl *Field,
494
const InitializedEntity &ParentEntity,
495
InitListExpr *ILE, bool &RequiresSecondPass,
496
bool FillWithNoInit = false);
497
void FillInEmptyInitializations(const InitializedEntity &Entity,
498
InitListExpr *ILE, bool &RequiresSecondPass,
499
InitListExpr *OuterILE, unsigned OuterIndex,
500
bool FillWithNoInit = false);
501
bool CheckFlexibleArrayInit(const InitializedEntity &Entity,
502
Expr *InitExpr, FieldDecl *Field,
503
bool TopLevelObject);
504
void CheckEmptyInitializable(const InitializedEntity &Entity,
505
SourceLocation Loc);
506
507
Expr *HandleEmbed(EmbedExpr *Embed, const InitializedEntity &Entity) {
508
Expr *Result = nullptr;
509
// Undrestand which part of embed we'd like to reference.
510
if (!CurEmbed) {
511
CurEmbed = Embed;
512
CurEmbedIndex = 0;
513
}
514
// Reference just one if we're initializing a single scalar.
515
uint64_t ElsCount = 1;
516
// Otherwise try to fill whole array with embed data.
517
if (Entity.getKind() == InitializedEntity::EK_ArrayElement) {
518
auto *AType =
519
SemaRef.Context.getAsArrayType(Entity.getParent()->getType());
520
assert(AType && "expected array type when initializing array");
521
ElsCount = Embed->getDataElementCount();
522
if (const auto *CAType = dyn_cast<ConstantArrayType>(AType))
523
ElsCount = std::min(CAType->getSize().getZExtValue(),
524
ElsCount - CurEmbedIndex);
525
if (ElsCount == Embed->getDataElementCount()) {
526
CurEmbed = nullptr;
527
CurEmbedIndex = 0;
528
return Embed;
529
}
530
}
531
532
Result = new (SemaRef.Context)
533
EmbedExpr(SemaRef.Context, Embed->getLocation(), Embed->getData(),
534
CurEmbedIndex, ElsCount);
535
CurEmbedIndex += ElsCount;
536
if (CurEmbedIndex >= Embed->getDataElementCount()) {
537
CurEmbed = nullptr;
538
CurEmbedIndex = 0;
539
}
540
return Result;
541
}
542
543
public:
544
InitListChecker(
545
Sema &S, const InitializedEntity &Entity, InitListExpr *IL, QualType &T,
546
bool VerifyOnly, bool TreatUnavailableAsInvalid,
547
bool InOverloadResolution = false,
548
SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes = nullptr);
549
InitListChecker(Sema &S, const InitializedEntity &Entity, InitListExpr *IL,
550
QualType &T,
551
SmallVectorImpl<QualType> &AggrDeductionCandidateParamTypes)
552
: InitListChecker(S, Entity, IL, T, /*VerifyOnly=*/true,
553
/*TreatUnavailableAsInvalid=*/false,
554
/*InOverloadResolution=*/false,
555
&AggrDeductionCandidateParamTypes) {}
556
557
bool HadError() { return hadError; }
558
559
// Retrieves the fully-structured initializer list used for
560
// semantic analysis and code generation.
561
InitListExpr *getFullyStructuredList() const { return FullyStructuredList; }
562
};
563
564
} // end anonymous namespace
565
566
ExprResult InitListChecker::PerformEmptyInit(SourceLocation Loc,
567
const InitializedEntity &Entity) {
568
InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc,
569
true);
570
MultiExprArg SubInit;
571
Expr *InitExpr;
572
InitListExpr DummyInitList(SemaRef.Context, Loc, std::nullopt, Loc);
573
574
// C++ [dcl.init.aggr]p7:
575
// If there are fewer initializer-clauses in the list than there are
576
// members in the aggregate, then each member not explicitly initialized
577
// ...
578
bool EmptyInitList = SemaRef.getLangOpts().CPlusPlus11 &&
579
Entity.getType()->getBaseElementTypeUnsafe()->isRecordType();
580
if (EmptyInitList) {
581
// C++1y / DR1070:
582
// shall be initialized [...] from an empty initializer list.
583
//
584
// We apply the resolution of this DR to C++11 but not C++98, since C++98
585
// does not have useful semantics for initialization from an init list.
586
// We treat this as copy-initialization, because aggregate initialization
587
// always performs copy-initialization on its elements.
588
//
589
// Only do this if we're initializing a class type, to avoid filling in
590
// the initializer list where possible.
591
InitExpr = VerifyOnly
592
? &DummyInitList
593
: new (SemaRef.Context)
594
InitListExpr(SemaRef.Context, Loc, std::nullopt, Loc);
595
InitExpr->setType(SemaRef.Context.VoidTy);
596
SubInit = InitExpr;
597
Kind = InitializationKind::CreateCopy(Loc, Loc);
598
} else {
599
// C++03:
600
// shall be value-initialized.
601
}
602
603
InitializationSequence InitSeq(SemaRef, Entity, Kind, SubInit);
604
// libstdc++4.6 marks the vector default constructor as explicit in
605
// _GLIBCXX_DEBUG mode, so recover using the C++03 logic in that case.
606
// stlport does so too. Look for std::__debug for libstdc++, and for
607
// std:: for stlport. This is effectively a compiler-side implementation of
608
// LWG2193.
609
if (!InitSeq && EmptyInitList && InitSeq.getFailureKind() ==
610
InitializationSequence::FK_ExplicitConstructor) {
611
OverloadCandidateSet::iterator Best;
612
OverloadingResult O =
613
InitSeq.getFailedCandidateSet()
614
.BestViableFunction(SemaRef, Kind.getLocation(), Best);
615
(void)O;
616
assert(O == OR_Success && "Inconsistent overload resolution");
617
CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
618
CXXRecordDecl *R = CtorDecl->getParent();
619
620
if (CtorDecl->getMinRequiredArguments() == 0 &&
621
CtorDecl->isExplicit() && R->getDeclName() &&
622
SemaRef.SourceMgr.isInSystemHeader(CtorDecl->getLocation())) {
623
bool IsInStd = false;
624
for (NamespaceDecl *ND = dyn_cast<NamespaceDecl>(R->getDeclContext());
625
ND && !IsInStd; ND = dyn_cast<NamespaceDecl>(ND->getParent())) {
626
if (SemaRef.getStdNamespace()->InEnclosingNamespaceSetOf(ND))
627
IsInStd = true;
628
}
629
630
if (IsInStd && llvm::StringSwitch<bool>(R->getName())
631
.Cases("basic_string", "deque", "forward_list", true)
632
.Cases("list", "map", "multimap", "multiset", true)
633
.Cases("priority_queue", "queue", "set", "stack", true)
634
.Cases("unordered_map", "unordered_set", "vector", true)
635
.Default(false)) {
636
InitSeq.InitializeFrom(
637
SemaRef, Entity,
638
InitializationKind::CreateValue(Loc, Loc, Loc, true),
639
MultiExprArg(), /*TopLevelOfInitList=*/false,
640
TreatUnavailableAsInvalid);
641
// Emit a warning for this. System header warnings aren't shown
642
// by default, but people working on system headers should see it.
643
if (!VerifyOnly) {
644
SemaRef.Diag(CtorDecl->getLocation(),
645
diag::warn_invalid_initializer_from_system_header);
646
if (Entity.getKind() == InitializedEntity::EK_Member)
647
SemaRef.Diag(Entity.getDecl()->getLocation(),
648
diag::note_used_in_initialization_here);
649
else if (Entity.getKind() == InitializedEntity::EK_ArrayElement)
650
SemaRef.Diag(Loc, diag::note_used_in_initialization_here);
651
}
652
}
653
}
654
}
655
if (!InitSeq) {
656
if (!VerifyOnly) {
657
InitSeq.Diagnose(SemaRef, Entity, Kind, SubInit);
658
if (Entity.getKind() == InitializedEntity::EK_Member)
659
SemaRef.Diag(Entity.getDecl()->getLocation(),
660
diag::note_in_omitted_aggregate_initializer)
661
<< /*field*/1 << Entity.getDecl();
662
else if (Entity.getKind() == InitializedEntity::EK_ArrayElement) {
663
bool IsTrailingArrayNewMember =
664
Entity.getParent() &&
665
Entity.getParent()->isVariableLengthArrayNew();
666
SemaRef.Diag(Loc, diag::note_in_omitted_aggregate_initializer)
667
<< (IsTrailingArrayNewMember ? 2 : /*array element*/0)
668
<< Entity.getElementIndex();
669
}
670
}
671
hadError = true;
672
return ExprError();
673
}
674
675
return VerifyOnly ? ExprResult()
676
: InitSeq.Perform(SemaRef, Entity, Kind, SubInit);
677
}
678
679
void InitListChecker::CheckEmptyInitializable(const InitializedEntity &Entity,
680
SourceLocation Loc) {
681
// If we're building a fully-structured list, we'll check this at the end
682
// once we know which elements are actually initialized. Otherwise, we know
683
// that there are no designators so we can just check now.
684
if (FullyStructuredList)
685
return;
686
PerformEmptyInit(Loc, Entity);
687
}
688
689
void InitListChecker::FillInEmptyInitForBase(
690
unsigned Init, const CXXBaseSpecifier &Base,
691
const InitializedEntity &ParentEntity, InitListExpr *ILE,
692
bool &RequiresSecondPass, bool FillWithNoInit) {
693
InitializedEntity BaseEntity = InitializedEntity::InitializeBase(
694
SemaRef.Context, &Base, false, &ParentEntity);
695
696
if (Init >= ILE->getNumInits() || !ILE->getInit(Init)) {
697
ExprResult BaseInit = FillWithNoInit
698
? new (SemaRef.Context) NoInitExpr(Base.getType())
699
: PerformEmptyInit(ILE->getEndLoc(), BaseEntity);
700
if (BaseInit.isInvalid()) {
701
hadError = true;
702
return;
703
}
704
705
if (!VerifyOnly) {
706
assert(Init < ILE->getNumInits() && "should have been expanded");
707
ILE->setInit(Init, BaseInit.getAs<Expr>());
708
}
709
} else if (InitListExpr *InnerILE =
710
dyn_cast<InitListExpr>(ILE->getInit(Init))) {
711
FillInEmptyInitializations(BaseEntity, InnerILE, RequiresSecondPass,
712
ILE, Init, FillWithNoInit);
713
} else if (DesignatedInitUpdateExpr *InnerDIUE =
714
dyn_cast<DesignatedInitUpdateExpr>(ILE->getInit(Init))) {
715
FillInEmptyInitializations(BaseEntity, InnerDIUE->getUpdater(),
716
RequiresSecondPass, ILE, Init,
717
/*FillWithNoInit =*/true);
718
}
719
}
720
721
void InitListChecker::FillInEmptyInitForField(unsigned Init, FieldDecl *Field,
722
const InitializedEntity &ParentEntity,
723
InitListExpr *ILE,
724
bool &RequiresSecondPass,
725
bool FillWithNoInit) {
726
SourceLocation Loc = ILE->getEndLoc();
727
unsigned NumInits = ILE->getNumInits();
728
InitializedEntity MemberEntity
729
= InitializedEntity::InitializeMember(Field, &ParentEntity);
730
731
if (Init >= NumInits || !ILE->getInit(Init)) {
732
if (const RecordType *RType = ILE->getType()->getAs<RecordType>())
733
if (!RType->getDecl()->isUnion())
734
assert((Init < NumInits || VerifyOnly) &&
735
"This ILE should have been expanded");
736
737
if (FillWithNoInit) {
738
assert(!VerifyOnly && "should not fill with no-init in verify-only mode");
739
Expr *Filler = new (SemaRef.Context) NoInitExpr(Field->getType());
740
if (Init < NumInits)
741
ILE->setInit(Init, Filler);
742
else
743
ILE->updateInit(SemaRef.Context, Init, Filler);
744
return;
745
}
746
// C++1y [dcl.init.aggr]p7:
747
// If there are fewer initializer-clauses in the list than there are
748
// members in the aggregate, then each member not explicitly initialized
749
// shall be initialized from its brace-or-equal-initializer [...]
750
if (Field->hasInClassInitializer()) {
751
if (VerifyOnly)
752
return;
753
754
ExprResult DIE = SemaRef.BuildCXXDefaultInitExpr(Loc, Field);
755
if (DIE.isInvalid()) {
756
hadError = true;
757
return;
758
}
759
SemaRef.checkInitializerLifetime(MemberEntity, DIE.get());
760
if (Init < NumInits)
761
ILE->setInit(Init, DIE.get());
762
else {
763
ILE->updateInit(SemaRef.Context, Init, DIE.get());
764
RequiresSecondPass = true;
765
}
766
return;
767
}
768
769
if (Field->getType()->isReferenceType()) {
770
if (!VerifyOnly) {
771
// C++ [dcl.init.aggr]p9:
772
// If an incomplete or empty initializer-list leaves a
773
// member of reference type uninitialized, the program is
774
// ill-formed.
775
SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized)
776
<< Field->getType()
777
<< (ILE->isSyntacticForm() ? ILE : ILE->getSyntacticForm())
778
->getSourceRange();
779
SemaRef.Diag(Field->getLocation(), diag::note_uninit_reference_member);
780
}
781
hadError = true;
782
return;
783
}
784
785
ExprResult MemberInit = PerformEmptyInit(Loc, MemberEntity);
786
if (MemberInit.isInvalid()) {
787
hadError = true;
788
return;
789
}
790
791
if (hadError || VerifyOnly) {
792
// Do nothing
793
} else if (Init < NumInits) {
794
ILE->setInit(Init, MemberInit.getAs<Expr>());
795
} else if (!isa<ImplicitValueInitExpr>(MemberInit.get())) {
796
// Empty initialization requires a constructor call, so
797
// extend the initializer list to include the constructor
798
// call and make a note that we'll need to take another pass
799
// through the initializer list.
800
ILE->updateInit(SemaRef.Context, Init, MemberInit.getAs<Expr>());
801
RequiresSecondPass = true;
802
}
803
} else if (InitListExpr *InnerILE
804
= dyn_cast<InitListExpr>(ILE->getInit(Init))) {
805
FillInEmptyInitializations(MemberEntity, InnerILE,
806
RequiresSecondPass, ILE, Init, FillWithNoInit);
807
} else if (DesignatedInitUpdateExpr *InnerDIUE =
808
dyn_cast<DesignatedInitUpdateExpr>(ILE->getInit(Init))) {
809
FillInEmptyInitializations(MemberEntity, InnerDIUE->getUpdater(),
810
RequiresSecondPass, ILE, Init,
811
/*FillWithNoInit =*/true);
812
}
813
}
814
815
/// Recursively replaces NULL values within the given initializer list
816
/// with expressions that perform value-initialization of the
817
/// appropriate type, and finish off the InitListExpr formation.
818
void
819
InitListChecker::FillInEmptyInitializations(const InitializedEntity &Entity,
820
InitListExpr *ILE,
821
bool &RequiresSecondPass,
822
InitListExpr *OuterILE,
823
unsigned OuterIndex,
824
bool FillWithNoInit) {
825
assert((ILE->getType() != SemaRef.Context.VoidTy) &&
826
"Should not have void type");
827
828
// We don't need to do any checks when just filling NoInitExprs; that can't
829
// fail.
830
if (FillWithNoInit && VerifyOnly)
831
return;
832
833
// If this is a nested initializer list, we might have changed its contents
834
// (and therefore some of its properties, such as instantiation-dependence)
835
// while filling it in. Inform the outer initializer list so that its state
836
// can be updated to match.
837
// FIXME: We should fully build the inner initializers before constructing
838
// the outer InitListExpr instead of mutating AST nodes after they have
839
// been used as subexpressions of other nodes.
840
struct UpdateOuterILEWithUpdatedInit {
841
InitListExpr *Outer;
842
unsigned OuterIndex;
843
~UpdateOuterILEWithUpdatedInit() {
844
if (Outer)
845
Outer->setInit(OuterIndex, Outer->getInit(OuterIndex));
846
}
847
} UpdateOuterRAII = {OuterILE, OuterIndex};
848
849
// A transparent ILE is not performing aggregate initialization and should
850
// not be filled in.
851
if (ILE->isTransparent())
852
return;
853
854
if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) {
855
const RecordDecl *RDecl = RType->getDecl();
856
if (RDecl->isUnion() && ILE->getInitializedFieldInUnion()) {
857
FillInEmptyInitForField(0, ILE->getInitializedFieldInUnion(), Entity, ILE,
858
RequiresSecondPass, FillWithNoInit);
859
} else {
860
assert((!RDecl->isUnion() || !isa<CXXRecordDecl>(RDecl) ||
861
!cast<CXXRecordDecl>(RDecl)->hasInClassInitializer()) &&
862
"We should have computed initialized fields already");
863
// The fields beyond ILE->getNumInits() are default initialized, so in
864
// order to leave them uninitialized, the ILE is expanded and the extra
865
// fields are then filled with NoInitExpr.
866
unsigned NumElems = numStructUnionElements(ILE->getType());
867
if (!RDecl->isUnion() && RDecl->hasFlexibleArrayMember())
868
++NumElems;
869
if (!VerifyOnly && ILE->getNumInits() < NumElems)
870
ILE->resizeInits(SemaRef.Context, NumElems);
871
872
unsigned Init = 0;
873
874
if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RDecl)) {
875
for (auto &Base : CXXRD->bases()) {
876
if (hadError)
877
return;
878
879
FillInEmptyInitForBase(Init, Base, Entity, ILE, RequiresSecondPass,
880
FillWithNoInit);
881
++Init;
882
}
883
}
884
885
for (auto *Field : RDecl->fields()) {
886
if (Field->isUnnamedBitField())
887
continue;
888
889
if (hadError)
890
return;
891
892
FillInEmptyInitForField(Init, Field, Entity, ILE, RequiresSecondPass,
893
FillWithNoInit);
894
if (hadError)
895
return;
896
897
++Init;
898
899
// Only look at the first initialization of a union.
900
if (RDecl->isUnion())
901
break;
902
}
903
}
904
905
return;
906
}
907
908
QualType ElementType;
909
910
InitializedEntity ElementEntity = Entity;
911
unsigned NumInits = ILE->getNumInits();
912
uint64_t NumElements = NumInits;
913
if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) {
914
ElementType = AType->getElementType();
915
if (const auto *CAType = dyn_cast<ConstantArrayType>(AType))
916
NumElements = CAType->getZExtSize();
917
// For an array new with an unknown bound, ask for one additional element
918
// in order to populate the array filler.
919
if (Entity.isVariableLengthArrayNew())
920
++NumElements;
921
ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context,
922
0, Entity);
923
} else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) {
924
ElementType = VType->getElementType();
925
NumElements = VType->getNumElements();
926
ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context,
927
0, Entity);
928
} else
929
ElementType = ILE->getType();
930
931
bool SkipEmptyInitChecks = false;
932
for (uint64_t Init = 0; Init != NumElements; ++Init) {
933
if (hadError)
934
return;
935
936
if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement ||
937
ElementEntity.getKind() == InitializedEntity::EK_VectorElement)
938
ElementEntity.setElementIndex(Init);
939
940
if (Init >= NumInits && (ILE->hasArrayFiller() || SkipEmptyInitChecks))
941
return;
942
943
Expr *InitExpr = (Init < NumInits ? ILE->getInit(Init) : nullptr);
944
if (!InitExpr && Init < NumInits && ILE->hasArrayFiller())
945
ILE->setInit(Init, ILE->getArrayFiller());
946
else if (!InitExpr && !ILE->hasArrayFiller()) {
947
// In VerifyOnly mode, there's no point performing empty initialization
948
// more than once.
949
if (SkipEmptyInitChecks)
950
continue;
951
952
Expr *Filler = nullptr;
953
954
if (FillWithNoInit)
955
Filler = new (SemaRef.Context) NoInitExpr(ElementType);
956
else {
957
ExprResult ElementInit =
958
PerformEmptyInit(ILE->getEndLoc(), ElementEntity);
959
if (ElementInit.isInvalid()) {
960
hadError = true;
961
return;
962
}
963
964
Filler = ElementInit.getAs<Expr>();
965
}
966
967
if (hadError) {
968
// Do nothing
969
} else if (VerifyOnly) {
970
SkipEmptyInitChecks = true;
971
} else if (Init < NumInits) {
972
// For arrays, just set the expression used for value-initialization
973
// of the "holes" in the array.
974
if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement)
975
ILE->setArrayFiller(Filler);
976
else
977
ILE->setInit(Init, Filler);
978
} else {
979
// For arrays, just set the expression used for value-initialization
980
// of the rest of elements and exit.
981
if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) {
982
ILE->setArrayFiller(Filler);
983
return;
984
}
985
986
if (!isa<ImplicitValueInitExpr>(Filler) && !isa<NoInitExpr>(Filler)) {
987
// Empty initialization requires a constructor call, so
988
// extend the initializer list to include the constructor
989
// call and make a note that we'll need to take another pass
990
// through the initializer list.
991
ILE->updateInit(SemaRef.Context, Init, Filler);
992
RequiresSecondPass = true;
993
}
994
}
995
} else if (InitListExpr *InnerILE
996
= dyn_cast_or_null<InitListExpr>(InitExpr)) {
997
FillInEmptyInitializations(ElementEntity, InnerILE, RequiresSecondPass,
998
ILE, Init, FillWithNoInit);
999
} else if (DesignatedInitUpdateExpr *InnerDIUE =
1000
dyn_cast_or_null<DesignatedInitUpdateExpr>(InitExpr)) {
1001
FillInEmptyInitializations(ElementEntity, InnerDIUE->getUpdater(),
1002
RequiresSecondPass, ILE, Init,
1003
/*FillWithNoInit =*/true);
1004
}
1005
}
1006
}
1007
1008
static bool hasAnyDesignatedInits(const InitListExpr *IL) {
1009
for (const Stmt *Init : *IL)
1010
if (isa_and_nonnull<DesignatedInitExpr>(Init))
1011
return true;
1012
return false;
1013
}
1014
1015
InitListChecker::InitListChecker(
1016
Sema &S, const InitializedEntity &Entity, InitListExpr *IL, QualType &T,
1017
bool VerifyOnly, bool TreatUnavailableAsInvalid, bool InOverloadResolution,
1018
SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes)
1019
: SemaRef(S), VerifyOnly(VerifyOnly),
1020
TreatUnavailableAsInvalid(TreatUnavailableAsInvalid),
1021
InOverloadResolution(InOverloadResolution),
1022
AggrDeductionCandidateParamTypes(AggrDeductionCandidateParamTypes) {
1023
if (!VerifyOnly || hasAnyDesignatedInits(IL)) {
1024
FullyStructuredList =
1025
createInitListExpr(T, IL->getSourceRange(), IL->getNumInits());
1026
1027
// FIXME: Check that IL isn't already the semantic form of some other
1028
// InitListExpr. If it is, we'd create a broken AST.
1029
if (!VerifyOnly)
1030
FullyStructuredList->setSyntacticForm(IL);
1031
}
1032
1033
CheckExplicitInitList(Entity, IL, T, FullyStructuredList,
1034
/*TopLevelObject=*/true);
1035
1036
if (!hadError && !AggrDeductionCandidateParamTypes && FullyStructuredList) {
1037
bool RequiresSecondPass = false;
1038
FillInEmptyInitializations(Entity, FullyStructuredList, RequiresSecondPass,
1039
/*OuterILE=*/nullptr, /*OuterIndex=*/0);
1040
if (RequiresSecondPass && !hadError)
1041
FillInEmptyInitializations(Entity, FullyStructuredList,
1042
RequiresSecondPass, nullptr, 0);
1043
}
1044
if (hadError && FullyStructuredList)
1045
FullyStructuredList->markError();
1046
}
1047
1048
int InitListChecker::numArrayElements(QualType DeclType) {
1049
// FIXME: use a proper constant
1050
int maxElements = 0x7FFFFFFF;
1051
if (const ConstantArrayType *CAT =
1052
SemaRef.Context.getAsConstantArrayType(DeclType)) {
1053
maxElements = static_cast<int>(CAT->getZExtSize());
1054
}
1055
return maxElements;
1056
}
1057
1058
int InitListChecker::numStructUnionElements(QualType DeclType) {
1059
RecordDecl *structDecl = DeclType->castAs<RecordType>()->getDecl();
1060
int InitializableMembers = 0;
1061
if (auto *CXXRD = dyn_cast<CXXRecordDecl>(structDecl))
1062
InitializableMembers += CXXRD->getNumBases();
1063
for (const auto *Field : structDecl->fields())
1064
if (!Field->isUnnamedBitField())
1065
++InitializableMembers;
1066
1067
if (structDecl->isUnion())
1068
return std::min(InitializableMembers, 1);
1069
return InitializableMembers - structDecl->hasFlexibleArrayMember();
1070
}
1071
1072
RecordDecl *InitListChecker::getRecordDecl(QualType DeclType) {
1073
if (const auto *RT = DeclType->getAs<RecordType>())
1074
return RT->getDecl();
1075
if (const auto *Inject = DeclType->getAs<InjectedClassNameType>())
1076
return Inject->getDecl();
1077
return nullptr;
1078
}
1079
1080
/// Determine whether Entity is an entity for which it is idiomatic to elide
1081
/// the braces in aggregate initialization.
1082
static bool isIdiomaticBraceElisionEntity(const InitializedEntity &Entity) {
1083
// Recursive initialization of the one and only field within an aggregate
1084
// class is considered idiomatic. This case arises in particular for
1085
// initialization of std::array, where the C++ standard suggests the idiom of
1086
//
1087
// std::array<T, N> arr = {1, 2, 3};
1088
//
1089
// (where std::array is an aggregate struct containing a single array field.
1090
1091
if (!Entity.getParent())
1092
return false;
1093
1094
// Allows elide brace initialization for aggregates with empty base.
1095
if (Entity.getKind() == InitializedEntity::EK_Base) {
1096
auto *ParentRD =
1097
Entity.getParent()->getType()->castAs<RecordType>()->getDecl();
1098
CXXRecordDecl *CXXRD = cast<CXXRecordDecl>(ParentRD);
1099
return CXXRD->getNumBases() == 1 && CXXRD->field_empty();
1100
}
1101
1102
// Allow brace elision if the only subobject is a field.
1103
if (Entity.getKind() == InitializedEntity::EK_Member) {
1104
auto *ParentRD =
1105
Entity.getParent()->getType()->castAs<RecordType>()->getDecl();
1106
if (CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(ParentRD)) {
1107
if (CXXRD->getNumBases()) {
1108
return false;
1109
}
1110
}
1111
auto FieldIt = ParentRD->field_begin();
1112
assert(FieldIt != ParentRD->field_end() &&
1113
"no fields but have initializer for member?");
1114
return ++FieldIt == ParentRD->field_end();
1115
}
1116
1117
return false;
1118
}
1119
1120
/// Check whether the range of the initializer \p ParentIList from element
1121
/// \p Index onwards can be used to initialize an object of type \p T. Update
1122
/// \p Index to indicate how many elements of the list were consumed.
1123
///
1124
/// This also fills in \p StructuredList, from element \p StructuredIndex
1125
/// onwards, with the fully-braced, desugared form of the initialization.
1126
void InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity,
1127
InitListExpr *ParentIList,
1128
QualType T, unsigned &Index,
1129
InitListExpr *StructuredList,
1130
unsigned &StructuredIndex) {
1131
int maxElements = 0;
1132
1133
if (T->isArrayType())
1134
maxElements = numArrayElements(T);
1135
else if (T->isRecordType())
1136
maxElements = numStructUnionElements(T);
1137
else if (T->isVectorType())
1138
maxElements = T->castAs<VectorType>()->getNumElements();
1139
else
1140
llvm_unreachable("CheckImplicitInitList(): Illegal type");
1141
1142
if (maxElements == 0) {
1143
if (!VerifyOnly)
1144
SemaRef.Diag(ParentIList->getInit(Index)->getBeginLoc(),
1145
diag::err_implicit_empty_initializer);
1146
++Index;
1147
hadError = true;
1148
return;
1149
}
1150
1151
// Build a structured initializer list corresponding to this subobject.
1152
InitListExpr *StructuredSubobjectInitList = getStructuredSubobjectInit(
1153
ParentIList, Index, T, StructuredList, StructuredIndex,
1154
SourceRange(ParentIList->getInit(Index)->getBeginLoc(),
1155
ParentIList->getSourceRange().getEnd()));
1156
unsigned StructuredSubobjectInitIndex = 0;
1157
1158
// Check the element types and build the structural subobject.
1159
unsigned StartIndex = Index;
1160
CheckListElementTypes(Entity, ParentIList, T,
1161
/*SubobjectIsDesignatorContext=*/false, Index,
1162
StructuredSubobjectInitList,
1163
StructuredSubobjectInitIndex);
1164
1165
if (StructuredSubobjectInitList) {
1166
StructuredSubobjectInitList->setType(T);
1167
1168
unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1);
1169
// Update the structured sub-object initializer so that it's ending
1170
// range corresponds with the end of the last initializer it used.
1171
if (EndIndex < ParentIList->getNumInits() &&
1172
ParentIList->getInit(EndIndex)) {
1173
SourceLocation EndLoc
1174
= ParentIList->getInit(EndIndex)->getSourceRange().getEnd();
1175
StructuredSubobjectInitList->setRBraceLoc(EndLoc);
1176
}
1177
1178
// Complain about missing braces.
1179
if (!VerifyOnly && (T->isArrayType() || T->isRecordType()) &&
1180
!ParentIList->isIdiomaticZeroInitializer(SemaRef.getLangOpts()) &&
1181
!isIdiomaticBraceElisionEntity(Entity)) {
1182
SemaRef.Diag(StructuredSubobjectInitList->getBeginLoc(),
1183
diag::warn_missing_braces)
1184
<< StructuredSubobjectInitList->getSourceRange()
1185
<< FixItHint::CreateInsertion(
1186
StructuredSubobjectInitList->getBeginLoc(), "{")
1187
<< FixItHint::CreateInsertion(
1188
SemaRef.getLocForEndOfToken(
1189
StructuredSubobjectInitList->getEndLoc()),
1190
"}");
1191
}
1192
1193
// Warn if this type won't be an aggregate in future versions of C++.
1194
auto *CXXRD = T->getAsCXXRecordDecl();
1195
if (!VerifyOnly && CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1196
SemaRef.Diag(StructuredSubobjectInitList->getBeginLoc(),
1197
diag::warn_cxx20_compat_aggregate_init_with_ctors)
1198
<< StructuredSubobjectInitList->getSourceRange() << T;
1199
}
1200
}
1201
}
1202
1203
/// Warn that \p Entity was of scalar type and was initialized by a
1204
/// single-element braced initializer list.
1205
static void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity,
1206
SourceRange Braces) {
1207
// Don't warn during template instantiation. If the initialization was
1208
// non-dependent, we warned during the initial parse; otherwise, the
1209
// type might not be scalar in some uses of the template.
1210
if (S.inTemplateInstantiation())
1211
return;
1212
1213
unsigned DiagID = 0;
1214
1215
switch (Entity.getKind()) {
1216
case InitializedEntity::EK_VectorElement:
1217
case InitializedEntity::EK_ComplexElement:
1218
case InitializedEntity::EK_ArrayElement:
1219
case InitializedEntity::EK_Parameter:
1220
case InitializedEntity::EK_Parameter_CF_Audited:
1221
case InitializedEntity::EK_TemplateParameter:
1222
case InitializedEntity::EK_Result:
1223
case InitializedEntity::EK_ParenAggInitMember:
1224
// Extra braces here are suspicious.
1225
DiagID = diag::warn_braces_around_init;
1226
break;
1227
1228
case InitializedEntity::EK_Member:
1229
// Warn on aggregate initialization but not on ctor init list or
1230
// default member initializer.
1231
if (Entity.getParent())
1232
DiagID = diag::warn_braces_around_init;
1233
break;
1234
1235
case InitializedEntity::EK_Variable:
1236
case InitializedEntity::EK_LambdaCapture:
1237
// No warning, might be direct-list-initialization.
1238
// FIXME: Should we warn for copy-list-initialization in these cases?
1239
break;
1240
1241
case InitializedEntity::EK_New:
1242
case InitializedEntity::EK_Temporary:
1243
case InitializedEntity::EK_CompoundLiteralInit:
1244
// No warning, braces are part of the syntax of the underlying construct.
1245
break;
1246
1247
case InitializedEntity::EK_RelatedResult:
1248
// No warning, we already warned when initializing the result.
1249
break;
1250
1251
case InitializedEntity::EK_Exception:
1252
case InitializedEntity::EK_Base:
1253
case InitializedEntity::EK_Delegating:
1254
case InitializedEntity::EK_BlockElement:
1255
case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
1256
case InitializedEntity::EK_Binding:
1257
case InitializedEntity::EK_StmtExprResult:
1258
llvm_unreachable("unexpected braced scalar init");
1259
}
1260
1261
if (DiagID) {
1262
S.Diag(Braces.getBegin(), DiagID)
1263
<< Entity.getType()->isSizelessBuiltinType() << Braces
1264
<< FixItHint::CreateRemoval(Braces.getBegin())
1265
<< FixItHint::CreateRemoval(Braces.getEnd());
1266
}
1267
}
1268
1269
/// Check whether the initializer \p IList (that was written with explicit
1270
/// braces) can be used to initialize an object of type \p T.
1271
///
1272
/// This also fills in \p StructuredList with the fully-braced, desugared
1273
/// form of the initialization.
1274
void InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity,
1275
InitListExpr *IList, QualType &T,
1276
InitListExpr *StructuredList,
1277
bool TopLevelObject) {
1278
unsigned Index = 0, StructuredIndex = 0;
1279
CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true,
1280
Index, StructuredList, StructuredIndex, TopLevelObject);
1281
if (StructuredList) {
1282
QualType ExprTy = T;
1283
if (!ExprTy->isArrayType())
1284
ExprTy = ExprTy.getNonLValueExprType(SemaRef.Context);
1285
if (!VerifyOnly)
1286
IList->setType(ExprTy);
1287
StructuredList->setType(ExprTy);
1288
}
1289
if (hadError)
1290
return;
1291
1292
// Don't complain for incomplete types, since we'll get an error elsewhere.
1293
if (Index < IList->getNumInits() && !T->isIncompleteType()) {
1294
// We have leftover initializers
1295
bool ExtraInitsIsError = SemaRef.getLangOpts().CPlusPlus ||
1296
(SemaRef.getLangOpts().OpenCL && T->isVectorType());
1297
hadError = ExtraInitsIsError;
1298
if (VerifyOnly) {
1299
return;
1300
} else if (StructuredIndex == 1 &&
1301
IsStringInit(StructuredList->getInit(0), T, SemaRef.Context) ==
1302
SIF_None) {
1303
unsigned DK =
1304
ExtraInitsIsError
1305
? diag::err_excess_initializers_in_char_array_initializer
1306
: diag::ext_excess_initializers_in_char_array_initializer;
1307
SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1308
<< IList->getInit(Index)->getSourceRange();
1309
} else if (T->isSizelessBuiltinType()) {
1310
unsigned DK = ExtraInitsIsError
1311
? diag::err_excess_initializers_for_sizeless_type
1312
: diag::ext_excess_initializers_for_sizeless_type;
1313
SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1314
<< T << IList->getInit(Index)->getSourceRange();
1315
} else {
1316
int initKind = T->isArrayType() ? 0 :
1317
T->isVectorType() ? 1 :
1318
T->isScalarType() ? 2 :
1319
T->isUnionType() ? 3 :
1320
4;
1321
1322
unsigned DK = ExtraInitsIsError ? diag::err_excess_initializers
1323
: diag::ext_excess_initializers;
1324
SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1325
<< initKind << IList->getInit(Index)->getSourceRange();
1326
}
1327
}
1328
1329
if (!VerifyOnly) {
1330
if (T->isScalarType() && IList->getNumInits() == 1 &&
1331
!isa<InitListExpr>(IList->getInit(0)))
1332
warnBracedScalarInit(SemaRef, Entity, IList->getSourceRange());
1333
1334
// Warn if this is a class type that won't be an aggregate in future
1335
// versions of C++.
1336
auto *CXXRD = T->getAsCXXRecordDecl();
1337
if (CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1338
// Don't warn if there's an equivalent default constructor that would be
1339
// used instead.
1340
bool HasEquivCtor = false;
1341
if (IList->getNumInits() == 0) {
1342
auto *CD = SemaRef.LookupDefaultConstructor(CXXRD);
1343
HasEquivCtor = CD && !CD->isDeleted();
1344
}
1345
1346
if (!HasEquivCtor) {
1347
SemaRef.Diag(IList->getBeginLoc(),
1348
diag::warn_cxx20_compat_aggregate_init_with_ctors)
1349
<< IList->getSourceRange() << T;
1350
}
1351
}
1352
}
1353
}
1354
1355
void InitListChecker::CheckListElementTypes(const InitializedEntity &Entity,
1356
InitListExpr *IList,
1357
QualType &DeclType,
1358
bool SubobjectIsDesignatorContext,
1359
unsigned &Index,
1360
InitListExpr *StructuredList,
1361
unsigned &StructuredIndex,
1362
bool TopLevelObject) {
1363
if (DeclType->isAnyComplexType() && SubobjectIsDesignatorContext) {
1364
// Explicitly braced initializer for complex type can be real+imaginary
1365
// parts.
1366
CheckComplexType(Entity, IList, DeclType, Index,
1367
StructuredList, StructuredIndex);
1368
} else if (DeclType->isScalarType()) {
1369
CheckScalarType(Entity, IList, DeclType, Index,
1370
StructuredList, StructuredIndex);
1371
} else if (DeclType->isVectorType()) {
1372
CheckVectorType(Entity, IList, DeclType, Index,
1373
StructuredList, StructuredIndex);
1374
} else if (const RecordDecl *RD = getRecordDecl(DeclType)) {
1375
auto Bases =
1376
CXXRecordDecl::base_class_const_range(CXXRecordDecl::base_class_const_iterator(),
1377
CXXRecordDecl::base_class_const_iterator());
1378
if (DeclType->isRecordType()) {
1379
assert(DeclType->isAggregateType() &&
1380
"non-aggregate records should be handed in CheckSubElementType");
1381
if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1382
Bases = CXXRD->bases();
1383
} else {
1384
Bases = cast<CXXRecordDecl>(RD)->bases();
1385
}
1386
CheckStructUnionTypes(Entity, IList, DeclType, Bases, RD->field_begin(),
1387
SubobjectIsDesignatorContext, Index, StructuredList,
1388
StructuredIndex, TopLevelObject);
1389
} else if (DeclType->isArrayType()) {
1390
llvm::APSInt Zero(
1391
SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()),
1392
false);
1393
CheckArrayType(Entity, IList, DeclType, Zero,
1394
SubobjectIsDesignatorContext, Index,
1395
StructuredList, StructuredIndex);
1396
} else if (DeclType->isVoidType() || DeclType->isFunctionType()) {
1397
// This type is invalid, issue a diagnostic.
1398
++Index;
1399
if (!VerifyOnly)
1400
SemaRef.Diag(IList->getBeginLoc(), diag::err_illegal_initializer_type)
1401
<< DeclType;
1402
hadError = true;
1403
} else if (DeclType->isReferenceType()) {
1404
CheckReferenceType(Entity, IList, DeclType, Index,
1405
StructuredList, StructuredIndex);
1406
} else if (DeclType->isObjCObjectType()) {
1407
if (!VerifyOnly)
1408
SemaRef.Diag(IList->getBeginLoc(), diag::err_init_objc_class) << DeclType;
1409
hadError = true;
1410
} else if (DeclType->isOCLIntelSubgroupAVCType() ||
1411
DeclType->isSizelessBuiltinType()) {
1412
// Checks for scalar type are sufficient for these types too.
1413
CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1414
StructuredIndex);
1415
} else if (DeclType->isDependentType()) {
1416
// C++ [over.match.class.deduct]p1.5:
1417
// brace elision is not considered for any aggregate element that has a
1418
// dependent non-array type or an array type with a value-dependent bound
1419
++Index;
1420
assert(AggrDeductionCandidateParamTypes);
1421
AggrDeductionCandidateParamTypes->push_back(DeclType);
1422
} else {
1423
if (!VerifyOnly)
1424
SemaRef.Diag(IList->getBeginLoc(), diag::err_illegal_initializer_type)
1425
<< DeclType;
1426
hadError = true;
1427
}
1428
}
1429
1430
void InitListChecker::CheckSubElementType(const InitializedEntity &Entity,
1431
InitListExpr *IList,
1432
QualType ElemType,
1433
unsigned &Index,
1434
InitListExpr *StructuredList,
1435
unsigned &StructuredIndex,
1436
bool DirectlyDesignated) {
1437
Expr *expr = IList->getInit(Index);
1438
1439
if (ElemType->isReferenceType())
1440
return CheckReferenceType(Entity, IList, ElemType, Index,
1441
StructuredList, StructuredIndex);
1442
1443
if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) {
1444
if (SubInitList->getNumInits() == 1 &&
1445
IsStringInit(SubInitList->getInit(0), ElemType, SemaRef.Context) ==
1446
SIF_None) {
1447
// FIXME: It would be more faithful and no less correct to include an
1448
// InitListExpr in the semantic form of the initializer list in this case.
1449
expr = SubInitList->getInit(0);
1450
}
1451
// Nested aggregate initialization and C++ initialization are handled later.
1452
} else if (isa<ImplicitValueInitExpr>(expr)) {
1453
// This happens during template instantiation when we see an InitListExpr
1454
// that we've already checked once.
1455
assert(SemaRef.Context.hasSameType(expr->getType(), ElemType) &&
1456
"found implicit initialization for the wrong type");
1457
UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1458
++Index;
1459
return;
1460
}
1461
1462
if (SemaRef.getLangOpts().CPlusPlus || isa<InitListExpr>(expr)) {
1463
// C++ [dcl.init.aggr]p2:
1464
// Each member is copy-initialized from the corresponding
1465
// initializer-clause.
1466
1467
// FIXME: Better EqualLoc?
1468
InitializationKind Kind =
1469
InitializationKind::CreateCopy(expr->getBeginLoc(), SourceLocation());
1470
1471
// Vector elements can be initialized from other vectors in which case
1472
// we need initialization entity with a type of a vector (and not a vector
1473
// element!) initializing multiple vector elements.
1474
auto TmpEntity =
1475
(ElemType->isExtVectorType() && !Entity.getType()->isExtVectorType())
1476
? InitializedEntity::InitializeTemporary(ElemType)
1477
: Entity;
1478
1479
if (TmpEntity.getType()->isDependentType()) {
1480
// C++ [over.match.class.deduct]p1.5:
1481
// brace elision is not considered for any aggregate element that has a
1482
// dependent non-array type or an array type with a value-dependent
1483
// bound
1484
assert(AggrDeductionCandidateParamTypes);
1485
1486
// In the presence of a braced-init-list within the initializer, we should
1487
// not perform brace-elision, even if brace elision would otherwise be
1488
// applicable. For example, given:
1489
//
1490
// template <class T> struct Foo {
1491
// T t[2];
1492
// };
1493
//
1494
// Foo t = {{1, 2}};
1495
//
1496
// we don't want the (T, T) but rather (T [2]) in terms of the initializer
1497
// {{1, 2}}.
1498
if (isa<InitListExpr, DesignatedInitExpr>(expr) ||
1499
!isa_and_present<ConstantArrayType>(
1500
SemaRef.Context.getAsArrayType(ElemType))) {
1501
++Index;
1502
AggrDeductionCandidateParamTypes->push_back(ElemType);
1503
return;
1504
}
1505
} else {
1506
InitializationSequence Seq(SemaRef, TmpEntity, Kind, expr,
1507
/*TopLevelOfInitList*/ true);
1508
// C++14 [dcl.init.aggr]p13:
1509
// If the assignment-expression can initialize a member, the member is
1510
// initialized. Otherwise [...] brace elision is assumed
1511
//
1512
// Brace elision is never performed if the element is not an
1513
// assignment-expression.
1514
if (Seq || isa<InitListExpr>(expr)) {
1515
if (auto *Embed = dyn_cast<EmbedExpr>(expr)) {
1516
expr = HandleEmbed(Embed, Entity);
1517
}
1518
if (!VerifyOnly) {
1519
ExprResult Result = Seq.Perform(SemaRef, TmpEntity, Kind, expr);
1520
if (Result.isInvalid())
1521
hadError = true;
1522
1523
UpdateStructuredListElement(StructuredList, StructuredIndex,
1524
Result.getAs<Expr>());
1525
} else if (!Seq) {
1526
hadError = true;
1527
} else if (StructuredList) {
1528
UpdateStructuredListElement(StructuredList, StructuredIndex,
1529
getDummyInit());
1530
}
1531
if (!CurEmbed)
1532
++Index;
1533
if (AggrDeductionCandidateParamTypes)
1534
AggrDeductionCandidateParamTypes->push_back(ElemType);
1535
return;
1536
}
1537
}
1538
1539
// Fall through for subaggregate initialization
1540
} else if (ElemType->isScalarType() || ElemType->isAtomicType()) {
1541
// FIXME: Need to handle atomic aggregate types with implicit init lists.
1542
return CheckScalarType(Entity, IList, ElemType, Index,
1543
StructuredList, StructuredIndex);
1544
} else if (const ArrayType *arrayType =
1545
SemaRef.Context.getAsArrayType(ElemType)) {
1546
// arrayType can be incomplete if we're initializing a flexible
1547
// array member. There's nothing we can do with the completed
1548
// type here, though.
1549
1550
if (IsStringInit(expr, arrayType, SemaRef.Context) == SIF_None) {
1551
// FIXME: Should we do this checking in verify-only mode?
1552
if (!VerifyOnly)
1553
CheckStringInit(expr, ElemType, arrayType, SemaRef,
1554
SemaRef.getLangOpts().C23 &&
1555
initializingConstexprVariable(Entity));
1556
if (StructuredList)
1557
UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1558
++Index;
1559
return;
1560
}
1561
1562
// Fall through for subaggregate initialization.
1563
1564
} else {
1565
assert((ElemType->isRecordType() || ElemType->isVectorType() ||
1566
ElemType->isOpenCLSpecificType()) && "Unexpected type");
1567
1568
// C99 6.7.8p13:
1569
//
1570
// The initializer for a structure or union object that has
1571
// automatic storage duration shall be either an initializer
1572
// list as described below, or a single expression that has
1573
// compatible structure or union type. In the latter case, the
1574
// initial value of the object, including unnamed members, is
1575
// that of the expression.
1576
ExprResult ExprRes = expr;
1577
if (SemaRef.CheckSingleAssignmentConstraints(
1578
ElemType, ExprRes, !VerifyOnly) != Sema::Incompatible) {
1579
if (ExprRes.isInvalid())
1580
hadError = true;
1581
else {
1582
ExprRes = SemaRef.DefaultFunctionArrayLvalueConversion(ExprRes.get());
1583
if (ExprRes.isInvalid())
1584
hadError = true;
1585
}
1586
UpdateStructuredListElement(StructuredList, StructuredIndex,
1587
ExprRes.getAs<Expr>());
1588
++Index;
1589
return;
1590
}
1591
ExprRes.get();
1592
// Fall through for subaggregate initialization
1593
}
1594
1595
// C++ [dcl.init.aggr]p12:
1596
//
1597
// [...] Otherwise, if the member is itself a non-empty
1598
// subaggregate, brace elision is assumed and the initializer is
1599
// considered for the initialization of the first member of
1600
// the subaggregate.
1601
// OpenCL vector initializer is handled elsewhere.
1602
if ((!SemaRef.getLangOpts().OpenCL && ElemType->isVectorType()) ||
1603
ElemType->isAggregateType()) {
1604
CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList,
1605
StructuredIndex);
1606
++StructuredIndex;
1607
1608
// In C++20, brace elision is not permitted for a designated initializer.
1609
if (DirectlyDesignated && SemaRef.getLangOpts().CPlusPlus && !hadError) {
1610
if (InOverloadResolution)
1611
hadError = true;
1612
if (!VerifyOnly) {
1613
SemaRef.Diag(expr->getBeginLoc(),
1614
diag::ext_designated_init_brace_elision)
1615
<< expr->getSourceRange()
1616
<< FixItHint::CreateInsertion(expr->getBeginLoc(), "{")
1617
<< FixItHint::CreateInsertion(
1618
SemaRef.getLocForEndOfToken(expr->getEndLoc()), "}");
1619
}
1620
}
1621
} else {
1622
if (!VerifyOnly) {
1623
// We cannot initialize this element, so let PerformCopyInitialization
1624
// produce the appropriate diagnostic. We already checked that this
1625
// initialization will fail.
1626
ExprResult Copy =
1627
SemaRef.PerformCopyInitialization(Entity, SourceLocation(), expr,
1628
/*TopLevelOfInitList=*/true);
1629
(void)Copy;
1630
assert(Copy.isInvalid() &&
1631
"expected non-aggregate initialization to fail");
1632
}
1633
hadError = true;
1634
++Index;
1635
++StructuredIndex;
1636
}
1637
}
1638
1639
void InitListChecker::CheckComplexType(const InitializedEntity &Entity,
1640
InitListExpr *IList, QualType DeclType,
1641
unsigned &Index,
1642
InitListExpr *StructuredList,
1643
unsigned &StructuredIndex) {
1644
assert(Index == 0 && "Index in explicit init list must be zero");
1645
1646
// As an extension, clang supports complex initializers, which initialize
1647
// a complex number component-wise. When an explicit initializer list for
1648
// a complex number contains two initializers, this extension kicks in:
1649
// it expects the initializer list to contain two elements convertible to
1650
// the element type of the complex type. The first element initializes
1651
// the real part, and the second element intitializes the imaginary part.
1652
1653
if (IList->getNumInits() < 2)
1654
return CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1655
StructuredIndex);
1656
1657
// This is an extension in C. (The builtin _Complex type does not exist
1658
// in the C++ standard.)
1659
if (!SemaRef.getLangOpts().CPlusPlus && !VerifyOnly)
1660
SemaRef.Diag(IList->getBeginLoc(), diag::ext_complex_component_init)
1661
<< IList->getSourceRange();
1662
1663
// Initialize the complex number.
1664
QualType elementType = DeclType->castAs<ComplexType>()->getElementType();
1665
InitializedEntity ElementEntity =
1666
InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
1667
1668
for (unsigned i = 0; i < 2; ++i) {
1669
ElementEntity.setElementIndex(Index);
1670
CheckSubElementType(ElementEntity, IList, elementType, Index,
1671
StructuredList, StructuredIndex);
1672
}
1673
}
1674
1675
void InitListChecker::CheckScalarType(const InitializedEntity &Entity,
1676
InitListExpr *IList, QualType DeclType,
1677
unsigned &Index,
1678
InitListExpr *StructuredList,
1679
unsigned &StructuredIndex) {
1680
if (Index >= IList->getNumInits()) {
1681
if (!VerifyOnly) {
1682
if (SemaRef.getLangOpts().CPlusPlus) {
1683
if (DeclType->isSizelessBuiltinType())
1684
SemaRef.Diag(IList->getBeginLoc(),
1685
SemaRef.getLangOpts().CPlusPlus11
1686
? diag::warn_cxx98_compat_empty_sizeless_initializer
1687
: diag::err_empty_sizeless_initializer)
1688
<< DeclType << IList->getSourceRange();
1689
else
1690
SemaRef.Diag(IList->getBeginLoc(),
1691
SemaRef.getLangOpts().CPlusPlus11
1692
? diag::warn_cxx98_compat_empty_scalar_initializer
1693
: diag::err_empty_scalar_initializer)
1694
<< IList->getSourceRange();
1695
}
1696
}
1697
hadError =
1698
SemaRef.getLangOpts().CPlusPlus && !SemaRef.getLangOpts().CPlusPlus11;
1699
++Index;
1700
++StructuredIndex;
1701
return;
1702
}
1703
1704
Expr *expr = IList->getInit(Index);
1705
if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) {
1706
// FIXME: This is invalid, and accepting it causes overload resolution
1707
// to pick the wrong overload in some corner cases.
1708
if (!VerifyOnly)
1709
SemaRef.Diag(SubIList->getBeginLoc(), diag::ext_many_braces_around_init)
1710
<< DeclType->isSizelessBuiltinType() << SubIList->getSourceRange();
1711
1712
CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList,
1713
StructuredIndex);
1714
return;
1715
} else if (isa<DesignatedInitExpr>(expr)) {
1716
if (!VerifyOnly)
1717
SemaRef.Diag(expr->getBeginLoc(),
1718
diag::err_designator_for_scalar_or_sizeless_init)
1719
<< DeclType->isSizelessBuiltinType() << DeclType
1720
<< expr->getSourceRange();
1721
hadError = true;
1722
++Index;
1723
++StructuredIndex;
1724
return;
1725
} else if (auto *Embed = dyn_cast<EmbedExpr>(expr)) {
1726
expr = HandleEmbed(Embed, Entity);
1727
}
1728
1729
ExprResult Result;
1730
if (VerifyOnly) {
1731
if (SemaRef.CanPerformCopyInitialization(Entity, expr))
1732
Result = getDummyInit();
1733
else
1734
Result = ExprError();
1735
} else {
1736
Result =
1737
SemaRef.PerformCopyInitialization(Entity, expr->getBeginLoc(), expr,
1738
/*TopLevelOfInitList=*/true);
1739
}
1740
1741
Expr *ResultExpr = nullptr;
1742
1743
if (Result.isInvalid())
1744
hadError = true; // types weren't compatible.
1745
else {
1746
ResultExpr = Result.getAs<Expr>();
1747
1748
if (ResultExpr != expr && !VerifyOnly && !CurEmbed) {
1749
// The type was promoted, update initializer list.
1750
// FIXME: Why are we updating the syntactic init list?
1751
IList->setInit(Index, ResultExpr);
1752
}
1753
}
1754
1755
UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1756
if (!CurEmbed)
1757
++Index;
1758
if (AggrDeductionCandidateParamTypes)
1759
AggrDeductionCandidateParamTypes->push_back(DeclType);
1760
}
1761
1762
void InitListChecker::CheckReferenceType(const InitializedEntity &Entity,
1763
InitListExpr *IList, QualType DeclType,
1764
unsigned &Index,
1765
InitListExpr *StructuredList,
1766
unsigned &StructuredIndex) {
1767
if (Index >= IList->getNumInits()) {
1768
// FIXME: It would be wonderful if we could point at the actual member. In
1769
// general, it would be useful to pass location information down the stack,
1770
// so that we know the location (or decl) of the "current object" being
1771
// initialized.
1772
if (!VerifyOnly)
1773
SemaRef.Diag(IList->getBeginLoc(),
1774
diag::err_init_reference_member_uninitialized)
1775
<< DeclType << IList->getSourceRange();
1776
hadError = true;
1777
++Index;
1778
++StructuredIndex;
1779
return;
1780
}
1781
1782
Expr *expr = IList->getInit(Index);
1783
if (isa<InitListExpr>(expr) && !SemaRef.getLangOpts().CPlusPlus11) {
1784
if (!VerifyOnly)
1785
SemaRef.Diag(IList->getBeginLoc(), diag::err_init_non_aggr_init_list)
1786
<< DeclType << IList->getSourceRange();
1787
hadError = true;
1788
++Index;
1789
++StructuredIndex;
1790
return;
1791
}
1792
1793
ExprResult Result;
1794
if (VerifyOnly) {
1795
if (SemaRef.CanPerformCopyInitialization(Entity,expr))
1796
Result = getDummyInit();
1797
else
1798
Result = ExprError();
1799
} else {
1800
Result =
1801
SemaRef.PerformCopyInitialization(Entity, expr->getBeginLoc(), expr,
1802
/*TopLevelOfInitList=*/true);
1803
}
1804
1805
if (Result.isInvalid())
1806
hadError = true;
1807
1808
expr = Result.getAs<Expr>();
1809
// FIXME: Why are we updating the syntactic init list?
1810
if (!VerifyOnly && expr)
1811
IList->setInit(Index, expr);
1812
1813
UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1814
++Index;
1815
if (AggrDeductionCandidateParamTypes)
1816
AggrDeductionCandidateParamTypes->push_back(DeclType);
1817
}
1818
1819
void InitListChecker::CheckVectorType(const InitializedEntity &Entity,
1820
InitListExpr *IList, QualType DeclType,
1821
unsigned &Index,
1822
InitListExpr *StructuredList,
1823
unsigned &StructuredIndex) {
1824
const VectorType *VT = DeclType->castAs<VectorType>();
1825
unsigned maxElements = VT->getNumElements();
1826
unsigned numEltsInit = 0;
1827
QualType elementType = VT->getElementType();
1828
1829
if (Index >= IList->getNumInits()) {
1830
// Make sure the element type can be value-initialized.
1831
CheckEmptyInitializable(
1832
InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity),
1833
IList->getEndLoc());
1834
return;
1835
}
1836
1837
if (!SemaRef.getLangOpts().OpenCL && !SemaRef.getLangOpts().HLSL ) {
1838
// If the initializing element is a vector, try to copy-initialize
1839
// instead of breaking it apart (which is doomed to failure anyway).
1840
Expr *Init = IList->getInit(Index);
1841
if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) {
1842
ExprResult Result;
1843
if (VerifyOnly) {
1844
if (SemaRef.CanPerformCopyInitialization(Entity, Init))
1845
Result = getDummyInit();
1846
else
1847
Result = ExprError();
1848
} else {
1849
Result =
1850
SemaRef.PerformCopyInitialization(Entity, Init->getBeginLoc(), Init,
1851
/*TopLevelOfInitList=*/true);
1852
}
1853
1854
Expr *ResultExpr = nullptr;
1855
if (Result.isInvalid())
1856
hadError = true; // types weren't compatible.
1857
else {
1858
ResultExpr = Result.getAs<Expr>();
1859
1860
if (ResultExpr != Init && !VerifyOnly) {
1861
// The type was promoted, update initializer list.
1862
// FIXME: Why are we updating the syntactic init list?
1863
IList->setInit(Index, ResultExpr);
1864
}
1865
}
1866
UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1867
++Index;
1868
if (AggrDeductionCandidateParamTypes)
1869
AggrDeductionCandidateParamTypes->push_back(elementType);
1870
return;
1871
}
1872
1873
InitializedEntity ElementEntity =
1874
InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
1875
1876
for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) {
1877
// Don't attempt to go past the end of the init list
1878
if (Index >= IList->getNumInits()) {
1879
CheckEmptyInitializable(ElementEntity, IList->getEndLoc());
1880
break;
1881
}
1882
1883
ElementEntity.setElementIndex(Index);
1884
CheckSubElementType(ElementEntity, IList, elementType, Index,
1885
StructuredList, StructuredIndex);
1886
}
1887
1888
if (VerifyOnly)
1889
return;
1890
1891
bool isBigEndian = SemaRef.Context.getTargetInfo().isBigEndian();
1892
const VectorType *T = Entity.getType()->castAs<VectorType>();
1893
if (isBigEndian && (T->getVectorKind() == VectorKind::Neon ||
1894
T->getVectorKind() == VectorKind::NeonPoly)) {
1895
// The ability to use vector initializer lists is a GNU vector extension
1896
// and is unrelated to the NEON intrinsics in arm_neon.h. On little
1897
// endian machines it works fine, however on big endian machines it
1898
// exhibits surprising behaviour:
1899
//
1900
// uint32x2_t x = {42, 64};
1901
// return vget_lane_u32(x, 0); // Will return 64.
1902
//
1903
// Because of this, explicitly call out that it is non-portable.
1904
//
1905
SemaRef.Diag(IList->getBeginLoc(),
1906
diag::warn_neon_vector_initializer_non_portable);
1907
1908
const char *typeCode;
1909
unsigned typeSize = SemaRef.Context.getTypeSize(elementType);
1910
1911
if (elementType->isFloatingType())
1912
typeCode = "f";
1913
else if (elementType->isSignedIntegerType())
1914
typeCode = "s";
1915
else if (elementType->isUnsignedIntegerType())
1916
typeCode = "u";
1917
else
1918
llvm_unreachable("Invalid element type!");
1919
1920
SemaRef.Diag(IList->getBeginLoc(),
1921
SemaRef.Context.getTypeSize(VT) > 64
1922
? diag::note_neon_vector_initializer_non_portable_q
1923
: diag::note_neon_vector_initializer_non_portable)
1924
<< typeCode << typeSize;
1925
}
1926
1927
return;
1928
}
1929
1930
InitializedEntity ElementEntity =
1931
InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
1932
1933
// OpenCL and HLSL initializers allow vectors to be constructed from vectors.
1934
for (unsigned i = 0; i < maxElements; ++i) {
1935
// Don't attempt to go past the end of the init list
1936
if (Index >= IList->getNumInits())
1937
break;
1938
1939
ElementEntity.setElementIndex(Index);
1940
1941
QualType IType = IList->getInit(Index)->getType();
1942
if (!IType->isVectorType()) {
1943
CheckSubElementType(ElementEntity, IList, elementType, Index,
1944
StructuredList, StructuredIndex);
1945
++numEltsInit;
1946
} else {
1947
QualType VecType;
1948
const VectorType *IVT = IType->castAs<VectorType>();
1949
unsigned numIElts = IVT->getNumElements();
1950
1951
if (IType->isExtVectorType())
1952
VecType = SemaRef.Context.getExtVectorType(elementType, numIElts);
1953
else
1954
VecType = SemaRef.Context.getVectorType(elementType, numIElts,
1955
IVT->getVectorKind());
1956
CheckSubElementType(ElementEntity, IList, VecType, Index,
1957
StructuredList, StructuredIndex);
1958
numEltsInit += numIElts;
1959
}
1960
}
1961
1962
// OpenCL and HLSL require all elements to be initialized.
1963
if (numEltsInit != maxElements) {
1964
if (!VerifyOnly)
1965
SemaRef.Diag(IList->getBeginLoc(),
1966
diag::err_vector_incorrect_num_initializers)
1967
<< (numEltsInit < maxElements) << maxElements << numEltsInit;
1968
hadError = true;
1969
}
1970
}
1971
1972
/// Check if the type of a class element has an accessible destructor, and marks
1973
/// it referenced. Returns true if we shouldn't form a reference to the
1974
/// destructor.
1975
///
1976
/// Aggregate initialization requires a class element's destructor be
1977
/// accessible per 11.6.1 [dcl.init.aggr]:
1978
///
1979
/// The destructor for each element of class type is potentially invoked
1980
/// (15.4 [class.dtor]) from the context where the aggregate initialization
1981
/// occurs.
1982
static bool checkDestructorReference(QualType ElementType, SourceLocation Loc,
1983
Sema &SemaRef) {
1984
auto *CXXRD = ElementType->getAsCXXRecordDecl();
1985
if (!CXXRD)
1986
return false;
1987
1988
CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(CXXRD);
1989
SemaRef.CheckDestructorAccess(Loc, Destructor,
1990
SemaRef.PDiag(diag::err_access_dtor_temp)
1991
<< ElementType);
1992
SemaRef.MarkFunctionReferenced(Loc, Destructor);
1993
return SemaRef.DiagnoseUseOfDecl(Destructor, Loc);
1994
}
1995
1996
static bool
1997
canInitializeArrayWithEmbedDataString(ArrayRef<Expr *> ExprList,
1998
const InitializedEntity &Entity,
1999
ASTContext &Context) {
2000
QualType InitType = Entity.getType();
2001
const InitializedEntity *Parent = &Entity;
2002
2003
while (Parent) {
2004
InitType = Parent->getType();
2005
Parent = Parent->getParent();
2006
}
2007
2008
// Only one initializer, it's an embed and the types match;
2009
EmbedExpr *EE =
2010
ExprList.size() == 1
2011
? dyn_cast_if_present<EmbedExpr>(ExprList[0]->IgnoreParens())
2012
: nullptr;
2013
if (!EE)
2014
return false;
2015
2016
if (InitType->isArrayType()) {
2017
const ArrayType *InitArrayType = InitType->getAsArrayTypeUnsafe();
2018
QualType InitElementTy = InitArrayType->getElementType();
2019
QualType EmbedExprElementTy = EE->getDataStringLiteral()->getType();
2020
const bool TypesMatch =
2021
Context.typesAreCompatible(InitElementTy, EmbedExprElementTy) ||
2022
(InitElementTy->isCharType() && EmbedExprElementTy->isCharType());
2023
if (TypesMatch)
2024
return true;
2025
}
2026
return false;
2027
}
2028
2029
void InitListChecker::CheckArrayType(const InitializedEntity &Entity,
2030
InitListExpr *IList, QualType &DeclType,
2031
llvm::APSInt elementIndex,
2032
bool SubobjectIsDesignatorContext,
2033
unsigned &Index,
2034
InitListExpr *StructuredList,
2035
unsigned &StructuredIndex) {
2036
const ArrayType *arrayType = SemaRef.Context.getAsArrayType(DeclType);
2037
2038
if (!VerifyOnly) {
2039
if (checkDestructorReference(arrayType->getElementType(),
2040
IList->getEndLoc(), SemaRef)) {
2041
hadError = true;
2042
return;
2043
}
2044
}
2045
2046
if (canInitializeArrayWithEmbedDataString(IList->inits(), Entity,
2047
SemaRef.Context)) {
2048
EmbedExpr *Embed = cast<EmbedExpr>(IList->inits()[0]);
2049
IList->setInit(0, Embed->getDataStringLiteral());
2050
}
2051
2052
// Check for the special-case of initializing an array with a string.
2053
if (Index < IList->getNumInits()) {
2054
if (IsStringInit(IList->getInit(Index), arrayType, SemaRef.Context) ==
2055
SIF_None) {
2056
// We place the string literal directly into the resulting
2057
// initializer list. This is the only place where the structure
2058
// of the structured initializer list doesn't match exactly,
2059
// because doing so would involve allocating one character
2060
// constant for each string.
2061
// FIXME: Should we do these checks in verify-only mode too?
2062
if (!VerifyOnly)
2063
CheckStringInit(IList->getInit(Index), DeclType, arrayType, SemaRef,
2064
SemaRef.getLangOpts().C23 &&
2065
initializingConstexprVariable(Entity));
2066
if (StructuredList) {
2067
UpdateStructuredListElement(StructuredList, StructuredIndex,
2068
IList->getInit(Index));
2069
StructuredList->resizeInits(SemaRef.Context, StructuredIndex);
2070
}
2071
++Index;
2072
if (AggrDeductionCandidateParamTypes)
2073
AggrDeductionCandidateParamTypes->push_back(DeclType);
2074
return;
2075
}
2076
}
2077
if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) {
2078
// Check for VLAs; in standard C it would be possible to check this
2079
// earlier, but I don't know where clang accepts VLAs (gcc accepts
2080
// them in all sorts of strange places).
2081
bool HasErr = IList->getNumInits() != 0 || SemaRef.getLangOpts().CPlusPlus;
2082
if (!VerifyOnly) {
2083
// C23 6.7.10p4: An entity of variable length array type shall not be
2084
// initialized except by an empty initializer.
2085
//
2086
// The C extension warnings are issued from ParseBraceInitializer() and
2087
// do not need to be issued here. However, we continue to issue an error
2088
// in the case there are initializers or we are compiling C++. We allow
2089
// use of VLAs in C++, but it's not clear we want to allow {} to zero
2090
// init a VLA in C++ in all cases (such as with non-trivial constructors).
2091
// FIXME: should we allow this construct in C++ when it makes sense to do
2092
// so?
2093
if (HasErr)
2094
SemaRef.Diag(VAT->getSizeExpr()->getBeginLoc(),
2095
diag::err_variable_object_no_init)
2096
<< VAT->getSizeExpr()->getSourceRange();
2097
}
2098
hadError = HasErr;
2099
++Index;
2100
++StructuredIndex;
2101
return;
2102
}
2103
2104
// We might know the maximum number of elements in advance.
2105
llvm::APSInt maxElements(elementIndex.getBitWidth(),
2106
elementIndex.isUnsigned());
2107
bool maxElementsKnown = false;
2108
if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(arrayType)) {
2109
maxElements = CAT->getSize();
2110
elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth());
2111
elementIndex.setIsUnsigned(maxElements.isUnsigned());
2112
maxElementsKnown = true;
2113
}
2114
2115
QualType elementType = arrayType->getElementType();
2116
while (Index < IList->getNumInits()) {
2117
Expr *Init = IList->getInit(Index);
2118
if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) {
2119
// If we're not the subobject that matches up with the '{' for
2120
// the designator, we shouldn't be handling the
2121
// designator. Return immediately.
2122
if (!SubobjectIsDesignatorContext)
2123
return;
2124
2125
// Handle this designated initializer. elementIndex will be
2126
// updated to be the next array element we'll initialize.
2127
if (CheckDesignatedInitializer(Entity, IList, DIE, 0,
2128
DeclType, nullptr, &elementIndex, Index,
2129
StructuredList, StructuredIndex, true,
2130
false)) {
2131
hadError = true;
2132
continue;
2133
}
2134
2135
if (elementIndex.getBitWidth() > maxElements.getBitWidth())
2136
maxElements = maxElements.extend(elementIndex.getBitWidth());
2137
else if (elementIndex.getBitWidth() < maxElements.getBitWidth())
2138
elementIndex = elementIndex.extend(maxElements.getBitWidth());
2139
elementIndex.setIsUnsigned(maxElements.isUnsigned());
2140
2141
// If the array is of incomplete type, keep track of the number of
2142
// elements in the initializer.
2143
if (!maxElementsKnown && elementIndex > maxElements)
2144
maxElements = elementIndex;
2145
2146
continue;
2147
}
2148
2149
// If we know the maximum number of elements, and we've already
2150
// hit it, stop consuming elements in the initializer list.
2151
if (maxElementsKnown && elementIndex == maxElements)
2152
break;
2153
2154
InitializedEntity ElementEntity = InitializedEntity::InitializeElement(
2155
SemaRef.Context, StructuredIndex, Entity);
2156
2157
unsigned EmbedElementIndexBeforeInit = CurEmbedIndex;
2158
// Check this element.
2159
CheckSubElementType(ElementEntity, IList, elementType, Index,
2160
StructuredList, StructuredIndex);
2161
++elementIndex;
2162
if ((CurEmbed || isa<EmbedExpr>(Init)) && elementType->isScalarType()) {
2163
if (CurEmbed) {
2164
elementIndex =
2165
elementIndex + CurEmbedIndex - EmbedElementIndexBeforeInit - 1;
2166
} else {
2167
auto Embed = cast<EmbedExpr>(Init);
2168
elementIndex = elementIndex + Embed->getDataElementCount() -
2169
EmbedElementIndexBeforeInit - 1;
2170
}
2171
}
2172
2173
// If the array is of incomplete type, keep track of the number of
2174
// elements in the initializer.
2175
if (!maxElementsKnown && elementIndex > maxElements)
2176
maxElements = elementIndex;
2177
}
2178
if (!hadError && DeclType->isIncompleteArrayType() && !VerifyOnly) {
2179
// If this is an incomplete array type, the actual type needs to
2180
// be calculated here.
2181
llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned());
2182
if (maxElements == Zero && !Entity.isVariableLengthArrayNew()) {
2183
// Sizing an array implicitly to zero is not allowed by ISO C,
2184
// but is supported by GNU.
2185
SemaRef.Diag(IList->getBeginLoc(), diag::ext_typecheck_zero_array_size);
2186
}
2187
2188
DeclType = SemaRef.Context.getConstantArrayType(
2189
elementType, maxElements, nullptr, ArraySizeModifier::Normal, 0);
2190
}
2191
if (!hadError) {
2192
// If there are any members of the array that get value-initialized, check
2193
// that is possible. That happens if we know the bound and don't have
2194
// enough elements, or if we're performing an array new with an unknown
2195
// bound.
2196
if ((maxElementsKnown && elementIndex < maxElements) ||
2197
Entity.isVariableLengthArrayNew())
2198
CheckEmptyInitializable(
2199
InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity),
2200
IList->getEndLoc());
2201
}
2202
}
2203
2204
bool InitListChecker::CheckFlexibleArrayInit(const InitializedEntity &Entity,
2205
Expr *InitExpr,
2206
FieldDecl *Field,
2207
bool TopLevelObject) {
2208
// Handle GNU flexible array initializers.
2209
unsigned FlexArrayDiag;
2210
if (isa<InitListExpr>(InitExpr) &&
2211
cast<InitListExpr>(InitExpr)->getNumInits() == 0) {
2212
// Empty flexible array init always allowed as an extension
2213
FlexArrayDiag = diag::ext_flexible_array_init;
2214
} else if (!TopLevelObject) {
2215
// Disallow flexible array init on non-top-level object
2216
FlexArrayDiag = diag::err_flexible_array_init;
2217
} else if (Entity.getKind() != InitializedEntity::EK_Variable) {
2218
// Disallow flexible array init on anything which is not a variable.
2219
FlexArrayDiag = diag::err_flexible_array_init;
2220
} else if (cast<VarDecl>(Entity.getDecl())->hasLocalStorage()) {
2221
// Disallow flexible array init on local variables.
2222
FlexArrayDiag = diag::err_flexible_array_init;
2223
} else {
2224
// Allow other cases.
2225
FlexArrayDiag = diag::ext_flexible_array_init;
2226
}
2227
2228
if (!VerifyOnly) {
2229
SemaRef.Diag(InitExpr->getBeginLoc(), FlexArrayDiag)
2230
<< InitExpr->getBeginLoc();
2231
SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
2232
<< Field;
2233
}
2234
2235
return FlexArrayDiag != diag::ext_flexible_array_init;
2236
}
2237
2238
void InitListChecker::CheckStructUnionTypes(
2239
const InitializedEntity &Entity, InitListExpr *IList, QualType DeclType,
2240
CXXRecordDecl::base_class_const_range Bases, RecordDecl::field_iterator Field,
2241
bool SubobjectIsDesignatorContext, unsigned &Index,
2242
InitListExpr *StructuredList, unsigned &StructuredIndex,
2243
bool TopLevelObject) {
2244
const RecordDecl *RD = getRecordDecl(DeclType);
2245
2246
// If the record is invalid, some of it's members are invalid. To avoid
2247
// confusion, we forgo checking the initializer for the entire record.
2248
if (RD->isInvalidDecl()) {
2249
// Assume it was supposed to consume a single initializer.
2250
++Index;
2251
hadError = true;
2252
return;
2253
}
2254
2255
if (RD->isUnion() && IList->getNumInits() == 0) {
2256
if (!VerifyOnly)
2257
for (FieldDecl *FD : RD->fields()) {
2258
QualType ET = SemaRef.Context.getBaseElementType(FD->getType());
2259
if (checkDestructorReference(ET, IList->getEndLoc(), SemaRef)) {
2260
hadError = true;
2261
return;
2262
}
2263
}
2264
2265
// If there's a default initializer, use it.
2266
if (isa<CXXRecordDecl>(RD) &&
2267
cast<CXXRecordDecl>(RD)->hasInClassInitializer()) {
2268
if (!StructuredList)
2269
return;
2270
for (RecordDecl::field_iterator FieldEnd = RD->field_end();
2271
Field != FieldEnd; ++Field) {
2272
if (Field->hasInClassInitializer() ||
2273
(Field->isAnonymousStructOrUnion() &&
2274
Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
2275
StructuredList->setInitializedFieldInUnion(*Field);
2276
// FIXME: Actually build a CXXDefaultInitExpr?
2277
return;
2278
}
2279
}
2280
llvm_unreachable("Couldn't find in-class initializer");
2281
}
2282
2283
// Value-initialize the first member of the union that isn't an unnamed
2284
// bitfield.
2285
for (RecordDecl::field_iterator FieldEnd = RD->field_end();
2286
Field != FieldEnd; ++Field) {
2287
if (!Field->isUnnamedBitField()) {
2288
CheckEmptyInitializable(
2289
InitializedEntity::InitializeMember(*Field, &Entity),
2290
IList->getEndLoc());
2291
if (StructuredList)
2292
StructuredList->setInitializedFieldInUnion(*Field);
2293
break;
2294
}
2295
}
2296
return;
2297
}
2298
2299
bool InitializedSomething = false;
2300
2301
// If we have any base classes, they are initialized prior to the fields.
2302
for (auto I = Bases.begin(), E = Bases.end(); I != E; ++I) {
2303
auto &Base = *I;
2304
Expr *Init = Index < IList->getNumInits() ? IList->getInit(Index) : nullptr;
2305
2306
// Designated inits always initialize fields, so if we see one, all
2307
// remaining base classes have no explicit initializer.
2308
if (isa_and_nonnull<DesignatedInitExpr>(Init))
2309
Init = nullptr;
2310
2311
// C++ [over.match.class.deduct]p1.6:
2312
// each non-trailing aggregate element that is a pack expansion is assumed
2313
// to correspond to no elements of the initializer list, and (1.7) a
2314
// trailing aggregate element that is a pack expansion is assumed to
2315
// correspond to all remaining elements of the initializer list (if any).
2316
2317
// C++ [over.match.class.deduct]p1.9:
2318
// ... except that additional parameter packs of the form P_j... are
2319
// inserted into the parameter list in their original aggregate element
2320
// position corresponding to each non-trailing aggregate element of
2321
// type P_j that was skipped because it was a parameter pack, and the
2322
// trailing sequence of parameters corresponding to a trailing
2323
// aggregate element that is a pack expansion (if any) is replaced
2324
// by a single parameter of the form T_n....
2325
if (AggrDeductionCandidateParamTypes && Base.isPackExpansion()) {
2326
AggrDeductionCandidateParamTypes->push_back(
2327
SemaRef.Context.getPackExpansionType(Base.getType(), std::nullopt));
2328
2329
// Trailing pack expansion
2330
if (I + 1 == E && RD->field_empty()) {
2331
if (Index < IList->getNumInits())
2332
Index = IList->getNumInits();
2333
return;
2334
}
2335
2336
continue;
2337
}
2338
2339
SourceLocation InitLoc = Init ? Init->getBeginLoc() : IList->getEndLoc();
2340
InitializedEntity BaseEntity = InitializedEntity::InitializeBase(
2341
SemaRef.Context, &Base, false, &Entity);
2342
if (Init) {
2343
CheckSubElementType(BaseEntity, IList, Base.getType(), Index,
2344
StructuredList, StructuredIndex);
2345
InitializedSomething = true;
2346
} else {
2347
CheckEmptyInitializable(BaseEntity, InitLoc);
2348
}
2349
2350
if (!VerifyOnly)
2351
if (checkDestructorReference(Base.getType(), InitLoc, SemaRef)) {
2352
hadError = true;
2353
return;
2354
}
2355
}
2356
2357
// If structDecl is a forward declaration, this loop won't do
2358
// anything except look at designated initializers; That's okay,
2359
// because an error should get printed out elsewhere. It might be
2360
// worthwhile to skip over the rest of the initializer, though.
2361
RecordDecl::field_iterator FieldEnd = RD->field_end();
2362
size_t NumRecordDecls = llvm::count_if(RD->decls(), [&](const Decl *D) {
2363
return isa<FieldDecl>(D) || isa<RecordDecl>(D);
2364
});
2365
bool HasDesignatedInit = false;
2366
2367
llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
2368
2369
while (Index < IList->getNumInits()) {
2370
Expr *Init = IList->getInit(Index);
2371
SourceLocation InitLoc = Init->getBeginLoc();
2372
2373
if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) {
2374
// If we're not the subobject that matches up with the '{' for
2375
// the designator, we shouldn't be handling the
2376
// designator. Return immediately.
2377
if (!SubobjectIsDesignatorContext)
2378
return;
2379
2380
HasDesignatedInit = true;
2381
2382
// Handle this designated initializer. Field will be updated to
2383
// the next field that we'll be initializing.
2384
bool DesignatedInitFailed = CheckDesignatedInitializer(
2385
Entity, IList, DIE, 0, DeclType, &Field, nullptr, Index,
2386
StructuredList, StructuredIndex, true, TopLevelObject);
2387
if (DesignatedInitFailed)
2388
hadError = true;
2389
2390
// Find the field named by the designated initializer.
2391
DesignatedInitExpr::Designator *D = DIE->getDesignator(0);
2392
if (!VerifyOnly && D->isFieldDesignator()) {
2393
FieldDecl *F = D->getFieldDecl();
2394
InitializedFields.insert(F);
2395
if (!DesignatedInitFailed) {
2396
QualType ET = SemaRef.Context.getBaseElementType(F->getType());
2397
if (checkDestructorReference(ET, InitLoc, SemaRef)) {
2398
hadError = true;
2399
return;
2400
}
2401
}
2402
}
2403
2404
InitializedSomething = true;
2405
continue;
2406
}
2407
2408
// Check if this is an initializer of forms:
2409
//
2410
// struct foo f = {};
2411
// struct foo g = {0};
2412
//
2413
// These are okay for randomized structures. [C99 6.7.8p19]
2414
//
2415
// Also, if there is only one element in the structure, we allow something
2416
// like this, because it's really not randomized in the traditional sense.
2417
//
2418
// struct foo h = {bar};
2419
auto IsZeroInitializer = [&](const Expr *I) {
2420
if (IList->getNumInits() == 1) {
2421
if (NumRecordDecls == 1)
2422
return true;
2423
if (const auto *IL = dyn_cast<IntegerLiteral>(I))
2424
return IL->getValue().isZero();
2425
}
2426
return false;
2427
};
2428
2429
// Don't allow non-designated initializers on randomized structures.
2430
if (RD->isRandomized() && !IsZeroInitializer(Init)) {
2431
if (!VerifyOnly)
2432
SemaRef.Diag(InitLoc, diag::err_non_designated_init_used);
2433
hadError = true;
2434
break;
2435
}
2436
2437
if (Field == FieldEnd) {
2438
// We've run out of fields. We're done.
2439
break;
2440
}
2441
2442
// We've already initialized a member of a union. We can stop entirely.
2443
if (InitializedSomething && RD->isUnion())
2444
return;
2445
2446
// Stop if we've hit a flexible array member.
2447
if (Field->getType()->isIncompleteArrayType())
2448
break;
2449
2450
if (Field->isUnnamedBitField()) {
2451
// Don't initialize unnamed bitfields, e.g. "int : 20;"
2452
++Field;
2453
continue;
2454
}
2455
2456
// Make sure we can use this declaration.
2457
bool InvalidUse;
2458
if (VerifyOnly)
2459
InvalidUse = !SemaRef.CanUseDecl(*Field, TreatUnavailableAsInvalid);
2460
else
2461
InvalidUse = SemaRef.DiagnoseUseOfDecl(
2462
*Field, IList->getInit(Index)->getBeginLoc());
2463
if (InvalidUse) {
2464
++Index;
2465
++Field;
2466
hadError = true;
2467
continue;
2468
}
2469
2470
if (!VerifyOnly) {
2471
QualType ET = SemaRef.Context.getBaseElementType(Field->getType());
2472
if (checkDestructorReference(ET, InitLoc, SemaRef)) {
2473
hadError = true;
2474
return;
2475
}
2476
}
2477
2478
InitializedEntity MemberEntity =
2479
InitializedEntity::InitializeMember(*Field, &Entity);
2480
CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
2481
StructuredList, StructuredIndex);
2482
InitializedSomething = true;
2483
InitializedFields.insert(*Field);
2484
2485
if (RD->isUnion() && StructuredList) {
2486
// Initialize the first field within the union.
2487
StructuredList->setInitializedFieldInUnion(*Field);
2488
}
2489
2490
++Field;
2491
}
2492
2493
// Emit warnings for missing struct field initializers.
2494
// This check is disabled for designated initializers in C.
2495
// This matches gcc behaviour.
2496
bool IsCDesignatedInitializer =
2497
HasDesignatedInit && !SemaRef.getLangOpts().CPlusPlus;
2498
if (!VerifyOnly && InitializedSomething && !RD->isUnion() &&
2499
!IList->isIdiomaticZeroInitializer(SemaRef.getLangOpts()) &&
2500
!IsCDesignatedInitializer) {
2501
// It is possible we have one or more unnamed bitfields remaining.
2502
// Find first (if any) named field and emit warning.
2503
for (RecordDecl::field_iterator it = HasDesignatedInit ? RD->field_begin()
2504
: Field,
2505
end = RD->field_end();
2506
it != end; ++it) {
2507
if (HasDesignatedInit && InitializedFields.count(*it))
2508
continue;
2509
2510
if (!it->isUnnamedBitField() && !it->hasInClassInitializer() &&
2511
!it->getType()->isIncompleteArrayType()) {
2512
auto Diag = HasDesignatedInit
2513
? diag::warn_missing_designated_field_initializers
2514
: diag::warn_missing_field_initializers;
2515
SemaRef.Diag(IList->getSourceRange().getEnd(), Diag) << *it;
2516
break;
2517
}
2518
}
2519
}
2520
2521
// Check that any remaining fields can be value-initialized if we're not
2522
// building a structured list. (If we are, we'll check this later.)
2523
if (!StructuredList && Field != FieldEnd && !RD->isUnion() &&
2524
!Field->getType()->isIncompleteArrayType()) {
2525
for (; Field != FieldEnd && !hadError; ++Field) {
2526
if (!Field->isUnnamedBitField() && !Field->hasInClassInitializer())
2527
CheckEmptyInitializable(
2528
InitializedEntity::InitializeMember(*Field, &Entity),
2529
IList->getEndLoc());
2530
}
2531
}
2532
2533
// Check that the types of the remaining fields have accessible destructors.
2534
if (!VerifyOnly) {
2535
// If the initializer expression has a designated initializer, check the
2536
// elements for which a designated initializer is not provided too.
2537
RecordDecl::field_iterator I = HasDesignatedInit ? RD->field_begin()
2538
: Field;
2539
for (RecordDecl::field_iterator E = RD->field_end(); I != E; ++I) {
2540
QualType ET = SemaRef.Context.getBaseElementType(I->getType());
2541
if (checkDestructorReference(ET, IList->getEndLoc(), SemaRef)) {
2542
hadError = true;
2543
return;
2544
}
2545
}
2546
}
2547
2548
if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() ||
2549
Index >= IList->getNumInits())
2550
return;
2551
2552
if (CheckFlexibleArrayInit(Entity, IList->getInit(Index), *Field,
2553
TopLevelObject)) {
2554
hadError = true;
2555
++Index;
2556
return;
2557
}
2558
2559
InitializedEntity MemberEntity =
2560
InitializedEntity::InitializeMember(*Field, &Entity);
2561
2562
if (isa<InitListExpr>(IList->getInit(Index)) ||
2563
AggrDeductionCandidateParamTypes)
2564
CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
2565
StructuredList, StructuredIndex);
2566
else
2567
CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index,
2568
StructuredList, StructuredIndex);
2569
2570
if (RD->isUnion() && StructuredList) {
2571
// Initialize the first field within the union.
2572
StructuredList->setInitializedFieldInUnion(*Field);
2573
}
2574
}
2575
2576
/// Expand a field designator that refers to a member of an
2577
/// anonymous struct or union into a series of field designators that
2578
/// refers to the field within the appropriate subobject.
2579
///
2580
static void ExpandAnonymousFieldDesignator(Sema &SemaRef,
2581
DesignatedInitExpr *DIE,
2582
unsigned DesigIdx,
2583
IndirectFieldDecl *IndirectField) {
2584
typedef DesignatedInitExpr::Designator Designator;
2585
2586
// Build the replacement designators.
2587
SmallVector<Designator, 4> Replacements;
2588
for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(),
2589
PE = IndirectField->chain_end(); PI != PE; ++PI) {
2590
if (PI + 1 == PE)
2591
Replacements.push_back(Designator::CreateFieldDesignator(
2592
(IdentifierInfo *)nullptr, DIE->getDesignator(DesigIdx)->getDotLoc(),
2593
DIE->getDesignator(DesigIdx)->getFieldLoc()));
2594
else
2595
Replacements.push_back(Designator::CreateFieldDesignator(
2596
(IdentifierInfo *)nullptr, SourceLocation(), SourceLocation()));
2597
assert(isa<FieldDecl>(*PI));
2598
Replacements.back().setFieldDecl(cast<FieldDecl>(*PI));
2599
}
2600
2601
// Expand the current designator into the set of replacement
2602
// designators, so we have a full subobject path down to where the
2603
// member of the anonymous struct/union is actually stored.
2604
DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0],
2605
&Replacements[0] + Replacements.size());
2606
}
2607
2608
static DesignatedInitExpr *CloneDesignatedInitExpr(Sema &SemaRef,
2609
DesignatedInitExpr *DIE) {
2610
unsigned NumIndexExprs = DIE->getNumSubExprs() - 1;
2611
SmallVector<Expr*, 4> IndexExprs(NumIndexExprs);
2612
for (unsigned I = 0; I < NumIndexExprs; ++I)
2613
IndexExprs[I] = DIE->getSubExpr(I + 1);
2614
return DesignatedInitExpr::Create(SemaRef.Context, DIE->designators(),
2615
IndexExprs,
2616
DIE->getEqualOrColonLoc(),
2617
DIE->usesGNUSyntax(), DIE->getInit());
2618
}
2619
2620
namespace {
2621
2622
// Callback to only accept typo corrections that are for field members of
2623
// the given struct or union.
2624
class FieldInitializerValidatorCCC final : public CorrectionCandidateCallback {
2625
public:
2626
explicit FieldInitializerValidatorCCC(const RecordDecl *RD)
2627
: Record(RD) {}
2628
2629
bool ValidateCandidate(const TypoCorrection &candidate) override {
2630
FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>();
2631
return FD && FD->getDeclContext()->getRedeclContext()->Equals(Record);
2632
}
2633
2634
std::unique_ptr<CorrectionCandidateCallback> clone() override {
2635
return std::make_unique<FieldInitializerValidatorCCC>(*this);
2636
}
2637
2638
private:
2639
const RecordDecl *Record;
2640
};
2641
2642
} // end anonymous namespace
2643
2644
/// Check the well-formedness of a C99 designated initializer.
2645
///
2646
/// Determines whether the designated initializer @p DIE, which
2647
/// resides at the given @p Index within the initializer list @p
2648
/// IList, is well-formed for a current object of type @p DeclType
2649
/// (C99 6.7.8). The actual subobject that this designator refers to
2650
/// within the current subobject is returned in either
2651
/// @p NextField or @p NextElementIndex (whichever is appropriate).
2652
///
2653
/// @param IList The initializer list in which this designated
2654
/// initializer occurs.
2655
///
2656
/// @param DIE The designated initializer expression.
2657
///
2658
/// @param DesigIdx The index of the current designator.
2659
///
2660
/// @param CurrentObjectType The type of the "current object" (C99 6.7.8p17),
2661
/// into which the designation in @p DIE should refer.
2662
///
2663
/// @param NextField If non-NULL and the first designator in @p DIE is
2664
/// a field, this will be set to the field declaration corresponding
2665
/// to the field named by the designator. On input, this is expected to be
2666
/// the next field that would be initialized in the absence of designation,
2667
/// if the complete object being initialized is a struct.
2668
///
2669
/// @param NextElementIndex If non-NULL and the first designator in @p
2670
/// DIE is an array designator or GNU array-range designator, this
2671
/// will be set to the last index initialized by this designator.
2672
///
2673
/// @param Index Index into @p IList where the designated initializer
2674
/// @p DIE occurs.
2675
///
2676
/// @param StructuredList The initializer list expression that
2677
/// describes all of the subobject initializers in the order they'll
2678
/// actually be initialized.
2679
///
2680
/// @returns true if there was an error, false otherwise.
2681
bool
2682
InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
2683
InitListExpr *IList,
2684
DesignatedInitExpr *DIE,
2685
unsigned DesigIdx,
2686
QualType &CurrentObjectType,
2687
RecordDecl::field_iterator *NextField,
2688
llvm::APSInt *NextElementIndex,
2689
unsigned &Index,
2690
InitListExpr *StructuredList,
2691
unsigned &StructuredIndex,
2692
bool FinishSubobjectInit,
2693
bool TopLevelObject) {
2694
if (DesigIdx == DIE->size()) {
2695
// C++20 designated initialization can result in direct-list-initialization
2696
// of the designated subobject. This is the only way that we can end up
2697
// performing direct initialization as part of aggregate initialization, so
2698
// it needs special handling.
2699
if (DIE->isDirectInit()) {
2700
Expr *Init = DIE->getInit();
2701
assert(isa<InitListExpr>(Init) &&
2702
"designator result in direct non-list initialization?");
2703
InitializationKind Kind = InitializationKind::CreateDirectList(
2704
DIE->getBeginLoc(), Init->getBeginLoc(), Init->getEndLoc());
2705
InitializationSequence Seq(SemaRef, Entity, Kind, Init,
2706
/*TopLevelOfInitList*/ true);
2707
if (StructuredList) {
2708
ExprResult Result = VerifyOnly
2709
? getDummyInit()
2710
: Seq.Perform(SemaRef, Entity, Kind, Init);
2711
UpdateStructuredListElement(StructuredList, StructuredIndex,
2712
Result.get());
2713
}
2714
++Index;
2715
if (AggrDeductionCandidateParamTypes)
2716
AggrDeductionCandidateParamTypes->push_back(CurrentObjectType);
2717
return !Seq;
2718
}
2719
2720
// Check the actual initialization for the designated object type.
2721
bool prevHadError = hadError;
2722
2723
// Temporarily remove the designator expression from the
2724
// initializer list that the child calls see, so that we don't try
2725
// to re-process the designator.
2726
unsigned OldIndex = Index;
2727
IList->setInit(OldIndex, DIE->getInit());
2728
2729
CheckSubElementType(Entity, IList, CurrentObjectType, Index, StructuredList,
2730
StructuredIndex, /*DirectlyDesignated=*/true);
2731
2732
// Restore the designated initializer expression in the syntactic
2733
// form of the initializer list.
2734
if (IList->getInit(OldIndex) != DIE->getInit())
2735
DIE->setInit(IList->getInit(OldIndex));
2736
IList->setInit(OldIndex, DIE);
2737
2738
return hadError && !prevHadError;
2739
}
2740
2741
DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx);
2742
bool IsFirstDesignator = (DesigIdx == 0);
2743
if (IsFirstDesignator ? FullyStructuredList : StructuredList) {
2744
// Determine the structural initializer list that corresponds to the
2745
// current subobject.
2746
if (IsFirstDesignator)
2747
StructuredList = FullyStructuredList;
2748
else {
2749
Expr *ExistingInit = StructuredIndex < StructuredList->getNumInits() ?
2750
StructuredList->getInit(StructuredIndex) : nullptr;
2751
if (!ExistingInit && StructuredList->hasArrayFiller())
2752
ExistingInit = StructuredList->getArrayFiller();
2753
2754
if (!ExistingInit)
2755
StructuredList = getStructuredSubobjectInit(
2756
IList, Index, CurrentObjectType, StructuredList, StructuredIndex,
2757
SourceRange(D->getBeginLoc(), DIE->getEndLoc()));
2758
else if (InitListExpr *Result = dyn_cast<InitListExpr>(ExistingInit))
2759
StructuredList = Result;
2760
else {
2761
// We are creating an initializer list that initializes the
2762
// subobjects of the current object, but there was already an
2763
// initialization that completely initialized the current
2764
// subobject, e.g., by a compound literal:
2765
//
2766
// struct X { int a, b; };
2767
// struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 };
2768
//
2769
// Here, xs[0].a == 1 and xs[0].b == 3, since the second,
2770
// designated initializer re-initializes only its current object
2771
// subobject [0].b.
2772
diagnoseInitOverride(ExistingInit,
2773
SourceRange(D->getBeginLoc(), DIE->getEndLoc()),
2774
/*UnionOverride=*/false,
2775
/*FullyOverwritten=*/false);
2776
2777
if (!VerifyOnly) {
2778
if (DesignatedInitUpdateExpr *E =
2779
dyn_cast<DesignatedInitUpdateExpr>(ExistingInit))
2780
StructuredList = E->getUpdater();
2781
else {
2782
DesignatedInitUpdateExpr *DIUE = new (SemaRef.Context)
2783
DesignatedInitUpdateExpr(SemaRef.Context, D->getBeginLoc(),
2784
ExistingInit, DIE->getEndLoc());
2785
StructuredList->updateInit(SemaRef.Context, StructuredIndex, DIUE);
2786
StructuredList = DIUE->getUpdater();
2787
}
2788
} else {
2789
// We don't need to track the structured representation of a
2790
// designated init update of an already-fully-initialized object in
2791
// verify-only mode. The only reason we would need the structure is
2792
// to determine where the uninitialized "holes" are, and in this
2793
// case, we know there aren't any and we can't introduce any.
2794
StructuredList = nullptr;
2795
}
2796
}
2797
}
2798
}
2799
2800
if (D->isFieldDesignator()) {
2801
// C99 6.7.8p7:
2802
//
2803
// If a designator has the form
2804
//
2805
// . identifier
2806
//
2807
// then the current object (defined below) shall have
2808
// structure or union type and the identifier shall be the
2809
// name of a member of that type.
2810
RecordDecl *RD = getRecordDecl(CurrentObjectType);
2811
if (!RD) {
2812
SourceLocation Loc = D->getDotLoc();
2813
if (Loc.isInvalid())
2814
Loc = D->getFieldLoc();
2815
if (!VerifyOnly)
2816
SemaRef.Diag(Loc, diag::err_field_designator_non_aggr)
2817
<< SemaRef.getLangOpts().CPlusPlus << CurrentObjectType;
2818
++Index;
2819
return true;
2820
}
2821
2822
FieldDecl *KnownField = D->getFieldDecl();
2823
if (!KnownField) {
2824
const IdentifierInfo *FieldName = D->getFieldName();
2825
ValueDecl *VD = SemaRef.tryLookupUnambiguousFieldDecl(RD, FieldName);
2826
if (auto *FD = dyn_cast_if_present<FieldDecl>(VD)) {
2827
KnownField = FD;
2828
} else if (auto *IFD = dyn_cast_if_present<IndirectFieldDecl>(VD)) {
2829
// In verify mode, don't modify the original.
2830
if (VerifyOnly)
2831
DIE = CloneDesignatedInitExpr(SemaRef, DIE);
2832
ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IFD);
2833
D = DIE->getDesignator(DesigIdx);
2834
KnownField = cast<FieldDecl>(*IFD->chain_begin());
2835
}
2836
if (!KnownField) {
2837
if (VerifyOnly) {
2838
++Index;
2839
return true; // No typo correction when just trying this out.
2840
}
2841
2842
// We found a placeholder variable
2843
if (SemaRef.DiagRedefinedPlaceholderFieldDecl(DIE->getBeginLoc(), RD,
2844
FieldName)) {
2845
++Index;
2846
return true;
2847
}
2848
// Name lookup found something, but it wasn't a field.
2849
if (DeclContextLookupResult Lookup = RD->lookup(FieldName);
2850
!Lookup.empty()) {
2851
SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield)
2852
<< FieldName;
2853
SemaRef.Diag(Lookup.front()->getLocation(),
2854
diag::note_field_designator_found);
2855
++Index;
2856
return true;
2857
}
2858
2859
// Name lookup didn't find anything.
2860
// Determine whether this was a typo for another field name.
2861
FieldInitializerValidatorCCC CCC(RD);
2862
if (TypoCorrection Corrected = SemaRef.CorrectTypo(
2863
DeclarationNameInfo(FieldName, D->getFieldLoc()),
2864
Sema::LookupMemberName, /*Scope=*/nullptr, /*SS=*/nullptr, CCC,
2865
Sema::CTK_ErrorRecovery, RD)) {
2866
SemaRef.diagnoseTypo(
2867
Corrected,
2868
SemaRef.PDiag(diag::err_field_designator_unknown_suggest)
2869
<< FieldName << CurrentObjectType);
2870
KnownField = Corrected.getCorrectionDeclAs<FieldDecl>();
2871
hadError = true;
2872
} else {
2873
// Typo correction didn't find anything.
2874
SourceLocation Loc = D->getFieldLoc();
2875
2876
// The loc can be invalid with a "null" designator (i.e. an anonymous
2877
// union/struct). Do our best to approximate the location.
2878
if (Loc.isInvalid())
2879
Loc = IList->getBeginLoc();
2880
2881
SemaRef.Diag(Loc, diag::err_field_designator_unknown)
2882
<< FieldName << CurrentObjectType << DIE->getSourceRange();
2883
++Index;
2884
return true;
2885
}
2886
}
2887
}
2888
2889
unsigned NumBases = 0;
2890
if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
2891
NumBases = CXXRD->getNumBases();
2892
2893
unsigned FieldIndex = NumBases;
2894
2895
for (auto *FI : RD->fields()) {
2896
if (FI->isUnnamedBitField())
2897
continue;
2898
if (declaresSameEntity(KnownField, FI)) {
2899
KnownField = FI;
2900
break;
2901
}
2902
++FieldIndex;
2903
}
2904
2905
RecordDecl::field_iterator Field =
2906
RecordDecl::field_iterator(DeclContext::decl_iterator(KnownField));
2907
2908
// All of the fields of a union are located at the same place in
2909
// the initializer list.
2910
if (RD->isUnion()) {
2911
FieldIndex = 0;
2912
if (StructuredList) {
2913
FieldDecl *CurrentField = StructuredList->getInitializedFieldInUnion();
2914
if (CurrentField && !declaresSameEntity(CurrentField, *Field)) {
2915
assert(StructuredList->getNumInits() == 1
2916
&& "A union should never have more than one initializer!");
2917
2918
Expr *ExistingInit = StructuredList->getInit(0);
2919
if (ExistingInit) {
2920
// We're about to throw away an initializer, emit warning.
2921
diagnoseInitOverride(
2922
ExistingInit, SourceRange(D->getBeginLoc(), DIE->getEndLoc()),
2923
/*UnionOverride=*/true,
2924
/*FullyOverwritten=*/SemaRef.getLangOpts().CPlusPlus ? false
2925
: true);
2926
}
2927
2928
// remove existing initializer
2929
StructuredList->resizeInits(SemaRef.Context, 0);
2930
StructuredList->setInitializedFieldInUnion(nullptr);
2931
}
2932
2933
StructuredList->setInitializedFieldInUnion(*Field);
2934
}
2935
}
2936
2937
// Make sure we can use this declaration.
2938
bool InvalidUse;
2939
if (VerifyOnly)
2940
InvalidUse = !SemaRef.CanUseDecl(*Field, TreatUnavailableAsInvalid);
2941
else
2942
InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc());
2943
if (InvalidUse) {
2944
++Index;
2945
return true;
2946
}
2947
2948
// C++20 [dcl.init.list]p3:
2949
// The ordered identifiers in the designators of the designated-
2950
// initializer-list shall form a subsequence of the ordered identifiers
2951
// in the direct non-static data members of T.
2952
//
2953
// Note that this is not a condition on forming the aggregate
2954
// initialization, only on actually performing initialization,
2955
// so it is not checked in VerifyOnly mode.
2956
//
2957
// FIXME: This is the only reordering diagnostic we produce, and it only
2958
// catches cases where we have a top-level field designator that jumps
2959
// backwards. This is the only such case that is reachable in an
2960
// otherwise-valid C++20 program, so is the only case that's required for
2961
// conformance, but for consistency, we should diagnose all the other
2962
// cases where a designator takes us backwards too.
2963
if (IsFirstDesignator && !VerifyOnly && SemaRef.getLangOpts().CPlusPlus &&
2964
NextField &&
2965
(*NextField == RD->field_end() ||
2966
(*NextField)->getFieldIndex() > Field->getFieldIndex() + 1)) {
2967
// Find the field that we just initialized.
2968
FieldDecl *PrevField = nullptr;
2969
for (auto FI = RD->field_begin(); FI != RD->field_end(); ++FI) {
2970
if (FI->isUnnamedBitField())
2971
continue;
2972
if (*NextField != RD->field_end() &&
2973
declaresSameEntity(*FI, **NextField))
2974
break;
2975
PrevField = *FI;
2976
}
2977
2978
if (PrevField &&
2979
PrevField->getFieldIndex() > KnownField->getFieldIndex()) {
2980
SemaRef.Diag(DIE->getInit()->getBeginLoc(),
2981
diag::ext_designated_init_reordered)
2982
<< KnownField << PrevField << DIE->getSourceRange();
2983
2984
unsigned OldIndex = StructuredIndex - 1;
2985
if (StructuredList && OldIndex <= StructuredList->getNumInits()) {
2986
if (Expr *PrevInit = StructuredList->getInit(OldIndex)) {
2987
SemaRef.Diag(PrevInit->getBeginLoc(),
2988
diag::note_previous_field_init)
2989
<< PrevField << PrevInit->getSourceRange();
2990
}
2991
}
2992
}
2993
}
2994
2995
2996
// Update the designator with the field declaration.
2997
if (!VerifyOnly)
2998
D->setFieldDecl(*Field);
2999
3000
// Make sure that our non-designated initializer list has space
3001
// for a subobject corresponding to this field.
3002
if (StructuredList && FieldIndex >= StructuredList->getNumInits())
3003
StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1);
3004
3005
// This designator names a flexible array member.
3006
if (Field->getType()->isIncompleteArrayType()) {
3007
bool Invalid = false;
3008
if ((DesigIdx + 1) != DIE->size()) {
3009
// We can't designate an object within the flexible array
3010
// member (because GCC doesn't allow it).
3011
if (!VerifyOnly) {
3012
DesignatedInitExpr::Designator *NextD
3013
= DIE->getDesignator(DesigIdx + 1);
3014
SemaRef.Diag(NextD->getBeginLoc(),
3015
diag::err_designator_into_flexible_array_member)
3016
<< SourceRange(NextD->getBeginLoc(), DIE->getEndLoc());
3017
SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
3018
<< *Field;
3019
}
3020
Invalid = true;
3021
}
3022
3023
if (!hadError && !isa<InitListExpr>(DIE->getInit()) &&
3024
!isa<StringLiteral>(DIE->getInit())) {
3025
// The initializer is not an initializer list.
3026
if (!VerifyOnly) {
3027
SemaRef.Diag(DIE->getInit()->getBeginLoc(),
3028
diag::err_flexible_array_init_needs_braces)
3029
<< DIE->getInit()->getSourceRange();
3030
SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
3031
<< *Field;
3032
}
3033
Invalid = true;
3034
}
3035
3036
// Check GNU flexible array initializer.
3037
if (!Invalid && CheckFlexibleArrayInit(Entity, DIE->getInit(), *Field,
3038
TopLevelObject))
3039
Invalid = true;
3040
3041
if (Invalid) {
3042
++Index;
3043
return true;
3044
}
3045
3046
// Initialize the array.
3047
bool prevHadError = hadError;
3048
unsigned newStructuredIndex = FieldIndex;
3049
unsigned OldIndex = Index;
3050
IList->setInit(Index, DIE->getInit());
3051
3052
InitializedEntity MemberEntity =
3053
InitializedEntity::InitializeMember(*Field, &Entity);
3054
CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
3055
StructuredList, newStructuredIndex);
3056
3057
IList->setInit(OldIndex, DIE);
3058
if (hadError && !prevHadError) {
3059
++Field;
3060
++FieldIndex;
3061
if (NextField)
3062
*NextField = Field;
3063
StructuredIndex = FieldIndex;
3064
return true;
3065
}
3066
} else {
3067
// Recurse to check later designated subobjects.
3068
QualType FieldType = Field->getType();
3069
unsigned newStructuredIndex = FieldIndex;
3070
3071
InitializedEntity MemberEntity =
3072
InitializedEntity::InitializeMember(*Field, &Entity);
3073
if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1,
3074
FieldType, nullptr, nullptr, Index,
3075
StructuredList, newStructuredIndex,
3076
FinishSubobjectInit, false))
3077
return true;
3078
}
3079
3080
// Find the position of the next field to be initialized in this
3081
// subobject.
3082
++Field;
3083
++FieldIndex;
3084
3085
// If this the first designator, our caller will continue checking
3086
// the rest of this struct/class/union subobject.
3087
if (IsFirstDesignator) {
3088
if (Field != RD->field_end() && Field->isUnnamedBitField())
3089
++Field;
3090
3091
if (NextField)
3092
*NextField = Field;
3093
3094
StructuredIndex = FieldIndex;
3095
return false;
3096
}
3097
3098
if (!FinishSubobjectInit)
3099
return false;
3100
3101
// We've already initialized something in the union; we're done.
3102
if (RD->isUnion())
3103
return hadError;
3104
3105
// Check the remaining fields within this class/struct/union subobject.
3106
bool prevHadError = hadError;
3107
3108
auto NoBases =
3109
CXXRecordDecl::base_class_range(CXXRecordDecl::base_class_iterator(),
3110
CXXRecordDecl::base_class_iterator());
3111
CheckStructUnionTypes(Entity, IList, CurrentObjectType, NoBases, Field,
3112
false, Index, StructuredList, FieldIndex);
3113
return hadError && !prevHadError;
3114
}
3115
3116
// C99 6.7.8p6:
3117
//
3118
// If a designator has the form
3119
//
3120
// [ constant-expression ]
3121
//
3122
// then the current object (defined below) shall have array
3123
// type and the expression shall be an integer constant
3124
// expression. If the array is of unknown size, any
3125
// nonnegative value is valid.
3126
//
3127
// Additionally, cope with the GNU extension that permits
3128
// designators of the form
3129
//
3130
// [ constant-expression ... constant-expression ]
3131
const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType);
3132
if (!AT) {
3133
if (!VerifyOnly)
3134
SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array)
3135
<< CurrentObjectType;
3136
++Index;
3137
return true;
3138
}
3139
3140
Expr *IndexExpr = nullptr;
3141
llvm::APSInt DesignatedStartIndex, DesignatedEndIndex;
3142
if (D->isArrayDesignator()) {
3143
IndexExpr = DIE->getArrayIndex(*D);
3144
DesignatedStartIndex = IndexExpr->EvaluateKnownConstInt(SemaRef.Context);
3145
DesignatedEndIndex = DesignatedStartIndex;
3146
} else {
3147
assert(D->isArrayRangeDesignator() && "Need array-range designator");
3148
3149
DesignatedStartIndex =
3150
DIE->getArrayRangeStart(*D)->EvaluateKnownConstInt(SemaRef.Context);
3151
DesignatedEndIndex =
3152
DIE->getArrayRangeEnd(*D)->EvaluateKnownConstInt(SemaRef.Context);
3153
IndexExpr = DIE->getArrayRangeEnd(*D);
3154
3155
// Codegen can't handle evaluating array range designators that have side
3156
// effects, because we replicate the AST value for each initialized element.
3157
// As such, set the sawArrayRangeDesignator() bit if we initialize multiple
3158
// elements with something that has a side effect, so codegen can emit an
3159
// "error unsupported" error instead of miscompiling the app.
3160
if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&&
3161
DIE->getInit()->HasSideEffects(SemaRef.Context) && !VerifyOnly)
3162
FullyStructuredList->sawArrayRangeDesignator();
3163
}
3164
3165
if (isa<ConstantArrayType>(AT)) {
3166
llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false);
3167
DesignatedStartIndex
3168
= DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth());
3169
DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned());
3170
DesignatedEndIndex
3171
= DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth());
3172
DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned());
3173
if (DesignatedEndIndex >= MaxElements) {
3174
if (!VerifyOnly)
3175
SemaRef.Diag(IndexExpr->getBeginLoc(),
3176
diag::err_array_designator_too_large)
3177
<< toString(DesignatedEndIndex, 10) << toString(MaxElements, 10)
3178
<< IndexExpr->getSourceRange();
3179
++Index;
3180
return true;
3181
}
3182
} else {
3183
unsigned DesignatedIndexBitWidth =
3184
ConstantArrayType::getMaxSizeBits(SemaRef.Context);
3185
DesignatedStartIndex =
3186
DesignatedStartIndex.extOrTrunc(DesignatedIndexBitWidth);
3187
DesignatedEndIndex =
3188
DesignatedEndIndex.extOrTrunc(DesignatedIndexBitWidth);
3189
DesignatedStartIndex.setIsUnsigned(true);
3190
DesignatedEndIndex.setIsUnsigned(true);
3191
}
3192
3193
bool IsStringLiteralInitUpdate =
3194
StructuredList && StructuredList->isStringLiteralInit();
3195
if (IsStringLiteralInitUpdate && VerifyOnly) {
3196
// We're just verifying an update to a string literal init. We don't need
3197
// to split the string up into individual characters to do that.
3198
StructuredList = nullptr;
3199
} else if (IsStringLiteralInitUpdate) {
3200
// We're modifying a string literal init; we have to decompose the string
3201
// so we can modify the individual characters.
3202
ASTContext &Context = SemaRef.Context;
3203
Expr *SubExpr = StructuredList->getInit(0)->IgnoreParenImpCasts();
3204
3205
// Compute the character type
3206
QualType CharTy = AT->getElementType();
3207
3208
// Compute the type of the integer literals.
3209
QualType PromotedCharTy = CharTy;
3210
if (Context.isPromotableIntegerType(CharTy))
3211
PromotedCharTy = Context.getPromotedIntegerType(CharTy);
3212
unsigned PromotedCharTyWidth = Context.getTypeSize(PromotedCharTy);
3213
3214
if (StringLiteral *SL = dyn_cast<StringLiteral>(SubExpr)) {
3215
// Get the length of the string.
3216
uint64_t StrLen = SL->getLength();
3217
if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
3218
StrLen = cast<ConstantArrayType>(AT)->getZExtSize();
3219
StructuredList->resizeInits(Context, StrLen);
3220
3221
// Build a literal for each character in the string, and put them into
3222
// the init list.
3223
for (unsigned i = 0, e = StrLen; i != e; ++i) {
3224
llvm::APInt CodeUnit(PromotedCharTyWidth, SL->getCodeUnit(i));
3225
Expr *Init = new (Context) IntegerLiteral(
3226
Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc());
3227
if (CharTy != PromotedCharTy)
3228
Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast,
3229
Init, nullptr, VK_PRValue,
3230
FPOptionsOverride());
3231
StructuredList->updateInit(Context, i, Init);
3232
}
3233
} else {
3234
ObjCEncodeExpr *E = cast<ObjCEncodeExpr>(SubExpr);
3235
std::string Str;
3236
Context.getObjCEncodingForType(E->getEncodedType(), Str);
3237
3238
// Get the length of the string.
3239
uint64_t StrLen = Str.size();
3240
if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
3241
StrLen = cast<ConstantArrayType>(AT)->getZExtSize();
3242
StructuredList->resizeInits(Context, StrLen);
3243
3244
// Build a literal for each character in the string, and put them into
3245
// the init list.
3246
for (unsigned i = 0, e = StrLen; i != e; ++i) {
3247
llvm::APInt CodeUnit(PromotedCharTyWidth, Str[i]);
3248
Expr *Init = new (Context) IntegerLiteral(
3249
Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc());
3250
if (CharTy != PromotedCharTy)
3251
Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast,
3252
Init, nullptr, VK_PRValue,
3253
FPOptionsOverride());
3254
StructuredList->updateInit(Context, i, Init);
3255
}
3256
}
3257
}
3258
3259
// Make sure that our non-designated initializer list has space
3260
// for a subobject corresponding to this array element.
3261
if (StructuredList &&
3262
DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits())
3263
StructuredList->resizeInits(SemaRef.Context,
3264
DesignatedEndIndex.getZExtValue() + 1);
3265
3266
// Repeatedly perform subobject initializations in the range
3267
// [DesignatedStartIndex, DesignatedEndIndex].
3268
3269
// Move to the next designator
3270
unsigned ElementIndex = DesignatedStartIndex.getZExtValue();
3271
unsigned OldIndex = Index;
3272
3273
InitializedEntity ElementEntity =
3274
InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
3275
3276
while (DesignatedStartIndex <= DesignatedEndIndex) {
3277
// Recurse to check later designated subobjects.
3278
QualType ElementType = AT->getElementType();
3279
Index = OldIndex;
3280
3281
ElementEntity.setElementIndex(ElementIndex);
3282
if (CheckDesignatedInitializer(
3283
ElementEntity, IList, DIE, DesigIdx + 1, ElementType, nullptr,
3284
nullptr, Index, StructuredList, ElementIndex,
3285
FinishSubobjectInit && (DesignatedStartIndex == DesignatedEndIndex),
3286
false))
3287
return true;
3288
3289
// Move to the next index in the array that we'll be initializing.
3290
++DesignatedStartIndex;
3291
ElementIndex = DesignatedStartIndex.getZExtValue();
3292
}
3293
3294
// If this the first designator, our caller will continue checking
3295
// the rest of this array subobject.
3296
if (IsFirstDesignator) {
3297
if (NextElementIndex)
3298
*NextElementIndex = DesignatedStartIndex;
3299
StructuredIndex = ElementIndex;
3300
return false;
3301
}
3302
3303
if (!FinishSubobjectInit)
3304
return false;
3305
3306
// Check the remaining elements within this array subobject.
3307
bool prevHadError = hadError;
3308
CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex,
3309
/*SubobjectIsDesignatorContext=*/false, Index,
3310
StructuredList, ElementIndex);
3311
return hadError && !prevHadError;
3312
}
3313
3314
// Get the structured initializer list for a subobject of type
3315
// @p CurrentObjectType.
3316
InitListExpr *
3317
InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
3318
QualType CurrentObjectType,
3319
InitListExpr *StructuredList,
3320
unsigned StructuredIndex,
3321
SourceRange InitRange,
3322
bool IsFullyOverwritten) {
3323
if (!StructuredList)
3324
return nullptr;
3325
3326
Expr *ExistingInit = nullptr;
3327
if (StructuredIndex < StructuredList->getNumInits())
3328
ExistingInit = StructuredList->getInit(StructuredIndex);
3329
3330
if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit))
3331
// There might have already been initializers for subobjects of the current
3332
// object, but a subsequent initializer list will overwrite the entirety
3333
// of the current object. (See DR 253 and C99 6.7.8p21). e.g.,
3334
//
3335
// struct P { char x[6]; };
3336
// struct P l = { .x[2] = 'x', .x = { [0] = 'f' } };
3337
//
3338
// The first designated initializer is ignored, and l.x is just "f".
3339
if (!IsFullyOverwritten)
3340
return Result;
3341
3342
if (ExistingInit) {
3343
// We are creating an initializer list that initializes the
3344
// subobjects of the current object, but there was already an
3345
// initialization that completely initialized the current
3346
// subobject:
3347
//
3348
// struct X { int a, b; };
3349
// struct X xs[] = { [0] = { 1, 2 }, [0].b = 3 };
3350
//
3351
// Here, xs[0].a == 1 and xs[0].b == 3, since the second,
3352
// designated initializer overwrites the [0].b initializer
3353
// from the prior initialization.
3354
//
3355
// When the existing initializer is an expression rather than an
3356
// initializer list, we cannot decompose and update it in this way.
3357
// For example:
3358
//
3359
// struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 };
3360
//
3361
// This case is handled by CheckDesignatedInitializer.
3362
diagnoseInitOverride(ExistingInit, InitRange);
3363
}
3364
3365
unsigned ExpectedNumInits = 0;
3366
if (Index < IList->getNumInits()) {
3367
if (auto *Init = dyn_cast_or_null<InitListExpr>(IList->getInit(Index)))
3368
ExpectedNumInits = Init->getNumInits();
3369
else
3370
ExpectedNumInits = IList->getNumInits() - Index;
3371
}
3372
3373
InitListExpr *Result =
3374
createInitListExpr(CurrentObjectType, InitRange, ExpectedNumInits);
3375
3376
// Link this new initializer list into the structured initializer
3377
// lists.
3378
StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result);
3379
return Result;
3380
}
3381
3382
InitListExpr *
3383
InitListChecker::createInitListExpr(QualType CurrentObjectType,
3384
SourceRange InitRange,
3385
unsigned ExpectedNumInits) {
3386
InitListExpr *Result = new (SemaRef.Context) InitListExpr(
3387
SemaRef.Context, InitRange.getBegin(), std::nullopt, InitRange.getEnd());
3388
3389
QualType ResultType = CurrentObjectType;
3390
if (!ResultType->isArrayType())
3391
ResultType = ResultType.getNonLValueExprType(SemaRef.Context);
3392
Result->setType(ResultType);
3393
3394
// Pre-allocate storage for the structured initializer list.
3395
unsigned NumElements = 0;
3396
3397
if (const ArrayType *AType
3398
= SemaRef.Context.getAsArrayType(CurrentObjectType)) {
3399
if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) {
3400
NumElements = CAType->getZExtSize();
3401
// Simple heuristic so that we don't allocate a very large
3402
// initializer with many empty entries at the end.
3403
if (NumElements > ExpectedNumInits)
3404
NumElements = 0;
3405
}
3406
} else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) {
3407
NumElements = VType->getNumElements();
3408
} else if (CurrentObjectType->isRecordType()) {
3409
NumElements = numStructUnionElements(CurrentObjectType);
3410
} else if (CurrentObjectType->isDependentType()) {
3411
NumElements = 1;
3412
}
3413
3414
Result->reserveInits(SemaRef.Context, NumElements);
3415
3416
return Result;
3417
}
3418
3419
/// Update the initializer at index @p StructuredIndex within the
3420
/// structured initializer list to the value @p expr.
3421
void InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList,
3422
unsigned &StructuredIndex,
3423
Expr *expr) {
3424
// No structured initializer list to update
3425
if (!StructuredList)
3426
return;
3427
3428
if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context,
3429
StructuredIndex, expr)) {
3430
// This initializer overwrites a previous initializer.
3431
// No need to diagnose when `expr` is nullptr because a more relevant
3432
// diagnostic has already been issued and this diagnostic is potentially
3433
// noise.
3434
if (expr)
3435
diagnoseInitOverride(PrevInit, expr->getSourceRange());
3436
}
3437
3438
++StructuredIndex;
3439
}
3440
3441
bool Sema::CanPerformAggregateInitializationForOverloadResolution(
3442
const InitializedEntity &Entity, InitListExpr *From) {
3443
QualType Type = Entity.getType();
3444
InitListChecker Check(*this, Entity, From, Type, /*VerifyOnly=*/true,
3445
/*TreatUnavailableAsInvalid=*/false,
3446
/*InOverloadResolution=*/true);
3447
return !Check.HadError();
3448
}
3449
3450
/// Check that the given Index expression is a valid array designator
3451
/// value. This is essentially just a wrapper around
3452
/// VerifyIntegerConstantExpression that also checks for negative values
3453
/// and produces a reasonable diagnostic if there is a
3454
/// failure. Returns the index expression, possibly with an implicit cast
3455
/// added, on success. If everything went okay, Value will receive the
3456
/// value of the constant expression.
3457
static ExprResult
3458
CheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) {
3459
SourceLocation Loc = Index->getBeginLoc();
3460
3461
// Make sure this is an integer constant expression.
3462
ExprResult Result =
3463
S.VerifyIntegerConstantExpression(Index, &Value, Sema::AllowFold);
3464
if (Result.isInvalid())
3465
return Result;
3466
3467
if (Value.isSigned() && Value.isNegative())
3468
return S.Diag(Loc, diag::err_array_designator_negative)
3469
<< toString(Value, 10) << Index->getSourceRange();
3470
3471
Value.setIsUnsigned(true);
3472
return Result;
3473
}
3474
3475
ExprResult Sema::ActOnDesignatedInitializer(Designation &Desig,
3476
SourceLocation EqualOrColonLoc,
3477
bool GNUSyntax,
3478
ExprResult Init) {
3479
typedef DesignatedInitExpr::Designator ASTDesignator;
3480
3481
bool Invalid = false;
3482
SmallVector<ASTDesignator, 32> Designators;
3483
SmallVector<Expr *, 32> InitExpressions;
3484
3485
// Build designators and check array designator expressions.
3486
for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) {
3487
const Designator &D = Desig.getDesignator(Idx);
3488
3489
if (D.isFieldDesignator()) {
3490
Designators.push_back(ASTDesignator::CreateFieldDesignator(
3491
D.getFieldDecl(), D.getDotLoc(), D.getFieldLoc()));
3492
} else if (D.isArrayDesignator()) {
3493
Expr *Index = static_cast<Expr *>(D.getArrayIndex());
3494
llvm::APSInt IndexValue;
3495
if (!Index->isTypeDependent() && !Index->isValueDependent())
3496
Index = CheckArrayDesignatorExpr(*this, Index, IndexValue).get();
3497
if (!Index)
3498
Invalid = true;
3499
else {
3500
Designators.push_back(ASTDesignator::CreateArrayDesignator(
3501
InitExpressions.size(), D.getLBracketLoc(), D.getRBracketLoc()));
3502
InitExpressions.push_back(Index);
3503
}
3504
} else if (D.isArrayRangeDesignator()) {
3505
Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart());
3506
Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd());
3507
llvm::APSInt StartValue;
3508
llvm::APSInt EndValue;
3509
bool StartDependent = StartIndex->isTypeDependent() ||
3510
StartIndex->isValueDependent();
3511
bool EndDependent = EndIndex->isTypeDependent() ||
3512
EndIndex->isValueDependent();
3513
if (!StartDependent)
3514
StartIndex =
3515
CheckArrayDesignatorExpr(*this, StartIndex, StartValue).get();
3516
if (!EndDependent)
3517
EndIndex = CheckArrayDesignatorExpr(*this, EndIndex, EndValue).get();
3518
3519
if (!StartIndex || !EndIndex)
3520
Invalid = true;
3521
else {
3522
// Make sure we're comparing values with the same bit width.
3523
if (StartDependent || EndDependent) {
3524
// Nothing to compute.
3525
} else if (StartValue.getBitWidth() > EndValue.getBitWidth())
3526
EndValue = EndValue.extend(StartValue.getBitWidth());
3527
else if (StartValue.getBitWidth() < EndValue.getBitWidth())
3528
StartValue = StartValue.extend(EndValue.getBitWidth());
3529
3530
if (!StartDependent && !EndDependent && EndValue < StartValue) {
3531
Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range)
3532
<< toString(StartValue, 10) << toString(EndValue, 10)
3533
<< StartIndex->getSourceRange() << EndIndex->getSourceRange();
3534
Invalid = true;
3535
} else {
3536
Designators.push_back(ASTDesignator::CreateArrayRangeDesignator(
3537
InitExpressions.size(), D.getLBracketLoc(), D.getEllipsisLoc(),
3538
D.getRBracketLoc()));
3539
InitExpressions.push_back(StartIndex);
3540
InitExpressions.push_back(EndIndex);
3541
}
3542
}
3543
}
3544
}
3545
3546
if (Invalid || Init.isInvalid())
3547
return ExprError();
3548
3549
return DesignatedInitExpr::Create(Context, Designators, InitExpressions,
3550
EqualOrColonLoc, GNUSyntax,
3551
Init.getAs<Expr>());
3552
}
3553
3554
//===----------------------------------------------------------------------===//
3555
// Initialization entity
3556
//===----------------------------------------------------------------------===//
3557
3558
InitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index,
3559
const InitializedEntity &Parent)
3560
: Parent(&Parent), Index(Index)
3561
{
3562
if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) {
3563
Kind = EK_ArrayElement;
3564
Type = AT->getElementType();
3565
} else if (const VectorType *VT = Parent.getType()->getAs<VectorType>()) {
3566
Kind = EK_VectorElement;
3567
Type = VT->getElementType();
3568
} else {
3569
const ComplexType *CT = Parent.getType()->getAs<ComplexType>();
3570
assert(CT && "Unexpected type");
3571
Kind = EK_ComplexElement;
3572
Type = CT->getElementType();
3573
}
3574
}
3575
3576
InitializedEntity
3577
InitializedEntity::InitializeBase(ASTContext &Context,
3578
const CXXBaseSpecifier *Base,
3579
bool IsInheritedVirtualBase,
3580
const InitializedEntity *Parent) {
3581
InitializedEntity Result;
3582
Result.Kind = EK_Base;
3583
Result.Parent = Parent;
3584
Result.Base = {Base, IsInheritedVirtualBase};
3585
Result.Type = Base->getType();
3586
return Result;
3587
}
3588
3589
DeclarationName InitializedEntity::getName() const {
3590
switch (getKind()) {
3591
case EK_Parameter:
3592
case EK_Parameter_CF_Audited: {
3593
ParmVarDecl *D = Parameter.getPointer();
3594
return (D ? D->getDeclName() : DeclarationName());
3595
}
3596
3597
case EK_Variable:
3598
case EK_Member:
3599
case EK_ParenAggInitMember:
3600
case EK_Binding:
3601
case EK_TemplateParameter:
3602
return Variable.VariableOrMember->getDeclName();
3603
3604
case EK_LambdaCapture:
3605
return DeclarationName(Capture.VarID);
3606
3607
case EK_Result:
3608
case EK_StmtExprResult:
3609
case EK_Exception:
3610
case EK_New:
3611
case EK_Temporary:
3612
case EK_Base:
3613
case EK_Delegating:
3614
case EK_ArrayElement:
3615
case EK_VectorElement:
3616
case EK_ComplexElement:
3617
case EK_BlockElement:
3618
case EK_LambdaToBlockConversionBlockElement:
3619
case EK_CompoundLiteralInit:
3620
case EK_RelatedResult:
3621
return DeclarationName();
3622
}
3623
3624
llvm_unreachable("Invalid EntityKind!");
3625
}
3626
3627
ValueDecl *InitializedEntity::getDecl() const {
3628
switch (getKind()) {
3629
case EK_Variable:
3630
case EK_Member:
3631
case EK_ParenAggInitMember:
3632
case EK_Binding:
3633
case EK_TemplateParameter:
3634
return Variable.VariableOrMember;
3635
3636
case EK_Parameter:
3637
case EK_Parameter_CF_Audited:
3638
return Parameter.getPointer();
3639
3640
case EK_Result:
3641
case EK_StmtExprResult:
3642
case EK_Exception:
3643
case EK_New:
3644
case EK_Temporary:
3645
case EK_Base:
3646
case EK_Delegating:
3647
case EK_ArrayElement:
3648
case EK_VectorElement:
3649
case EK_ComplexElement:
3650
case EK_BlockElement:
3651
case EK_LambdaToBlockConversionBlockElement:
3652
case EK_LambdaCapture:
3653
case EK_CompoundLiteralInit:
3654
case EK_RelatedResult:
3655
return nullptr;
3656
}
3657
3658
llvm_unreachable("Invalid EntityKind!");
3659
}
3660
3661
bool InitializedEntity::allowsNRVO() const {
3662
switch (getKind()) {
3663
case EK_Result:
3664
case EK_Exception:
3665
return LocAndNRVO.NRVO;
3666
3667
case EK_StmtExprResult:
3668
case EK_Variable:
3669
case EK_Parameter:
3670
case EK_Parameter_CF_Audited:
3671
case EK_TemplateParameter:
3672
case EK_Member:
3673
case EK_ParenAggInitMember:
3674
case EK_Binding:
3675
case EK_New:
3676
case EK_Temporary:
3677
case EK_CompoundLiteralInit:
3678
case EK_Base:
3679
case EK_Delegating:
3680
case EK_ArrayElement:
3681
case EK_VectorElement:
3682
case EK_ComplexElement:
3683
case EK_BlockElement:
3684
case EK_LambdaToBlockConversionBlockElement:
3685
case EK_LambdaCapture:
3686
case EK_RelatedResult:
3687
break;
3688
}
3689
3690
return false;
3691
}
3692
3693
unsigned InitializedEntity::dumpImpl(raw_ostream &OS) const {
3694
assert(getParent() != this);
3695
unsigned Depth = getParent() ? getParent()->dumpImpl(OS) : 0;
3696
for (unsigned I = 0; I != Depth; ++I)
3697
OS << "`-";
3698
3699
switch (getKind()) {
3700
case EK_Variable: OS << "Variable"; break;
3701
case EK_Parameter: OS << "Parameter"; break;
3702
case EK_Parameter_CF_Audited: OS << "CF audited function Parameter";
3703
break;
3704
case EK_TemplateParameter: OS << "TemplateParameter"; break;
3705
case EK_Result: OS << "Result"; break;
3706
case EK_StmtExprResult: OS << "StmtExprResult"; break;
3707
case EK_Exception: OS << "Exception"; break;
3708
case EK_Member:
3709
case EK_ParenAggInitMember:
3710
OS << "Member";
3711
break;
3712
case EK_Binding: OS << "Binding"; break;
3713
case EK_New: OS << "New"; break;
3714
case EK_Temporary: OS << "Temporary"; break;
3715
case EK_CompoundLiteralInit: OS << "CompoundLiteral";break;
3716
case EK_RelatedResult: OS << "RelatedResult"; break;
3717
case EK_Base: OS << "Base"; break;
3718
case EK_Delegating: OS << "Delegating"; break;
3719
case EK_ArrayElement: OS << "ArrayElement " << Index; break;
3720
case EK_VectorElement: OS << "VectorElement " << Index; break;
3721
case EK_ComplexElement: OS << "ComplexElement " << Index; break;
3722
case EK_BlockElement: OS << "Block"; break;
3723
case EK_LambdaToBlockConversionBlockElement:
3724
OS << "Block (lambda)";
3725
break;
3726
case EK_LambdaCapture:
3727
OS << "LambdaCapture ";
3728
OS << DeclarationName(Capture.VarID);
3729
break;
3730
}
3731
3732
if (auto *D = getDecl()) {
3733
OS << " ";
3734
D->printQualifiedName(OS);
3735
}
3736
3737
OS << " '" << getType() << "'\n";
3738
3739
return Depth + 1;
3740
}
3741
3742
LLVM_DUMP_METHOD void InitializedEntity::dump() const {
3743
dumpImpl(llvm::errs());
3744
}
3745
3746
//===----------------------------------------------------------------------===//
3747
// Initialization sequence
3748
//===----------------------------------------------------------------------===//
3749
3750
void InitializationSequence::Step::Destroy() {
3751
switch (Kind) {
3752
case SK_ResolveAddressOfOverloadedFunction:
3753
case SK_CastDerivedToBasePRValue:
3754
case SK_CastDerivedToBaseXValue:
3755
case SK_CastDerivedToBaseLValue:
3756
case SK_BindReference:
3757
case SK_BindReferenceToTemporary:
3758
case SK_FinalCopy:
3759
case SK_ExtraneousCopyToTemporary:
3760
case SK_UserConversion:
3761
case SK_QualificationConversionPRValue:
3762
case SK_QualificationConversionXValue:
3763
case SK_QualificationConversionLValue:
3764
case SK_FunctionReferenceConversion:
3765
case SK_AtomicConversion:
3766
case SK_ListInitialization:
3767
case SK_UnwrapInitList:
3768
case SK_RewrapInitList:
3769
case SK_ConstructorInitialization:
3770
case SK_ConstructorInitializationFromList:
3771
case SK_ZeroInitialization:
3772
case SK_CAssignment:
3773
case SK_StringInit:
3774
case SK_ObjCObjectConversion:
3775
case SK_ArrayLoopIndex:
3776
case SK_ArrayLoopInit:
3777
case SK_ArrayInit:
3778
case SK_GNUArrayInit:
3779
case SK_ParenthesizedArrayInit:
3780
case SK_PassByIndirectCopyRestore:
3781
case SK_PassByIndirectRestore:
3782
case SK_ProduceObjCObject:
3783
case SK_StdInitializerList:
3784
case SK_StdInitializerListConstructorCall:
3785
case SK_OCLSamplerInit:
3786
case SK_OCLZeroOpaqueType:
3787
case SK_ParenthesizedListInit:
3788
break;
3789
3790
case SK_ConversionSequence:
3791
case SK_ConversionSequenceNoNarrowing:
3792
delete ICS;
3793
}
3794
}
3795
3796
bool InitializationSequence::isDirectReferenceBinding() const {
3797
// There can be some lvalue adjustments after the SK_BindReference step.
3798
for (const Step &S : llvm::reverse(Steps)) {
3799
if (S.Kind == SK_BindReference)
3800
return true;
3801
if (S.Kind == SK_BindReferenceToTemporary)
3802
return false;
3803
}
3804
return false;
3805
}
3806
3807
bool InitializationSequence::isAmbiguous() const {
3808
if (!Failed())
3809
return false;
3810
3811
switch (getFailureKind()) {
3812
case FK_TooManyInitsForReference:
3813
case FK_ParenthesizedListInitForReference:
3814
case FK_ArrayNeedsInitList:
3815
case FK_ArrayNeedsInitListOrStringLiteral:
3816
case FK_ArrayNeedsInitListOrWideStringLiteral:
3817
case FK_NarrowStringIntoWideCharArray:
3818
case FK_WideStringIntoCharArray:
3819
case FK_IncompatWideStringIntoWideChar:
3820
case FK_PlainStringIntoUTF8Char:
3821
case FK_UTF8StringIntoPlainChar:
3822
case FK_AddressOfOverloadFailed: // FIXME: Could do better
3823
case FK_NonConstLValueReferenceBindingToTemporary:
3824
case FK_NonConstLValueReferenceBindingToBitfield:
3825
case FK_NonConstLValueReferenceBindingToVectorElement:
3826
case FK_NonConstLValueReferenceBindingToMatrixElement:
3827
case FK_NonConstLValueReferenceBindingToUnrelated:
3828
case FK_RValueReferenceBindingToLValue:
3829
case FK_ReferenceAddrspaceMismatchTemporary:
3830
case FK_ReferenceInitDropsQualifiers:
3831
case FK_ReferenceInitFailed:
3832
case FK_ConversionFailed:
3833
case FK_ConversionFromPropertyFailed:
3834
case FK_TooManyInitsForScalar:
3835
case FK_ParenthesizedListInitForScalar:
3836
case FK_ReferenceBindingToInitList:
3837
case FK_InitListBadDestinationType:
3838
case FK_DefaultInitOfConst:
3839
case FK_Incomplete:
3840
case FK_ArrayTypeMismatch:
3841
case FK_NonConstantArrayInit:
3842
case FK_ListInitializationFailed:
3843
case FK_VariableLengthArrayHasInitializer:
3844
case FK_PlaceholderType:
3845
case FK_ExplicitConstructor:
3846
case FK_AddressOfUnaddressableFunction:
3847
case FK_ParenthesizedListInitFailed:
3848
case FK_DesignatedInitForNonAggregate:
3849
return false;
3850
3851
case FK_ReferenceInitOverloadFailed:
3852
case FK_UserConversionOverloadFailed:
3853
case FK_ConstructorOverloadFailed:
3854
case FK_ListConstructorOverloadFailed:
3855
return FailedOverloadResult == OR_Ambiguous;
3856
}
3857
3858
llvm_unreachable("Invalid EntityKind!");
3859
}
3860
3861
bool InitializationSequence::isConstructorInitialization() const {
3862
return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization;
3863
}
3864
3865
void
3866
InitializationSequence
3867
::AddAddressOverloadResolutionStep(FunctionDecl *Function,
3868
DeclAccessPair Found,
3869
bool HadMultipleCandidates) {
3870
Step S;
3871
S.Kind = SK_ResolveAddressOfOverloadedFunction;
3872
S.Type = Function->getType();
3873
S.Function.HadMultipleCandidates = HadMultipleCandidates;
3874
S.Function.Function = Function;
3875
S.Function.FoundDecl = Found;
3876
Steps.push_back(S);
3877
}
3878
3879
void InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType,
3880
ExprValueKind VK) {
3881
Step S;
3882
switch (VK) {
3883
case VK_PRValue:
3884
S.Kind = SK_CastDerivedToBasePRValue;
3885
break;
3886
case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break;
3887
case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break;
3888
}
3889
S.Type = BaseType;
3890
Steps.push_back(S);
3891
}
3892
3893
void InitializationSequence::AddReferenceBindingStep(QualType T,
3894
bool BindingTemporary) {
3895
Step S;
3896
S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference;
3897
S.Type = T;
3898
Steps.push_back(S);
3899
}
3900
3901
void InitializationSequence::AddFinalCopy(QualType T) {
3902
Step S;
3903
S.Kind = SK_FinalCopy;
3904
S.Type = T;
3905
Steps.push_back(S);
3906
}
3907
3908
void InitializationSequence::AddExtraneousCopyToTemporary(QualType T) {
3909
Step S;
3910
S.Kind = SK_ExtraneousCopyToTemporary;
3911
S.Type = T;
3912
Steps.push_back(S);
3913
}
3914
3915
void
3916
InitializationSequence::AddUserConversionStep(FunctionDecl *Function,
3917
DeclAccessPair FoundDecl,
3918
QualType T,
3919
bool HadMultipleCandidates) {
3920
Step S;
3921
S.Kind = SK_UserConversion;
3922
S.Type = T;
3923
S.Function.HadMultipleCandidates = HadMultipleCandidates;
3924
S.Function.Function = Function;
3925
S.Function.FoundDecl = FoundDecl;
3926
Steps.push_back(S);
3927
}
3928
3929
void InitializationSequence::AddQualificationConversionStep(QualType Ty,
3930
ExprValueKind VK) {
3931
Step S;
3932
S.Kind = SK_QualificationConversionPRValue; // work around a gcc warning
3933
switch (VK) {
3934
case VK_PRValue:
3935
S.Kind = SK_QualificationConversionPRValue;
3936
break;
3937
case VK_XValue:
3938
S.Kind = SK_QualificationConversionXValue;
3939
break;
3940
case VK_LValue:
3941
S.Kind = SK_QualificationConversionLValue;
3942
break;
3943
}
3944
S.Type = Ty;
3945
Steps.push_back(S);
3946
}
3947
3948
void InitializationSequence::AddFunctionReferenceConversionStep(QualType Ty) {
3949
Step S;
3950
S.Kind = SK_FunctionReferenceConversion;
3951
S.Type = Ty;
3952
Steps.push_back(S);
3953
}
3954
3955
void InitializationSequence::AddAtomicConversionStep(QualType Ty) {
3956
Step S;
3957
S.Kind = SK_AtomicConversion;
3958
S.Type = Ty;
3959
Steps.push_back(S);
3960
}
3961
3962
void InitializationSequence::AddConversionSequenceStep(
3963
const ImplicitConversionSequence &ICS, QualType T,
3964
bool TopLevelOfInitList) {
3965
Step S;
3966
S.Kind = TopLevelOfInitList ? SK_ConversionSequenceNoNarrowing
3967
: SK_ConversionSequence;
3968
S.Type = T;
3969
S.ICS = new ImplicitConversionSequence(ICS);
3970
Steps.push_back(S);
3971
}
3972
3973
void InitializationSequence::AddListInitializationStep(QualType T) {
3974
Step S;
3975
S.Kind = SK_ListInitialization;
3976
S.Type = T;
3977
Steps.push_back(S);
3978
}
3979
3980
void InitializationSequence::AddConstructorInitializationStep(
3981
DeclAccessPair FoundDecl, CXXConstructorDecl *Constructor, QualType T,
3982
bool HadMultipleCandidates, bool FromInitList, bool AsInitList) {
3983
Step S;
3984
S.Kind = FromInitList ? AsInitList ? SK_StdInitializerListConstructorCall
3985
: SK_ConstructorInitializationFromList
3986
: SK_ConstructorInitialization;
3987
S.Type = T;
3988
S.Function.HadMultipleCandidates = HadMultipleCandidates;
3989
S.Function.Function = Constructor;
3990
S.Function.FoundDecl = FoundDecl;
3991
Steps.push_back(S);
3992
}
3993
3994
void InitializationSequence::AddZeroInitializationStep(QualType T) {
3995
Step S;
3996
S.Kind = SK_ZeroInitialization;
3997
S.Type = T;
3998
Steps.push_back(S);
3999
}
4000
4001
void InitializationSequence::AddCAssignmentStep(QualType T) {
4002
Step S;
4003
S.Kind = SK_CAssignment;
4004
S.Type = T;
4005
Steps.push_back(S);
4006
}
4007
4008
void InitializationSequence::AddStringInitStep(QualType T) {
4009
Step S;
4010
S.Kind = SK_StringInit;
4011
S.Type = T;
4012
Steps.push_back(S);
4013
}
4014
4015
void InitializationSequence::AddObjCObjectConversionStep(QualType T) {
4016
Step S;
4017
S.Kind = SK_ObjCObjectConversion;
4018
S.Type = T;
4019
Steps.push_back(S);
4020
}
4021
4022
void InitializationSequence::AddArrayInitStep(QualType T, bool IsGNUExtension) {
4023
Step S;
4024
S.Kind = IsGNUExtension ? SK_GNUArrayInit : SK_ArrayInit;
4025
S.Type = T;
4026
Steps.push_back(S);
4027
}
4028
4029
void InitializationSequence::AddArrayInitLoopStep(QualType T, QualType EltT) {
4030
Step S;
4031
S.Kind = SK_ArrayLoopIndex;
4032
S.Type = EltT;
4033
Steps.insert(Steps.begin(), S);
4034
4035
S.Kind = SK_ArrayLoopInit;
4036
S.Type = T;
4037
Steps.push_back(S);
4038
}
4039
4040
void InitializationSequence::AddParenthesizedArrayInitStep(QualType T) {
4041
Step S;
4042
S.Kind = SK_ParenthesizedArrayInit;
4043
S.Type = T;
4044
Steps.push_back(S);
4045
}
4046
4047
void InitializationSequence::AddPassByIndirectCopyRestoreStep(QualType type,
4048
bool shouldCopy) {
4049
Step s;
4050
s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore
4051
: SK_PassByIndirectRestore);
4052
s.Type = type;
4053
Steps.push_back(s);
4054
}
4055
4056
void InitializationSequence::AddProduceObjCObjectStep(QualType T) {
4057
Step S;
4058
S.Kind = SK_ProduceObjCObject;
4059
S.Type = T;
4060
Steps.push_back(S);
4061
}
4062
4063
void InitializationSequence::AddStdInitializerListConstructionStep(QualType T) {
4064
Step S;
4065
S.Kind = SK_StdInitializerList;
4066
S.Type = T;
4067
Steps.push_back(S);
4068
}
4069
4070
void InitializationSequence::AddOCLSamplerInitStep(QualType T) {
4071
Step S;
4072
S.Kind = SK_OCLSamplerInit;
4073
S.Type = T;
4074
Steps.push_back(S);
4075
}
4076
4077
void InitializationSequence::AddOCLZeroOpaqueTypeStep(QualType T) {
4078
Step S;
4079
S.Kind = SK_OCLZeroOpaqueType;
4080
S.Type = T;
4081
Steps.push_back(S);
4082
}
4083
4084
void InitializationSequence::AddParenthesizedListInitStep(QualType T) {
4085
Step S;
4086
S.Kind = SK_ParenthesizedListInit;
4087
S.Type = T;
4088
Steps.push_back(S);
4089
}
4090
4091
void InitializationSequence::RewrapReferenceInitList(QualType T,
4092
InitListExpr *Syntactic) {
4093
assert(Syntactic->getNumInits() == 1 &&
4094
"Can only rewrap trivial init lists.");
4095
Step S;
4096
S.Kind = SK_UnwrapInitList;
4097
S.Type = Syntactic->getInit(0)->getType();
4098
Steps.insert(Steps.begin(), S);
4099
4100
S.Kind = SK_RewrapInitList;
4101
S.Type = T;
4102
S.WrappingSyntacticList = Syntactic;
4103
Steps.push_back(S);
4104
}
4105
4106
void InitializationSequence::SetOverloadFailure(FailureKind Failure,
4107
OverloadingResult Result) {
4108
setSequenceKind(FailedSequence);
4109
this->Failure = Failure;
4110
this->FailedOverloadResult = Result;
4111
}
4112
4113
//===----------------------------------------------------------------------===//
4114
// Attempt initialization
4115
//===----------------------------------------------------------------------===//
4116
4117
/// Tries to add a zero initializer. Returns true if that worked.
4118
static bool
4119
maybeRecoverWithZeroInitialization(Sema &S, InitializationSequence &Sequence,
4120
const InitializedEntity &Entity) {
4121
if (Entity.getKind() != InitializedEntity::EK_Variable)
4122
return false;
4123
4124
VarDecl *VD = cast<VarDecl>(Entity.getDecl());
4125
if (VD->getInit() || VD->getEndLoc().isMacroID())
4126
return false;
4127
4128
QualType VariableTy = VD->getType().getCanonicalType();
4129
SourceLocation Loc = S.getLocForEndOfToken(VD->getEndLoc());
4130
std::string Init = S.getFixItZeroInitializerForType(VariableTy, Loc);
4131
if (!Init.empty()) {
4132
Sequence.AddZeroInitializationStep(Entity.getType());
4133
Sequence.SetZeroInitializationFixit(Init, Loc);
4134
return true;
4135
}
4136
return false;
4137
}
4138
4139
static void MaybeProduceObjCObject(Sema &S,
4140
InitializationSequence &Sequence,
4141
const InitializedEntity &Entity) {
4142
if (!S.getLangOpts().ObjCAutoRefCount) return;
4143
4144
/// When initializing a parameter, produce the value if it's marked
4145
/// __attribute__((ns_consumed)).
4146
if (Entity.isParameterKind()) {
4147
if (!Entity.isParameterConsumed())
4148
return;
4149
4150
assert(Entity.getType()->isObjCRetainableType() &&
4151
"consuming an object of unretainable type?");
4152
Sequence.AddProduceObjCObjectStep(Entity.getType());
4153
4154
/// When initializing a return value, if the return type is a
4155
/// retainable type, then returns need to immediately retain the
4156
/// object. If an autorelease is required, it will be done at the
4157
/// last instant.
4158
} else if (Entity.getKind() == InitializedEntity::EK_Result ||
4159
Entity.getKind() == InitializedEntity::EK_StmtExprResult) {
4160
if (!Entity.getType()->isObjCRetainableType())
4161
return;
4162
4163
Sequence.AddProduceObjCObjectStep(Entity.getType());
4164
}
4165
}
4166
4167
static void TryListInitialization(Sema &S,
4168
const InitializedEntity &Entity,
4169
const InitializationKind &Kind,
4170
InitListExpr *InitList,
4171
InitializationSequence &Sequence,
4172
bool TreatUnavailableAsInvalid);
4173
4174
/// When initializing from init list via constructor, handle
4175
/// initialization of an object of type std::initializer_list<T>.
4176
///
4177
/// \return true if we have handled initialization of an object of type
4178
/// std::initializer_list<T>, false otherwise.
4179
static bool TryInitializerListConstruction(Sema &S,
4180
InitListExpr *List,
4181
QualType DestType,
4182
InitializationSequence &Sequence,
4183
bool TreatUnavailableAsInvalid) {
4184
QualType E;
4185
if (!S.isStdInitializerList(DestType, &E))
4186
return false;
4187
4188
if (!S.isCompleteType(List->getExprLoc(), E)) {
4189
Sequence.setIncompleteTypeFailure(E);
4190
return true;
4191
}
4192
4193
// Try initializing a temporary array from the init list.
4194
QualType ArrayType = S.Context.getConstantArrayType(
4195
E.withConst(),
4196
llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
4197
List->getNumInits()),
4198
nullptr, clang::ArraySizeModifier::Normal, 0);
4199
InitializedEntity HiddenArray =
4200
InitializedEntity::InitializeTemporary(ArrayType);
4201
InitializationKind Kind = InitializationKind::CreateDirectList(
4202
List->getExprLoc(), List->getBeginLoc(), List->getEndLoc());
4203
TryListInitialization(S, HiddenArray, Kind, List, Sequence,
4204
TreatUnavailableAsInvalid);
4205
if (Sequence)
4206
Sequence.AddStdInitializerListConstructionStep(DestType);
4207
return true;
4208
}
4209
4210
/// Determine if the constructor has the signature of a copy or move
4211
/// constructor for the type T of the class in which it was found. That is,
4212
/// determine if its first parameter is of type T or reference to (possibly
4213
/// cv-qualified) T.
4214
static bool hasCopyOrMoveCtorParam(ASTContext &Ctx,
4215
const ConstructorInfo &Info) {
4216
if (Info.Constructor->getNumParams() == 0)
4217
return false;
4218
4219
QualType ParmT =
4220
Info.Constructor->getParamDecl(0)->getType().getNonReferenceType();
4221
QualType ClassT =
4222
Ctx.getRecordType(cast<CXXRecordDecl>(Info.FoundDecl->getDeclContext()));
4223
4224
return Ctx.hasSameUnqualifiedType(ParmT, ClassT);
4225
}
4226
4227
static OverloadingResult ResolveConstructorOverload(
4228
Sema &S, SourceLocation DeclLoc, MultiExprArg Args,
4229
OverloadCandidateSet &CandidateSet, QualType DestType,
4230
DeclContext::lookup_result Ctors, OverloadCandidateSet::iterator &Best,
4231
bool CopyInitializing, bool AllowExplicit, bool OnlyListConstructors,
4232
bool IsListInit, bool RequireActualConstructor,
4233
bool SecondStepOfCopyInit = false) {
4234
CandidateSet.clear(OverloadCandidateSet::CSK_InitByConstructor);
4235
CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
4236
4237
for (NamedDecl *D : Ctors) {
4238
auto Info = getConstructorInfo(D);
4239
if (!Info.Constructor || Info.Constructor->isInvalidDecl())
4240
continue;
4241
4242
if (OnlyListConstructors && !S.isInitListConstructor(Info.Constructor))
4243
continue;
4244
4245
// C++11 [over.best.ics]p4:
4246
// ... and the constructor or user-defined conversion function is a
4247
// candidate by
4248
// - 13.3.1.3, when the argument is the temporary in the second step
4249
// of a class copy-initialization, or
4250
// - 13.3.1.4, 13.3.1.5, or 13.3.1.6 (in all cases), [not handled here]
4251
// - the second phase of 13.3.1.7 when the initializer list has exactly
4252
// one element that is itself an initializer list, and the target is
4253
// the first parameter of a constructor of class X, and the conversion
4254
// is to X or reference to (possibly cv-qualified X),
4255
// user-defined conversion sequences are not considered.
4256
bool SuppressUserConversions =
4257
SecondStepOfCopyInit ||
4258
(IsListInit && Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
4259
hasCopyOrMoveCtorParam(S.Context, Info));
4260
4261
if (Info.ConstructorTmpl)
4262
S.AddTemplateOverloadCandidate(
4263
Info.ConstructorTmpl, Info.FoundDecl,
4264
/*ExplicitArgs*/ nullptr, Args, CandidateSet, SuppressUserConversions,
4265
/*PartialOverloading=*/false, AllowExplicit);
4266
else {
4267
// C++ [over.match.copy]p1:
4268
// - When initializing a temporary to be bound to the first parameter
4269
// of a constructor [for type T] that takes a reference to possibly
4270
// cv-qualified T as its first argument, called with a single
4271
// argument in the context of direct-initialization, explicit
4272
// conversion functions are also considered.
4273
// FIXME: What if a constructor template instantiates to such a signature?
4274
bool AllowExplicitConv = AllowExplicit && !CopyInitializing &&
4275
Args.size() == 1 &&
4276
hasCopyOrMoveCtorParam(S.Context, Info);
4277
S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl, Args,
4278
CandidateSet, SuppressUserConversions,
4279
/*PartialOverloading=*/false, AllowExplicit,
4280
AllowExplicitConv);
4281
}
4282
}
4283
4284
// FIXME: Work around a bug in C++17 guaranteed copy elision.
4285
//
4286
// When initializing an object of class type T by constructor
4287
// ([over.match.ctor]) or by list-initialization ([over.match.list])
4288
// from a single expression of class type U, conversion functions of
4289
// U that convert to the non-reference type cv T are candidates.
4290
// Explicit conversion functions are only candidates during
4291
// direct-initialization.
4292
//
4293
// Note: SecondStepOfCopyInit is only ever true in this case when
4294
// evaluating whether to produce a C++98 compatibility warning.
4295
if (S.getLangOpts().CPlusPlus17 && Args.size() == 1 &&
4296
!RequireActualConstructor && !SecondStepOfCopyInit) {
4297
Expr *Initializer = Args[0];
4298
auto *SourceRD = Initializer->getType()->getAsCXXRecordDecl();
4299
if (SourceRD && S.isCompleteType(DeclLoc, Initializer->getType())) {
4300
const auto &Conversions = SourceRD->getVisibleConversionFunctions();
4301
for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4302
NamedDecl *D = *I;
4303
CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
4304
D = D->getUnderlyingDecl();
4305
4306
FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
4307
CXXConversionDecl *Conv;
4308
if (ConvTemplate)
4309
Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
4310
else
4311
Conv = cast<CXXConversionDecl>(D);
4312
4313
if (ConvTemplate)
4314
S.AddTemplateConversionCandidate(
4315
ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
4316
CandidateSet, AllowExplicit, AllowExplicit,
4317
/*AllowResultConversion*/ false);
4318
else
4319
S.AddConversionCandidate(Conv, I.getPair(), ActingDC, Initializer,
4320
DestType, CandidateSet, AllowExplicit,
4321
AllowExplicit,
4322
/*AllowResultConversion*/ false);
4323
}
4324
}
4325
}
4326
4327
// Perform overload resolution and return the result.
4328
return CandidateSet.BestViableFunction(S, DeclLoc, Best);
4329
}
4330
4331
/// Attempt initialization by constructor (C++ [dcl.init]), which
4332
/// enumerates the constructors of the initialized entity and performs overload
4333
/// resolution to select the best.
4334
/// \param DestType The destination class type.
4335
/// \param DestArrayType The destination type, which is either DestType or
4336
/// a (possibly multidimensional) array of DestType.
4337
/// \param IsListInit Is this list-initialization?
4338
/// \param IsInitListCopy Is this non-list-initialization resulting from a
4339
/// list-initialization from {x} where x is the same
4340
/// type as the entity?
4341
static void TryConstructorInitialization(Sema &S,
4342
const InitializedEntity &Entity,
4343
const InitializationKind &Kind,
4344
MultiExprArg Args, QualType DestType,
4345
QualType DestArrayType,
4346
InitializationSequence &Sequence,
4347
bool IsListInit = false,
4348
bool IsInitListCopy = false) {
4349
assert(((!IsListInit && !IsInitListCopy) ||
4350
(Args.size() == 1 && isa<InitListExpr>(Args[0]))) &&
4351
"IsListInit/IsInitListCopy must come with a single initializer list "
4352
"argument.");
4353
InitListExpr *ILE =
4354
(IsListInit || IsInitListCopy) ? cast<InitListExpr>(Args[0]) : nullptr;
4355
MultiExprArg UnwrappedArgs =
4356
ILE ? MultiExprArg(ILE->getInits(), ILE->getNumInits()) : Args;
4357
4358
// The type we're constructing needs to be complete.
4359
if (!S.isCompleteType(Kind.getLocation(), DestType)) {
4360
Sequence.setIncompleteTypeFailure(DestType);
4361
return;
4362
}
4363
4364
bool RequireActualConstructor =
4365
!(Entity.getKind() != InitializedEntity::EK_Base &&
4366
Entity.getKind() != InitializedEntity::EK_Delegating &&
4367
Entity.getKind() !=
4368
InitializedEntity::EK_LambdaToBlockConversionBlockElement);
4369
4370
// C++17 [dcl.init]p17:
4371
// - If the initializer expression is a prvalue and the cv-unqualified
4372
// version of the source type is the same class as the class of the
4373
// destination, the initializer expression is used to initialize the
4374
// destination object.
4375
// Per DR (no number yet), this does not apply when initializing a base
4376
// class or delegating to another constructor from a mem-initializer.
4377
// ObjC++: Lambda captured by the block in the lambda to block conversion
4378
// should avoid copy elision.
4379
if (S.getLangOpts().CPlusPlus17 && !RequireActualConstructor &&
4380
UnwrappedArgs.size() == 1 && UnwrappedArgs[0]->isPRValue() &&
4381
S.Context.hasSameUnqualifiedType(UnwrappedArgs[0]->getType(), DestType)) {
4382
// Convert qualifications if necessary.
4383
Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
4384
if (ILE)
4385
Sequence.RewrapReferenceInitList(DestType, ILE);
4386
return;
4387
}
4388
4389
const RecordType *DestRecordType = DestType->getAs<RecordType>();
4390
assert(DestRecordType && "Constructor initialization requires record type");
4391
CXXRecordDecl *DestRecordDecl
4392
= cast<CXXRecordDecl>(DestRecordType->getDecl());
4393
4394
// Build the candidate set directly in the initialization sequence
4395
// structure, so that it will persist if we fail.
4396
OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
4397
4398
// Determine whether we are allowed to call explicit constructors or
4399
// explicit conversion operators.
4400
bool AllowExplicit = Kind.AllowExplicit() || IsListInit;
4401
bool CopyInitialization = Kind.getKind() == InitializationKind::IK_Copy;
4402
4403
// - Otherwise, if T is a class type, constructors are considered. The
4404
// applicable constructors are enumerated, and the best one is chosen
4405
// through overload resolution.
4406
DeclContext::lookup_result Ctors = S.LookupConstructors(DestRecordDecl);
4407
4408
OverloadingResult Result = OR_No_Viable_Function;
4409
OverloadCandidateSet::iterator Best;
4410
bool AsInitializerList = false;
4411
4412
// C++11 [over.match.list]p1, per DR1467:
4413
// When objects of non-aggregate type T are list-initialized, such that
4414
// 8.5.4 [dcl.init.list] specifies that overload resolution is performed
4415
// according to the rules in this section, overload resolution selects
4416
// the constructor in two phases:
4417
//
4418
// - Initially, the candidate functions are the initializer-list
4419
// constructors of the class T and the argument list consists of the
4420
// initializer list as a single argument.
4421
if (IsListInit) {
4422
AsInitializerList = true;
4423
4424
// If the initializer list has no elements and T has a default constructor,
4425
// the first phase is omitted.
4426
if (!(UnwrappedArgs.empty() && S.LookupDefaultConstructor(DestRecordDecl)))
4427
Result = ResolveConstructorOverload(
4428
S, Kind.getLocation(), Args, CandidateSet, DestType, Ctors, Best,
4429
CopyInitialization, AllowExplicit,
4430
/*OnlyListConstructors=*/true, IsListInit, RequireActualConstructor);
4431
}
4432
4433
// C++11 [over.match.list]p1:
4434
// - If no viable initializer-list constructor is found, overload resolution
4435
// is performed again, where the candidate functions are all the
4436
// constructors of the class T and the argument list consists of the
4437
// elements of the initializer list.
4438
if (Result == OR_No_Viable_Function) {
4439
AsInitializerList = false;
4440
Result = ResolveConstructorOverload(
4441
S, Kind.getLocation(), UnwrappedArgs, CandidateSet, DestType, Ctors,
4442
Best, CopyInitialization, AllowExplicit,
4443
/*OnlyListConstructors=*/false, IsListInit, RequireActualConstructor);
4444
}
4445
if (Result) {
4446
Sequence.SetOverloadFailure(
4447
IsListInit ? InitializationSequence::FK_ListConstructorOverloadFailed
4448
: InitializationSequence::FK_ConstructorOverloadFailed,
4449
Result);
4450
4451
if (Result != OR_Deleted)
4452
return;
4453
}
4454
4455
bool HadMultipleCandidates = (CandidateSet.size() > 1);
4456
4457
// In C++17, ResolveConstructorOverload can select a conversion function
4458
// instead of a constructor.
4459
if (auto *CD = dyn_cast<CXXConversionDecl>(Best->Function)) {
4460
// Add the user-defined conversion step that calls the conversion function.
4461
QualType ConvType = CD->getConversionType();
4462
assert(S.Context.hasSameUnqualifiedType(ConvType, DestType) &&
4463
"should not have selected this conversion function");
4464
Sequence.AddUserConversionStep(CD, Best->FoundDecl, ConvType,
4465
HadMultipleCandidates);
4466
if (!S.Context.hasSameType(ConvType, DestType))
4467
Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
4468
if (IsListInit)
4469
Sequence.RewrapReferenceInitList(Entity.getType(), ILE);
4470
return;
4471
}
4472
4473
CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
4474
if (Result != OR_Deleted) {
4475
// C++11 [dcl.init]p6:
4476
// If a program calls for the default initialization of an object
4477
// of a const-qualified type T, T shall be a class type with a
4478
// user-provided default constructor.
4479
// C++ core issue 253 proposal:
4480
// If the implicit default constructor initializes all subobjects, no
4481
// initializer should be required.
4482
// The 253 proposal is for example needed to process libstdc++ headers
4483
// in 5.x.
4484
if (Kind.getKind() == InitializationKind::IK_Default &&
4485
Entity.getType().isConstQualified()) {
4486
if (!CtorDecl->getParent()->allowConstDefaultInit()) {
4487
if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
4488
Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
4489
return;
4490
}
4491
}
4492
4493
// C++11 [over.match.list]p1:
4494
// In copy-list-initialization, if an explicit constructor is chosen, the
4495
// initializer is ill-formed.
4496
if (IsListInit && !Kind.AllowExplicit() && CtorDecl->isExplicit()) {
4497
Sequence.SetFailed(InitializationSequence::FK_ExplicitConstructor);
4498
return;
4499
}
4500
}
4501
4502
// [class.copy.elision]p3:
4503
// In some copy-initialization contexts, a two-stage overload resolution
4504
// is performed.
4505
// If the first overload resolution selects a deleted function, we also
4506
// need the initialization sequence to decide whether to perform the second
4507
// overload resolution.
4508
// For deleted functions in other contexts, there is no need to get the
4509
// initialization sequence.
4510
if (Result == OR_Deleted && Kind.getKind() != InitializationKind::IK_Copy)
4511
return;
4512
4513
// Add the constructor initialization step. Any cv-qualification conversion is
4514
// subsumed by the initialization.
4515
Sequence.AddConstructorInitializationStep(
4516
Best->FoundDecl, CtorDecl, DestArrayType, HadMultipleCandidates,
4517
IsListInit | IsInitListCopy, AsInitializerList);
4518
}
4519
4520
static bool
4521
ResolveOverloadedFunctionForReferenceBinding(Sema &S,
4522
Expr *Initializer,
4523
QualType &SourceType,
4524
QualType &UnqualifiedSourceType,
4525
QualType UnqualifiedTargetType,
4526
InitializationSequence &Sequence) {
4527
if (S.Context.getCanonicalType(UnqualifiedSourceType) ==
4528
S.Context.OverloadTy) {
4529
DeclAccessPair Found;
4530
bool HadMultipleCandidates = false;
4531
if (FunctionDecl *Fn
4532
= S.ResolveAddressOfOverloadedFunction(Initializer,
4533
UnqualifiedTargetType,
4534
false, Found,
4535
&HadMultipleCandidates)) {
4536
Sequence.AddAddressOverloadResolutionStep(Fn, Found,
4537
HadMultipleCandidates);
4538
SourceType = Fn->getType();
4539
UnqualifiedSourceType = SourceType.getUnqualifiedType();
4540
} else if (!UnqualifiedTargetType->isRecordType()) {
4541
Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
4542
return true;
4543
}
4544
}
4545
return false;
4546
}
4547
4548
static void TryReferenceInitializationCore(Sema &S,
4549
const InitializedEntity &Entity,
4550
const InitializationKind &Kind,
4551
Expr *Initializer,
4552
QualType cv1T1, QualType T1,
4553
Qualifiers T1Quals,
4554
QualType cv2T2, QualType T2,
4555
Qualifiers T2Quals,
4556
InitializationSequence &Sequence,
4557
bool TopLevelOfInitList);
4558
4559
static void TryValueInitialization(Sema &S,
4560
const InitializedEntity &Entity,
4561
const InitializationKind &Kind,
4562
InitializationSequence &Sequence,
4563
InitListExpr *InitList = nullptr);
4564
4565
/// Attempt list initialization of a reference.
4566
static void TryReferenceListInitialization(Sema &S,
4567
const InitializedEntity &Entity,
4568
const InitializationKind &Kind,
4569
InitListExpr *InitList,
4570
InitializationSequence &Sequence,
4571
bool TreatUnavailableAsInvalid) {
4572
// First, catch C++03 where this isn't possible.
4573
if (!S.getLangOpts().CPlusPlus11) {
4574
Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList);
4575
return;
4576
}
4577
// Can't reference initialize a compound literal.
4578
if (Entity.getKind() == InitializedEntity::EK_CompoundLiteralInit) {
4579
Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList);
4580
return;
4581
}
4582
4583
QualType DestType = Entity.getType();
4584
QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
4585
Qualifiers T1Quals;
4586
QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
4587
4588
// Reference initialization via an initializer list works thus:
4589
// If the initializer list consists of a single element that is
4590
// reference-related to the referenced type, bind directly to that element
4591
// (possibly creating temporaries).
4592
// Otherwise, initialize a temporary with the initializer list and
4593
// bind to that.
4594
if (InitList->getNumInits() == 1) {
4595
Expr *Initializer = InitList->getInit(0);
4596
QualType cv2T2 = S.getCompletedType(Initializer);
4597
Qualifiers T2Quals;
4598
QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
4599
4600
// If this fails, creating a temporary wouldn't work either.
4601
if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2,
4602
T1, Sequence))
4603
return;
4604
4605
SourceLocation DeclLoc = Initializer->getBeginLoc();
4606
Sema::ReferenceCompareResult RefRelationship
4607
= S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2);
4608
if (RefRelationship >= Sema::Ref_Related) {
4609
// Try to bind the reference here.
4610
TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
4611
T1Quals, cv2T2, T2, T2Quals, Sequence,
4612
/*TopLevelOfInitList=*/true);
4613
if (Sequence)
4614
Sequence.RewrapReferenceInitList(cv1T1, InitList);
4615
return;
4616
}
4617
4618
// Update the initializer if we've resolved an overloaded function.
4619
if (Sequence.step_begin() != Sequence.step_end())
4620
Sequence.RewrapReferenceInitList(cv1T1, InitList);
4621
}
4622
// Perform address space compatibility check.
4623
QualType cv1T1IgnoreAS = cv1T1;
4624
if (T1Quals.hasAddressSpace()) {
4625
Qualifiers T2Quals;
4626
(void)S.Context.getUnqualifiedArrayType(InitList->getType(), T2Quals);
4627
if (!T1Quals.isAddressSpaceSupersetOf(T2Quals)) {
4628
Sequence.SetFailed(
4629
InitializationSequence::FK_ReferenceInitDropsQualifiers);
4630
return;
4631
}
4632
// Ignore address space of reference type at this point and perform address
4633
// space conversion after the reference binding step.
4634
cv1T1IgnoreAS =
4635
S.Context.getQualifiedType(T1, T1Quals.withoutAddressSpace());
4636
}
4637
// Not reference-related. Create a temporary and bind to that.
4638
InitializedEntity TempEntity =
4639
InitializedEntity::InitializeTemporary(cv1T1IgnoreAS);
4640
4641
TryListInitialization(S, TempEntity, Kind, InitList, Sequence,
4642
TreatUnavailableAsInvalid);
4643
if (Sequence) {
4644
if (DestType->isRValueReferenceType() ||
4645
(T1Quals.hasConst() && !T1Quals.hasVolatile())) {
4646
if (S.getLangOpts().CPlusPlus20 &&
4647
isa<IncompleteArrayType>(T1->getUnqualifiedDesugaredType()) &&
4648
DestType->isRValueReferenceType()) {
4649
// C++20 [dcl.init.list]p3.10:
4650
// List-initialization of an object or reference of type T is defined as
4651
// follows:
4652
// ..., unless T is “reference to array of unknown bound of U”, in which
4653
// case the type of the prvalue is the type of x in the declaration U
4654
// x[] H, where H is the initializer list.
4655
Sequence.AddQualificationConversionStep(cv1T1, clang::VK_PRValue);
4656
}
4657
Sequence.AddReferenceBindingStep(cv1T1IgnoreAS,
4658
/*BindingTemporary=*/true);
4659
if (T1Quals.hasAddressSpace())
4660
Sequence.AddQualificationConversionStep(
4661
cv1T1, DestType->isRValueReferenceType() ? VK_XValue : VK_LValue);
4662
} else
4663
Sequence.SetFailed(
4664
InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary);
4665
}
4666
}
4667
4668
/// Attempt list initialization (C++0x [dcl.init.list])
4669
static void TryListInitialization(Sema &S,
4670
const InitializedEntity &Entity,
4671
const InitializationKind &Kind,
4672
InitListExpr *InitList,
4673
InitializationSequence &Sequence,
4674
bool TreatUnavailableAsInvalid) {
4675
QualType DestType = Entity.getType();
4676
4677
// C++ doesn't allow scalar initialization with more than one argument.
4678
// But C99 complex numbers are scalars and it makes sense there.
4679
if (S.getLangOpts().CPlusPlus && DestType->isScalarType() &&
4680
!DestType->isAnyComplexType() && InitList->getNumInits() > 1) {
4681
Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar);
4682
return;
4683
}
4684
if (DestType->isReferenceType()) {
4685
TryReferenceListInitialization(S, Entity, Kind, InitList, Sequence,
4686
TreatUnavailableAsInvalid);
4687
return;
4688
}
4689
4690
if (DestType->isRecordType() &&
4691
!S.isCompleteType(InitList->getBeginLoc(), DestType)) {
4692
Sequence.setIncompleteTypeFailure(DestType);
4693
return;
4694
}
4695
4696
// C++20 [dcl.init.list]p3:
4697
// - If the braced-init-list contains a designated-initializer-list, T shall
4698
// be an aggregate class. [...] Aggregate initialization is performed.
4699
//
4700
// We allow arrays here too in order to support array designators.
4701
//
4702
// FIXME: This check should precede the handling of reference initialization.
4703
// We follow other compilers in allowing things like 'Aggr &&a = {.x = 1};'
4704
// as a tentative DR resolution.
4705
bool IsDesignatedInit = InitList->hasDesignatedInit();
4706
if (!DestType->isAggregateType() && IsDesignatedInit) {
4707
Sequence.SetFailed(
4708
InitializationSequence::FK_DesignatedInitForNonAggregate);
4709
return;
4710
}
4711
4712
// C++11 [dcl.init.list]p3, per DR1467:
4713
// - If T is a class type and the initializer list has a single element of
4714
// type cv U, where U is T or a class derived from T, the object is
4715
// initialized from that element (by copy-initialization for
4716
// copy-list-initialization, or by direct-initialization for
4717
// direct-list-initialization).
4718
// - Otherwise, if T is a character array and the initializer list has a
4719
// single element that is an appropriately-typed string literal
4720
// (8.5.2 [dcl.init.string]), initialization is performed as described
4721
// in that section.
4722
// - Otherwise, if T is an aggregate, [...] (continue below).
4723
if (S.getLangOpts().CPlusPlus11 && InitList->getNumInits() == 1 &&
4724
!IsDesignatedInit) {
4725
if (DestType->isRecordType()) {
4726
QualType InitType = InitList->getInit(0)->getType();
4727
if (S.Context.hasSameUnqualifiedType(InitType, DestType) ||
4728
S.IsDerivedFrom(InitList->getBeginLoc(), InitType, DestType)) {
4729
Expr *InitListAsExpr = InitList;
4730
TryConstructorInitialization(S, Entity, Kind, InitListAsExpr, DestType,
4731
DestType, Sequence,
4732
/*InitListSyntax*/false,
4733
/*IsInitListCopy*/true);
4734
return;
4735
}
4736
}
4737
if (const ArrayType *DestAT = S.Context.getAsArrayType(DestType)) {
4738
Expr *SubInit[1] = {InitList->getInit(0)};
4739
if (!isa<VariableArrayType>(DestAT) &&
4740
IsStringInit(SubInit[0], DestAT, S.Context) == SIF_None) {
4741
InitializationKind SubKind =
4742
Kind.getKind() == InitializationKind::IK_DirectList
4743
? InitializationKind::CreateDirect(Kind.getLocation(),
4744
InitList->getLBraceLoc(),
4745
InitList->getRBraceLoc())
4746
: Kind;
4747
Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
4748
/*TopLevelOfInitList*/ true,
4749
TreatUnavailableAsInvalid);
4750
4751
// TryStringLiteralInitialization() (in InitializeFrom()) will fail if
4752
// the element is not an appropriately-typed string literal, in which
4753
// case we should proceed as in C++11 (below).
4754
if (Sequence) {
4755
Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
4756
return;
4757
}
4758
}
4759
}
4760
}
4761
4762
// C++11 [dcl.init.list]p3:
4763
// - If T is an aggregate, aggregate initialization is performed.
4764
if ((DestType->isRecordType() && !DestType->isAggregateType()) ||
4765
(S.getLangOpts().CPlusPlus11 &&
4766
S.isStdInitializerList(DestType, nullptr) && !IsDesignatedInit)) {
4767
if (S.getLangOpts().CPlusPlus11) {
4768
// - Otherwise, if the initializer list has no elements and T is a
4769
// class type with a default constructor, the object is
4770
// value-initialized.
4771
if (InitList->getNumInits() == 0) {
4772
CXXRecordDecl *RD = DestType->getAsCXXRecordDecl();
4773
if (S.LookupDefaultConstructor(RD)) {
4774
TryValueInitialization(S, Entity, Kind, Sequence, InitList);
4775
return;
4776
}
4777
}
4778
4779
// - Otherwise, if T is a specialization of std::initializer_list<E>,
4780
// an initializer_list object constructed [...]
4781
if (TryInitializerListConstruction(S, InitList, DestType, Sequence,
4782
TreatUnavailableAsInvalid))
4783
return;
4784
4785
// - Otherwise, if T is a class type, constructors are considered.
4786
Expr *InitListAsExpr = InitList;
4787
TryConstructorInitialization(S, Entity, Kind, InitListAsExpr, DestType,
4788
DestType, Sequence, /*InitListSyntax*/true);
4789
} else
4790
Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType);
4791
return;
4792
}
4793
4794
if (S.getLangOpts().CPlusPlus && !DestType->isAggregateType() &&
4795
InitList->getNumInits() == 1) {
4796
Expr *E = InitList->getInit(0);
4797
4798
// - Otherwise, if T is an enumeration with a fixed underlying type,
4799
// the initializer-list has a single element v, and the initialization
4800
// is direct-list-initialization, the object is initialized with the
4801
// value T(v); if a narrowing conversion is required to convert v to
4802
// the underlying type of T, the program is ill-formed.
4803
auto *ET = DestType->getAs<EnumType>();
4804
if (S.getLangOpts().CPlusPlus17 &&
4805
Kind.getKind() == InitializationKind::IK_DirectList &&
4806
ET && ET->getDecl()->isFixed() &&
4807
!S.Context.hasSameUnqualifiedType(E->getType(), DestType) &&
4808
(E->getType()->isIntegralOrUnscopedEnumerationType() ||
4809
E->getType()->isFloatingType())) {
4810
// There are two ways that T(v) can work when T is an enumeration type.
4811
// If there is either an implicit conversion sequence from v to T or
4812
// a conversion function that can convert from v to T, then we use that.
4813
// Otherwise, if v is of integral, unscoped enumeration, or floating-point
4814
// type, it is converted to the enumeration type via its underlying type.
4815
// There is no overlap possible between these two cases (except when the
4816
// source value is already of the destination type), and the first
4817
// case is handled by the general case for single-element lists below.
4818
ImplicitConversionSequence ICS;
4819
ICS.setStandard();
4820
ICS.Standard.setAsIdentityConversion();
4821
if (!E->isPRValue())
4822
ICS.Standard.First = ICK_Lvalue_To_Rvalue;
4823
// If E is of a floating-point type, then the conversion is ill-formed
4824
// due to narrowing, but go through the motions in order to produce the
4825
// right diagnostic.
4826
ICS.Standard.Second = E->getType()->isFloatingType()
4827
? ICK_Floating_Integral
4828
: ICK_Integral_Conversion;
4829
ICS.Standard.setFromType(E->getType());
4830
ICS.Standard.setToType(0, E->getType());
4831
ICS.Standard.setToType(1, DestType);
4832
ICS.Standard.setToType(2, DestType);
4833
Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2),
4834
/*TopLevelOfInitList*/true);
4835
Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
4836
return;
4837
}
4838
4839
// - Otherwise, if the initializer list has a single element of type E
4840
// [...references are handled above...], the object or reference is
4841
// initialized from that element (by copy-initialization for
4842
// copy-list-initialization, or by direct-initialization for
4843
// direct-list-initialization); if a narrowing conversion is required
4844
// to convert the element to T, the program is ill-formed.
4845
//
4846
// Per core-24034, this is direct-initialization if we were performing
4847
// direct-list-initialization and copy-initialization otherwise.
4848
// We can't use InitListChecker for this, because it always performs
4849
// copy-initialization. This only matters if we might use an 'explicit'
4850
// conversion operator, or for the special case conversion of nullptr_t to
4851
// bool, so we only need to handle those cases.
4852
//
4853
// FIXME: Why not do this in all cases?
4854
Expr *Init = InitList->getInit(0);
4855
if (Init->getType()->isRecordType() ||
4856
(Init->getType()->isNullPtrType() && DestType->isBooleanType())) {
4857
InitializationKind SubKind =
4858
Kind.getKind() == InitializationKind::IK_DirectList
4859
? InitializationKind::CreateDirect(Kind.getLocation(),
4860
InitList->getLBraceLoc(),
4861
InitList->getRBraceLoc())
4862
: Kind;
4863
Expr *SubInit[1] = { Init };
4864
Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
4865
/*TopLevelOfInitList*/true,
4866
TreatUnavailableAsInvalid);
4867
if (Sequence)
4868
Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
4869
return;
4870
}
4871
}
4872
4873
InitListChecker CheckInitList(S, Entity, InitList,
4874
DestType, /*VerifyOnly=*/true, TreatUnavailableAsInvalid);
4875
if (CheckInitList.HadError()) {
4876
Sequence.SetFailed(InitializationSequence::FK_ListInitializationFailed);
4877
return;
4878
}
4879
4880
// Add the list initialization step with the built init list.
4881
Sequence.AddListInitializationStep(DestType);
4882
}
4883
4884
/// Try a reference initialization that involves calling a conversion
4885
/// function.
4886
static OverloadingResult TryRefInitWithConversionFunction(
4887
Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
4888
Expr *Initializer, bool AllowRValues, bool IsLValueRef,
4889
InitializationSequence &Sequence) {
4890
QualType DestType = Entity.getType();
4891
QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
4892
QualType T1 = cv1T1.getUnqualifiedType();
4893
QualType cv2T2 = Initializer->getType();
4894
QualType T2 = cv2T2.getUnqualifiedType();
4895
4896
assert(!S.CompareReferenceRelationship(Initializer->getBeginLoc(), T1, T2) &&
4897
"Must have incompatible references when binding via conversion");
4898
4899
// Build the candidate set directly in the initialization sequence
4900
// structure, so that it will persist if we fail.
4901
OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
4902
CandidateSet.clear(OverloadCandidateSet::CSK_InitByUserDefinedConversion);
4903
4904
// Determine whether we are allowed to call explicit conversion operators.
4905
// Note that none of [over.match.copy], [over.match.conv], nor
4906
// [over.match.ref] permit an explicit constructor to be chosen when
4907
// initializing a reference, not even for direct-initialization.
4908
bool AllowExplicitCtors = false;
4909
bool AllowExplicitConvs = Kind.allowExplicitConversionFunctionsInRefBinding();
4910
4911
const RecordType *T1RecordType = nullptr;
4912
if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) &&
4913
S.isCompleteType(Kind.getLocation(), T1)) {
4914
// The type we're converting to is a class type. Enumerate its constructors
4915
// to see if there is a suitable conversion.
4916
CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl());
4917
4918
for (NamedDecl *D : S.LookupConstructors(T1RecordDecl)) {
4919
auto Info = getConstructorInfo(D);
4920
if (!Info.Constructor)
4921
continue;
4922
4923
if (!Info.Constructor->isInvalidDecl() &&
4924
Info.Constructor->isConvertingConstructor(/*AllowExplicit*/true)) {
4925
if (Info.ConstructorTmpl)
4926
S.AddTemplateOverloadCandidate(
4927
Info.ConstructorTmpl, Info.FoundDecl,
4928
/*ExplicitArgs*/ nullptr, Initializer, CandidateSet,
4929
/*SuppressUserConversions=*/true,
4930
/*PartialOverloading*/ false, AllowExplicitCtors);
4931
else
4932
S.AddOverloadCandidate(
4933
Info.Constructor, Info.FoundDecl, Initializer, CandidateSet,
4934
/*SuppressUserConversions=*/true,
4935
/*PartialOverloading*/ false, AllowExplicitCtors);
4936
}
4937
}
4938
}
4939
if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl())
4940
return OR_No_Viable_Function;
4941
4942
const RecordType *T2RecordType = nullptr;
4943
if ((T2RecordType = T2->getAs<RecordType>()) &&
4944
S.isCompleteType(Kind.getLocation(), T2)) {
4945
// The type we're converting from is a class type, enumerate its conversion
4946
// functions.
4947
CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl());
4948
4949
const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
4950
for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4951
NamedDecl *D = *I;
4952
CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
4953
if (isa<UsingShadowDecl>(D))
4954
D = cast<UsingShadowDecl>(D)->getTargetDecl();
4955
4956
FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
4957
CXXConversionDecl *Conv;
4958
if (ConvTemplate)
4959
Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
4960
else
4961
Conv = cast<CXXConversionDecl>(D);
4962
4963
// If the conversion function doesn't return a reference type,
4964
// it can't be considered for this conversion unless we're allowed to
4965
// consider rvalues.
4966
// FIXME: Do we need to make sure that we only consider conversion
4967
// candidates with reference-compatible results? That might be needed to
4968
// break recursion.
4969
if ((AllowRValues ||
4970
Conv->getConversionType()->isLValueReferenceType())) {
4971
if (ConvTemplate)
4972
S.AddTemplateConversionCandidate(
4973
ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
4974
CandidateSet,
4975
/*AllowObjCConversionOnExplicit=*/false, AllowExplicitConvs);
4976
else
4977
S.AddConversionCandidate(
4978
Conv, I.getPair(), ActingDC, Initializer, DestType, CandidateSet,
4979
/*AllowObjCConversionOnExplicit=*/false, AllowExplicitConvs);
4980
}
4981
}
4982
}
4983
if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl())
4984
return OR_No_Viable_Function;
4985
4986
SourceLocation DeclLoc = Initializer->getBeginLoc();
4987
4988
// Perform overload resolution. If it fails, return the failed result.
4989
OverloadCandidateSet::iterator Best;
4990
if (OverloadingResult Result
4991
= CandidateSet.BestViableFunction(S, DeclLoc, Best))
4992
return Result;
4993
4994
FunctionDecl *Function = Best->Function;
4995
// This is the overload that will be used for this initialization step if we
4996
// use this initialization. Mark it as referenced.
4997
Function->setReferenced();
4998
4999
// Compute the returned type and value kind of the conversion.
5000
QualType cv3T3;
5001
if (isa<CXXConversionDecl>(Function))
5002
cv3T3 = Function->getReturnType();
5003
else
5004
cv3T3 = T1;
5005
5006
ExprValueKind VK = VK_PRValue;
5007
if (cv3T3->isLValueReferenceType())
5008
VK = VK_LValue;
5009
else if (const auto *RRef = cv3T3->getAs<RValueReferenceType>())
5010
VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue;
5011
cv3T3 = cv3T3.getNonLValueExprType(S.Context);
5012
5013
// Add the user-defined conversion step.
5014
bool HadMultipleCandidates = (CandidateSet.size() > 1);
5015
Sequence.AddUserConversionStep(Function, Best->FoundDecl, cv3T3,
5016
HadMultipleCandidates);
5017
5018
// Determine whether we'll need to perform derived-to-base adjustments or
5019
// other conversions.
5020
Sema::ReferenceConversions RefConv;
5021
Sema::ReferenceCompareResult NewRefRelationship =
5022
S.CompareReferenceRelationship(DeclLoc, T1, cv3T3, &RefConv);
5023
5024
// Add the final conversion sequence, if necessary.
5025
if (NewRefRelationship == Sema::Ref_Incompatible) {
5026
assert(!isa<CXXConstructorDecl>(Function) &&
5027
"should not have conversion after constructor");
5028
5029
ImplicitConversionSequence ICS;
5030
ICS.setStandard();
5031
ICS.Standard = Best->FinalConversion;
5032
Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2));
5033
5034
// Every implicit conversion results in a prvalue, except for a glvalue
5035
// derived-to-base conversion, which we handle below.
5036
cv3T3 = ICS.Standard.getToType(2);
5037
VK = VK_PRValue;
5038
}
5039
5040
// If the converted initializer is a prvalue, its type T4 is adjusted to
5041
// type "cv1 T4" and the temporary materialization conversion is applied.
5042
//
5043
// We adjust the cv-qualifications to match the reference regardless of
5044
// whether we have a prvalue so that the AST records the change. In this
5045
// case, T4 is "cv3 T3".
5046
QualType cv1T4 = S.Context.getQualifiedType(cv3T3, cv1T1.getQualifiers());
5047
if (cv1T4.getQualifiers() != cv3T3.getQualifiers())
5048
Sequence.AddQualificationConversionStep(cv1T4, VK);
5049
Sequence.AddReferenceBindingStep(cv1T4, VK == VK_PRValue);
5050
VK = IsLValueRef ? VK_LValue : VK_XValue;
5051
5052
if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5053
Sequence.AddDerivedToBaseCastStep(cv1T1, VK);
5054
else if (RefConv & Sema::ReferenceConversions::ObjC)
5055
Sequence.AddObjCObjectConversionStep(cv1T1);
5056
else if (RefConv & Sema::ReferenceConversions::Function)
5057
Sequence.AddFunctionReferenceConversionStep(cv1T1);
5058
else if (RefConv & Sema::ReferenceConversions::Qualification) {
5059
if (!S.Context.hasSameType(cv1T4, cv1T1))
5060
Sequence.AddQualificationConversionStep(cv1T1, VK);
5061
}
5062
5063
return OR_Success;
5064
}
5065
5066
static void CheckCXX98CompatAccessibleCopy(Sema &S,
5067
const InitializedEntity &Entity,
5068
Expr *CurInitExpr);
5069
5070
/// Attempt reference initialization (C++0x [dcl.init.ref])
5071
static void TryReferenceInitialization(Sema &S, const InitializedEntity &Entity,
5072
const InitializationKind &Kind,
5073
Expr *Initializer,
5074
InitializationSequence &Sequence,
5075
bool TopLevelOfInitList) {
5076
QualType DestType = Entity.getType();
5077
QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
5078
Qualifiers T1Quals;
5079
QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
5080
QualType cv2T2 = S.getCompletedType(Initializer);
5081
Qualifiers T2Quals;
5082
QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
5083
5084
// If the initializer is the address of an overloaded function, try
5085
// to resolve the overloaded function. If all goes well, T2 is the
5086
// type of the resulting function.
5087
if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2,
5088
T1, Sequence))
5089
return;
5090
5091
// Delegate everything else to a subfunction.
5092
TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
5093
T1Quals, cv2T2, T2, T2Quals, Sequence,
5094
TopLevelOfInitList);
5095
}
5096
5097
/// Determine whether an expression is a non-referenceable glvalue (one to
5098
/// which a reference can never bind). Attempting to bind a reference to
5099
/// such a glvalue will always create a temporary.
5100
static bool isNonReferenceableGLValue(Expr *E) {
5101
return E->refersToBitField() || E->refersToVectorElement() ||
5102
E->refersToMatrixElement();
5103
}
5104
5105
/// Reference initialization without resolving overloaded functions.
5106
///
5107
/// We also can get here in C if we call a builtin which is declared as
5108
/// a function with a parameter of reference type (such as __builtin_va_end()).
5109
static void TryReferenceInitializationCore(Sema &S,
5110
const InitializedEntity &Entity,
5111
const InitializationKind &Kind,
5112
Expr *Initializer,
5113
QualType cv1T1, QualType T1,
5114
Qualifiers T1Quals,
5115
QualType cv2T2, QualType T2,
5116
Qualifiers T2Quals,
5117
InitializationSequence &Sequence,
5118
bool TopLevelOfInitList) {
5119
QualType DestType = Entity.getType();
5120
SourceLocation DeclLoc = Initializer->getBeginLoc();
5121
5122
// Compute some basic properties of the types and the initializer.
5123
bool isLValueRef = DestType->isLValueReferenceType();
5124
bool isRValueRef = !isLValueRef;
5125
Expr::Classification InitCategory = Initializer->Classify(S.Context);
5126
5127
Sema::ReferenceConversions RefConv;
5128
Sema::ReferenceCompareResult RefRelationship =
5129
S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, &RefConv);
5130
5131
// C++0x [dcl.init.ref]p5:
5132
// A reference to type "cv1 T1" is initialized by an expression of type
5133
// "cv2 T2" as follows:
5134
//
5135
// - If the reference is an lvalue reference and the initializer
5136
// expression
5137
// Note the analogous bullet points for rvalue refs to functions. Because
5138
// there are no function rvalues in C++, rvalue refs to functions are treated
5139
// like lvalue refs.
5140
OverloadingResult ConvOvlResult = OR_Success;
5141
bool T1Function = T1->isFunctionType();
5142
if (isLValueRef || T1Function) {
5143
if (InitCategory.isLValue() && !isNonReferenceableGLValue(Initializer) &&
5144
(RefRelationship == Sema::Ref_Compatible ||
5145
(Kind.isCStyleOrFunctionalCast() &&
5146
RefRelationship == Sema::Ref_Related))) {
5147
// - is an lvalue (but is not a bit-field), and "cv1 T1" is
5148
// reference-compatible with "cv2 T2," or
5149
if (RefConv & (Sema::ReferenceConversions::DerivedToBase |
5150
Sema::ReferenceConversions::ObjC)) {
5151
// If we're converting the pointee, add any qualifiers first;
5152
// these qualifiers must all be top-level, so just convert to "cv1 T2".
5153
if (RefConv & (Sema::ReferenceConversions::Qualification))
5154
Sequence.AddQualificationConversionStep(
5155
S.Context.getQualifiedType(T2, T1Quals),
5156
Initializer->getValueKind());
5157
if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5158
Sequence.AddDerivedToBaseCastStep(cv1T1, VK_LValue);
5159
else
5160
Sequence.AddObjCObjectConversionStep(cv1T1);
5161
} else if (RefConv & Sema::ReferenceConversions::Qualification) {
5162
// Perform a (possibly multi-level) qualification conversion.
5163
Sequence.AddQualificationConversionStep(cv1T1,
5164
Initializer->getValueKind());
5165
} else if (RefConv & Sema::ReferenceConversions::Function) {
5166
Sequence.AddFunctionReferenceConversionStep(cv1T1);
5167
}
5168
5169
// We only create a temporary here when binding a reference to a
5170
// bit-field or vector element. Those cases are't supposed to be
5171
// handled by this bullet, but the outcome is the same either way.
5172
Sequence.AddReferenceBindingStep(cv1T1, false);
5173
return;
5174
}
5175
5176
// - has a class type (i.e., T2 is a class type), where T1 is not
5177
// reference-related to T2, and can be implicitly converted to an
5178
// lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible
5179
// with "cv3 T3" (this conversion is selected by enumerating the
5180
// applicable conversion functions (13.3.1.6) and choosing the best
5181
// one through overload resolution (13.3)),
5182
// If we have an rvalue ref to function type here, the rhs must be
5183
// an rvalue. DR1287 removed the "implicitly" here.
5184
if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() &&
5185
(isLValueRef || InitCategory.isRValue())) {
5186
if (S.getLangOpts().CPlusPlus) {
5187
// Try conversion functions only for C++.
5188
ConvOvlResult = TryRefInitWithConversionFunction(
5189
S, Entity, Kind, Initializer, /*AllowRValues*/ isRValueRef,
5190
/*IsLValueRef*/ isLValueRef, Sequence);
5191
if (ConvOvlResult == OR_Success)
5192
return;
5193
if (ConvOvlResult != OR_No_Viable_Function)
5194
Sequence.SetOverloadFailure(
5195
InitializationSequence::FK_ReferenceInitOverloadFailed,
5196
ConvOvlResult);
5197
} else {
5198
ConvOvlResult = OR_No_Viable_Function;
5199
}
5200
}
5201
}
5202
5203
// - Otherwise, the reference shall be an lvalue reference to a
5204
// non-volatile const type (i.e., cv1 shall be const), or the reference
5205
// shall be an rvalue reference.
5206
// For address spaces, we interpret this to mean that an addr space
5207
// of a reference "cv1 T1" is a superset of addr space of "cv2 T2".
5208
if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile() &&
5209
T1Quals.isAddressSpaceSupersetOf(T2Quals))) {
5210
if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy)
5211
Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
5212
else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
5213
Sequence.SetOverloadFailure(
5214
InitializationSequence::FK_ReferenceInitOverloadFailed,
5215
ConvOvlResult);
5216
else if (!InitCategory.isLValue())
5217
Sequence.SetFailed(
5218
T1Quals.isAddressSpaceSupersetOf(T2Quals)
5219
? InitializationSequence::
5220
FK_NonConstLValueReferenceBindingToTemporary
5221
: InitializationSequence::FK_ReferenceInitDropsQualifiers);
5222
else {
5223
InitializationSequence::FailureKind FK;
5224
switch (RefRelationship) {
5225
case Sema::Ref_Compatible:
5226
if (Initializer->refersToBitField())
5227
FK = InitializationSequence::
5228
FK_NonConstLValueReferenceBindingToBitfield;
5229
else if (Initializer->refersToVectorElement())
5230
FK = InitializationSequence::
5231
FK_NonConstLValueReferenceBindingToVectorElement;
5232
else if (Initializer->refersToMatrixElement())
5233
FK = InitializationSequence::
5234
FK_NonConstLValueReferenceBindingToMatrixElement;
5235
else
5236
llvm_unreachable("unexpected kind of compatible initializer");
5237
break;
5238
case Sema::Ref_Related:
5239
FK = InitializationSequence::FK_ReferenceInitDropsQualifiers;
5240
break;
5241
case Sema::Ref_Incompatible:
5242
FK = InitializationSequence::
5243
FK_NonConstLValueReferenceBindingToUnrelated;
5244
break;
5245
}
5246
Sequence.SetFailed(FK);
5247
}
5248
return;
5249
}
5250
5251
// - If the initializer expression
5252
// - is an
5253
// [<=14] xvalue (but not a bit-field), class prvalue, array prvalue, or
5254
// [1z] rvalue (but not a bit-field) or
5255
// function lvalue and "cv1 T1" is reference-compatible with "cv2 T2"
5256
//
5257
// Note: functions are handled above and below rather than here...
5258
if (!T1Function &&
5259
(RefRelationship == Sema::Ref_Compatible ||
5260
(Kind.isCStyleOrFunctionalCast() &&
5261
RefRelationship == Sema::Ref_Related)) &&
5262
((InitCategory.isXValue() && !isNonReferenceableGLValue(Initializer)) ||
5263
(InitCategory.isPRValue() &&
5264
(S.getLangOpts().CPlusPlus17 || T2->isRecordType() ||
5265
T2->isArrayType())))) {
5266
ExprValueKind ValueKind = InitCategory.isXValue() ? VK_XValue : VK_PRValue;
5267
if (InitCategory.isPRValue() && T2->isRecordType()) {
5268
// The corresponding bullet in C++03 [dcl.init.ref]p5 gives the
5269
// compiler the freedom to perform a copy here or bind to the
5270
// object, while C++0x requires that we bind directly to the
5271
// object. Hence, we always bind to the object without making an
5272
// extra copy. However, in C++03 requires that we check for the
5273
// presence of a suitable copy constructor:
5274
//
5275
// The constructor that would be used to make the copy shall
5276
// be callable whether or not the copy is actually done.
5277
if (!S.getLangOpts().CPlusPlus11 && !S.getLangOpts().MicrosoftExt)
5278
Sequence.AddExtraneousCopyToTemporary(cv2T2);
5279
else if (S.getLangOpts().CPlusPlus11)
5280
CheckCXX98CompatAccessibleCopy(S, Entity, Initializer);
5281
}
5282
5283
// C++1z [dcl.init.ref]/5.2.1.2:
5284
// If the converted initializer is a prvalue, its type T4 is adjusted
5285
// to type "cv1 T4" and the temporary materialization conversion is
5286
// applied.
5287
// Postpone address space conversions to after the temporary materialization
5288
// conversion to allow creating temporaries in the alloca address space.
5289
auto T1QualsIgnoreAS = T1Quals;
5290
auto T2QualsIgnoreAS = T2Quals;
5291
if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
5292
T1QualsIgnoreAS.removeAddressSpace();
5293
T2QualsIgnoreAS.removeAddressSpace();
5294
}
5295
QualType cv1T4 = S.Context.getQualifiedType(cv2T2, T1QualsIgnoreAS);
5296
if (T1QualsIgnoreAS != T2QualsIgnoreAS)
5297
Sequence.AddQualificationConversionStep(cv1T4, ValueKind);
5298
Sequence.AddReferenceBindingStep(cv1T4, ValueKind == VK_PRValue);
5299
ValueKind = isLValueRef ? VK_LValue : VK_XValue;
5300
// Add addr space conversion if required.
5301
if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
5302
auto T4Quals = cv1T4.getQualifiers();
5303
T4Quals.addAddressSpace(T1Quals.getAddressSpace());
5304
QualType cv1T4WithAS = S.Context.getQualifiedType(T2, T4Quals);
5305
Sequence.AddQualificationConversionStep(cv1T4WithAS, ValueKind);
5306
cv1T4 = cv1T4WithAS;
5307
}
5308
5309
// In any case, the reference is bound to the resulting glvalue (or to
5310
// an appropriate base class subobject).
5311
if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5312
Sequence.AddDerivedToBaseCastStep(cv1T1, ValueKind);
5313
else if (RefConv & Sema::ReferenceConversions::ObjC)
5314
Sequence.AddObjCObjectConversionStep(cv1T1);
5315
else if (RefConv & Sema::ReferenceConversions::Qualification) {
5316
if (!S.Context.hasSameType(cv1T4, cv1T1))
5317
Sequence.AddQualificationConversionStep(cv1T1, ValueKind);
5318
}
5319
return;
5320
}
5321
5322
// - has a class type (i.e., T2 is a class type), where T1 is not
5323
// reference-related to T2, and can be implicitly converted to an
5324
// xvalue, class prvalue, or function lvalue of type "cv3 T3",
5325
// where "cv1 T1" is reference-compatible with "cv3 T3",
5326
//
5327
// DR1287 removes the "implicitly" here.
5328
if (T2->isRecordType()) {
5329
if (RefRelationship == Sema::Ref_Incompatible) {
5330
ConvOvlResult = TryRefInitWithConversionFunction(
5331
S, Entity, Kind, Initializer, /*AllowRValues*/ true,
5332
/*IsLValueRef*/ isLValueRef, Sequence);
5333
if (ConvOvlResult)
5334
Sequence.SetOverloadFailure(
5335
InitializationSequence::FK_ReferenceInitOverloadFailed,
5336
ConvOvlResult);
5337
5338
return;
5339
}
5340
5341
if (RefRelationship == Sema::Ref_Compatible &&
5342
isRValueRef && InitCategory.isLValue()) {
5343
Sequence.SetFailed(
5344
InitializationSequence::FK_RValueReferenceBindingToLValue);
5345
return;
5346
}
5347
5348
Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers);
5349
return;
5350
}
5351
5352
// - Otherwise, a temporary of type "cv1 T1" is created and initialized
5353
// from the initializer expression using the rules for a non-reference
5354
// copy-initialization (8.5). The reference is then bound to the
5355
// temporary. [...]
5356
5357
// Ignore address space of reference type at this point and perform address
5358
// space conversion after the reference binding step.
5359
QualType cv1T1IgnoreAS =
5360
T1Quals.hasAddressSpace()
5361
? S.Context.getQualifiedType(T1, T1Quals.withoutAddressSpace())
5362
: cv1T1;
5363
5364
InitializedEntity TempEntity =
5365
InitializedEntity::InitializeTemporary(cv1T1IgnoreAS);
5366
5367
// FIXME: Why do we use an implicit conversion here rather than trying
5368
// copy-initialization?
5369
ImplicitConversionSequence ICS
5370
= S.TryImplicitConversion(Initializer, TempEntity.getType(),
5371
/*SuppressUserConversions=*/false,
5372
Sema::AllowedExplicit::None,
5373
/*FIXME:InOverloadResolution=*/false,
5374
/*CStyle=*/Kind.isCStyleOrFunctionalCast(),
5375
/*AllowObjCWritebackConversion=*/false);
5376
5377
if (ICS.isBad()) {
5378
// FIXME: Use the conversion function set stored in ICS to turn
5379
// this into an overloading ambiguity diagnostic. However, we need
5380
// to keep that set as an OverloadCandidateSet rather than as some
5381
// other kind of set.
5382
if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
5383
Sequence.SetOverloadFailure(
5384
InitializationSequence::FK_ReferenceInitOverloadFailed,
5385
ConvOvlResult);
5386
else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy)
5387
Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
5388
else
5389
Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed);
5390
return;
5391
} else {
5392
Sequence.AddConversionSequenceStep(ICS, TempEntity.getType(),
5393
TopLevelOfInitList);
5394
}
5395
5396
// [...] If T1 is reference-related to T2, cv1 must be the
5397
// same cv-qualification as, or greater cv-qualification
5398
// than, cv2; otherwise, the program is ill-formed.
5399
unsigned T1CVRQuals = T1Quals.getCVRQualifiers();
5400
unsigned T2CVRQuals = T2Quals.getCVRQualifiers();
5401
if (RefRelationship == Sema::Ref_Related &&
5402
((T1CVRQuals | T2CVRQuals) != T1CVRQuals ||
5403
!T1Quals.isAddressSpaceSupersetOf(T2Quals))) {
5404
Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers);
5405
return;
5406
}
5407
5408
// [...] If T1 is reference-related to T2 and the reference is an rvalue
5409
// reference, the initializer expression shall not be an lvalue.
5410
if (RefRelationship >= Sema::Ref_Related && !isLValueRef &&
5411
InitCategory.isLValue()) {
5412
Sequence.SetFailed(
5413
InitializationSequence::FK_RValueReferenceBindingToLValue);
5414
return;
5415
}
5416
5417
Sequence.AddReferenceBindingStep(cv1T1IgnoreAS, /*BindingTemporary=*/true);
5418
5419
if (T1Quals.hasAddressSpace()) {
5420
if (!Qualifiers::isAddressSpaceSupersetOf(T1Quals.getAddressSpace(),
5421
LangAS::Default)) {
5422
Sequence.SetFailed(
5423
InitializationSequence::FK_ReferenceAddrspaceMismatchTemporary);
5424
return;
5425
}
5426
Sequence.AddQualificationConversionStep(cv1T1, isLValueRef ? VK_LValue
5427
: VK_XValue);
5428
}
5429
}
5430
5431
/// Attempt character array initialization from a string literal
5432
/// (C++ [dcl.init.string], C99 6.7.8).
5433
static void TryStringLiteralInitialization(Sema &S,
5434
const InitializedEntity &Entity,
5435
const InitializationKind &Kind,
5436
Expr *Initializer,
5437
InitializationSequence &Sequence) {
5438
Sequence.AddStringInitStep(Entity.getType());
5439
}
5440
5441
/// Attempt value initialization (C++ [dcl.init]p7).
5442
static void TryValueInitialization(Sema &S,
5443
const InitializedEntity &Entity,
5444
const InitializationKind &Kind,
5445
InitializationSequence &Sequence,
5446
InitListExpr *InitList) {
5447
assert((!InitList || InitList->getNumInits() == 0) &&
5448
"Shouldn't use value-init for non-empty init lists");
5449
5450
// C++98 [dcl.init]p5, C++11 [dcl.init]p7:
5451
//
5452
// To value-initialize an object of type T means:
5453
QualType T = Entity.getType();
5454
5455
// -- if T is an array type, then each element is value-initialized;
5456
T = S.Context.getBaseElementType(T);
5457
5458
if (const RecordType *RT = T->getAs<RecordType>()) {
5459
if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
5460
bool NeedZeroInitialization = true;
5461
// C++98:
5462
// -- if T is a class type (clause 9) with a user-declared constructor
5463
// (12.1), then the default constructor for T is called (and the
5464
// initialization is ill-formed if T has no accessible default
5465
// constructor);
5466
// C++11:
5467
// -- if T is a class type (clause 9) with either no default constructor
5468
// (12.1 [class.ctor]) or a default constructor that is user-provided
5469
// or deleted, then the object is default-initialized;
5470
//
5471
// Note that the C++11 rule is the same as the C++98 rule if there are no
5472
// defaulted or deleted constructors, so we just use it unconditionally.
5473
CXXConstructorDecl *CD = S.LookupDefaultConstructor(ClassDecl);
5474
if (!CD || !CD->getCanonicalDecl()->isDefaulted() || CD->isDeleted())
5475
NeedZeroInitialization = false;
5476
5477
// -- if T is a (possibly cv-qualified) non-union class type without a
5478
// user-provided or deleted default constructor, then the object is
5479
// zero-initialized and, if T has a non-trivial default constructor,
5480
// default-initialized;
5481
// The 'non-union' here was removed by DR1502. The 'non-trivial default
5482
// constructor' part was removed by DR1507.
5483
if (NeedZeroInitialization)
5484
Sequence.AddZeroInitializationStep(Entity.getType());
5485
5486
// C++03:
5487
// -- if T is a non-union class type without a user-declared constructor,
5488
// then every non-static data member and base class component of T is
5489
// value-initialized;
5490
// [...] A program that calls for [...] value-initialization of an
5491
// entity of reference type is ill-formed.
5492
//
5493
// C++11 doesn't need this handling, because value-initialization does not
5494
// occur recursively there, and the implicit default constructor is
5495
// defined as deleted in the problematic cases.
5496
if (!S.getLangOpts().CPlusPlus11 &&
5497
ClassDecl->hasUninitializedReferenceMember()) {
5498
Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForReference);
5499
return;
5500
}
5501
5502
// If this is list-value-initialization, pass the empty init list on when
5503
// building the constructor call. This affects the semantics of a few
5504
// things (such as whether an explicit default constructor can be called).
5505
Expr *InitListAsExpr = InitList;
5506
MultiExprArg Args(&InitListAsExpr, InitList ? 1 : 0);
5507
bool InitListSyntax = InitList;
5508
5509
// FIXME: Instead of creating a CXXConstructExpr of array type here,
5510
// wrap a class-typed CXXConstructExpr in an ArrayInitLoopExpr.
5511
return TryConstructorInitialization(
5512
S, Entity, Kind, Args, T, Entity.getType(), Sequence, InitListSyntax);
5513
}
5514
}
5515
5516
Sequence.AddZeroInitializationStep(Entity.getType());
5517
}
5518
5519
/// Attempt default initialization (C++ [dcl.init]p6).
5520
static void TryDefaultInitialization(Sema &S,
5521
const InitializedEntity &Entity,
5522
const InitializationKind &Kind,
5523
InitializationSequence &Sequence) {
5524
assert(Kind.getKind() == InitializationKind::IK_Default);
5525
5526
// C++ [dcl.init]p6:
5527
// To default-initialize an object of type T means:
5528
// - if T is an array type, each element is default-initialized;
5529
QualType DestType = S.Context.getBaseElementType(Entity.getType());
5530
5531
// - if T is a (possibly cv-qualified) class type (Clause 9), the default
5532
// constructor for T is called (and the initialization is ill-formed if
5533
// T has no accessible default constructor);
5534
if (DestType->isRecordType() && S.getLangOpts().CPlusPlus) {
5535
TryConstructorInitialization(S, Entity, Kind, std::nullopt, DestType,
5536
Entity.getType(), Sequence);
5537
return;
5538
}
5539
5540
// - otherwise, no initialization is performed.
5541
5542
// If a program calls for the default initialization of an object of
5543
// a const-qualified type T, T shall be a class type with a user-provided
5544
// default constructor.
5545
if (DestType.isConstQualified() && S.getLangOpts().CPlusPlus) {
5546
if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
5547
Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
5548
return;
5549
}
5550
5551
// If the destination type has a lifetime property, zero-initialize it.
5552
if (DestType.getQualifiers().hasObjCLifetime()) {
5553
Sequence.AddZeroInitializationStep(Entity.getType());
5554
return;
5555
}
5556
}
5557
5558
static void TryOrBuildParenListInitialization(
5559
Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
5560
ArrayRef<Expr *> Args, InitializationSequence &Sequence, bool VerifyOnly,
5561
ExprResult *Result = nullptr) {
5562
unsigned EntityIndexToProcess = 0;
5563
SmallVector<Expr *, 4> InitExprs;
5564
QualType ResultType;
5565
Expr *ArrayFiller = nullptr;
5566
FieldDecl *InitializedFieldInUnion = nullptr;
5567
5568
auto HandleInitializedEntity = [&](const InitializedEntity &SubEntity,
5569
const InitializationKind &SubKind,
5570
Expr *Arg, Expr **InitExpr = nullptr) {
5571
InitializationSequence IS = InitializationSequence(
5572
S, SubEntity, SubKind, Arg ? MultiExprArg(Arg) : std::nullopt);
5573
5574
if (IS.Failed()) {
5575
if (!VerifyOnly) {
5576
IS.Diagnose(S, SubEntity, SubKind, Arg ? ArrayRef(Arg) : std::nullopt);
5577
} else {
5578
Sequence.SetFailed(
5579
InitializationSequence::FK_ParenthesizedListInitFailed);
5580
}
5581
5582
return false;
5583
}
5584
if (!VerifyOnly) {
5585
ExprResult ER;
5586
ER = IS.Perform(S, SubEntity, SubKind,
5587
Arg ? MultiExprArg(Arg) : std::nullopt);
5588
5589
if (ER.isInvalid())
5590
return false;
5591
5592
if (InitExpr)
5593
*InitExpr = ER.get();
5594
else
5595
InitExprs.push_back(ER.get());
5596
}
5597
return true;
5598
};
5599
5600
if (const ArrayType *AT =
5601
S.getASTContext().getAsArrayType(Entity.getType())) {
5602
SmallVector<InitializedEntity, 4> ElementEntities;
5603
uint64_t ArrayLength;
5604
// C++ [dcl.init]p16.5
5605
// if the destination type is an array, the object is initialized as
5606
// follows. Let x1, . . . , xk be the elements of the expression-list. If
5607
// the destination type is an array of unknown bound, it is defined as
5608
// having k elements.
5609
if (const ConstantArrayType *CAT =
5610
S.getASTContext().getAsConstantArrayType(Entity.getType())) {
5611
ArrayLength = CAT->getZExtSize();
5612
ResultType = Entity.getType();
5613
} else if (const VariableArrayType *VAT =
5614
S.getASTContext().getAsVariableArrayType(Entity.getType())) {
5615
// Braced-initialization of variable array types is not allowed, even if
5616
// the size is greater than or equal to the number of args, so we don't
5617
// allow them to be initialized via parenthesized aggregate initialization
5618
// either.
5619
const Expr *SE = VAT->getSizeExpr();
5620
S.Diag(SE->getBeginLoc(), diag::err_variable_object_no_init)
5621
<< SE->getSourceRange();
5622
return;
5623
} else {
5624
assert(Entity.getType()->isIncompleteArrayType());
5625
ArrayLength = Args.size();
5626
}
5627
EntityIndexToProcess = ArrayLength;
5628
5629
// ...the ith array element is copy-initialized with xi for each
5630
// 1 <= i <= k
5631
for (Expr *E : Args) {
5632
InitializedEntity SubEntity = InitializedEntity::InitializeElement(
5633
S.getASTContext(), EntityIndexToProcess, Entity);
5634
InitializationKind SubKind = InitializationKind::CreateForInit(
5635
E->getExprLoc(), /*isDirectInit=*/false, E);
5636
if (!HandleInitializedEntity(SubEntity, SubKind, E))
5637
return;
5638
}
5639
// ...and value-initialized for each k < i <= n;
5640
if (ArrayLength > Args.size() || Entity.isVariableLengthArrayNew()) {
5641
InitializedEntity SubEntity = InitializedEntity::InitializeElement(
5642
S.getASTContext(), Args.size(), Entity);
5643
InitializationKind SubKind = InitializationKind::CreateValue(
5644
Kind.getLocation(), Kind.getLocation(), Kind.getLocation(), true);
5645
if (!HandleInitializedEntity(SubEntity, SubKind, nullptr, &ArrayFiller))
5646
return;
5647
}
5648
5649
if (ResultType.isNull()) {
5650
ResultType = S.Context.getConstantArrayType(
5651
AT->getElementType(), llvm::APInt(/*numBits=*/32, ArrayLength),
5652
/*SizeExpr=*/nullptr, ArraySizeModifier::Normal, 0);
5653
}
5654
} else if (auto *RT = Entity.getType()->getAs<RecordType>()) {
5655
bool IsUnion = RT->isUnionType();
5656
const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
5657
if (RD->isInvalidDecl()) {
5658
// Exit early to avoid confusion when processing members.
5659
// We do the same for braced list initialization in
5660
// `CheckStructUnionTypes`.
5661
Sequence.SetFailed(
5662
clang::InitializationSequence::FK_ParenthesizedListInitFailed);
5663
return;
5664
}
5665
5666
if (!IsUnion) {
5667
for (const CXXBaseSpecifier &Base : RD->bases()) {
5668
InitializedEntity SubEntity = InitializedEntity::InitializeBase(
5669
S.getASTContext(), &Base, false, &Entity);
5670
if (EntityIndexToProcess < Args.size()) {
5671
// C++ [dcl.init]p16.6.2.2.
5672
// ...the object is initialized is follows. Let e1, ..., en be the
5673
// elements of the aggregate([dcl.init.aggr]). Let x1, ..., xk be
5674
// the elements of the expression-list...The element ei is
5675
// copy-initialized with xi for 1 <= i <= k.
5676
Expr *E = Args[EntityIndexToProcess];
5677
InitializationKind SubKind = InitializationKind::CreateForInit(
5678
E->getExprLoc(), /*isDirectInit=*/false, E);
5679
if (!HandleInitializedEntity(SubEntity, SubKind, E))
5680
return;
5681
} else {
5682
// We've processed all of the args, but there are still base classes
5683
// that have to be initialized.
5684
// C++ [dcl.init]p17.6.2.2
5685
// The remaining elements...otherwise are value initialzed
5686
InitializationKind SubKind = InitializationKind::CreateValue(
5687
Kind.getLocation(), Kind.getLocation(), Kind.getLocation(),
5688
/*IsImplicit=*/true);
5689
if (!HandleInitializedEntity(SubEntity, SubKind, nullptr))
5690
return;
5691
}
5692
EntityIndexToProcess++;
5693
}
5694
}
5695
5696
for (FieldDecl *FD : RD->fields()) {
5697
// Unnamed bitfields should not be initialized at all, either with an arg
5698
// or by default.
5699
if (FD->isUnnamedBitField())
5700
continue;
5701
5702
InitializedEntity SubEntity =
5703
InitializedEntity::InitializeMemberFromParenAggInit(FD);
5704
5705
if (EntityIndexToProcess < Args.size()) {
5706
// ...The element ei is copy-initialized with xi for 1 <= i <= k.
5707
Expr *E = Args[EntityIndexToProcess];
5708
5709
// Incomplete array types indicate flexible array members. Do not allow
5710
// paren list initializations of structs with these members, as GCC
5711
// doesn't either.
5712
if (FD->getType()->isIncompleteArrayType()) {
5713
if (!VerifyOnly) {
5714
S.Diag(E->getBeginLoc(), diag::err_flexible_array_init)
5715
<< SourceRange(E->getBeginLoc(), E->getEndLoc());
5716
S.Diag(FD->getLocation(), diag::note_flexible_array_member) << FD;
5717
}
5718
Sequence.SetFailed(
5719
InitializationSequence::FK_ParenthesizedListInitFailed);
5720
return;
5721
}
5722
5723
InitializationKind SubKind = InitializationKind::CreateForInit(
5724
E->getExprLoc(), /*isDirectInit=*/false, E);
5725
if (!HandleInitializedEntity(SubEntity, SubKind, E))
5726
return;
5727
5728
// Unions should have only one initializer expression, so we bail out
5729
// after processing the first field. If there are more initializers then
5730
// it will be caught when we later check whether EntityIndexToProcess is
5731
// less than Args.size();
5732
if (IsUnion) {
5733
InitializedFieldInUnion = FD;
5734
EntityIndexToProcess = 1;
5735
break;
5736
}
5737
} else {
5738
// We've processed all of the args, but there are still members that
5739
// have to be initialized.
5740
if (FD->hasInClassInitializer()) {
5741
if (!VerifyOnly) {
5742
// C++ [dcl.init]p16.6.2.2
5743
// The remaining elements are initialized with their default
5744
// member initializers, if any
5745
ExprResult DIE = S.BuildCXXDefaultInitExpr(
5746
Kind.getParenOrBraceRange().getEnd(), FD);
5747
if (DIE.isInvalid())
5748
return;
5749
S.checkInitializerLifetime(SubEntity, DIE.get());
5750
InitExprs.push_back(DIE.get());
5751
}
5752
} else {
5753
// C++ [dcl.init]p17.6.2.2
5754
// The remaining elements...otherwise are value initialzed
5755
if (FD->getType()->isReferenceType()) {
5756
Sequence.SetFailed(
5757
InitializationSequence::FK_ParenthesizedListInitFailed);
5758
if (!VerifyOnly) {
5759
SourceRange SR = Kind.getParenOrBraceRange();
5760
S.Diag(SR.getEnd(), diag::err_init_reference_member_uninitialized)
5761
<< FD->getType() << SR;
5762
S.Diag(FD->getLocation(), diag::note_uninit_reference_member);
5763
}
5764
return;
5765
}
5766
InitializationKind SubKind = InitializationKind::CreateValue(
5767
Kind.getLocation(), Kind.getLocation(), Kind.getLocation(), true);
5768
if (!HandleInitializedEntity(SubEntity, SubKind, nullptr))
5769
return;
5770
}
5771
}
5772
EntityIndexToProcess++;
5773
}
5774
ResultType = Entity.getType();
5775
}
5776
5777
// Not all of the args have been processed, so there must've been more args
5778
// than were required to initialize the element.
5779
if (EntityIndexToProcess < Args.size()) {
5780
Sequence.SetFailed(InitializationSequence::FK_ParenthesizedListInitFailed);
5781
if (!VerifyOnly) {
5782
QualType T = Entity.getType();
5783
int InitKind = T->isArrayType() ? 0 : T->isUnionType() ? 3 : 4;
5784
SourceRange ExcessInitSR(Args[EntityIndexToProcess]->getBeginLoc(),
5785
Args.back()->getEndLoc());
5786
S.Diag(Kind.getLocation(), diag::err_excess_initializers)
5787
<< InitKind << ExcessInitSR;
5788
}
5789
return;
5790
}
5791
5792
if (VerifyOnly) {
5793
Sequence.setSequenceKind(InitializationSequence::NormalSequence);
5794
Sequence.AddParenthesizedListInitStep(Entity.getType());
5795
} else if (Result) {
5796
SourceRange SR = Kind.getParenOrBraceRange();
5797
auto *CPLIE = CXXParenListInitExpr::Create(
5798
S.getASTContext(), InitExprs, ResultType, Args.size(),
5799
Kind.getLocation(), SR.getBegin(), SR.getEnd());
5800
if (ArrayFiller)
5801
CPLIE->setArrayFiller(ArrayFiller);
5802
if (InitializedFieldInUnion)
5803
CPLIE->setInitializedFieldInUnion(InitializedFieldInUnion);
5804
*Result = CPLIE;
5805
S.Diag(Kind.getLocation(),
5806
diag::warn_cxx17_compat_aggregate_init_paren_list)
5807
<< Kind.getLocation() << SR << ResultType;
5808
}
5809
}
5810
5811
/// Attempt a user-defined conversion between two types (C++ [dcl.init]),
5812
/// which enumerates all conversion functions and performs overload resolution
5813
/// to select the best.
5814
static void TryUserDefinedConversion(Sema &S,
5815
QualType DestType,
5816
const InitializationKind &Kind,
5817
Expr *Initializer,
5818
InitializationSequence &Sequence,
5819
bool TopLevelOfInitList) {
5820
assert(!DestType->isReferenceType() && "References are handled elsewhere");
5821
QualType SourceType = Initializer->getType();
5822
assert((DestType->isRecordType() || SourceType->isRecordType()) &&
5823
"Must have a class type to perform a user-defined conversion");
5824
5825
// Build the candidate set directly in the initialization sequence
5826
// structure, so that it will persist if we fail.
5827
OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
5828
CandidateSet.clear(OverloadCandidateSet::CSK_InitByUserDefinedConversion);
5829
CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
5830
5831
// Determine whether we are allowed to call explicit constructors or
5832
// explicit conversion operators.
5833
bool AllowExplicit = Kind.AllowExplicit();
5834
5835
if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) {
5836
// The type we're converting to is a class type. Enumerate its constructors
5837
// to see if there is a suitable conversion.
5838
CXXRecordDecl *DestRecordDecl
5839
= cast<CXXRecordDecl>(DestRecordType->getDecl());
5840
5841
// Try to complete the type we're converting to.
5842
if (S.isCompleteType(Kind.getLocation(), DestType)) {
5843
for (NamedDecl *D : S.LookupConstructors(DestRecordDecl)) {
5844
auto Info = getConstructorInfo(D);
5845
if (!Info.Constructor)
5846
continue;
5847
5848
if (!Info.Constructor->isInvalidDecl() &&
5849
Info.Constructor->isConvertingConstructor(/*AllowExplicit*/true)) {
5850
if (Info.ConstructorTmpl)
5851
S.AddTemplateOverloadCandidate(
5852
Info.ConstructorTmpl, Info.FoundDecl,
5853
/*ExplicitArgs*/ nullptr, Initializer, CandidateSet,
5854
/*SuppressUserConversions=*/true,
5855
/*PartialOverloading*/ false, AllowExplicit);
5856
else
5857
S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl,
5858
Initializer, CandidateSet,
5859
/*SuppressUserConversions=*/true,
5860
/*PartialOverloading*/ false, AllowExplicit);
5861
}
5862
}
5863
}
5864
}
5865
5866
SourceLocation DeclLoc = Initializer->getBeginLoc();
5867
5868
if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) {
5869
// The type we're converting from is a class type, enumerate its conversion
5870
// functions.
5871
5872
// We can only enumerate the conversion functions for a complete type; if
5873
// the type isn't complete, simply skip this step.
5874
if (S.isCompleteType(DeclLoc, SourceType)) {
5875
CXXRecordDecl *SourceRecordDecl
5876
= cast<CXXRecordDecl>(SourceRecordType->getDecl());
5877
5878
const auto &Conversions =
5879
SourceRecordDecl->getVisibleConversionFunctions();
5880
for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5881
NamedDecl *D = *I;
5882
CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
5883
if (isa<UsingShadowDecl>(D))
5884
D = cast<UsingShadowDecl>(D)->getTargetDecl();
5885
5886
FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
5887
CXXConversionDecl *Conv;
5888
if (ConvTemplate)
5889
Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
5890
else
5891
Conv = cast<CXXConversionDecl>(D);
5892
5893
if (ConvTemplate)
5894
S.AddTemplateConversionCandidate(
5895
ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
5896
CandidateSet, AllowExplicit, AllowExplicit);
5897
else
5898
S.AddConversionCandidate(Conv, I.getPair(), ActingDC, Initializer,
5899
DestType, CandidateSet, AllowExplicit,
5900
AllowExplicit);
5901
}
5902
}
5903
}
5904
5905
// Perform overload resolution. If it fails, return the failed result.
5906
OverloadCandidateSet::iterator Best;
5907
if (OverloadingResult Result
5908
= CandidateSet.BestViableFunction(S, DeclLoc, Best)) {
5909
Sequence.SetOverloadFailure(
5910
InitializationSequence::FK_UserConversionOverloadFailed, Result);
5911
5912
// [class.copy.elision]p3:
5913
// In some copy-initialization contexts, a two-stage overload resolution
5914
// is performed.
5915
// If the first overload resolution selects a deleted function, we also
5916
// need the initialization sequence to decide whether to perform the second
5917
// overload resolution.
5918
if (!(Result == OR_Deleted &&
5919
Kind.getKind() == InitializationKind::IK_Copy))
5920
return;
5921
}
5922
5923
FunctionDecl *Function = Best->Function;
5924
Function->setReferenced();
5925
bool HadMultipleCandidates = (CandidateSet.size() > 1);
5926
5927
if (isa<CXXConstructorDecl>(Function)) {
5928
// Add the user-defined conversion step. Any cv-qualification conversion is
5929
// subsumed by the initialization. Per DR5, the created temporary is of the
5930
// cv-unqualified type of the destination.
5931
Sequence.AddUserConversionStep(Function, Best->FoundDecl,
5932
DestType.getUnqualifiedType(),
5933
HadMultipleCandidates);
5934
5935
// C++14 and before:
5936
// - if the function is a constructor, the call initializes a temporary
5937
// of the cv-unqualified version of the destination type. The [...]
5938
// temporary [...] is then used to direct-initialize, according to the
5939
// rules above, the object that is the destination of the
5940
// copy-initialization.
5941
// Note that this just performs a simple object copy from the temporary.
5942
//
5943
// C++17:
5944
// - if the function is a constructor, the call is a prvalue of the
5945
// cv-unqualified version of the destination type whose return object
5946
// is initialized by the constructor. The call is used to
5947
// direct-initialize, according to the rules above, the object that
5948
// is the destination of the copy-initialization.
5949
// Therefore we need to do nothing further.
5950
//
5951
// FIXME: Mark this copy as extraneous.
5952
if (!S.getLangOpts().CPlusPlus17)
5953
Sequence.AddFinalCopy(DestType);
5954
else if (DestType.hasQualifiers())
5955
Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
5956
return;
5957
}
5958
5959
// Add the user-defined conversion step that calls the conversion function.
5960
QualType ConvType = Function->getCallResultType();
5961
Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType,
5962
HadMultipleCandidates);
5963
5964
if (ConvType->getAs<RecordType>()) {
5965
// The call is used to direct-initialize [...] the object that is the
5966
// destination of the copy-initialization.
5967
//
5968
// In C++17, this does not call a constructor if we enter /17.6.1:
5969
// - If the initializer expression is a prvalue and the cv-unqualified
5970
// version of the source type is the same as the class of the
5971
// destination [... do not make an extra copy]
5972
//
5973
// FIXME: Mark this copy as extraneous.
5974
if (!S.getLangOpts().CPlusPlus17 ||
5975
Function->getReturnType()->isReferenceType() ||
5976
!S.Context.hasSameUnqualifiedType(ConvType, DestType))
5977
Sequence.AddFinalCopy(DestType);
5978
else if (!S.Context.hasSameType(ConvType, DestType))
5979
Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
5980
return;
5981
}
5982
5983
// If the conversion following the call to the conversion function
5984
// is interesting, add it as a separate step.
5985
if (Best->FinalConversion.First || Best->FinalConversion.Second ||
5986
Best->FinalConversion.Third) {
5987
ImplicitConversionSequence ICS;
5988
ICS.setStandard();
5989
ICS.Standard = Best->FinalConversion;
5990
Sequence.AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
5991
}
5992
}
5993
5994
/// An egregious hack for compatibility with libstdc++-4.2: in <tr1/hashtable>,
5995
/// a function with a pointer return type contains a 'return false;' statement.
5996
/// In C++11, 'false' is not a null pointer, so this breaks the build of any
5997
/// code using that header.
5998
///
5999
/// Work around this by treating 'return false;' as zero-initializing the result
6000
/// if it's used in a pointer-returning function in a system header.
6001
static bool isLibstdcxxPointerReturnFalseHack(Sema &S,
6002
const InitializedEntity &Entity,
6003
const Expr *Init) {
6004
return S.getLangOpts().CPlusPlus11 &&
6005
Entity.getKind() == InitializedEntity::EK_Result &&
6006
Entity.getType()->isPointerType() &&
6007
isa<CXXBoolLiteralExpr>(Init) &&
6008
!cast<CXXBoolLiteralExpr>(Init)->getValue() &&
6009
S.getSourceManager().isInSystemHeader(Init->getExprLoc());
6010
}
6011
6012
/// The non-zero enum values here are indexes into diagnostic alternatives.
6013
enum InvalidICRKind { IIK_okay, IIK_nonlocal, IIK_nonscalar };
6014
6015
/// Determines whether this expression is an acceptable ICR source.
6016
static InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e,
6017
bool isAddressOf, bool &isWeakAccess) {
6018
// Skip parens.
6019
e = e->IgnoreParens();
6020
6021
// Skip address-of nodes.
6022
if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) {
6023
if (op->getOpcode() == UO_AddrOf)
6024
return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true,
6025
isWeakAccess);
6026
6027
// Skip certain casts.
6028
} else if (CastExpr *ce = dyn_cast<CastExpr>(e)) {
6029
switch (ce->getCastKind()) {
6030
case CK_Dependent:
6031
case CK_BitCast:
6032
case CK_LValueBitCast:
6033
case CK_NoOp:
6034
return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf, isWeakAccess);
6035
6036
case CK_ArrayToPointerDecay:
6037
return IIK_nonscalar;
6038
6039
case CK_NullToPointer:
6040
return IIK_okay;
6041
6042
default:
6043
break;
6044
}
6045
6046
// If we have a declaration reference, it had better be a local variable.
6047
} else if (isa<DeclRefExpr>(e)) {
6048
// set isWeakAccess to true, to mean that there will be an implicit
6049
// load which requires a cleanup.
6050
if (e->getType().getObjCLifetime() == Qualifiers::OCL_Weak)
6051
isWeakAccess = true;
6052
6053
if (!isAddressOf) return IIK_nonlocal;
6054
6055
VarDecl *var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl());
6056
if (!var) return IIK_nonlocal;
6057
6058
return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal);
6059
6060
// If we have a conditional operator, check both sides.
6061
} else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) {
6062
if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf,
6063
isWeakAccess))
6064
return iik;
6065
6066
return isInvalidICRSource(C, cond->getRHS(), isAddressOf, isWeakAccess);
6067
6068
// These are never scalar.
6069
} else if (isa<ArraySubscriptExpr>(e)) {
6070
return IIK_nonscalar;
6071
6072
// Otherwise, it needs to be a null pointer constant.
6073
} else {
6074
return (e->isNullPointerConstant(C, Expr::NPC_ValueDependentIsNull)
6075
? IIK_okay : IIK_nonlocal);
6076
}
6077
6078
return IIK_nonlocal;
6079
}
6080
6081
/// Check whether the given expression is a valid operand for an
6082
/// indirect copy/restore.
6083
static void checkIndirectCopyRestoreSource(Sema &S, Expr *src) {
6084
assert(src->isPRValue());
6085
bool isWeakAccess = false;
6086
InvalidICRKind iik = isInvalidICRSource(S.Context, src, false, isWeakAccess);
6087
// If isWeakAccess to true, there will be an implicit
6088
// load which requires a cleanup.
6089
if (S.getLangOpts().ObjCAutoRefCount && isWeakAccess)
6090
S.Cleanup.setExprNeedsCleanups(true);
6091
6092
if (iik == IIK_okay) return;
6093
6094
S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback)
6095
<< ((unsigned) iik - 1) // shift index into diagnostic explanations
6096
<< src->getSourceRange();
6097
}
6098
6099
/// Determine whether we have compatible array types for the
6100
/// purposes of GNU by-copy array initialization.
6101
static bool hasCompatibleArrayTypes(ASTContext &Context, const ArrayType *Dest,
6102
const ArrayType *Source) {
6103
// If the source and destination array types are equivalent, we're
6104
// done.
6105
if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0)))
6106
return true;
6107
6108
// Make sure that the element types are the same.
6109
if (!Context.hasSameType(Dest->getElementType(), Source->getElementType()))
6110
return false;
6111
6112
// The only mismatch we allow is when the destination is an
6113
// incomplete array type and the source is a constant array type.
6114
return Source->isConstantArrayType() && Dest->isIncompleteArrayType();
6115
}
6116
6117
static bool tryObjCWritebackConversion(Sema &S,
6118
InitializationSequence &Sequence,
6119
const InitializedEntity &Entity,
6120
Expr *Initializer) {
6121
bool ArrayDecay = false;
6122
QualType ArgType = Initializer->getType();
6123
QualType ArgPointee;
6124
if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) {
6125
ArrayDecay = true;
6126
ArgPointee = ArgArrayType->getElementType();
6127
ArgType = S.Context.getPointerType(ArgPointee);
6128
}
6129
6130
// Handle write-back conversion.
6131
QualType ConvertedArgType;
6132
if (!S.ObjC().isObjCWritebackConversion(ArgType, Entity.getType(),
6133
ConvertedArgType))
6134
return false;
6135
6136
// We should copy unless we're passing to an argument explicitly
6137
// marked 'out'.
6138
bool ShouldCopy = true;
6139
if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
6140
ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
6141
6142
// Do we need an lvalue conversion?
6143
if (ArrayDecay || Initializer->isGLValue()) {
6144
ImplicitConversionSequence ICS;
6145
ICS.setStandard();
6146
ICS.Standard.setAsIdentityConversion();
6147
6148
QualType ResultType;
6149
if (ArrayDecay) {
6150
ICS.Standard.First = ICK_Array_To_Pointer;
6151
ResultType = S.Context.getPointerType(ArgPointee);
6152
} else {
6153
ICS.Standard.First = ICK_Lvalue_To_Rvalue;
6154
ResultType = Initializer->getType().getNonLValueExprType(S.Context);
6155
}
6156
6157
Sequence.AddConversionSequenceStep(ICS, ResultType);
6158
}
6159
6160
Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy);
6161
return true;
6162
}
6163
6164
static bool TryOCLSamplerInitialization(Sema &S,
6165
InitializationSequence &Sequence,
6166
QualType DestType,
6167
Expr *Initializer) {
6168
if (!S.getLangOpts().OpenCL || !DestType->isSamplerT() ||
6169
(!Initializer->isIntegerConstantExpr(S.Context) &&
6170
!Initializer->getType()->isSamplerT()))
6171
return false;
6172
6173
Sequence.AddOCLSamplerInitStep(DestType);
6174
return true;
6175
}
6176
6177
static bool IsZeroInitializer(Expr *Initializer, Sema &S) {
6178
return Initializer->isIntegerConstantExpr(S.getASTContext()) &&
6179
(Initializer->EvaluateKnownConstInt(S.getASTContext()) == 0);
6180
}
6181
6182
static bool TryOCLZeroOpaqueTypeInitialization(Sema &S,
6183
InitializationSequence &Sequence,
6184
QualType DestType,
6185
Expr *Initializer) {
6186
if (!S.getLangOpts().OpenCL)
6187
return false;
6188
6189
//
6190
// OpenCL 1.2 spec, s6.12.10
6191
//
6192
// The event argument can also be used to associate the
6193
// async_work_group_copy with a previous async copy allowing
6194
// an event to be shared by multiple async copies; otherwise
6195
// event should be zero.
6196
//
6197
if (DestType->isEventT() || DestType->isQueueT()) {
6198
if (!IsZeroInitializer(Initializer, S))
6199
return false;
6200
6201
Sequence.AddOCLZeroOpaqueTypeStep(DestType);
6202
return true;
6203
}
6204
6205
// We should allow zero initialization for all types defined in the
6206
// cl_intel_device_side_avc_motion_estimation extension, except
6207
// intel_sub_group_avc_mce_payload_t and intel_sub_group_avc_mce_result_t.
6208
if (S.getOpenCLOptions().isAvailableOption(
6209
"cl_intel_device_side_avc_motion_estimation", S.getLangOpts()) &&
6210
DestType->isOCLIntelSubgroupAVCType()) {
6211
if (DestType->isOCLIntelSubgroupAVCMcePayloadType() ||
6212
DestType->isOCLIntelSubgroupAVCMceResultType())
6213
return false;
6214
if (!IsZeroInitializer(Initializer, S))
6215
return false;
6216
6217
Sequence.AddOCLZeroOpaqueTypeStep(DestType);
6218
return true;
6219
}
6220
6221
return false;
6222
}
6223
6224
InitializationSequence::InitializationSequence(
6225
Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
6226
MultiExprArg Args, bool TopLevelOfInitList, bool TreatUnavailableAsInvalid)
6227
: FailedOverloadResult(OR_Success),
6228
FailedCandidateSet(Kind.getLocation(), OverloadCandidateSet::CSK_Normal) {
6229
InitializeFrom(S, Entity, Kind, Args, TopLevelOfInitList,
6230
TreatUnavailableAsInvalid);
6231
}
6232
6233
/// Tries to get a FunctionDecl out of `E`. If it succeeds and we can take the
6234
/// address of that function, this returns true. Otherwise, it returns false.
6235
static bool isExprAnUnaddressableFunction(Sema &S, const Expr *E) {
6236
auto *DRE = dyn_cast<DeclRefExpr>(E);
6237
if (!DRE || !isa<FunctionDecl>(DRE->getDecl()))
6238
return false;
6239
6240
return !S.checkAddressOfFunctionIsAvailable(
6241
cast<FunctionDecl>(DRE->getDecl()));
6242
}
6243
6244
/// Determine whether we can perform an elementwise array copy for this kind
6245
/// of entity.
6246
static bool canPerformArrayCopy(const InitializedEntity &Entity) {
6247
switch (Entity.getKind()) {
6248
case InitializedEntity::EK_LambdaCapture:
6249
// C++ [expr.prim.lambda]p24:
6250
// For array members, the array elements are direct-initialized in
6251
// increasing subscript order.
6252
return true;
6253
6254
case InitializedEntity::EK_Variable:
6255
// C++ [dcl.decomp]p1:
6256
// [...] each element is copy-initialized or direct-initialized from the
6257
// corresponding element of the assignment-expression [...]
6258
return isa<DecompositionDecl>(Entity.getDecl());
6259
6260
case InitializedEntity::EK_Member:
6261
// C++ [class.copy.ctor]p14:
6262
// - if the member is an array, each element is direct-initialized with
6263
// the corresponding subobject of x
6264
return Entity.isImplicitMemberInitializer();
6265
6266
case InitializedEntity::EK_ArrayElement:
6267
// All the above cases are intended to apply recursively, even though none
6268
// of them actually say that.
6269
if (auto *E = Entity.getParent())
6270
return canPerformArrayCopy(*E);
6271
break;
6272
6273
default:
6274
break;
6275
}
6276
6277
return false;
6278
}
6279
6280
void InitializationSequence::InitializeFrom(Sema &S,
6281
const InitializedEntity &Entity,
6282
const InitializationKind &Kind,
6283
MultiExprArg Args,
6284
bool TopLevelOfInitList,
6285
bool TreatUnavailableAsInvalid) {
6286
ASTContext &Context = S.Context;
6287
6288
// Eliminate non-overload placeholder types in the arguments. We
6289
// need to do this before checking whether types are dependent
6290
// because lowering a pseudo-object expression might well give us
6291
// something of dependent type.
6292
for (unsigned I = 0, E = Args.size(); I != E; ++I)
6293
if (Args[I]->getType()->isNonOverloadPlaceholderType()) {
6294
// FIXME: should we be doing this here?
6295
ExprResult result = S.CheckPlaceholderExpr(Args[I]);
6296
if (result.isInvalid()) {
6297
SetFailed(FK_PlaceholderType);
6298
return;
6299
}
6300
Args[I] = result.get();
6301
}
6302
6303
// C++0x [dcl.init]p16:
6304
// The semantics of initializers are as follows. The destination type is
6305
// the type of the object or reference being initialized and the source
6306
// type is the type of the initializer expression. The source type is not
6307
// defined when the initializer is a braced-init-list or when it is a
6308
// parenthesized list of expressions.
6309
QualType DestType = Entity.getType();
6310
6311
if (DestType->isDependentType() ||
6312
Expr::hasAnyTypeDependentArguments(Args)) {
6313
SequenceKind = DependentSequence;
6314
return;
6315
}
6316
6317
// Almost everything is a normal sequence.
6318
setSequenceKind(NormalSequence);
6319
6320
QualType SourceType;
6321
Expr *Initializer = nullptr;
6322
if (Args.size() == 1) {
6323
Initializer = Args[0];
6324
if (S.getLangOpts().ObjC) {
6325
if (S.ObjC().CheckObjCBridgeRelatedConversions(
6326
Initializer->getBeginLoc(), DestType, Initializer->getType(),
6327
Initializer) ||
6328
S.ObjC().CheckConversionToObjCLiteral(DestType, Initializer))
6329
Args[0] = Initializer;
6330
}
6331
if (!isa<InitListExpr>(Initializer))
6332
SourceType = Initializer->getType();
6333
}
6334
6335
// - If the initializer is a (non-parenthesized) braced-init-list, the
6336
// object is list-initialized (8.5.4).
6337
if (Kind.getKind() != InitializationKind::IK_Direct) {
6338
if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) {
6339
TryListInitialization(S, Entity, Kind, InitList, *this,
6340
TreatUnavailableAsInvalid);
6341
return;
6342
}
6343
}
6344
6345
// - If the destination type is a reference type, see 8.5.3.
6346
if (DestType->isReferenceType()) {
6347
// C++0x [dcl.init.ref]p1:
6348
// A variable declared to be a T& or T&&, that is, "reference to type T"
6349
// (8.3.2), shall be initialized by an object, or function, of type T or
6350
// by an object that can be converted into a T.
6351
// (Therefore, multiple arguments are not permitted.)
6352
if (Args.size() != 1)
6353
SetFailed(FK_TooManyInitsForReference);
6354
// C++17 [dcl.init.ref]p5:
6355
// A reference [...] is initialized by an expression [...] as follows:
6356
// If the initializer is not an expression, presumably we should reject,
6357
// but the standard fails to actually say so.
6358
else if (isa<InitListExpr>(Args[0]))
6359
SetFailed(FK_ParenthesizedListInitForReference);
6360
else
6361
TryReferenceInitialization(S, Entity, Kind, Args[0], *this,
6362
TopLevelOfInitList);
6363
return;
6364
}
6365
6366
// - If the initializer is (), the object is value-initialized.
6367
if (Kind.getKind() == InitializationKind::IK_Value ||
6368
(Kind.getKind() == InitializationKind::IK_Direct && Args.empty())) {
6369
TryValueInitialization(S, Entity, Kind, *this);
6370
return;
6371
}
6372
6373
// Handle default initialization.
6374
if (Kind.getKind() == InitializationKind::IK_Default) {
6375
TryDefaultInitialization(S, Entity, Kind, *this);
6376
return;
6377
}
6378
6379
// - If the destination type is an array of characters, an array of
6380
// char16_t, an array of char32_t, or an array of wchar_t, and the
6381
// initializer is a string literal, see 8.5.2.
6382
// - Otherwise, if the destination type is an array, the program is
6383
// ill-formed.
6384
// - Except in HLSL, where non-decaying array parameters behave like
6385
// non-array types for initialization.
6386
if (DestType->isArrayType() && !DestType->isArrayParameterType()) {
6387
const ArrayType *DestAT = Context.getAsArrayType(DestType);
6388
if (Initializer && isa<VariableArrayType>(DestAT)) {
6389
SetFailed(FK_VariableLengthArrayHasInitializer);
6390
return;
6391
}
6392
6393
if (Initializer) {
6394
switch (IsStringInit(Initializer, DestAT, Context)) {
6395
case SIF_None:
6396
TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this);
6397
return;
6398
case SIF_NarrowStringIntoWideChar:
6399
SetFailed(FK_NarrowStringIntoWideCharArray);
6400
return;
6401
case SIF_WideStringIntoChar:
6402
SetFailed(FK_WideStringIntoCharArray);
6403
return;
6404
case SIF_IncompatWideStringIntoWideChar:
6405
SetFailed(FK_IncompatWideStringIntoWideChar);
6406
return;
6407
case SIF_PlainStringIntoUTF8Char:
6408
SetFailed(FK_PlainStringIntoUTF8Char);
6409
return;
6410
case SIF_UTF8StringIntoPlainChar:
6411
SetFailed(FK_UTF8StringIntoPlainChar);
6412
return;
6413
case SIF_Other:
6414
break;
6415
}
6416
}
6417
6418
// Some kinds of initialization permit an array to be initialized from
6419
// another array of the same type, and perform elementwise initialization.
6420
if (Initializer && isa<ConstantArrayType>(DestAT) &&
6421
S.Context.hasSameUnqualifiedType(Initializer->getType(),
6422
Entity.getType()) &&
6423
canPerformArrayCopy(Entity)) {
6424
// If source is a prvalue, use it directly.
6425
if (Initializer->isPRValue()) {
6426
AddArrayInitStep(DestType, /*IsGNUExtension*/false);
6427
return;
6428
}
6429
6430
// Emit element-at-a-time copy loop.
6431
InitializedEntity Element =
6432
InitializedEntity::InitializeElement(S.Context, 0, Entity);
6433
QualType InitEltT =
6434
Context.getAsArrayType(Initializer->getType())->getElementType();
6435
OpaqueValueExpr OVE(Initializer->getExprLoc(), InitEltT,
6436
Initializer->getValueKind(),
6437
Initializer->getObjectKind());
6438
Expr *OVEAsExpr = &OVE;
6439
InitializeFrom(S, Element, Kind, OVEAsExpr, TopLevelOfInitList,
6440
TreatUnavailableAsInvalid);
6441
if (!Failed())
6442
AddArrayInitLoopStep(Entity.getType(), InitEltT);
6443
return;
6444
}
6445
6446
// Note: as an GNU C extension, we allow initialization of an
6447
// array from a compound literal that creates an array of the same
6448
// type, so long as the initializer has no side effects.
6449
if (!S.getLangOpts().CPlusPlus && Initializer &&
6450
isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) &&
6451
Initializer->getType()->isArrayType()) {
6452
const ArrayType *SourceAT
6453
= Context.getAsArrayType(Initializer->getType());
6454
if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT))
6455
SetFailed(FK_ArrayTypeMismatch);
6456
else if (Initializer->HasSideEffects(S.Context))
6457
SetFailed(FK_NonConstantArrayInit);
6458
else {
6459
AddArrayInitStep(DestType, /*IsGNUExtension*/true);
6460
}
6461
}
6462
// Note: as a GNU C++ extension, we allow list-initialization of a
6463
// class member of array type from a parenthesized initializer list.
6464
else if (S.getLangOpts().CPlusPlus &&
6465
Entity.getKind() == InitializedEntity::EK_Member &&
6466
isa_and_nonnull<InitListExpr>(Initializer)) {
6467
TryListInitialization(S, Entity, Kind, cast<InitListExpr>(Initializer),
6468
*this, TreatUnavailableAsInvalid);
6469
AddParenthesizedArrayInitStep(DestType);
6470
} else if (S.getLangOpts().CPlusPlus20 && !TopLevelOfInitList &&
6471
Kind.getKind() == InitializationKind::IK_Direct)
6472
TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
6473
/*VerifyOnly=*/true);
6474
else if (DestAT->getElementType()->isCharType())
6475
SetFailed(FK_ArrayNeedsInitListOrStringLiteral);
6476
else if (IsWideCharCompatible(DestAT->getElementType(), Context))
6477
SetFailed(FK_ArrayNeedsInitListOrWideStringLiteral);
6478
else
6479
SetFailed(FK_ArrayNeedsInitList);
6480
6481
return;
6482
}
6483
6484
// Determine whether we should consider writeback conversions for
6485
// Objective-C ARC.
6486
bool allowObjCWritebackConversion = S.getLangOpts().ObjCAutoRefCount &&
6487
Entity.isParameterKind();
6488
6489
if (TryOCLSamplerInitialization(S, *this, DestType, Initializer))
6490
return;
6491
6492
// We're at the end of the line for C: it's either a write-back conversion
6493
// or it's a C assignment. There's no need to check anything else.
6494
if (!S.getLangOpts().CPlusPlus) {
6495
assert(Initializer && "Initializer must be non-null");
6496
// If allowed, check whether this is an Objective-C writeback conversion.
6497
if (allowObjCWritebackConversion &&
6498
tryObjCWritebackConversion(S, *this, Entity, Initializer)) {
6499
return;
6500
}
6501
6502
if (TryOCLZeroOpaqueTypeInitialization(S, *this, DestType, Initializer))
6503
return;
6504
6505
// Handle initialization in C
6506
AddCAssignmentStep(DestType);
6507
MaybeProduceObjCObject(S, *this, Entity);
6508
return;
6509
}
6510
6511
assert(S.getLangOpts().CPlusPlus);
6512
6513
// - If the destination type is a (possibly cv-qualified) class type:
6514
if (DestType->isRecordType()) {
6515
// - If the initialization is direct-initialization, or if it is
6516
// copy-initialization where the cv-unqualified version of the
6517
// source type is the same class as, or a derived class of, the
6518
// class of the destination, constructors are considered. [...]
6519
if (Kind.getKind() == InitializationKind::IK_Direct ||
6520
(Kind.getKind() == InitializationKind::IK_Copy &&
6521
(Context.hasSameUnqualifiedType(SourceType, DestType) ||
6522
(Initializer && S.IsDerivedFrom(Initializer->getBeginLoc(),
6523
SourceType, DestType))))) {
6524
TryConstructorInitialization(S, Entity, Kind, Args, DestType, DestType,
6525
*this);
6526
6527
// We fall back to the "no matching constructor" path if the
6528
// failed candidate set has functions other than the three default
6529
// constructors. For example, conversion function.
6530
if (const auto *RD =
6531
dyn_cast<CXXRecordDecl>(DestType->getAs<RecordType>()->getDecl());
6532
// In general, we should call isCompleteType for RD to check its
6533
// completeness, we don't call it here as it was already called in the
6534
// above TryConstructorInitialization.
6535
S.getLangOpts().CPlusPlus20 && RD && RD->hasDefinition() &&
6536
RD->isAggregate() && Failed() &&
6537
getFailureKind() == FK_ConstructorOverloadFailed) {
6538
// Do not attempt paren list initialization if overload resolution
6539
// resolves to a deleted function .
6540
//
6541
// We may reach this condition if we have a union wrapping a class with
6542
// a non-trivial copy or move constructor and we call one of those two
6543
// constructors. The union is an aggregate, but the matched constructor
6544
// is implicitly deleted, so we need to prevent aggregate initialization
6545
// (otherwise, it'll attempt aggregate initialization by initializing
6546
// the first element with a reference to the union).
6547
OverloadCandidateSet::iterator Best;
6548
OverloadingResult OR = getFailedCandidateSet().BestViableFunction(
6549
S, Kind.getLocation(), Best);
6550
if (OR != OverloadingResult::OR_Deleted) {
6551
// C++20 [dcl.init] 17.6.2.2:
6552
// - Otherwise, if no constructor is viable, the destination type is
6553
// an
6554
// aggregate class, and the initializer is a parenthesized
6555
// expression-list.
6556
TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
6557
/*VerifyOnly=*/true);
6558
}
6559
}
6560
} else {
6561
// - Otherwise (i.e., for the remaining copy-initialization cases),
6562
// user-defined conversion sequences that can convert from the
6563
// source type to the destination type or (when a conversion
6564
// function is used) to a derived class thereof are enumerated as
6565
// described in 13.3.1.4, and the best one is chosen through
6566
// overload resolution (13.3).
6567
assert(Initializer && "Initializer must be non-null");
6568
TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
6569
TopLevelOfInitList);
6570
}
6571
return;
6572
}
6573
6574
assert(Args.size() >= 1 && "Zero-argument case handled above");
6575
6576
// For HLSL ext vector types we allow list initialization behavior for C++
6577
// constructor syntax. This is accomplished by converting initialization
6578
// arguments an InitListExpr late.
6579
if (S.getLangOpts().HLSL && Args.size() > 1 && DestType->isExtVectorType() &&
6580
(SourceType.isNull() ||
6581
!Context.hasSameUnqualifiedType(SourceType, DestType))) {
6582
6583
llvm::SmallVector<Expr *> InitArgs;
6584
for (auto *Arg : Args) {
6585
if (Arg->getType()->isExtVectorType()) {
6586
const auto *VTy = Arg->getType()->castAs<ExtVectorType>();
6587
unsigned Elm = VTy->getNumElements();
6588
for (unsigned Idx = 0; Idx < Elm; ++Idx) {
6589
InitArgs.emplace_back(new (Context) ArraySubscriptExpr(
6590
Arg,
6591
IntegerLiteral::Create(
6592
Context, llvm::APInt(Context.getIntWidth(Context.IntTy), Idx),
6593
Context.IntTy, SourceLocation()),
6594
VTy->getElementType(), Arg->getValueKind(), Arg->getObjectKind(),
6595
SourceLocation()));
6596
}
6597
} else
6598
InitArgs.emplace_back(Arg);
6599
}
6600
InitListExpr *ILE = new (Context) InitListExpr(
6601
S.getASTContext(), SourceLocation(), InitArgs, SourceLocation());
6602
Args[0] = ILE;
6603
AddListInitializationStep(DestType);
6604
return;
6605
}
6606
6607
// The remaining cases all need a source type.
6608
if (Args.size() > 1) {
6609
SetFailed(FK_TooManyInitsForScalar);
6610
return;
6611
} else if (isa<InitListExpr>(Args[0])) {
6612
SetFailed(FK_ParenthesizedListInitForScalar);
6613
return;
6614
}
6615
6616
// - Otherwise, if the source type is a (possibly cv-qualified) class
6617
// type, conversion functions are considered.
6618
if (!SourceType.isNull() && SourceType->isRecordType()) {
6619
assert(Initializer && "Initializer must be non-null");
6620
// For a conversion to _Atomic(T) from either T or a class type derived
6621
// from T, initialize the T object then convert to _Atomic type.
6622
bool NeedAtomicConversion = false;
6623
if (const AtomicType *Atomic = DestType->getAs<AtomicType>()) {
6624
if (Context.hasSameUnqualifiedType(SourceType, Atomic->getValueType()) ||
6625
S.IsDerivedFrom(Initializer->getBeginLoc(), SourceType,
6626
Atomic->getValueType())) {
6627
DestType = Atomic->getValueType();
6628
NeedAtomicConversion = true;
6629
}
6630
}
6631
6632
TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
6633
TopLevelOfInitList);
6634
MaybeProduceObjCObject(S, *this, Entity);
6635
if (!Failed() && NeedAtomicConversion)
6636
AddAtomicConversionStep(Entity.getType());
6637
return;
6638
}
6639
6640
// - Otherwise, if the initialization is direct-initialization, the source
6641
// type is std::nullptr_t, and the destination type is bool, the initial
6642
// value of the object being initialized is false.
6643
if (!SourceType.isNull() && SourceType->isNullPtrType() &&
6644
DestType->isBooleanType() &&
6645
Kind.getKind() == InitializationKind::IK_Direct) {
6646
AddConversionSequenceStep(
6647
ImplicitConversionSequence::getNullptrToBool(SourceType, DestType,
6648
Initializer->isGLValue()),
6649
DestType);
6650
return;
6651
}
6652
6653
// - Otherwise, the initial value of the object being initialized is the
6654
// (possibly converted) value of the initializer expression. Standard
6655
// conversions (Clause 4) will be used, if necessary, to convert the
6656
// initializer expression to the cv-unqualified version of the
6657
// destination type; no user-defined conversions are considered.
6658
6659
ImplicitConversionSequence ICS
6660
= S.TryImplicitConversion(Initializer, DestType,
6661
/*SuppressUserConversions*/true,
6662
Sema::AllowedExplicit::None,
6663
/*InOverloadResolution*/ false,
6664
/*CStyle=*/Kind.isCStyleOrFunctionalCast(),
6665
allowObjCWritebackConversion);
6666
6667
if (ICS.isStandard() &&
6668
ICS.Standard.Second == ICK_Writeback_Conversion) {
6669
// Objective-C ARC writeback conversion.
6670
6671
// We should copy unless we're passing to an argument explicitly
6672
// marked 'out'.
6673
bool ShouldCopy = true;
6674
if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
6675
ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
6676
6677
// If there was an lvalue adjustment, add it as a separate conversion.
6678
if (ICS.Standard.First == ICK_Array_To_Pointer ||
6679
ICS.Standard.First == ICK_Lvalue_To_Rvalue) {
6680
ImplicitConversionSequence LvalueICS;
6681
LvalueICS.setStandard();
6682
LvalueICS.Standard.setAsIdentityConversion();
6683
LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0));
6684
LvalueICS.Standard.First = ICS.Standard.First;
6685
AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0));
6686
}
6687
6688
AddPassByIndirectCopyRestoreStep(DestType, ShouldCopy);
6689
} else if (ICS.isBad()) {
6690
if (isLibstdcxxPointerReturnFalseHack(S, Entity, Initializer))
6691
AddZeroInitializationStep(Entity.getType());
6692
else if (DeclAccessPair Found;
6693
Initializer->getType() == Context.OverloadTy &&
6694
!S.ResolveAddressOfOverloadedFunction(Initializer, DestType,
6695
/*Complain=*/false, Found))
6696
SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
6697
else if (Initializer->getType()->isFunctionType() &&
6698
isExprAnUnaddressableFunction(S, Initializer))
6699
SetFailed(InitializationSequence::FK_AddressOfUnaddressableFunction);
6700
else
6701
SetFailed(InitializationSequence::FK_ConversionFailed);
6702
} else {
6703
AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
6704
6705
MaybeProduceObjCObject(S, *this, Entity);
6706
}
6707
}
6708
6709
InitializationSequence::~InitializationSequence() {
6710
for (auto &S : Steps)
6711
S.Destroy();
6712
}
6713
6714
//===----------------------------------------------------------------------===//
6715
// Perform initialization
6716
//===----------------------------------------------------------------------===//
6717
static Sema::AssignmentAction
6718
getAssignmentAction(const InitializedEntity &Entity, bool Diagnose = false) {
6719
switch(Entity.getKind()) {
6720
case InitializedEntity::EK_Variable:
6721
case InitializedEntity::EK_New:
6722
case InitializedEntity::EK_Exception:
6723
case InitializedEntity::EK_Base:
6724
case InitializedEntity::EK_Delegating:
6725
return Sema::AA_Initializing;
6726
6727
case InitializedEntity::EK_Parameter:
6728
if (Entity.getDecl() &&
6729
isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext()))
6730
return Sema::AA_Sending;
6731
6732
return Sema::AA_Passing;
6733
6734
case InitializedEntity::EK_Parameter_CF_Audited:
6735
if (Entity.getDecl() &&
6736
isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext()))
6737
return Sema::AA_Sending;
6738
6739
return !Diagnose ? Sema::AA_Passing : Sema::AA_Passing_CFAudited;
6740
6741
case InitializedEntity::EK_Result:
6742
case InitializedEntity::EK_StmtExprResult: // FIXME: Not quite right.
6743
return Sema::AA_Returning;
6744
6745
case InitializedEntity::EK_Temporary:
6746
case InitializedEntity::EK_RelatedResult:
6747
// FIXME: Can we tell apart casting vs. converting?
6748
return Sema::AA_Casting;
6749
6750
case InitializedEntity::EK_TemplateParameter:
6751
// This is really initialization, but refer to it as conversion for
6752
// consistency with CheckConvertedConstantExpression.
6753
return Sema::AA_Converting;
6754
6755
case InitializedEntity::EK_Member:
6756
case InitializedEntity::EK_ParenAggInitMember:
6757
case InitializedEntity::EK_Binding:
6758
case InitializedEntity::EK_ArrayElement:
6759
case InitializedEntity::EK_VectorElement:
6760
case InitializedEntity::EK_ComplexElement:
6761
case InitializedEntity::EK_BlockElement:
6762
case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
6763
case InitializedEntity::EK_LambdaCapture:
6764
case InitializedEntity::EK_CompoundLiteralInit:
6765
return Sema::AA_Initializing;
6766
}
6767
6768
llvm_unreachable("Invalid EntityKind!");
6769
}
6770
6771
/// Whether we should bind a created object as a temporary when
6772
/// initializing the given entity.
6773
static bool shouldBindAsTemporary(const InitializedEntity &Entity) {
6774
switch (Entity.getKind()) {
6775
case InitializedEntity::EK_ArrayElement:
6776
case InitializedEntity::EK_Member:
6777
case InitializedEntity::EK_ParenAggInitMember:
6778
case InitializedEntity::EK_Result:
6779
case InitializedEntity::EK_StmtExprResult:
6780
case InitializedEntity::EK_New:
6781
case InitializedEntity::EK_Variable:
6782
case InitializedEntity::EK_Base:
6783
case InitializedEntity::EK_Delegating:
6784
case InitializedEntity::EK_VectorElement:
6785
case InitializedEntity::EK_ComplexElement:
6786
case InitializedEntity::EK_Exception:
6787
case InitializedEntity::EK_BlockElement:
6788
case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
6789
case InitializedEntity::EK_LambdaCapture:
6790
case InitializedEntity::EK_CompoundLiteralInit:
6791
case InitializedEntity::EK_TemplateParameter:
6792
return false;
6793
6794
case InitializedEntity::EK_Parameter:
6795
case InitializedEntity::EK_Parameter_CF_Audited:
6796
case InitializedEntity::EK_Temporary:
6797
case InitializedEntity::EK_RelatedResult:
6798
case InitializedEntity::EK_Binding:
6799
return true;
6800
}
6801
6802
llvm_unreachable("missed an InitializedEntity kind?");
6803
}
6804
6805
/// Whether the given entity, when initialized with an object
6806
/// created for that initialization, requires destruction.
6807
static bool shouldDestroyEntity(const InitializedEntity &Entity) {
6808
switch (Entity.getKind()) {
6809
case InitializedEntity::EK_Result:
6810
case InitializedEntity::EK_StmtExprResult:
6811
case InitializedEntity::EK_New:
6812
case InitializedEntity::EK_Base:
6813
case InitializedEntity::EK_Delegating:
6814
case InitializedEntity::EK_VectorElement:
6815
case InitializedEntity::EK_ComplexElement:
6816
case InitializedEntity::EK_BlockElement:
6817
case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
6818
case InitializedEntity::EK_LambdaCapture:
6819
return false;
6820
6821
case InitializedEntity::EK_Member:
6822
case InitializedEntity::EK_ParenAggInitMember:
6823
case InitializedEntity::EK_Binding:
6824
case InitializedEntity::EK_Variable:
6825
case InitializedEntity::EK_Parameter:
6826
case InitializedEntity::EK_Parameter_CF_Audited:
6827
case InitializedEntity::EK_TemplateParameter:
6828
case InitializedEntity::EK_Temporary:
6829
case InitializedEntity::EK_ArrayElement:
6830
case InitializedEntity::EK_Exception:
6831
case InitializedEntity::EK_CompoundLiteralInit:
6832
case InitializedEntity::EK_RelatedResult:
6833
return true;
6834
}
6835
6836
llvm_unreachable("missed an InitializedEntity kind?");
6837
}
6838
6839
/// Get the location at which initialization diagnostics should appear.
6840
static SourceLocation getInitializationLoc(const InitializedEntity &Entity,
6841
Expr *Initializer) {
6842
switch (Entity.getKind()) {
6843
case InitializedEntity::EK_Result:
6844
case InitializedEntity::EK_StmtExprResult:
6845
return Entity.getReturnLoc();
6846
6847
case InitializedEntity::EK_Exception:
6848
return Entity.getThrowLoc();
6849
6850
case InitializedEntity::EK_Variable:
6851
case InitializedEntity::EK_Binding:
6852
return Entity.getDecl()->getLocation();
6853
6854
case InitializedEntity::EK_LambdaCapture:
6855
return Entity.getCaptureLoc();
6856
6857
case InitializedEntity::EK_ArrayElement:
6858
case InitializedEntity::EK_Member:
6859
case InitializedEntity::EK_ParenAggInitMember:
6860
case InitializedEntity::EK_Parameter:
6861
case InitializedEntity::EK_Parameter_CF_Audited:
6862
case InitializedEntity::EK_TemplateParameter:
6863
case InitializedEntity::EK_Temporary:
6864
case InitializedEntity::EK_New:
6865
case InitializedEntity::EK_Base:
6866
case InitializedEntity::EK_Delegating:
6867
case InitializedEntity::EK_VectorElement:
6868
case InitializedEntity::EK_ComplexElement:
6869
case InitializedEntity::EK_BlockElement:
6870
case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
6871
case InitializedEntity::EK_CompoundLiteralInit:
6872
case InitializedEntity::EK_RelatedResult:
6873
return Initializer->getBeginLoc();
6874
}
6875
llvm_unreachable("missed an InitializedEntity kind?");
6876
}
6877
6878
/// Make a (potentially elidable) temporary copy of the object
6879
/// provided by the given initializer by calling the appropriate copy
6880
/// constructor.
6881
///
6882
/// \param S The Sema object used for type-checking.
6883
///
6884
/// \param T The type of the temporary object, which must either be
6885
/// the type of the initializer expression or a superclass thereof.
6886
///
6887
/// \param Entity The entity being initialized.
6888
///
6889
/// \param CurInit The initializer expression.
6890
///
6891
/// \param IsExtraneousCopy Whether this is an "extraneous" copy that
6892
/// is permitted in C++03 (but not C++0x) when binding a reference to
6893
/// an rvalue.
6894
///
6895
/// \returns An expression that copies the initializer expression into
6896
/// a temporary object, or an error expression if a copy could not be
6897
/// created.
6898
static ExprResult CopyObject(Sema &S,
6899
QualType T,
6900
const InitializedEntity &Entity,
6901
ExprResult CurInit,
6902
bool IsExtraneousCopy) {
6903
if (CurInit.isInvalid())
6904
return CurInit;
6905
// Determine which class type we're copying to.
6906
Expr *CurInitExpr = (Expr *)CurInit.get();
6907
CXXRecordDecl *Class = nullptr;
6908
if (const RecordType *Record = T->getAs<RecordType>())
6909
Class = cast<CXXRecordDecl>(Record->getDecl());
6910
if (!Class)
6911
return CurInit;
6912
6913
SourceLocation Loc = getInitializationLoc(Entity, CurInit.get());
6914
6915
// Make sure that the type we are copying is complete.
6916
if (S.RequireCompleteType(Loc, T, diag::err_temp_copy_incomplete))
6917
return CurInit;
6918
6919
// Perform overload resolution using the class's constructors. Per
6920
// C++11 [dcl.init]p16, second bullet for class types, this initialization
6921
// is direct-initialization.
6922
OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
6923
DeclContext::lookup_result Ctors = S.LookupConstructors(Class);
6924
6925
OverloadCandidateSet::iterator Best;
6926
switch (ResolveConstructorOverload(
6927
S, Loc, CurInitExpr, CandidateSet, T, Ctors, Best,
6928
/*CopyInitializing=*/false, /*AllowExplicit=*/true,
6929
/*OnlyListConstructors=*/false, /*IsListInit=*/false,
6930
/*RequireActualConstructor=*/false,
6931
/*SecondStepOfCopyInit=*/true)) {
6932
case OR_Success:
6933
break;
6934
6935
case OR_No_Viable_Function:
6936
CandidateSet.NoteCandidates(
6937
PartialDiagnosticAt(
6938
Loc, S.PDiag(IsExtraneousCopy && !S.isSFINAEContext()
6939
? diag::ext_rvalue_to_reference_temp_copy_no_viable
6940
: diag::err_temp_copy_no_viable)
6941
<< (int)Entity.getKind() << CurInitExpr->getType()
6942
<< CurInitExpr->getSourceRange()),
6943
S, OCD_AllCandidates, CurInitExpr);
6944
if (!IsExtraneousCopy || S.isSFINAEContext())
6945
return ExprError();
6946
return CurInit;
6947
6948
case OR_Ambiguous:
6949
CandidateSet.NoteCandidates(
6950
PartialDiagnosticAt(Loc, S.PDiag(diag::err_temp_copy_ambiguous)
6951
<< (int)Entity.getKind()
6952
<< CurInitExpr->getType()
6953
<< CurInitExpr->getSourceRange()),
6954
S, OCD_AmbiguousCandidates, CurInitExpr);
6955
return ExprError();
6956
6957
case OR_Deleted:
6958
S.Diag(Loc, diag::err_temp_copy_deleted)
6959
<< (int)Entity.getKind() << CurInitExpr->getType()
6960
<< CurInitExpr->getSourceRange();
6961
S.NoteDeletedFunction(Best->Function);
6962
return ExprError();
6963
}
6964
6965
bool HadMultipleCandidates = CandidateSet.size() > 1;
6966
6967
CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function);
6968
SmallVector<Expr*, 8> ConstructorArgs;
6969
CurInit.get(); // Ownership transferred into MultiExprArg, below.
6970
6971
S.CheckConstructorAccess(Loc, Constructor, Best->FoundDecl, Entity,
6972
IsExtraneousCopy);
6973
6974
if (IsExtraneousCopy) {
6975
// If this is a totally extraneous copy for C++03 reference
6976
// binding purposes, just return the original initialization
6977
// expression. We don't generate an (elided) copy operation here
6978
// because doing so would require us to pass down a flag to avoid
6979
// infinite recursion, where each step adds another extraneous,
6980
// elidable copy.
6981
6982
// Instantiate the default arguments of any extra parameters in
6983
// the selected copy constructor, as if we were going to create a
6984
// proper call to the copy constructor.
6985
for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) {
6986
ParmVarDecl *Parm = Constructor->getParamDecl(I);
6987
if (S.RequireCompleteType(Loc, Parm->getType(),
6988
diag::err_call_incomplete_argument))
6989
break;
6990
6991
// Build the default argument expression; we don't actually care
6992
// if this succeeds or not, because this routine will complain
6993
// if there was a problem.
6994
S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm);
6995
}
6996
6997
return CurInitExpr;
6998
}
6999
7000
// Determine the arguments required to actually perform the
7001
// constructor call (we might have derived-to-base conversions, or
7002
// the copy constructor may have default arguments).
7003
if (S.CompleteConstructorCall(Constructor, T, CurInitExpr, Loc,
7004
ConstructorArgs))
7005
return ExprError();
7006
7007
// C++0x [class.copy]p32:
7008
// When certain criteria are met, an implementation is allowed to
7009
// omit the copy/move construction of a class object, even if the
7010
// copy/move constructor and/or destructor for the object have
7011
// side effects. [...]
7012
// - when a temporary class object that has not been bound to a
7013
// reference (12.2) would be copied/moved to a class object
7014
// with the same cv-unqualified type, the copy/move operation
7015
// can be omitted by constructing the temporary object
7016
// directly into the target of the omitted copy/move
7017
//
7018
// Note that the other three bullets are handled elsewhere. Copy
7019
// elision for return statements and throw expressions are handled as part
7020
// of constructor initialization, while copy elision for exception handlers
7021
// is handled by the run-time.
7022
//
7023
// FIXME: If the function parameter is not the same type as the temporary, we
7024
// should still be able to elide the copy, but we don't have a way to
7025
// represent in the AST how much should be elided in this case.
7026
bool Elidable =
7027
CurInitExpr->isTemporaryObject(S.Context, Class) &&
7028
S.Context.hasSameUnqualifiedType(
7029
Best->Function->getParamDecl(0)->getType().getNonReferenceType(),
7030
CurInitExpr->getType());
7031
7032
// Actually perform the constructor call.
7033
CurInit = S.BuildCXXConstructExpr(
7034
Loc, T, Best->FoundDecl, Constructor, Elidable, ConstructorArgs,
7035
HadMultipleCandidates,
7036
/*ListInit*/ false,
7037
/*StdInitListInit*/ false,
7038
/*ZeroInit*/ false, CXXConstructionKind::Complete, SourceRange());
7039
7040
// If we're supposed to bind temporaries, do so.
7041
if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity))
7042
CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
7043
return CurInit;
7044
}
7045
7046
/// Check whether elidable copy construction for binding a reference to
7047
/// a temporary would have succeeded if we were building in C++98 mode, for
7048
/// -Wc++98-compat.
7049
static void CheckCXX98CompatAccessibleCopy(Sema &S,
7050
const InitializedEntity &Entity,
7051
Expr *CurInitExpr) {
7052
assert(S.getLangOpts().CPlusPlus11);
7053
7054
const RecordType *Record = CurInitExpr->getType()->getAs<RecordType>();
7055
if (!Record)
7056
return;
7057
7058
SourceLocation Loc = getInitializationLoc(Entity, CurInitExpr);
7059
if (S.Diags.isIgnored(diag::warn_cxx98_compat_temp_copy, Loc))
7060
return;
7061
7062
// Find constructors which would have been considered.
7063
OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
7064
DeclContext::lookup_result Ctors =
7065
S.LookupConstructors(cast<CXXRecordDecl>(Record->getDecl()));
7066
7067
// Perform overload resolution.
7068
OverloadCandidateSet::iterator Best;
7069
OverloadingResult OR = ResolveConstructorOverload(
7070
S, Loc, CurInitExpr, CandidateSet, CurInitExpr->getType(), Ctors, Best,
7071
/*CopyInitializing=*/false, /*AllowExplicit=*/true,
7072
/*OnlyListConstructors=*/false, /*IsListInit=*/false,
7073
/*RequireActualConstructor=*/false,
7074
/*SecondStepOfCopyInit=*/true);
7075
7076
PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy)
7077
<< OR << (int)Entity.getKind() << CurInitExpr->getType()
7078
<< CurInitExpr->getSourceRange();
7079
7080
switch (OR) {
7081
case OR_Success:
7082
S.CheckConstructorAccess(Loc, cast<CXXConstructorDecl>(Best->Function),
7083
Best->FoundDecl, Entity, Diag);
7084
// FIXME: Check default arguments as far as that's possible.
7085
break;
7086
7087
case OR_No_Viable_Function:
7088
CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S,
7089
OCD_AllCandidates, CurInitExpr);
7090
break;
7091
7092
case OR_Ambiguous:
7093
CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S,
7094
OCD_AmbiguousCandidates, CurInitExpr);
7095
break;
7096
7097
case OR_Deleted:
7098
S.Diag(Loc, Diag);
7099
S.NoteDeletedFunction(Best->Function);
7100
break;
7101
}
7102
}
7103
7104
void InitializationSequence::PrintInitLocationNote(Sema &S,
7105
const InitializedEntity &Entity) {
7106
if (Entity.isParamOrTemplateParamKind() && Entity.getDecl()) {
7107
if (Entity.getDecl()->getLocation().isInvalid())
7108
return;
7109
7110
if (Entity.getDecl()->getDeclName())
7111
S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here)
7112
<< Entity.getDecl()->getDeclName();
7113
else
7114
S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here);
7115
}
7116
else if (Entity.getKind() == InitializedEntity::EK_RelatedResult &&
7117
Entity.getMethodDecl())
7118
S.Diag(Entity.getMethodDecl()->getLocation(),
7119
diag::note_method_return_type_change)
7120
<< Entity.getMethodDecl()->getDeclName();
7121
}
7122
7123
/// Returns true if the parameters describe a constructor initialization of
7124
/// an explicit temporary object, e.g. "Point(x, y)".
7125
static bool isExplicitTemporary(const InitializedEntity &Entity,
7126
const InitializationKind &Kind,
7127
unsigned NumArgs) {
7128
switch (Entity.getKind()) {
7129
case InitializedEntity::EK_Temporary:
7130
case InitializedEntity::EK_CompoundLiteralInit:
7131
case InitializedEntity::EK_RelatedResult:
7132
break;
7133
default:
7134
return false;
7135
}
7136
7137
switch (Kind.getKind()) {
7138
case InitializationKind::IK_DirectList:
7139
return true;
7140
// FIXME: Hack to work around cast weirdness.
7141
case InitializationKind::IK_Direct:
7142
case InitializationKind::IK_Value:
7143
return NumArgs != 1;
7144
default:
7145
return false;
7146
}
7147
}
7148
7149
static ExprResult
7150
PerformConstructorInitialization(Sema &S,
7151
const InitializedEntity &Entity,
7152
const InitializationKind &Kind,
7153
MultiExprArg Args,
7154
const InitializationSequence::Step& Step,
7155
bool &ConstructorInitRequiresZeroInit,
7156
bool IsListInitialization,
7157
bool IsStdInitListInitialization,
7158
SourceLocation LBraceLoc,
7159
SourceLocation RBraceLoc) {
7160
unsigned NumArgs = Args.size();
7161
CXXConstructorDecl *Constructor
7162
= cast<CXXConstructorDecl>(Step.Function.Function);
7163
bool HadMultipleCandidates = Step.Function.HadMultipleCandidates;
7164
7165
// Build a call to the selected constructor.
7166
SmallVector<Expr*, 8> ConstructorArgs;
7167
SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid())
7168
? Kind.getEqualLoc()
7169
: Kind.getLocation();
7170
7171
if (Kind.getKind() == InitializationKind::IK_Default) {
7172
// Force even a trivial, implicit default constructor to be
7173
// semantically checked. We do this explicitly because we don't build
7174
// the definition for completely trivial constructors.
7175
assert(Constructor->getParent() && "No parent class for constructor.");
7176
if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() &&
7177
Constructor->isTrivial() && !Constructor->isUsed(false)) {
7178
S.runWithSufficientStackSpace(Loc, [&] {
7179
S.DefineImplicitDefaultConstructor(Loc, Constructor);
7180
});
7181
}
7182
}
7183
7184
ExprResult CurInit((Expr *)nullptr);
7185
7186
// C++ [over.match.copy]p1:
7187
// - When initializing a temporary to be bound to the first parameter
7188
// of a constructor that takes a reference to possibly cv-qualified
7189
// T as its first argument, called with a single argument in the
7190
// context of direct-initialization, explicit conversion functions
7191
// are also considered.
7192
bool AllowExplicitConv =
7193
Kind.AllowExplicit() && !Kind.isCopyInit() && Args.size() == 1 &&
7194
hasCopyOrMoveCtorParam(S.Context,
7195
getConstructorInfo(Step.Function.FoundDecl));
7196
7197
// A smart pointer constructed from a nullable pointer is nullable.
7198
if (NumArgs == 1 && !Kind.isExplicitCast())
7199
S.diagnoseNullableToNonnullConversion(
7200
Entity.getType(), Args.front()->getType(), Kind.getLocation());
7201
7202
// Determine the arguments required to actually perform the constructor
7203
// call.
7204
if (S.CompleteConstructorCall(Constructor, Step.Type, Args, Loc,
7205
ConstructorArgs, AllowExplicitConv,
7206
IsListInitialization))
7207
return ExprError();
7208
7209
if (isExplicitTemporary(Entity, Kind, NumArgs)) {
7210
// An explicitly-constructed temporary, e.g., X(1, 2).
7211
if (S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc))
7212
return ExprError();
7213
7214
TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
7215
if (!TSInfo)
7216
TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc);
7217
SourceRange ParenOrBraceRange =
7218
(Kind.getKind() == InitializationKind::IK_DirectList)
7219
? SourceRange(LBraceLoc, RBraceLoc)
7220
: Kind.getParenOrBraceRange();
7221
7222
CXXConstructorDecl *CalleeDecl = Constructor;
7223
if (auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(
7224
Step.Function.FoundDecl.getDecl())) {
7225
CalleeDecl = S.findInheritingConstructor(Loc, Constructor, Shadow);
7226
}
7227
S.MarkFunctionReferenced(Loc, CalleeDecl);
7228
7229
CurInit = S.CheckForImmediateInvocation(
7230
CXXTemporaryObjectExpr::Create(
7231
S.Context, CalleeDecl,
7232
Entity.getType().getNonLValueExprType(S.Context), TSInfo,
7233
ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates,
7234
IsListInitialization, IsStdInitListInitialization,
7235
ConstructorInitRequiresZeroInit),
7236
CalleeDecl);
7237
} else {
7238
CXXConstructionKind ConstructKind = CXXConstructionKind::Complete;
7239
7240
if (Entity.getKind() == InitializedEntity::EK_Base) {
7241
ConstructKind = Entity.getBaseSpecifier()->isVirtual()
7242
? CXXConstructionKind::VirtualBase
7243
: CXXConstructionKind::NonVirtualBase;
7244
} else if (Entity.getKind() == InitializedEntity::EK_Delegating) {
7245
ConstructKind = CXXConstructionKind::Delegating;
7246
}
7247
7248
// Only get the parenthesis or brace range if it is a list initialization or
7249
// direct construction.
7250
SourceRange ParenOrBraceRange;
7251
if (IsListInitialization)
7252
ParenOrBraceRange = SourceRange(LBraceLoc, RBraceLoc);
7253
else if (Kind.getKind() == InitializationKind::IK_Direct)
7254
ParenOrBraceRange = Kind.getParenOrBraceRange();
7255
7256
// If the entity allows NRVO, mark the construction as elidable
7257
// unconditionally.
7258
if (Entity.allowsNRVO())
7259
CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,
7260
Step.Function.FoundDecl,
7261
Constructor, /*Elidable=*/true,
7262
ConstructorArgs,
7263
HadMultipleCandidates,
7264
IsListInitialization,
7265
IsStdInitListInitialization,
7266
ConstructorInitRequiresZeroInit,
7267
ConstructKind,
7268
ParenOrBraceRange);
7269
else
7270
CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,
7271
Step.Function.FoundDecl,
7272
Constructor,
7273
ConstructorArgs,
7274
HadMultipleCandidates,
7275
IsListInitialization,
7276
IsStdInitListInitialization,
7277
ConstructorInitRequiresZeroInit,
7278
ConstructKind,
7279
ParenOrBraceRange);
7280
}
7281
if (CurInit.isInvalid())
7282
return ExprError();
7283
7284
// Only check access if all of that succeeded.
7285
S.CheckConstructorAccess(Loc, Constructor, Step.Function.FoundDecl, Entity);
7286
if (S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc))
7287
return ExprError();
7288
7289
if (const ArrayType *AT = S.Context.getAsArrayType(Entity.getType()))
7290
if (checkDestructorReference(S.Context.getBaseElementType(AT), Loc, S))
7291
return ExprError();
7292
7293
if (shouldBindAsTemporary(Entity))
7294
CurInit = S.MaybeBindToTemporary(CurInit.get());
7295
7296
return CurInit;
7297
}
7298
7299
void Sema::checkInitializerLifetime(const InitializedEntity &Entity,
7300
Expr *Init) {
7301
return sema::checkExprLifetime(*this, Entity, Init);
7302
}
7303
7304
static void DiagnoseNarrowingInInitList(Sema &S,
7305
const ImplicitConversionSequence &ICS,
7306
QualType PreNarrowingType,
7307
QualType EntityType,
7308
const Expr *PostInit);
7309
7310
static void CheckC23ConstexprInitConversion(Sema &S, QualType FromType,
7311
QualType ToType, Expr *Init);
7312
7313
/// Provide warnings when std::move is used on construction.
7314
static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr,
7315
bool IsReturnStmt) {
7316
if (!InitExpr)
7317
return;
7318
7319
if (S.inTemplateInstantiation())
7320
return;
7321
7322
QualType DestType = InitExpr->getType();
7323
if (!DestType->isRecordType())
7324
return;
7325
7326
unsigned DiagID = 0;
7327
if (IsReturnStmt) {
7328
const CXXConstructExpr *CCE =
7329
dyn_cast<CXXConstructExpr>(InitExpr->IgnoreParens());
7330
if (!CCE || CCE->getNumArgs() != 1)
7331
return;
7332
7333
if (!CCE->getConstructor()->isCopyOrMoveConstructor())
7334
return;
7335
7336
InitExpr = CCE->getArg(0)->IgnoreImpCasts();
7337
}
7338
7339
// Find the std::move call and get the argument.
7340
const CallExpr *CE = dyn_cast<CallExpr>(InitExpr->IgnoreParens());
7341
if (!CE || !CE->isCallToStdMove())
7342
return;
7343
7344
const Expr *Arg = CE->getArg(0)->IgnoreImplicit();
7345
7346
if (IsReturnStmt) {
7347
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts());
7348
if (!DRE || DRE->refersToEnclosingVariableOrCapture())
7349
return;
7350
7351
const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl());
7352
if (!VD || !VD->hasLocalStorage())
7353
return;
7354
7355
// __block variables are not moved implicitly.
7356
if (VD->hasAttr<BlocksAttr>())
7357
return;
7358
7359
QualType SourceType = VD->getType();
7360
if (!SourceType->isRecordType())
7361
return;
7362
7363
if (!S.Context.hasSameUnqualifiedType(DestType, SourceType)) {
7364
return;
7365
}
7366
7367
// If we're returning a function parameter, copy elision
7368
// is not possible.
7369
if (isa<ParmVarDecl>(VD))
7370
DiagID = diag::warn_redundant_move_on_return;
7371
else
7372
DiagID = diag::warn_pessimizing_move_on_return;
7373
} else {
7374
DiagID = diag::warn_pessimizing_move_on_initialization;
7375
const Expr *ArgStripped = Arg->IgnoreImplicit()->IgnoreParens();
7376
if (!ArgStripped->isPRValue() || !ArgStripped->getType()->isRecordType())
7377
return;
7378
}
7379
7380
S.Diag(CE->getBeginLoc(), DiagID);
7381
7382
// Get all the locations for a fix-it. Don't emit the fix-it if any location
7383
// is within a macro.
7384
SourceLocation CallBegin = CE->getCallee()->getBeginLoc();
7385
if (CallBegin.isMacroID())
7386
return;
7387
SourceLocation RParen = CE->getRParenLoc();
7388
if (RParen.isMacroID())
7389
return;
7390
SourceLocation LParen;
7391
SourceLocation ArgLoc = Arg->getBeginLoc();
7392
7393
// Special testing for the argument location. Since the fix-it needs the
7394
// location right before the argument, the argument location can be in a
7395
// macro only if it is at the beginning of the macro.
7396
while (ArgLoc.isMacroID() &&
7397
S.getSourceManager().isAtStartOfImmediateMacroExpansion(ArgLoc)) {
7398
ArgLoc = S.getSourceManager().getImmediateExpansionRange(ArgLoc).getBegin();
7399
}
7400
7401
if (LParen.isMacroID())
7402
return;
7403
7404
LParen = ArgLoc.getLocWithOffset(-1);
7405
7406
S.Diag(CE->getBeginLoc(), diag::note_remove_move)
7407
<< FixItHint::CreateRemoval(SourceRange(CallBegin, LParen))
7408
<< FixItHint::CreateRemoval(SourceRange(RParen, RParen));
7409
}
7410
7411
static void CheckForNullPointerDereference(Sema &S, const Expr *E) {
7412
// Check to see if we are dereferencing a null pointer. If so, this is
7413
// undefined behavior, so warn about it. This only handles the pattern
7414
// "*null", which is a very syntactic check.
7415
if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E->IgnoreParenCasts()))
7416
if (UO->getOpcode() == UO_Deref &&
7417
UO->getSubExpr()->IgnoreParenCasts()->
7418
isNullPointerConstant(S.Context, Expr::NPC_ValueDependentIsNotNull)) {
7419
S.DiagRuntimeBehavior(UO->getOperatorLoc(), UO,
7420
S.PDiag(diag::warn_binding_null_to_reference)
7421
<< UO->getSubExpr()->getSourceRange());
7422
}
7423
}
7424
7425
MaterializeTemporaryExpr *
7426
Sema::CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary,
7427
bool BoundToLvalueReference) {
7428
auto MTE = new (Context)
7429
MaterializeTemporaryExpr(T, Temporary, BoundToLvalueReference);
7430
7431
// Order an ExprWithCleanups for lifetime marks.
7432
//
7433
// TODO: It'll be good to have a single place to check the access of the
7434
// destructor and generate ExprWithCleanups for various uses. Currently these
7435
// are done in both CreateMaterializeTemporaryExpr and MaybeBindToTemporary,
7436
// but there may be a chance to merge them.
7437
Cleanup.setExprNeedsCleanups(false);
7438
if (isInLifetimeExtendingContext()) {
7439
auto &Record = ExprEvalContexts.back();
7440
Record.ForRangeLifetimeExtendTemps.push_back(MTE);
7441
}
7442
return MTE;
7443
}
7444
7445
ExprResult Sema::TemporaryMaterializationConversion(Expr *E) {
7446
// In C++98, we don't want to implicitly create an xvalue.
7447
// FIXME: This means that AST consumers need to deal with "prvalues" that
7448
// denote materialized temporaries. Maybe we should add another ValueKind
7449
// for "xvalue pretending to be a prvalue" for C++98 support.
7450
if (!E->isPRValue() || !getLangOpts().CPlusPlus11)
7451
return E;
7452
7453
// C++1z [conv.rval]/1: T shall be a complete type.
7454
// FIXME: Does this ever matter (can we form a prvalue of incomplete type)?
7455
// If so, we should check for a non-abstract class type here too.
7456
QualType T = E->getType();
7457
if (RequireCompleteType(E->getExprLoc(), T, diag::err_incomplete_type))
7458
return ExprError();
7459
7460
return CreateMaterializeTemporaryExpr(E->getType(), E, false);
7461
}
7462
7463
ExprResult Sema::PerformQualificationConversion(Expr *E, QualType Ty,
7464
ExprValueKind VK,
7465
CheckedConversionKind CCK) {
7466
7467
CastKind CK = CK_NoOp;
7468
7469
if (VK == VK_PRValue) {
7470
auto PointeeTy = Ty->getPointeeType();
7471
auto ExprPointeeTy = E->getType()->getPointeeType();
7472
if (!PointeeTy.isNull() &&
7473
PointeeTy.getAddressSpace() != ExprPointeeTy.getAddressSpace())
7474
CK = CK_AddressSpaceConversion;
7475
} else if (Ty.getAddressSpace() != E->getType().getAddressSpace()) {
7476
CK = CK_AddressSpaceConversion;
7477
}
7478
7479
return ImpCastExprToType(E, Ty, CK, VK, /*BasePath=*/nullptr, CCK);
7480
}
7481
7482
ExprResult InitializationSequence::Perform(Sema &S,
7483
const InitializedEntity &Entity,
7484
const InitializationKind &Kind,
7485
MultiExprArg Args,
7486
QualType *ResultType) {
7487
if (Failed()) {
7488
Diagnose(S, Entity, Kind, Args);
7489
return ExprError();
7490
}
7491
if (!ZeroInitializationFixit.empty()) {
7492
const Decl *D = Entity.getDecl();
7493
const auto *VD = dyn_cast_or_null<VarDecl>(D);
7494
QualType DestType = Entity.getType();
7495
7496
// The initialization would have succeeded with this fixit. Since the fixit
7497
// is on the error, we need to build a valid AST in this case, so this isn't
7498
// handled in the Failed() branch above.
7499
if (!DestType->isRecordType() && VD && VD->isConstexpr()) {
7500
// Use a more useful diagnostic for constexpr variables.
7501
S.Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
7502
<< VD
7503
<< FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
7504
ZeroInitializationFixit);
7505
} else {
7506
unsigned DiagID = diag::err_default_init_const;
7507
if (S.getLangOpts().MSVCCompat && D && D->hasAttr<SelectAnyAttr>())
7508
DiagID = diag::ext_default_init_const;
7509
7510
S.Diag(Kind.getLocation(), DiagID)
7511
<< DestType << (bool)DestType->getAs<RecordType>()
7512
<< FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
7513
ZeroInitializationFixit);
7514
}
7515
}
7516
7517
if (getKind() == DependentSequence) {
7518
// If the declaration is a non-dependent, incomplete array type
7519
// that has an initializer, then its type will be completed once
7520
// the initializer is instantiated.
7521
if (ResultType && !Entity.getType()->isDependentType() &&
7522
Args.size() == 1) {
7523
QualType DeclType = Entity.getType();
7524
if (const IncompleteArrayType *ArrayT
7525
= S.Context.getAsIncompleteArrayType(DeclType)) {
7526
// FIXME: We don't currently have the ability to accurately
7527
// compute the length of an initializer list without
7528
// performing full type-checking of the initializer list
7529
// (since we have to determine where braces are implicitly
7530
// introduced and such). So, we fall back to making the array
7531
// type a dependently-sized array type with no specified
7532
// bound.
7533
if (isa<InitListExpr>((Expr *)Args[0])) {
7534
SourceRange Brackets;
7535
7536
// Scavange the location of the brackets from the entity, if we can.
7537
if (auto *DD = dyn_cast_or_null<DeclaratorDecl>(Entity.getDecl())) {
7538
if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) {
7539
TypeLoc TL = TInfo->getTypeLoc();
7540
if (IncompleteArrayTypeLoc ArrayLoc =
7541
TL.getAs<IncompleteArrayTypeLoc>())
7542
Brackets = ArrayLoc.getBracketsRange();
7543
}
7544
}
7545
7546
*ResultType
7547
= S.Context.getDependentSizedArrayType(ArrayT->getElementType(),
7548
/*NumElts=*/nullptr,
7549
ArrayT->getSizeModifier(),
7550
ArrayT->getIndexTypeCVRQualifiers(),
7551
Brackets);
7552
}
7553
7554
}
7555
}
7556
if (Kind.getKind() == InitializationKind::IK_Direct &&
7557
!Kind.isExplicitCast()) {
7558
// Rebuild the ParenListExpr.
7559
SourceRange ParenRange = Kind.getParenOrBraceRange();
7560
return S.ActOnParenListExpr(ParenRange.getBegin(), ParenRange.getEnd(),
7561
Args);
7562
}
7563
assert(Kind.getKind() == InitializationKind::IK_Copy ||
7564
Kind.isExplicitCast() ||
7565
Kind.getKind() == InitializationKind::IK_DirectList);
7566
return ExprResult(Args[0]);
7567
}
7568
7569
// No steps means no initialization.
7570
if (Steps.empty())
7571
return ExprResult((Expr *)nullptr);
7572
7573
if (S.getLangOpts().CPlusPlus11 && Entity.getType()->isReferenceType() &&
7574
Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
7575
!Entity.isParamOrTemplateParamKind()) {
7576
// Produce a C++98 compatibility warning if we are initializing a reference
7577
// from an initializer list. For parameters, we produce a better warning
7578
// elsewhere.
7579
Expr *Init = Args[0];
7580
S.Diag(Init->getBeginLoc(), diag::warn_cxx98_compat_reference_list_init)
7581
<< Init->getSourceRange();
7582
}
7583
7584
if (S.getLangOpts().MicrosoftExt && Args.size() == 1 &&
7585
isa<PredefinedExpr>(Args[0]) && Entity.getType()->isArrayType()) {
7586
// Produce a Microsoft compatibility warning when initializing from a
7587
// predefined expression since MSVC treats predefined expressions as string
7588
// literals.
7589
Expr *Init = Args[0];
7590
S.Diag(Init->getBeginLoc(), diag::ext_init_from_predefined) << Init;
7591
}
7592
7593
// OpenCL v2.0 s6.13.11.1. atomic variables can be initialized in global scope
7594
QualType ETy = Entity.getType();
7595
bool HasGlobalAS = ETy.hasAddressSpace() &&
7596
ETy.getAddressSpace() == LangAS::opencl_global;
7597
7598
if (S.getLangOpts().OpenCLVersion >= 200 &&
7599
ETy->isAtomicType() && !HasGlobalAS &&
7600
Entity.getKind() == InitializedEntity::EK_Variable && Args.size() > 0) {
7601
S.Diag(Args[0]->getBeginLoc(), diag::err_opencl_atomic_init)
7602
<< 1
7603
<< SourceRange(Entity.getDecl()->getBeginLoc(), Args[0]->getEndLoc());
7604
return ExprError();
7605
}
7606
7607
QualType DestType = Entity.getType().getNonReferenceType();
7608
// FIXME: Ugly hack around the fact that Entity.getType() is not
7609
// the same as Entity.getDecl()->getType() in cases involving type merging,
7610
// and we want latter when it makes sense.
7611
if (ResultType)
7612
*ResultType = Entity.getDecl() ? Entity.getDecl()->getType() :
7613
Entity.getType();
7614
7615
ExprResult CurInit((Expr *)nullptr);
7616
SmallVector<Expr*, 4> ArrayLoopCommonExprs;
7617
7618
// HLSL allows vector initialization to function like list initialization, but
7619
// use the syntax of a C++-like constructor.
7620
bool IsHLSLVectorInit = S.getLangOpts().HLSL && DestType->isExtVectorType() &&
7621
isa<InitListExpr>(Args[0]);
7622
(void)IsHLSLVectorInit;
7623
7624
// For initialization steps that start with a single initializer,
7625
// grab the only argument out the Args and place it into the "current"
7626
// initializer.
7627
switch (Steps.front().Kind) {
7628
case SK_ResolveAddressOfOverloadedFunction:
7629
case SK_CastDerivedToBasePRValue:
7630
case SK_CastDerivedToBaseXValue:
7631
case SK_CastDerivedToBaseLValue:
7632
case SK_BindReference:
7633
case SK_BindReferenceToTemporary:
7634
case SK_FinalCopy:
7635
case SK_ExtraneousCopyToTemporary:
7636
case SK_UserConversion:
7637
case SK_QualificationConversionLValue:
7638
case SK_QualificationConversionXValue:
7639
case SK_QualificationConversionPRValue:
7640
case SK_FunctionReferenceConversion:
7641
case SK_AtomicConversion:
7642
case SK_ConversionSequence:
7643
case SK_ConversionSequenceNoNarrowing:
7644
case SK_ListInitialization:
7645
case SK_UnwrapInitList:
7646
case SK_RewrapInitList:
7647
case SK_CAssignment:
7648
case SK_StringInit:
7649
case SK_ObjCObjectConversion:
7650
case SK_ArrayLoopIndex:
7651
case SK_ArrayLoopInit:
7652
case SK_ArrayInit:
7653
case SK_GNUArrayInit:
7654
case SK_ParenthesizedArrayInit:
7655
case SK_PassByIndirectCopyRestore:
7656
case SK_PassByIndirectRestore:
7657
case SK_ProduceObjCObject:
7658
case SK_StdInitializerList:
7659
case SK_OCLSamplerInit:
7660
case SK_OCLZeroOpaqueType: {
7661
assert(Args.size() == 1 || IsHLSLVectorInit);
7662
CurInit = Args[0];
7663
if (!CurInit.get()) return ExprError();
7664
break;
7665
}
7666
7667
case SK_ConstructorInitialization:
7668
case SK_ConstructorInitializationFromList:
7669
case SK_StdInitializerListConstructorCall:
7670
case SK_ZeroInitialization:
7671
case SK_ParenthesizedListInit:
7672
break;
7673
}
7674
7675
// Promote from an unevaluated context to an unevaluated list context in
7676
// C++11 list-initialization; we need to instantiate entities usable in
7677
// constant expressions here in order to perform narrowing checks =(
7678
EnterExpressionEvaluationContext Evaluated(
7679
S, EnterExpressionEvaluationContext::InitList,
7680
isa_and_nonnull<InitListExpr>(CurInit.get()));
7681
7682
// C++ [class.abstract]p2:
7683
// no objects of an abstract class can be created except as subobjects
7684
// of a class derived from it
7685
auto checkAbstractType = [&](QualType T) -> bool {
7686
if (Entity.getKind() == InitializedEntity::EK_Base ||
7687
Entity.getKind() == InitializedEntity::EK_Delegating)
7688
return false;
7689
return S.RequireNonAbstractType(Kind.getLocation(), T,
7690
diag::err_allocation_of_abstract_type);
7691
};
7692
7693
// Walk through the computed steps for the initialization sequence,
7694
// performing the specified conversions along the way.
7695
bool ConstructorInitRequiresZeroInit = false;
7696
for (step_iterator Step = step_begin(), StepEnd = step_end();
7697
Step != StepEnd; ++Step) {
7698
if (CurInit.isInvalid())
7699
return ExprError();
7700
7701
QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType();
7702
7703
switch (Step->Kind) {
7704
case SK_ResolveAddressOfOverloadedFunction:
7705
// Overload resolution determined which function invoke; update the
7706
// initializer to reflect that choice.
7707
S.CheckAddressOfMemberAccess(CurInit.get(), Step->Function.FoundDecl);
7708
if (S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()))
7709
return ExprError();
7710
CurInit = S.FixOverloadedFunctionReference(CurInit,
7711
Step->Function.FoundDecl,
7712
Step->Function.Function);
7713
// We might get back another placeholder expression if we resolved to a
7714
// builtin.
7715
if (!CurInit.isInvalid())
7716
CurInit = S.CheckPlaceholderExpr(CurInit.get());
7717
break;
7718
7719
case SK_CastDerivedToBasePRValue:
7720
case SK_CastDerivedToBaseXValue:
7721
case SK_CastDerivedToBaseLValue: {
7722
// We have a derived-to-base cast that produces either an rvalue or an
7723
// lvalue. Perform that cast.
7724
7725
CXXCastPath BasePath;
7726
7727
// Casts to inaccessible base classes are allowed with C-style casts.
7728
bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast();
7729
if (S.CheckDerivedToBaseConversion(
7730
SourceType, Step->Type, CurInit.get()->getBeginLoc(),
7731
CurInit.get()->getSourceRange(), &BasePath, IgnoreBaseAccess))
7732
return ExprError();
7733
7734
ExprValueKind VK =
7735
Step->Kind == SK_CastDerivedToBaseLValue
7736
? VK_LValue
7737
: (Step->Kind == SK_CastDerivedToBaseXValue ? VK_XValue
7738
: VK_PRValue);
7739
CurInit = ImplicitCastExpr::Create(S.Context, Step->Type,
7740
CK_DerivedToBase, CurInit.get(),
7741
&BasePath, VK, FPOptionsOverride());
7742
break;
7743
}
7744
7745
case SK_BindReference:
7746
// Reference binding does not have any corresponding ASTs.
7747
7748
// Check exception specifications
7749
if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
7750
return ExprError();
7751
7752
// We don't check for e.g. function pointers here, since address
7753
// availability checks should only occur when the function first decays
7754
// into a pointer or reference.
7755
if (CurInit.get()->getType()->isFunctionProtoType()) {
7756
if (auto *DRE = dyn_cast<DeclRefExpr>(CurInit.get()->IgnoreParens())) {
7757
if (auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
7758
if (!S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
7759
DRE->getBeginLoc()))
7760
return ExprError();
7761
}
7762
}
7763
}
7764
7765
CheckForNullPointerDereference(S, CurInit.get());
7766
break;
7767
7768
case SK_BindReferenceToTemporary: {
7769
// Make sure the "temporary" is actually an rvalue.
7770
assert(CurInit.get()->isPRValue() && "not a temporary");
7771
7772
// Check exception specifications
7773
if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
7774
return ExprError();
7775
7776
QualType MTETy = Step->Type;
7777
7778
// When this is an incomplete array type (such as when this is
7779
// initializing an array of unknown bounds from an init list), use THAT
7780
// type instead so that we propagate the array bounds.
7781
if (MTETy->isIncompleteArrayType() &&
7782
!CurInit.get()->getType()->isIncompleteArrayType() &&
7783
S.Context.hasSameType(
7784
MTETy->getPointeeOrArrayElementType(),
7785
CurInit.get()->getType()->getPointeeOrArrayElementType()))
7786
MTETy = CurInit.get()->getType();
7787
7788
// Materialize the temporary into memory.
7789
MaterializeTemporaryExpr *MTE = S.CreateMaterializeTemporaryExpr(
7790
MTETy, CurInit.get(), Entity.getType()->isLValueReferenceType());
7791
CurInit = MTE;
7792
7793
// If we're extending this temporary to automatic storage duration -- we
7794
// need to register its cleanup during the full-expression's cleanups.
7795
if (MTE->getStorageDuration() == SD_Automatic &&
7796
MTE->getType().isDestructedType())
7797
S.Cleanup.setExprNeedsCleanups(true);
7798
break;
7799
}
7800
7801
case SK_FinalCopy:
7802
if (checkAbstractType(Step->Type))
7803
return ExprError();
7804
7805
// If the overall initialization is initializing a temporary, we already
7806
// bound our argument if it was necessary to do so. If not (if we're
7807
// ultimately initializing a non-temporary), our argument needs to be
7808
// bound since it's initializing a function parameter.
7809
// FIXME: This is a mess. Rationalize temporary destruction.
7810
if (!shouldBindAsTemporary(Entity))
7811
CurInit = S.MaybeBindToTemporary(CurInit.get());
7812
CurInit = CopyObject(S, Step->Type, Entity, CurInit,
7813
/*IsExtraneousCopy=*/false);
7814
break;
7815
7816
case SK_ExtraneousCopyToTemporary:
7817
CurInit = CopyObject(S, Step->Type, Entity, CurInit,
7818
/*IsExtraneousCopy=*/true);
7819
break;
7820
7821
case SK_UserConversion: {
7822
// We have a user-defined conversion that invokes either a constructor
7823
// or a conversion function.
7824
CastKind CastKind;
7825
FunctionDecl *Fn = Step->Function.Function;
7826
DeclAccessPair FoundFn = Step->Function.FoundDecl;
7827
bool HadMultipleCandidates = Step->Function.HadMultipleCandidates;
7828
bool CreatedObject = false;
7829
if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) {
7830
// Build a call to the selected constructor.
7831
SmallVector<Expr*, 8> ConstructorArgs;
7832
SourceLocation Loc = CurInit.get()->getBeginLoc();
7833
7834
// Determine the arguments required to actually perform the constructor
7835
// call.
7836
Expr *Arg = CurInit.get();
7837
if (S.CompleteConstructorCall(Constructor, Step->Type,
7838
MultiExprArg(&Arg, 1), Loc,
7839
ConstructorArgs))
7840
return ExprError();
7841
7842
// Build an expression that constructs a temporary.
7843
CurInit = S.BuildCXXConstructExpr(
7844
Loc, Step->Type, FoundFn, Constructor, ConstructorArgs,
7845
HadMultipleCandidates,
7846
/*ListInit*/ false,
7847
/*StdInitListInit*/ false,
7848
/*ZeroInit*/ false, CXXConstructionKind::Complete, SourceRange());
7849
if (CurInit.isInvalid())
7850
return ExprError();
7851
7852
S.CheckConstructorAccess(Kind.getLocation(), Constructor, FoundFn,
7853
Entity);
7854
if (S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()))
7855
return ExprError();
7856
7857
CastKind = CK_ConstructorConversion;
7858
CreatedObject = true;
7859
} else {
7860
// Build a call to the conversion function.
7861
CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn);
7862
S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), nullptr,
7863
FoundFn);
7864
if (S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()))
7865
return ExprError();
7866
7867
CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion,
7868
HadMultipleCandidates);
7869
if (CurInit.isInvalid())
7870
return ExprError();
7871
7872
CastKind = CK_UserDefinedConversion;
7873
CreatedObject = Conversion->getReturnType()->isRecordType();
7874
}
7875
7876
if (CreatedObject && checkAbstractType(CurInit.get()->getType()))
7877
return ExprError();
7878
7879
CurInit = ImplicitCastExpr::Create(
7880
S.Context, CurInit.get()->getType(), CastKind, CurInit.get(), nullptr,
7881
CurInit.get()->getValueKind(), S.CurFPFeatureOverrides());
7882
7883
if (shouldBindAsTemporary(Entity))
7884
// The overall entity is temporary, so this expression should be
7885
// destroyed at the end of its full-expression.
7886
CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
7887
else if (CreatedObject && shouldDestroyEntity(Entity)) {
7888
// The object outlasts the full-expression, but we need to prepare for
7889
// a destructor being run on it.
7890
// FIXME: It makes no sense to do this here. This should happen
7891
// regardless of how we initialized the entity.
7892
QualType T = CurInit.get()->getType();
7893
if (const RecordType *Record = T->getAs<RecordType>()) {
7894
CXXDestructorDecl *Destructor
7895
= S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl()));
7896
S.CheckDestructorAccess(CurInit.get()->getBeginLoc(), Destructor,
7897
S.PDiag(diag::err_access_dtor_temp) << T);
7898
S.MarkFunctionReferenced(CurInit.get()->getBeginLoc(), Destructor);
7899
if (S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getBeginLoc()))
7900
return ExprError();
7901
}
7902
}
7903
break;
7904
}
7905
7906
case SK_QualificationConversionLValue:
7907
case SK_QualificationConversionXValue:
7908
case SK_QualificationConversionPRValue: {
7909
// Perform a qualification conversion; these can never go wrong.
7910
ExprValueKind VK =
7911
Step->Kind == SK_QualificationConversionLValue
7912
? VK_LValue
7913
: (Step->Kind == SK_QualificationConversionXValue ? VK_XValue
7914
: VK_PRValue);
7915
CurInit = S.PerformQualificationConversion(CurInit.get(), Step->Type, VK);
7916
break;
7917
}
7918
7919
case SK_FunctionReferenceConversion:
7920
assert(CurInit.get()->isLValue() &&
7921
"function reference should be lvalue");
7922
CurInit =
7923
S.ImpCastExprToType(CurInit.get(), Step->Type, CK_NoOp, VK_LValue);
7924
break;
7925
7926
case SK_AtomicConversion: {
7927
assert(CurInit.get()->isPRValue() && "cannot convert glvalue to atomic");
7928
CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
7929
CK_NonAtomicToAtomic, VK_PRValue);
7930
break;
7931
}
7932
7933
case SK_ConversionSequence:
7934
case SK_ConversionSequenceNoNarrowing: {
7935
if (const auto *FromPtrType =
7936
CurInit.get()->getType()->getAs<PointerType>()) {
7937
if (const auto *ToPtrType = Step->Type->getAs<PointerType>()) {
7938
if (FromPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
7939
!ToPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
7940
// Do not check static casts here because they are checked earlier
7941
// in Sema::ActOnCXXNamedCast()
7942
if (!Kind.isStaticCast()) {
7943
S.Diag(CurInit.get()->getExprLoc(),
7944
diag::warn_noderef_to_dereferenceable_pointer)
7945
<< CurInit.get()->getSourceRange();
7946
}
7947
}
7948
}
7949
}
7950
Expr *Init = CurInit.get();
7951
CheckedConversionKind CCK =
7952
Kind.isCStyleCast() ? CheckedConversionKind::CStyleCast
7953
: Kind.isFunctionalCast() ? CheckedConversionKind::FunctionalCast
7954
: Kind.isExplicitCast() ? CheckedConversionKind::OtherCast
7955
: CheckedConversionKind::Implicit;
7956
ExprResult CurInitExprRes = S.PerformImplicitConversion(
7957
Init, Step->Type, *Step->ICS, getAssignmentAction(Entity), CCK);
7958
if (CurInitExprRes.isInvalid())
7959
return ExprError();
7960
7961
S.DiscardMisalignedMemberAddress(Step->Type.getTypePtr(), Init);
7962
7963
CurInit = CurInitExprRes;
7964
7965
if (Step->Kind == SK_ConversionSequenceNoNarrowing &&
7966
S.getLangOpts().CPlusPlus)
7967
DiagnoseNarrowingInInitList(S, *Step->ICS, SourceType, Entity.getType(),
7968
CurInit.get());
7969
7970
break;
7971
}
7972
7973
case SK_ListInitialization: {
7974
if (checkAbstractType(Step->Type))
7975
return ExprError();
7976
7977
InitListExpr *InitList = cast<InitListExpr>(CurInit.get());
7978
// If we're not initializing the top-level entity, we need to create an
7979
// InitializeTemporary entity for our target type.
7980
QualType Ty = Step->Type;
7981
bool IsTemporary = !S.Context.hasSameType(Entity.getType(), Ty);
7982
InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(Ty);
7983
InitializedEntity InitEntity = IsTemporary ? TempEntity : Entity;
7984
InitListChecker PerformInitList(S, InitEntity,
7985
InitList, Ty, /*VerifyOnly=*/false,
7986
/*TreatUnavailableAsInvalid=*/false);
7987
if (PerformInitList.HadError())
7988
return ExprError();
7989
7990
// Hack: We must update *ResultType if available in order to set the
7991
// bounds of arrays, e.g. in 'int ar[] = {1, 2, 3};'.
7992
// Worst case: 'const int (&arref)[] = {1, 2, 3};'.
7993
if (ResultType &&
7994
ResultType->getNonReferenceType()->isIncompleteArrayType()) {
7995
if ((*ResultType)->isRValueReferenceType())
7996
Ty = S.Context.getRValueReferenceType(Ty);
7997
else if ((*ResultType)->isLValueReferenceType())
7998
Ty = S.Context.getLValueReferenceType(Ty,
7999
(*ResultType)->castAs<LValueReferenceType>()->isSpelledAsLValue());
8000
*ResultType = Ty;
8001
}
8002
8003
InitListExpr *StructuredInitList =
8004
PerformInitList.getFullyStructuredList();
8005
CurInit.get();
8006
CurInit = shouldBindAsTemporary(InitEntity)
8007
? S.MaybeBindToTemporary(StructuredInitList)
8008
: StructuredInitList;
8009
break;
8010
}
8011
8012
case SK_ConstructorInitializationFromList: {
8013
if (checkAbstractType(Step->Type))
8014
return ExprError();
8015
8016
// When an initializer list is passed for a parameter of type "reference
8017
// to object", we don't get an EK_Temporary entity, but instead an
8018
// EK_Parameter entity with reference type.
8019
// FIXME: This is a hack. What we really should do is create a user
8020
// conversion step for this case, but this makes it considerably more
8021
// complicated. For now, this will do.
8022
InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(
8023
Entity.getType().getNonReferenceType());
8024
bool UseTemporary = Entity.getType()->isReferenceType();
8025
assert(Args.size() == 1 && "expected a single argument for list init");
8026
InitListExpr *InitList = cast<InitListExpr>(Args[0]);
8027
S.Diag(InitList->getExprLoc(), diag::warn_cxx98_compat_ctor_list_init)
8028
<< InitList->getSourceRange();
8029
MultiExprArg Arg(InitList->getInits(), InitList->getNumInits());
8030
CurInit = PerformConstructorInitialization(S, UseTemporary ? TempEntity :
8031
Entity,
8032
Kind, Arg, *Step,
8033
ConstructorInitRequiresZeroInit,
8034
/*IsListInitialization*/true,
8035
/*IsStdInitListInit*/false,
8036
InitList->getLBraceLoc(),
8037
InitList->getRBraceLoc());
8038
break;
8039
}
8040
8041
case SK_UnwrapInitList:
8042
CurInit = cast<InitListExpr>(CurInit.get())->getInit(0);
8043
break;
8044
8045
case SK_RewrapInitList: {
8046
Expr *E = CurInit.get();
8047
InitListExpr *Syntactic = Step->WrappingSyntacticList;
8048
InitListExpr *ILE = new (S.Context) InitListExpr(S.Context,
8049
Syntactic->getLBraceLoc(), E, Syntactic->getRBraceLoc());
8050
ILE->setSyntacticForm(Syntactic);
8051
ILE->setType(E->getType());
8052
ILE->setValueKind(E->getValueKind());
8053
CurInit = ILE;
8054
break;
8055
}
8056
8057
case SK_ConstructorInitialization:
8058
case SK_StdInitializerListConstructorCall: {
8059
if (checkAbstractType(Step->Type))
8060
return ExprError();
8061
8062
// When an initializer list is passed for a parameter of type "reference
8063
// to object", we don't get an EK_Temporary entity, but instead an
8064
// EK_Parameter entity with reference type.
8065
// FIXME: This is a hack. What we really should do is create a user
8066
// conversion step for this case, but this makes it considerably more
8067
// complicated. For now, this will do.
8068
InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(
8069
Entity.getType().getNonReferenceType());
8070
bool UseTemporary = Entity.getType()->isReferenceType();
8071
bool IsStdInitListInit =
8072
Step->Kind == SK_StdInitializerListConstructorCall;
8073
Expr *Source = CurInit.get();
8074
SourceRange Range = Kind.hasParenOrBraceRange()
8075
? Kind.getParenOrBraceRange()
8076
: SourceRange();
8077
CurInit = PerformConstructorInitialization(
8078
S, UseTemporary ? TempEntity : Entity, Kind,
8079
Source ? MultiExprArg(Source) : Args, *Step,
8080
ConstructorInitRequiresZeroInit,
8081
/*IsListInitialization*/ IsStdInitListInit,
8082
/*IsStdInitListInitialization*/ IsStdInitListInit,
8083
/*LBraceLoc*/ Range.getBegin(),
8084
/*RBraceLoc*/ Range.getEnd());
8085
break;
8086
}
8087
8088
case SK_ZeroInitialization: {
8089
step_iterator NextStep = Step;
8090
++NextStep;
8091
if (NextStep != StepEnd &&
8092
(NextStep->Kind == SK_ConstructorInitialization ||
8093
NextStep->Kind == SK_ConstructorInitializationFromList)) {
8094
// The need for zero-initialization is recorded directly into
8095
// the call to the object's constructor within the next step.
8096
ConstructorInitRequiresZeroInit = true;
8097
} else if (Kind.getKind() == InitializationKind::IK_Value &&
8098
S.getLangOpts().CPlusPlus &&
8099
!Kind.isImplicitValueInit()) {
8100
TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
8101
if (!TSInfo)
8102
TSInfo = S.Context.getTrivialTypeSourceInfo(Step->Type,
8103
Kind.getRange().getBegin());
8104
8105
CurInit = new (S.Context) CXXScalarValueInitExpr(
8106
Entity.getType().getNonLValueExprType(S.Context), TSInfo,
8107
Kind.getRange().getEnd());
8108
} else {
8109
CurInit = new (S.Context) ImplicitValueInitExpr(Step->Type);
8110
}
8111
break;
8112
}
8113
8114
case SK_CAssignment: {
8115
QualType SourceType = CurInit.get()->getType();
8116
Expr *Init = CurInit.get();
8117
8118
// Save off the initial CurInit in case we need to emit a diagnostic
8119
ExprResult InitialCurInit = Init;
8120
ExprResult Result = Init;
8121
Sema::AssignConvertType ConvTy =
8122
S.CheckSingleAssignmentConstraints(Step->Type, Result, true,
8123
Entity.getKind() == InitializedEntity::EK_Parameter_CF_Audited);
8124
if (Result.isInvalid())
8125
return ExprError();
8126
CurInit = Result;
8127
8128
// If this is a call, allow conversion to a transparent union.
8129
ExprResult CurInitExprRes = CurInit;
8130
if (ConvTy != Sema::Compatible &&
8131
Entity.isParameterKind() &&
8132
S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExprRes)
8133
== Sema::Compatible)
8134
ConvTy = Sema::Compatible;
8135
if (CurInitExprRes.isInvalid())
8136
return ExprError();
8137
CurInit = CurInitExprRes;
8138
8139
if (S.getLangOpts().C23 && initializingConstexprVariable(Entity)) {
8140
CheckC23ConstexprInitConversion(S, SourceType, Entity.getType(),
8141
CurInit.get());
8142
8143
// C23 6.7.1p6: If an object or subobject declared with storage-class
8144
// specifier constexpr has pointer, integer, or arithmetic type, any
8145
// explicit initializer value for it shall be null, an integer
8146
// constant expression, or an arithmetic constant expression,
8147
// respectively.
8148
Expr::EvalResult ER;
8149
if (Entity.getType()->getAs<PointerType>() &&
8150
CurInit.get()->EvaluateAsRValue(ER, S.Context) &&
8151
!ER.Val.isNullPointer()) {
8152
S.Diag(Kind.getLocation(), diag::err_c23_constexpr_pointer_not_null);
8153
}
8154
}
8155
8156
bool Complained;
8157
if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(),
8158
Step->Type, SourceType,
8159
InitialCurInit.get(),
8160
getAssignmentAction(Entity, true),
8161
&Complained)) {
8162
PrintInitLocationNote(S, Entity);
8163
return ExprError();
8164
} else if (Complained)
8165
PrintInitLocationNote(S, Entity);
8166
break;
8167
}
8168
8169
case SK_StringInit: {
8170
QualType Ty = Step->Type;
8171
bool UpdateType = ResultType && Entity.getType()->isIncompleteArrayType();
8172
CheckStringInit(CurInit.get(), UpdateType ? *ResultType : Ty,
8173
S.Context.getAsArrayType(Ty), S,
8174
S.getLangOpts().C23 &&
8175
initializingConstexprVariable(Entity));
8176
break;
8177
}
8178
8179
case SK_ObjCObjectConversion:
8180
CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8181
CK_ObjCObjectLValueCast,
8182
CurInit.get()->getValueKind());
8183
break;
8184
8185
case SK_ArrayLoopIndex: {
8186
Expr *Cur = CurInit.get();
8187
Expr *BaseExpr = new (S.Context)
8188
OpaqueValueExpr(Cur->getExprLoc(), Cur->getType(),
8189
Cur->getValueKind(), Cur->getObjectKind(), Cur);
8190
Expr *IndexExpr =
8191
new (S.Context) ArrayInitIndexExpr(S.Context.getSizeType());
8192
CurInit = S.CreateBuiltinArraySubscriptExpr(
8193
BaseExpr, Kind.getLocation(), IndexExpr, Kind.getLocation());
8194
ArrayLoopCommonExprs.push_back(BaseExpr);
8195
break;
8196
}
8197
8198
case SK_ArrayLoopInit: {
8199
assert(!ArrayLoopCommonExprs.empty() &&
8200
"mismatched SK_ArrayLoopIndex and SK_ArrayLoopInit");
8201
Expr *Common = ArrayLoopCommonExprs.pop_back_val();
8202
CurInit = new (S.Context) ArrayInitLoopExpr(Step->Type, Common,
8203
CurInit.get());
8204
break;
8205
}
8206
8207
case SK_GNUArrayInit:
8208
// Okay: we checked everything before creating this step. Note that
8209
// this is a GNU extension.
8210
S.Diag(Kind.getLocation(), diag::ext_array_init_copy)
8211
<< Step->Type << CurInit.get()->getType()
8212
<< CurInit.get()->getSourceRange();
8213
updateGNUCompoundLiteralRValue(CurInit.get());
8214
[[fallthrough]];
8215
case SK_ArrayInit:
8216
// If the destination type is an incomplete array type, update the
8217
// type accordingly.
8218
if (ResultType) {
8219
if (const IncompleteArrayType *IncompleteDest
8220
= S.Context.getAsIncompleteArrayType(Step->Type)) {
8221
if (const ConstantArrayType *ConstantSource
8222
= S.Context.getAsConstantArrayType(CurInit.get()->getType())) {
8223
*ResultType = S.Context.getConstantArrayType(
8224
IncompleteDest->getElementType(), ConstantSource->getSize(),
8225
ConstantSource->getSizeExpr(), ArraySizeModifier::Normal, 0);
8226
}
8227
}
8228
}
8229
break;
8230
8231
case SK_ParenthesizedArrayInit:
8232
// Okay: we checked everything before creating this step. Note that
8233
// this is a GNU extension.
8234
S.Diag(Kind.getLocation(), diag::ext_array_init_parens)
8235
<< CurInit.get()->getSourceRange();
8236
break;
8237
8238
case SK_PassByIndirectCopyRestore:
8239
case SK_PassByIndirectRestore:
8240
checkIndirectCopyRestoreSource(S, CurInit.get());
8241
CurInit = new (S.Context) ObjCIndirectCopyRestoreExpr(
8242
CurInit.get(), Step->Type,
8243
Step->Kind == SK_PassByIndirectCopyRestore);
8244
break;
8245
8246
case SK_ProduceObjCObject:
8247
CurInit = ImplicitCastExpr::Create(
8248
S.Context, Step->Type, CK_ARCProduceObject, CurInit.get(), nullptr,
8249
VK_PRValue, FPOptionsOverride());
8250
break;
8251
8252
case SK_StdInitializerList: {
8253
S.Diag(CurInit.get()->getExprLoc(),
8254
diag::warn_cxx98_compat_initializer_list_init)
8255
<< CurInit.get()->getSourceRange();
8256
8257
// Materialize the temporary into memory.
8258
MaterializeTemporaryExpr *MTE = S.CreateMaterializeTemporaryExpr(
8259
CurInit.get()->getType(), CurInit.get(),
8260
/*BoundToLvalueReference=*/false);
8261
8262
// Wrap it in a construction of a std::initializer_list<T>.
8263
CurInit = new (S.Context) CXXStdInitializerListExpr(Step->Type, MTE);
8264
8265
if (!Step->Type->isDependentType()) {
8266
QualType ElementType;
8267
[[maybe_unused]] bool IsStdInitializerList =
8268
S.isStdInitializerList(Step->Type, &ElementType);
8269
assert(IsStdInitializerList &&
8270
"StdInitializerList step to non-std::initializer_list");
8271
const CXXRecordDecl *Record =
8272
Step->Type->getAsCXXRecordDecl()->getDefinition();
8273
assert(Record && Record->isCompleteDefinition() &&
8274
"std::initializer_list should have already be "
8275
"complete/instantiated by this point");
8276
8277
auto InvalidType = [&] {
8278
S.Diag(Record->getLocation(),
8279
diag::err_std_initializer_list_malformed)
8280
<< Step->Type.getUnqualifiedType();
8281
return ExprError();
8282
};
8283
8284
if (Record->isUnion() || Record->getNumBases() != 0 ||
8285
Record->isPolymorphic())
8286
return InvalidType();
8287
8288
RecordDecl::field_iterator Field = Record->field_begin();
8289
if (Field == Record->field_end())
8290
return InvalidType();
8291
8292
// Start pointer
8293
if (!Field->getType()->isPointerType() ||
8294
!S.Context.hasSameType(Field->getType()->getPointeeType(),
8295
ElementType.withConst()))
8296
return InvalidType();
8297
8298
if (++Field == Record->field_end())
8299
return InvalidType();
8300
8301
// Size or end pointer
8302
if (const auto *PT = Field->getType()->getAs<PointerType>()) {
8303
if (!S.Context.hasSameType(PT->getPointeeType(),
8304
ElementType.withConst()))
8305
return InvalidType();
8306
} else {
8307
if (Field->isBitField() ||
8308
!S.Context.hasSameType(Field->getType(), S.Context.getSizeType()))
8309
return InvalidType();
8310
}
8311
8312
if (++Field != Record->field_end())
8313
return InvalidType();
8314
}
8315
8316
// Bind the result, in case the library has given initializer_list a
8317
// non-trivial destructor.
8318
if (shouldBindAsTemporary(Entity))
8319
CurInit = S.MaybeBindToTemporary(CurInit.get());
8320
break;
8321
}
8322
8323
case SK_OCLSamplerInit: {
8324
// Sampler initialization have 5 cases:
8325
// 1. function argument passing
8326
// 1a. argument is a file-scope variable
8327
// 1b. argument is a function-scope variable
8328
// 1c. argument is one of caller function's parameters
8329
// 2. variable initialization
8330
// 2a. initializing a file-scope variable
8331
// 2b. initializing a function-scope variable
8332
//
8333
// For file-scope variables, since they cannot be initialized by function
8334
// call of __translate_sampler_initializer in LLVM IR, their references
8335
// need to be replaced by a cast from their literal initializers to
8336
// sampler type. Since sampler variables can only be used in function
8337
// calls as arguments, we only need to replace them when handling the
8338
// argument passing.
8339
assert(Step->Type->isSamplerT() &&
8340
"Sampler initialization on non-sampler type.");
8341
Expr *Init = CurInit.get()->IgnoreParens();
8342
QualType SourceType = Init->getType();
8343
// Case 1
8344
if (Entity.isParameterKind()) {
8345
if (!SourceType->isSamplerT() && !SourceType->isIntegerType()) {
8346
S.Diag(Kind.getLocation(), diag::err_sampler_argument_required)
8347
<< SourceType;
8348
break;
8349
} else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Init)) {
8350
auto Var = cast<VarDecl>(DRE->getDecl());
8351
// Case 1b and 1c
8352
// No cast from integer to sampler is needed.
8353
if (!Var->hasGlobalStorage()) {
8354
CurInit = ImplicitCastExpr::Create(
8355
S.Context, Step->Type, CK_LValueToRValue, Init,
8356
/*BasePath=*/nullptr, VK_PRValue, FPOptionsOverride());
8357
break;
8358
}
8359
// Case 1a
8360
// For function call with a file-scope sampler variable as argument,
8361
// get the integer literal.
8362
// Do not diagnose if the file-scope variable does not have initializer
8363
// since this has already been diagnosed when parsing the variable
8364
// declaration.
8365
if (!Var->getInit() || !isa<ImplicitCastExpr>(Var->getInit()))
8366
break;
8367
Init = cast<ImplicitCastExpr>(const_cast<Expr*>(
8368
Var->getInit()))->getSubExpr();
8369
SourceType = Init->getType();
8370
}
8371
} else {
8372
// Case 2
8373
// Check initializer is 32 bit integer constant.
8374
// If the initializer is taken from global variable, do not diagnose since
8375
// this has already been done when parsing the variable declaration.
8376
if (!Init->isConstantInitializer(S.Context, false))
8377
break;
8378
8379
if (!SourceType->isIntegerType() ||
8380
32 != S.Context.getIntWidth(SourceType)) {
8381
S.Diag(Kind.getLocation(), diag::err_sampler_initializer_not_integer)
8382
<< SourceType;
8383
break;
8384
}
8385
8386
Expr::EvalResult EVResult;
8387
Init->EvaluateAsInt(EVResult, S.Context);
8388
llvm::APSInt Result = EVResult.Val.getInt();
8389
const uint64_t SamplerValue = Result.getLimitedValue();
8390
// 32-bit value of sampler's initializer is interpreted as
8391
// bit-field with the following structure:
8392
// |unspecified|Filter|Addressing Mode| Normalized Coords|
8393
// |31 6|5 4|3 1| 0|
8394
// This structure corresponds to enum values of sampler properties
8395
// defined in SPIR spec v1.2 and also opencl-c.h
8396
unsigned AddressingMode = (0x0E & SamplerValue) >> 1;
8397
unsigned FilterMode = (0x30 & SamplerValue) >> 4;
8398
if (FilterMode != 1 && FilterMode != 2 &&
8399
!S.getOpenCLOptions().isAvailableOption(
8400
"cl_intel_device_side_avc_motion_estimation", S.getLangOpts()))
8401
S.Diag(Kind.getLocation(),
8402
diag::warn_sampler_initializer_invalid_bits)
8403
<< "Filter Mode";
8404
if (AddressingMode > 4)
8405
S.Diag(Kind.getLocation(),
8406
diag::warn_sampler_initializer_invalid_bits)
8407
<< "Addressing Mode";
8408
}
8409
8410
// Cases 1a, 2a and 2b
8411
// Insert cast from integer to sampler.
8412
CurInit = S.ImpCastExprToType(Init, S.Context.OCLSamplerTy,
8413
CK_IntToOCLSampler);
8414
break;
8415
}
8416
case SK_OCLZeroOpaqueType: {
8417
assert((Step->Type->isEventT() || Step->Type->isQueueT() ||
8418
Step->Type->isOCLIntelSubgroupAVCType()) &&
8419
"Wrong type for initialization of OpenCL opaque type.");
8420
8421
CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8422
CK_ZeroToOCLOpaqueType,
8423
CurInit.get()->getValueKind());
8424
break;
8425
}
8426
case SK_ParenthesizedListInit: {
8427
CurInit = nullptr;
8428
TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
8429
/*VerifyOnly=*/false, &CurInit);
8430
if (CurInit.get() && ResultType)
8431
*ResultType = CurInit.get()->getType();
8432
if (shouldBindAsTemporary(Entity))
8433
CurInit = S.MaybeBindToTemporary(CurInit.get());
8434
break;
8435
}
8436
}
8437
}
8438
8439
Expr *Init = CurInit.get();
8440
if (!Init)
8441
return ExprError();
8442
8443
// Check whether the initializer has a shorter lifetime than the initialized
8444
// entity, and if not, either lifetime-extend or warn as appropriate.
8445
S.checkInitializerLifetime(Entity, Init);
8446
8447
// Diagnose non-fatal problems with the completed initialization.
8448
if (InitializedEntity::EntityKind EK = Entity.getKind();
8449
(EK == InitializedEntity::EK_Member ||
8450
EK == InitializedEntity::EK_ParenAggInitMember) &&
8451
cast<FieldDecl>(Entity.getDecl())->isBitField())
8452
S.CheckBitFieldInitialization(Kind.getLocation(),
8453
cast<FieldDecl>(Entity.getDecl()), Init);
8454
8455
// Check for std::move on construction.
8456
CheckMoveOnConstruction(S, Init,
8457
Entity.getKind() == InitializedEntity::EK_Result);
8458
8459
return Init;
8460
}
8461
8462
/// Somewhere within T there is an uninitialized reference subobject.
8463
/// Dig it out and diagnose it.
8464
static bool DiagnoseUninitializedReference(Sema &S, SourceLocation Loc,
8465
QualType T) {
8466
if (T->isReferenceType()) {
8467
S.Diag(Loc, diag::err_reference_without_init)
8468
<< T.getNonReferenceType();
8469
return true;
8470
}
8471
8472
CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
8473
if (!RD || !RD->hasUninitializedReferenceMember())
8474
return false;
8475
8476
for (const auto *FI : RD->fields()) {
8477
if (FI->isUnnamedBitField())
8478
continue;
8479
8480
if (DiagnoseUninitializedReference(S, FI->getLocation(), FI->getType())) {
8481
S.Diag(Loc, diag::note_value_initialization_here) << RD;
8482
return true;
8483
}
8484
}
8485
8486
for (const auto &BI : RD->bases()) {
8487
if (DiagnoseUninitializedReference(S, BI.getBeginLoc(), BI.getType())) {
8488
S.Diag(Loc, diag::note_value_initialization_here) << RD;
8489
return true;
8490
}
8491
}
8492
8493
return false;
8494
}
8495
8496
8497
//===----------------------------------------------------------------------===//
8498
// Diagnose initialization failures
8499
//===----------------------------------------------------------------------===//
8500
8501
/// Emit notes associated with an initialization that failed due to a
8502
/// "simple" conversion failure.
8503
static void emitBadConversionNotes(Sema &S, const InitializedEntity &entity,
8504
Expr *op) {
8505
QualType destType = entity.getType();
8506
if (destType.getNonReferenceType()->isObjCObjectPointerType() &&
8507
op->getType()->isObjCObjectPointerType()) {
8508
8509
// Emit a possible note about the conversion failing because the
8510
// operand is a message send with a related result type.
8511
S.ObjC().EmitRelatedResultTypeNote(op);
8512
8513
// Emit a possible note about a return failing because we're
8514
// expecting a related result type.
8515
if (entity.getKind() == InitializedEntity::EK_Result)
8516
S.ObjC().EmitRelatedResultTypeNoteForReturn(destType);
8517
}
8518
QualType fromType = op->getType();
8519
QualType fromPointeeType = fromType.getCanonicalType()->getPointeeType();
8520
QualType destPointeeType = destType.getCanonicalType()->getPointeeType();
8521
auto *fromDecl = fromType->getPointeeCXXRecordDecl();
8522
auto *destDecl = destType->getPointeeCXXRecordDecl();
8523
if (fromDecl && destDecl && fromDecl->getDeclKind() == Decl::CXXRecord &&
8524
destDecl->getDeclKind() == Decl::CXXRecord &&
8525
!fromDecl->isInvalidDecl() && !destDecl->isInvalidDecl() &&
8526
!fromDecl->hasDefinition() &&
8527
destPointeeType.getQualifiers().compatiblyIncludes(
8528
fromPointeeType.getQualifiers()))
8529
S.Diag(fromDecl->getLocation(), diag::note_forward_class_conversion)
8530
<< S.getASTContext().getTagDeclType(fromDecl)
8531
<< S.getASTContext().getTagDeclType(destDecl);
8532
}
8533
8534
static void diagnoseListInit(Sema &S, const InitializedEntity &Entity,
8535
InitListExpr *InitList) {
8536
QualType DestType = Entity.getType();
8537
8538
QualType E;
8539
if (S.getLangOpts().CPlusPlus11 && S.isStdInitializerList(DestType, &E)) {
8540
QualType ArrayType = S.Context.getConstantArrayType(
8541
E.withConst(),
8542
llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
8543
InitList->getNumInits()),
8544
nullptr, clang::ArraySizeModifier::Normal, 0);
8545
InitializedEntity HiddenArray =
8546
InitializedEntity::InitializeTemporary(ArrayType);
8547
return diagnoseListInit(S, HiddenArray, InitList);
8548
}
8549
8550
if (DestType->isReferenceType()) {
8551
// A list-initialization failure for a reference means that we tried to
8552
// create a temporary of the inner type (per [dcl.init.list]p3.6) and the
8553
// inner initialization failed.
8554
QualType T = DestType->castAs<ReferenceType>()->getPointeeType();
8555
diagnoseListInit(S, InitializedEntity::InitializeTemporary(T), InitList);
8556
SourceLocation Loc = InitList->getBeginLoc();
8557
if (auto *D = Entity.getDecl())
8558
Loc = D->getLocation();
8559
S.Diag(Loc, diag::note_in_reference_temporary_list_initializer) << T;
8560
return;
8561
}
8562
8563
InitListChecker DiagnoseInitList(S, Entity, InitList, DestType,
8564
/*VerifyOnly=*/false,
8565
/*TreatUnavailableAsInvalid=*/false);
8566
assert(DiagnoseInitList.HadError() &&
8567
"Inconsistent init list check result.");
8568
}
8569
8570
bool InitializationSequence::Diagnose(Sema &S,
8571
const InitializedEntity &Entity,
8572
const InitializationKind &Kind,
8573
ArrayRef<Expr *> Args) {
8574
if (!Failed())
8575
return false;
8576
8577
QualType DestType = Entity.getType();
8578
8579
// When we want to diagnose only one element of a braced-init-list,
8580
// we need to factor it out.
8581
Expr *OnlyArg;
8582
if (Args.size() == 1) {
8583
auto *List = dyn_cast<InitListExpr>(Args[0]);
8584
if (List && List->getNumInits() == 1)
8585
OnlyArg = List->getInit(0);
8586
else
8587
OnlyArg = Args[0];
8588
8589
if (OnlyArg->getType() == S.Context.OverloadTy) {
8590
DeclAccessPair Found;
8591
if (FunctionDecl *FD = S.ResolveAddressOfOverloadedFunction(
8592
OnlyArg, DestType.getNonReferenceType(), /*Complain=*/false,
8593
Found)) {
8594
if (Expr *Resolved =
8595
S.FixOverloadedFunctionReference(OnlyArg, Found, FD).get())
8596
OnlyArg = Resolved;
8597
}
8598
}
8599
}
8600
else
8601
OnlyArg = nullptr;
8602
8603
switch (Failure) {
8604
case FK_TooManyInitsForReference:
8605
// FIXME: Customize for the initialized entity?
8606
if (Args.empty()) {
8607
// Dig out the reference subobject which is uninitialized and diagnose it.
8608
// If this is value-initialization, this could be nested some way within
8609
// the target type.
8610
assert(Kind.getKind() == InitializationKind::IK_Value ||
8611
DestType->isReferenceType());
8612
bool Diagnosed =
8613
DiagnoseUninitializedReference(S, Kind.getLocation(), DestType);
8614
assert(Diagnosed && "couldn't find uninitialized reference to diagnose");
8615
(void)Diagnosed;
8616
} else // FIXME: diagnostic below could be better!
8617
S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits)
8618
<< SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
8619
break;
8620
case FK_ParenthesizedListInitForReference:
8621
S.Diag(Kind.getLocation(), diag::err_list_init_in_parens)
8622
<< 1 << Entity.getType() << Args[0]->getSourceRange();
8623
break;
8624
8625
case FK_ArrayNeedsInitList:
8626
S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 0;
8627
break;
8628
case FK_ArrayNeedsInitListOrStringLiteral:
8629
S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 1;
8630
break;
8631
case FK_ArrayNeedsInitListOrWideStringLiteral:
8632
S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 2;
8633
break;
8634
case FK_NarrowStringIntoWideCharArray:
8635
S.Diag(Kind.getLocation(), diag::err_array_init_narrow_string_into_wchar);
8636
break;
8637
case FK_WideStringIntoCharArray:
8638
S.Diag(Kind.getLocation(), diag::err_array_init_wide_string_into_char);
8639
break;
8640
case FK_IncompatWideStringIntoWideChar:
8641
S.Diag(Kind.getLocation(),
8642
diag::err_array_init_incompat_wide_string_into_wchar);
8643
break;
8644
case FK_PlainStringIntoUTF8Char:
8645
S.Diag(Kind.getLocation(),
8646
diag::err_array_init_plain_string_into_char8_t);
8647
S.Diag(Args.front()->getBeginLoc(),
8648
diag::note_array_init_plain_string_into_char8_t)
8649
<< FixItHint::CreateInsertion(Args.front()->getBeginLoc(), "u8");
8650
break;
8651
case FK_UTF8StringIntoPlainChar:
8652
S.Diag(Kind.getLocation(), diag::err_array_init_utf8_string_into_char)
8653
<< DestType->isSignedIntegerType() << S.getLangOpts().CPlusPlus20;
8654
break;
8655
case FK_ArrayTypeMismatch:
8656
case FK_NonConstantArrayInit:
8657
S.Diag(Kind.getLocation(),
8658
(Failure == FK_ArrayTypeMismatch
8659
? diag::err_array_init_different_type
8660
: diag::err_array_init_non_constant_array))
8661
<< DestType.getNonReferenceType()
8662
<< OnlyArg->getType()
8663
<< Args[0]->getSourceRange();
8664
break;
8665
8666
case FK_VariableLengthArrayHasInitializer:
8667
S.Diag(Kind.getLocation(), diag::err_variable_object_no_init)
8668
<< Args[0]->getSourceRange();
8669
break;
8670
8671
case FK_AddressOfOverloadFailed: {
8672
DeclAccessPair Found;
8673
S.ResolveAddressOfOverloadedFunction(OnlyArg,
8674
DestType.getNonReferenceType(),
8675
true,
8676
Found);
8677
break;
8678
}
8679
8680
case FK_AddressOfUnaddressableFunction: {
8681
auto *FD = cast<FunctionDecl>(cast<DeclRefExpr>(OnlyArg)->getDecl());
8682
S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
8683
OnlyArg->getBeginLoc());
8684
break;
8685
}
8686
8687
case FK_ReferenceInitOverloadFailed:
8688
case FK_UserConversionOverloadFailed:
8689
switch (FailedOverloadResult) {
8690
case OR_Ambiguous:
8691
8692
FailedCandidateSet.NoteCandidates(
8693
PartialDiagnosticAt(
8694
Kind.getLocation(),
8695
Failure == FK_UserConversionOverloadFailed
8696
? (S.PDiag(diag::err_typecheck_ambiguous_condition)
8697
<< OnlyArg->getType() << DestType
8698
<< Args[0]->getSourceRange())
8699
: (S.PDiag(diag::err_ref_init_ambiguous)
8700
<< DestType << OnlyArg->getType()
8701
<< Args[0]->getSourceRange())),
8702
S, OCD_AmbiguousCandidates, Args);
8703
break;
8704
8705
case OR_No_Viable_Function: {
8706
auto Cands = FailedCandidateSet.CompleteCandidates(S, OCD_AllCandidates, Args);
8707
if (!S.RequireCompleteType(Kind.getLocation(),
8708
DestType.getNonReferenceType(),
8709
diag::err_typecheck_nonviable_condition_incomplete,
8710
OnlyArg->getType(), Args[0]->getSourceRange()))
8711
S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
8712
<< (Entity.getKind() == InitializedEntity::EK_Result)
8713
<< OnlyArg->getType() << Args[0]->getSourceRange()
8714
<< DestType.getNonReferenceType();
8715
8716
FailedCandidateSet.NoteCandidates(S, Args, Cands);
8717
break;
8718
}
8719
case OR_Deleted: {
8720
OverloadCandidateSet::iterator Best;
8721
OverloadingResult Ovl
8722
= FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
8723
8724
StringLiteral *Msg = Best->Function->getDeletedMessage();
8725
S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function)
8726
<< OnlyArg->getType() << DestType.getNonReferenceType()
8727
<< (Msg != nullptr) << (Msg ? Msg->getString() : StringRef())
8728
<< Args[0]->getSourceRange();
8729
if (Ovl == OR_Deleted) {
8730
S.NoteDeletedFunction(Best->Function);
8731
} else {
8732
llvm_unreachable("Inconsistent overload resolution?");
8733
}
8734
break;
8735
}
8736
8737
case OR_Success:
8738
llvm_unreachable("Conversion did not fail!");
8739
}
8740
break;
8741
8742
case FK_NonConstLValueReferenceBindingToTemporary:
8743
if (isa<InitListExpr>(Args[0])) {
8744
S.Diag(Kind.getLocation(),
8745
diag::err_lvalue_reference_bind_to_initlist)
8746
<< DestType.getNonReferenceType().isVolatileQualified()
8747
<< DestType.getNonReferenceType()
8748
<< Args[0]->getSourceRange();
8749
break;
8750
}
8751
[[fallthrough]];
8752
8753
case FK_NonConstLValueReferenceBindingToUnrelated:
8754
S.Diag(Kind.getLocation(),
8755
Failure == FK_NonConstLValueReferenceBindingToTemporary
8756
? diag::err_lvalue_reference_bind_to_temporary
8757
: diag::err_lvalue_reference_bind_to_unrelated)
8758
<< DestType.getNonReferenceType().isVolatileQualified()
8759
<< DestType.getNonReferenceType()
8760
<< OnlyArg->getType()
8761
<< Args[0]->getSourceRange();
8762
break;
8763
8764
case FK_NonConstLValueReferenceBindingToBitfield: {
8765
// We don't necessarily have an unambiguous source bit-field.
8766
FieldDecl *BitField = Args[0]->getSourceBitField();
8767
S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield)
8768
<< DestType.isVolatileQualified()
8769
<< (BitField ? BitField->getDeclName() : DeclarationName())
8770
<< (BitField != nullptr)
8771
<< Args[0]->getSourceRange();
8772
if (BitField)
8773
S.Diag(BitField->getLocation(), diag::note_bitfield_decl);
8774
break;
8775
}
8776
8777
case FK_NonConstLValueReferenceBindingToVectorElement:
8778
S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element)
8779
<< DestType.isVolatileQualified()
8780
<< Args[0]->getSourceRange();
8781
break;
8782
8783
case FK_NonConstLValueReferenceBindingToMatrixElement:
8784
S.Diag(Kind.getLocation(), diag::err_reference_bind_to_matrix_element)
8785
<< DestType.isVolatileQualified() << Args[0]->getSourceRange();
8786
break;
8787
8788
case FK_RValueReferenceBindingToLValue:
8789
S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref)
8790
<< DestType.getNonReferenceType() << OnlyArg->getType()
8791
<< Args[0]->getSourceRange();
8792
break;
8793
8794
case FK_ReferenceAddrspaceMismatchTemporary:
8795
S.Diag(Kind.getLocation(), diag::err_reference_bind_temporary_addrspace)
8796
<< DestType << Args[0]->getSourceRange();
8797
break;
8798
8799
case FK_ReferenceInitDropsQualifiers: {
8800
QualType SourceType = OnlyArg->getType();
8801
QualType NonRefType = DestType.getNonReferenceType();
8802
Qualifiers DroppedQualifiers =
8803
SourceType.getQualifiers() - NonRefType.getQualifiers();
8804
8805
if (!NonRefType.getQualifiers().isAddressSpaceSupersetOf(
8806
SourceType.getQualifiers()))
8807
S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8808
<< NonRefType << SourceType << 1 /*addr space*/
8809
<< Args[0]->getSourceRange();
8810
else if (DroppedQualifiers.hasQualifiers())
8811
S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8812
<< NonRefType << SourceType << 0 /*cv quals*/
8813
<< Qualifiers::fromCVRMask(DroppedQualifiers.getCVRQualifiers())
8814
<< DroppedQualifiers.getCVRQualifiers() << Args[0]->getSourceRange();
8815
else
8816
// FIXME: Consider decomposing the type and explaining which qualifiers
8817
// were dropped where, or on which level a 'const' is missing, etc.
8818
S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8819
<< NonRefType << SourceType << 2 /*incompatible quals*/
8820
<< Args[0]->getSourceRange();
8821
break;
8822
}
8823
8824
case FK_ReferenceInitFailed:
8825
S.Diag(Kind.getLocation(), diag::err_reference_bind_failed)
8826
<< DestType.getNonReferenceType()
8827
<< DestType.getNonReferenceType()->isIncompleteType()
8828
<< OnlyArg->isLValue()
8829
<< OnlyArg->getType()
8830
<< Args[0]->getSourceRange();
8831
emitBadConversionNotes(S, Entity, Args[0]);
8832
break;
8833
8834
case FK_ConversionFailed: {
8835
QualType FromType = OnlyArg->getType();
8836
PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed)
8837
<< (int)Entity.getKind()
8838
<< DestType
8839
<< OnlyArg->isLValue()
8840
<< FromType
8841
<< Args[0]->getSourceRange();
8842
S.HandleFunctionTypeMismatch(PDiag, FromType, DestType);
8843
S.Diag(Kind.getLocation(), PDiag);
8844
emitBadConversionNotes(S, Entity, Args[0]);
8845
break;
8846
}
8847
8848
case FK_ConversionFromPropertyFailed:
8849
// No-op. This error has already been reported.
8850
break;
8851
8852
case FK_TooManyInitsForScalar: {
8853
SourceRange R;
8854
8855
auto *InitList = dyn_cast<InitListExpr>(Args[0]);
8856
if (InitList && InitList->getNumInits() >= 1) {
8857
R = SourceRange(InitList->getInit(0)->getEndLoc(), InitList->getEndLoc());
8858
} else {
8859
assert(Args.size() > 1 && "Expected multiple initializers!");
8860
R = SourceRange(Args.front()->getEndLoc(), Args.back()->getEndLoc());
8861
}
8862
8863
R.setBegin(S.getLocForEndOfToken(R.getBegin()));
8864
if (Kind.isCStyleOrFunctionalCast())
8865
S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg)
8866
<< R;
8867
else
8868
S.Diag(Kind.getLocation(), diag::err_excess_initializers)
8869
<< /*scalar=*/2 << R;
8870
break;
8871
}
8872
8873
case FK_ParenthesizedListInitForScalar:
8874
S.Diag(Kind.getLocation(), diag::err_list_init_in_parens)
8875
<< 0 << Entity.getType() << Args[0]->getSourceRange();
8876
break;
8877
8878
case FK_ReferenceBindingToInitList:
8879
S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list)
8880
<< DestType.getNonReferenceType() << Args[0]->getSourceRange();
8881
break;
8882
8883
case FK_InitListBadDestinationType:
8884
S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type)
8885
<< (DestType->isRecordType()) << DestType << Args[0]->getSourceRange();
8886
break;
8887
8888
case FK_ListConstructorOverloadFailed:
8889
case FK_ConstructorOverloadFailed: {
8890
SourceRange ArgsRange;
8891
if (Args.size())
8892
ArgsRange =
8893
SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
8894
8895
if (Failure == FK_ListConstructorOverloadFailed) {
8896
assert(Args.size() == 1 &&
8897
"List construction from other than 1 argument.");
8898
InitListExpr *InitList = cast<InitListExpr>(Args[0]);
8899
Args = MultiExprArg(InitList->getInits(), InitList->getNumInits());
8900
}
8901
8902
// FIXME: Using "DestType" for the entity we're printing is probably
8903
// bad.
8904
switch (FailedOverloadResult) {
8905
case OR_Ambiguous:
8906
FailedCandidateSet.NoteCandidates(
8907
PartialDiagnosticAt(Kind.getLocation(),
8908
S.PDiag(diag::err_ovl_ambiguous_init)
8909
<< DestType << ArgsRange),
8910
S, OCD_AmbiguousCandidates, Args);
8911
break;
8912
8913
case OR_No_Viable_Function:
8914
if (Kind.getKind() == InitializationKind::IK_Default &&
8915
(Entity.getKind() == InitializedEntity::EK_Base ||
8916
Entity.getKind() == InitializedEntity::EK_Member ||
8917
Entity.getKind() == InitializedEntity::EK_ParenAggInitMember) &&
8918
isa<CXXConstructorDecl>(S.CurContext)) {
8919
// This is implicit default initialization of a member or
8920
// base within a constructor. If no viable function was
8921
// found, notify the user that they need to explicitly
8922
// initialize this base/member.
8923
CXXConstructorDecl *Constructor
8924
= cast<CXXConstructorDecl>(S.CurContext);
8925
const CXXRecordDecl *InheritedFrom = nullptr;
8926
if (auto Inherited = Constructor->getInheritedConstructor())
8927
InheritedFrom = Inherited.getShadowDecl()->getNominatedBaseClass();
8928
if (Entity.getKind() == InitializedEntity::EK_Base) {
8929
S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
8930
<< (InheritedFrom ? 2 : Constructor->isImplicit() ? 1 : 0)
8931
<< S.Context.getTypeDeclType(Constructor->getParent())
8932
<< /*base=*/0
8933
<< Entity.getType()
8934
<< InheritedFrom;
8935
8936
RecordDecl *BaseDecl
8937
= Entity.getBaseSpecifier()->getType()->castAs<RecordType>()
8938
->getDecl();
8939
S.Diag(BaseDecl->getLocation(), diag::note_previous_decl)
8940
<< S.Context.getTagDeclType(BaseDecl);
8941
} else {
8942
S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
8943
<< (InheritedFrom ? 2 : Constructor->isImplicit() ? 1 : 0)
8944
<< S.Context.getTypeDeclType(Constructor->getParent())
8945
<< /*member=*/1
8946
<< Entity.getName()
8947
<< InheritedFrom;
8948
S.Diag(Entity.getDecl()->getLocation(),
8949
diag::note_member_declared_at);
8950
8951
if (const RecordType *Record
8952
= Entity.getType()->getAs<RecordType>())
8953
S.Diag(Record->getDecl()->getLocation(),
8954
diag::note_previous_decl)
8955
<< S.Context.getTagDeclType(Record->getDecl());
8956
}
8957
break;
8958
}
8959
8960
FailedCandidateSet.NoteCandidates(
8961
PartialDiagnosticAt(
8962
Kind.getLocation(),
8963
S.PDiag(diag::err_ovl_no_viable_function_in_init)
8964
<< DestType << ArgsRange),
8965
S, OCD_AllCandidates, Args);
8966
break;
8967
8968
case OR_Deleted: {
8969
OverloadCandidateSet::iterator Best;
8970
OverloadingResult Ovl
8971
= FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
8972
if (Ovl != OR_Deleted) {
8973
S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
8974
<< DestType << ArgsRange;
8975
llvm_unreachable("Inconsistent overload resolution?");
8976
break;
8977
}
8978
8979
// If this is a defaulted or implicitly-declared function, then
8980
// it was implicitly deleted. Make it clear that the deletion was
8981
// implicit.
8982
if (S.isImplicitlyDeleted(Best->Function))
8983
S.Diag(Kind.getLocation(), diag::err_ovl_deleted_special_init)
8984
<< llvm::to_underlying(
8985
S.getSpecialMember(cast<CXXMethodDecl>(Best->Function)))
8986
<< DestType << ArgsRange;
8987
else {
8988
StringLiteral *Msg = Best->Function->getDeletedMessage();
8989
S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
8990
<< DestType << (Msg != nullptr)
8991
<< (Msg ? Msg->getString() : StringRef()) << ArgsRange;
8992
}
8993
8994
S.NoteDeletedFunction(Best->Function);
8995
break;
8996
}
8997
8998
case OR_Success:
8999
llvm_unreachable("Conversion did not fail!");
9000
}
9001
}
9002
break;
9003
9004
case FK_DefaultInitOfConst:
9005
if (Entity.getKind() == InitializedEntity::EK_Member &&
9006
isa<CXXConstructorDecl>(S.CurContext)) {
9007
// This is implicit default-initialization of a const member in
9008
// a constructor. Complain that it needs to be explicitly
9009
// initialized.
9010
CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext);
9011
S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor)
9012
<< (Constructor->getInheritedConstructor() ? 2 :
9013
Constructor->isImplicit() ? 1 : 0)
9014
<< S.Context.getTypeDeclType(Constructor->getParent())
9015
<< /*const=*/1
9016
<< Entity.getName();
9017
S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl)
9018
<< Entity.getName();
9019
} else if (const auto *VD = dyn_cast_if_present<VarDecl>(Entity.getDecl());
9020
VD && VD->isConstexpr()) {
9021
S.Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
9022
<< VD;
9023
} else {
9024
S.Diag(Kind.getLocation(), diag::err_default_init_const)
9025
<< DestType << (bool)DestType->getAs<RecordType>();
9026
}
9027
break;
9028
9029
case FK_Incomplete:
9030
S.RequireCompleteType(Kind.getLocation(), FailedIncompleteType,
9031
diag::err_init_incomplete_type);
9032
break;
9033
9034
case FK_ListInitializationFailed: {
9035
// Run the init list checker again to emit diagnostics.
9036
InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9037
diagnoseListInit(S, Entity, InitList);
9038
break;
9039
}
9040
9041
case FK_PlaceholderType: {
9042
// FIXME: Already diagnosed!
9043
break;
9044
}
9045
9046
case FK_ExplicitConstructor: {
9047
S.Diag(Kind.getLocation(), diag::err_selected_explicit_constructor)
9048
<< Args[0]->getSourceRange();
9049
OverloadCandidateSet::iterator Best;
9050
OverloadingResult Ovl
9051
= FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9052
(void)Ovl;
9053
assert(Ovl == OR_Success && "Inconsistent overload resolution");
9054
CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
9055
S.Diag(CtorDecl->getLocation(),
9056
diag::note_explicit_ctor_deduction_guide_here) << false;
9057
break;
9058
}
9059
9060
case FK_ParenthesizedListInitFailed:
9061
TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
9062
/*VerifyOnly=*/false);
9063
break;
9064
9065
case FK_DesignatedInitForNonAggregate:
9066
InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9067
S.Diag(Kind.getLocation(), diag::err_designated_init_for_non_aggregate)
9068
<< Entity.getType() << InitList->getSourceRange();
9069
break;
9070
}
9071
9072
PrintInitLocationNote(S, Entity);
9073
return true;
9074
}
9075
9076
void InitializationSequence::dump(raw_ostream &OS) const {
9077
switch (SequenceKind) {
9078
case FailedSequence: {
9079
OS << "Failed sequence: ";
9080
switch (Failure) {
9081
case FK_TooManyInitsForReference:
9082
OS << "too many initializers for reference";
9083
break;
9084
9085
case FK_ParenthesizedListInitForReference:
9086
OS << "parenthesized list init for reference";
9087
break;
9088
9089
case FK_ArrayNeedsInitList:
9090
OS << "array requires initializer list";
9091
break;
9092
9093
case FK_AddressOfUnaddressableFunction:
9094
OS << "address of unaddressable function was taken";
9095
break;
9096
9097
case FK_ArrayNeedsInitListOrStringLiteral:
9098
OS << "array requires initializer list or string literal";
9099
break;
9100
9101
case FK_ArrayNeedsInitListOrWideStringLiteral:
9102
OS << "array requires initializer list or wide string literal";
9103
break;
9104
9105
case FK_NarrowStringIntoWideCharArray:
9106
OS << "narrow string into wide char array";
9107
break;
9108
9109
case FK_WideStringIntoCharArray:
9110
OS << "wide string into char array";
9111
break;
9112
9113
case FK_IncompatWideStringIntoWideChar:
9114
OS << "incompatible wide string into wide char array";
9115
break;
9116
9117
case FK_PlainStringIntoUTF8Char:
9118
OS << "plain string literal into char8_t array";
9119
break;
9120
9121
case FK_UTF8StringIntoPlainChar:
9122
OS << "u8 string literal into char array";
9123
break;
9124
9125
case FK_ArrayTypeMismatch:
9126
OS << "array type mismatch";
9127
break;
9128
9129
case FK_NonConstantArrayInit:
9130
OS << "non-constant array initializer";
9131
break;
9132
9133
case FK_AddressOfOverloadFailed:
9134
OS << "address of overloaded function failed";
9135
break;
9136
9137
case FK_ReferenceInitOverloadFailed:
9138
OS << "overload resolution for reference initialization failed";
9139
break;
9140
9141
case FK_NonConstLValueReferenceBindingToTemporary:
9142
OS << "non-const lvalue reference bound to temporary";
9143
break;
9144
9145
case FK_NonConstLValueReferenceBindingToBitfield:
9146
OS << "non-const lvalue reference bound to bit-field";
9147
break;
9148
9149
case FK_NonConstLValueReferenceBindingToVectorElement:
9150
OS << "non-const lvalue reference bound to vector element";
9151
break;
9152
9153
case FK_NonConstLValueReferenceBindingToMatrixElement:
9154
OS << "non-const lvalue reference bound to matrix element";
9155
break;
9156
9157
case FK_NonConstLValueReferenceBindingToUnrelated:
9158
OS << "non-const lvalue reference bound to unrelated type";
9159
break;
9160
9161
case FK_RValueReferenceBindingToLValue:
9162
OS << "rvalue reference bound to an lvalue";
9163
break;
9164
9165
case FK_ReferenceInitDropsQualifiers:
9166
OS << "reference initialization drops qualifiers";
9167
break;
9168
9169
case FK_ReferenceAddrspaceMismatchTemporary:
9170
OS << "reference with mismatching address space bound to temporary";
9171
break;
9172
9173
case FK_ReferenceInitFailed:
9174
OS << "reference initialization failed";
9175
break;
9176
9177
case FK_ConversionFailed:
9178
OS << "conversion failed";
9179
break;
9180
9181
case FK_ConversionFromPropertyFailed:
9182
OS << "conversion from property failed";
9183
break;
9184
9185
case FK_TooManyInitsForScalar:
9186
OS << "too many initializers for scalar";
9187
break;
9188
9189
case FK_ParenthesizedListInitForScalar:
9190
OS << "parenthesized list init for reference";
9191
break;
9192
9193
case FK_ReferenceBindingToInitList:
9194
OS << "referencing binding to initializer list";
9195
break;
9196
9197
case FK_InitListBadDestinationType:
9198
OS << "initializer list for non-aggregate, non-scalar type";
9199
break;
9200
9201
case FK_UserConversionOverloadFailed:
9202
OS << "overloading failed for user-defined conversion";
9203
break;
9204
9205
case FK_ConstructorOverloadFailed:
9206
OS << "constructor overloading failed";
9207
break;
9208
9209
case FK_DefaultInitOfConst:
9210
OS << "default initialization of a const variable";
9211
break;
9212
9213
case FK_Incomplete:
9214
OS << "initialization of incomplete type";
9215
break;
9216
9217
case FK_ListInitializationFailed:
9218
OS << "list initialization checker failure";
9219
break;
9220
9221
case FK_VariableLengthArrayHasInitializer:
9222
OS << "variable length array has an initializer";
9223
break;
9224
9225
case FK_PlaceholderType:
9226
OS << "initializer expression isn't contextually valid";
9227
break;
9228
9229
case FK_ListConstructorOverloadFailed:
9230
OS << "list constructor overloading failed";
9231
break;
9232
9233
case FK_ExplicitConstructor:
9234
OS << "list copy initialization chose explicit constructor";
9235
break;
9236
9237
case FK_ParenthesizedListInitFailed:
9238
OS << "parenthesized list initialization failed";
9239
break;
9240
9241
case FK_DesignatedInitForNonAggregate:
9242
OS << "designated initializer for non-aggregate type";
9243
break;
9244
}
9245
OS << '\n';
9246
return;
9247
}
9248
9249
case DependentSequence:
9250
OS << "Dependent sequence\n";
9251
return;
9252
9253
case NormalSequence:
9254
OS << "Normal sequence: ";
9255
break;
9256
}
9257
9258
for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) {
9259
if (S != step_begin()) {
9260
OS << " -> ";
9261
}
9262
9263
switch (S->Kind) {
9264
case SK_ResolveAddressOfOverloadedFunction:
9265
OS << "resolve address of overloaded function";
9266
break;
9267
9268
case SK_CastDerivedToBasePRValue:
9269
OS << "derived-to-base (prvalue)";
9270
break;
9271
9272
case SK_CastDerivedToBaseXValue:
9273
OS << "derived-to-base (xvalue)";
9274
break;
9275
9276
case SK_CastDerivedToBaseLValue:
9277
OS << "derived-to-base (lvalue)";
9278
break;
9279
9280
case SK_BindReference:
9281
OS << "bind reference to lvalue";
9282
break;
9283
9284
case SK_BindReferenceToTemporary:
9285
OS << "bind reference to a temporary";
9286
break;
9287
9288
case SK_FinalCopy:
9289
OS << "final copy in class direct-initialization";
9290
break;
9291
9292
case SK_ExtraneousCopyToTemporary:
9293
OS << "extraneous C++03 copy to temporary";
9294
break;
9295
9296
case SK_UserConversion:
9297
OS << "user-defined conversion via " << *S->Function.Function;
9298
break;
9299
9300
case SK_QualificationConversionPRValue:
9301
OS << "qualification conversion (prvalue)";
9302
break;
9303
9304
case SK_QualificationConversionXValue:
9305
OS << "qualification conversion (xvalue)";
9306
break;
9307
9308
case SK_QualificationConversionLValue:
9309
OS << "qualification conversion (lvalue)";
9310
break;
9311
9312
case SK_FunctionReferenceConversion:
9313
OS << "function reference conversion";
9314
break;
9315
9316
case SK_AtomicConversion:
9317
OS << "non-atomic-to-atomic conversion";
9318
break;
9319
9320
case SK_ConversionSequence:
9321
OS << "implicit conversion sequence (";
9322
S->ICS->dump(); // FIXME: use OS
9323
OS << ")";
9324
break;
9325
9326
case SK_ConversionSequenceNoNarrowing:
9327
OS << "implicit conversion sequence with narrowing prohibited (";
9328
S->ICS->dump(); // FIXME: use OS
9329
OS << ")";
9330
break;
9331
9332
case SK_ListInitialization:
9333
OS << "list aggregate initialization";
9334
break;
9335
9336
case SK_UnwrapInitList:
9337
OS << "unwrap reference initializer list";
9338
break;
9339
9340
case SK_RewrapInitList:
9341
OS << "rewrap reference initializer list";
9342
break;
9343
9344
case SK_ConstructorInitialization:
9345
OS << "constructor initialization";
9346
break;
9347
9348
case SK_ConstructorInitializationFromList:
9349
OS << "list initialization via constructor";
9350
break;
9351
9352
case SK_ZeroInitialization:
9353
OS << "zero initialization";
9354
break;
9355
9356
case SK_CAssignment:
9357
OS << "C assignment";
9358
break;
9359
9360
case SK_StringInit:
9361
OS << "string initialization";
9362
break;
9363
9364
case SK_ObjCObjectConversion:
9365
OS << "Objective-C object conversion";
9366
break;
9367
9368
case SK_ArrayLoopIndex:
9369
OS << "indexing for array initialization loop";
9370
break;
9371
9372
case SK_ArrayLoopInit:
9373
OS << "array initialization loop";
9374
break;
9375
9376
case SK_ArrayInit:
9377
OS << "array initialization";
9378
break;
9379
9380
case SK_GNUArrayInit:
9381
OS << "array initialization (GNU extension)";
9382
break;
9383
9384
case SK_ParenthesizedArrayInit:
9385
OS << "parenthesized array initialization";
9386
break;
9387
9388
case SK_PassByIndirectCopyRestore:
9389
OS << "pass by indirect copy and restore";
9390
break;
9391
9392
case SK_PassByIndirectRestore:
9393
OS << "pass by indirect restore";
9394
break;
9395
9396
case SK_ProduceObjCObject:
9397
OS << "Objective-C object retension";
9398
break;
9399
9400
case SK_StdInitializerList:
9401
OS << "std::initializer_list from initializer list";
9402
break;
9403
9404
case SK_StdInitializerListConstructorCall:
9405
OS << "list initialization from std::initializer_list";
9406
break;
9407
9408
case SK_OCLSamplerInit:
9409
OS << "OpenCL sampler_t from integer constant";
9410
break;
9411
9412
case SK_OCLZeroOpaqueType:
9413
OS << "OpenCL opaque type from zero";
9414
break;
9415
case SK_ParenthesizedListInit:
9416
OS << "initialization from a parenthesized list of values";
9417
break;
9418
}
9419
9420
OS << " [" << S->Type << ']';
9421
}
9422
9423
OS << '\n';
9424
}
9425
9426
void InitializationSequence::dump() const {
9427
dump(llvm::errs());
9428
}
9429
9430
static void DiagnoseNarrowingInInitList(Sema &S,
9431
const ImplicitConversionSequence &ICS,
9432
QualType PreNarrowingType,
9433
QualType EntityType,
9434
const Expr *PostInit) {
9435
const StandardConversionSequence *SCS = nullptr;
9436
switch (ICS.getKind()) {
9437
case ImplicitConversionSequence::StandardConversion:
9438
SCS = &ICS.Standard;
9439
break;
9440
case ImplicitConversionSequence::UserDefinedConversion:
9441
SCS = &ICS.UserDefined.After;
9442
break;
9443
case ImplicitConversionSequence::AmbiguousConversion:
9444
case ImplicitConversionSequence::StaticObjectArgumentConversion:
9445
case ImplicitConversionSequence::EllipsisConversion:
9446
case ImplicitConversionSequence::BadConversion:
9447
return;
9448
}
9449
9450
auto MakeDiag = [&](bool IsConstRef, unsigned DefaultDiagID,
9451
unsigned ConstRefDiagID, unsigned WarnDiagID) {
9452
unsigned DiagID;
9453
auto &L = S.getLangOpts();
9454
if (L.CPlusPlus11 &&
9455
(!L.MicrosoftExt || L.isCompatibleWithMSVC(LangOptions::MSVC2015)))
9456
DiagID = IsConstRef ? ConstRefDiagID : DefaultDiagID;
9457
else
9458
DiagID = WarnDiagID;
9459
return S.Diag(PostInit->getBeginLoc(), DiagID)
9460
<< PostInit->getSourceRange();
9461
};
9462
9463
// C++11 [dcl.init.list]p7: Check whether this is a narrowing conversion.
9464
APValue ConstantValue;
9465
QualType ConstantType;
9466
switch (SCS->getNarrowingKind(S.Context, PostInit, ConstantValue,
9467
ConstantType)) {
9468
case NK_Not_Narrowing:
9469
case NK_Dependent_Narrowing:
9470
// No narrowing occurred.
9471
return;
9472
9473
case NK_Type_Narrowing: {
9474
// This was a floating-to-integer conversion, which is always considered a
9475
// narrowing conversion even if the value is a constant and can be
9476
// represented exactly as an integer.
9477
QualType T = EntityType.getNonReferenceType();
9478
MakeDiag(T != EntityType, diag::ext_init_list_type_narrowing,
9479
diag::ext_init_list_type_narrowing_const_reference,
9480
diag::warn_init_list_type_narrowing)
9481
<< PreNarrowingType.getLocalUnqualifiedType()
9482
<< T.getLocalUnqualifiedType();
9483
break;
9484
}
9485
9486
case NK_Constant_Narrowing: {
9487
// A constant value was narrowed.
9488
MakeDiag(EntityType.getNonReferenceType() != EntityType,
9489
diag::ext_init_list_constant_narrowing,
9490
diag::ext_init_list_constant_narrowing_const_reference,
9491
diag::warn_init_list_constant_narrowing)
9492
<< ConstantValue.getAsString(S.getASTContext(), ConstantType)
9493
<< EntityType.getNonReferenceType().getLocalUnqualifiedType();
9494
break;
9495
}
9496
9497
case NK_Variable_Narrowing: {
9498
// A variable's value may have been narrowed.
9499
MakeDiag(EntityType.getNonReferenceType() != EntityType,
9500
diag::ext_init_list_variable_narrowing,
9501
diag::ext_init_list_variable_narrowing_const_reference,
9502
diag::warn_init_list_variable_narrowing)
9503
<< PreNarrowingType.getLocalUnqualifiedType()
9504
<< EntityType.getNonReferenceType().getLocalUnqualifiedType();
9505
break;
9506
}
9507
}
9508
9509
SmallString<128> StaticCast;
9510
llvm::raw_svector_ostream OS(StaticCast);
9511
OS << "static_cast<";
9512
if (const TypedefType *TT = EntityType->getAs<TypedefType>()) {
9513
// It's important to use the typedef's name if there is one so that the
9514
// fixit doesn't break code using types like int64_t.
9515
//
9516
// FIXME: This will break if the typedef requires qualification. But
9517
// getQualifiedNameAsString() includes non-machine-parsable components.
9518
OS << *TT->getDecl();
9519
} else if (const BuiltinType *BT = EntityType->getAs<BuiltinType>())
9520
OS << BT->getName(S.getLangOpts());
9521
else {
9522
// Oops, we didn't find the actual type of the variable. Don't emit a fixit
9523
// with a broken cast.
9524
return;
9525
}
9526
OS << ">(";
9527
S.Diag(PostInit->getBeginLoc(), diag::note_init_list_narrowing_silence)
9528
<< PostInit->getSourceRange()
9529
<< FixItHint::CreateInsertion(PostInit->getBeginLoc(), OS.str())
9530
<< FixItHint::CreateInsertion(
9531
S.getLocForEndOfToken(PostInit->getEndLoc()), ")");
9532
}
9533
9534
static void CheckC23ConstexprInitConversion(Sema &S, QualType FromType,
9535
QualType ToType, Expr *Init) {
9536
assert(S.getLangOpts().C23);
9537
ImplicitConversionSequence ICS = S.TryImplicitConversion(
9538
Init->IgnoreParenImpCasts(), ToType, /*SuppressUserConversions*/ false,
9539
Sema::AllowedExplicit::None,
9540
/*InOverloadResolution*/ false,
9541
/*CStyle*/ false,
9542
/*AllowObjCWritebackConversion=*/false);
9543
9544
if (!ICS.isStandard())
9545
return;
9546
9547
APValue Value;
9548
QualType PreNarrowingType;
9549
// Reuse C++ narrowing check.
9550
switch (ICS.Standard.getNarrowingKind(
9551
S.Context, Init, Value, PreNarrowingType,
9552
/*IgnoreFloatToIntegralConversion*/ false)) {
9553
// The value doesn't fit.
9554
case NK_Constant_Narrowing:
9555
S.Diag(Init->getBeginLoc(), diag::err_c23_constexpr_init_not_representable)
9556
<< Value.getAsString(S.Context, PreNarrowingType) << ToType;
9557
return;
9558
9559
// Conversion to a narrower type.
9560
case NK_Type_Narrowing:
9561
S.Diag(Init->getBeginLoc(), diag::err_c23_constexpr_init_type_mismatch)
9562
<< ToType << FromType;
9563
return;
9564
9565
// Since we only reuse narrowing check for C23 constexpr variables here, we're
9566
// not really interested in these cases.
9567
case NK_Dependent_Narrowing:
9568
case NK_Variable_Narrowing:
9569
case NK_Not_Narrowing:
9570
return;
9571
}
9572
llvm_unreachable("unhandled case in switch");
9573
}
9574
9575
static void CheckC23ConstexprInitStringLiteral(const StringLiteral *SE,
9576
Sema &SemaRef, QualType &TT) {
9577
assert(SemaRef.getLangOpts().C23);
9578
// character that string literal contains fits into TT - target type.
9579
const ArrayType *AT = SemaRef.Context.getAsArrayType(TT);
9580
QualType CharType = AT->getElementType();
9581
uint32_t BitWidth = SemaRef.Context.getTypeSize(CharType);
9582
bool isUnsigned = CharType->isUnsignedIntegerType();
9583
llvm::APSInt Value(BitWidth, isUnsigned);
9584
for (unsigned I = 0, N = SE->getLength(); I != N; ++I) {
9585
int64_t C = SE->getCodeUnitS(I, SemaRef.Context.getCharWidth());
9586
Value = C;
9587
if (Value != C) {
9588
SemaRef.Diag(SemaRef.getLocationOfStringLiteralByte(SE, I),
9589
diag::err_c23_constexpr_init_not_representable)
9590
<< C << CharType;
9591
return;
9592
}
9593
}
9594
return;
9595
}
9596
9597
//===----------------------------------------------------------------------===//
9598
// Initialization helper functions
9599
//===----------------------------------------------------------------------===//
9600
bool
9601
Sema::CanPerformCopyInitialization(const InitializedEntity &Entity,
9602
ExprResult Init) {
9603
if (Init.isInvalid())
9604
return false;
9605
9606
Expr *InitE = Init.get();
9607
assert(InitE && "No initialization expression");
9608
9609
InitializationKind Kind =
9610
InitializationKind::CreateCopy(InitE->getBeginLoc(), SourceLocation());
9611
InitializationSequence Seq(*this, Entity, Kind, InitE);
9612
return !Seq.Failed();
9613
}
9614
9615
ExprResult
9616
Sema::PerformCopyInitialization(const InitializedEntity &Entity,
9617
SourceLocation EqualLoc,
9618
ExprResult Init,
9619
bool TopLevelOfInitList,
9620
bool AllowExplicit) {
9621
if (Init.isInvalid())
9622
return ExprError();
9623
9624
Expr *InitE = Init.get();
9625
assert(InitE && "No initialization expression?");
9626
9627
if (EqualLoc.isInvalid())
9628
EqualLoc = InitE->getBeginLoc();
9629
9630
InitializationKind Kind = InitializationKind::CreateCopy(
9631
InitE->getBeginLoc(), EqualLoc, AllowExplicit);
9632
InitializationSequence Seq(*this, Entity, Kind, InitE, TopLevelOfInitList);
9633
9634
// Prevent infinite recursion when performing parameter copy-initialization.
9635
const bool ShouldTrackCopy =
9636
Entity.isParameterKind() && Seq.isConstructorInitialization();
9637
if (ShouldTrackCopy) {
9638
if (llvm::is_contained(CurrentParameterCopyTypes, Entity.getType())) {
9639
Seq.SetOverloadFailure(
9640
InitializationSequence::FK_ConstructorOverloadFailed,
9641
OR_No_Viable_Function);
9642
9643
// Try to give a meaningful diagnostic note for the problematic
9644
// constructor.
9645
const auto LastStep = Seq.step_end() - 1;
9646
assert(LastStep->Kind ==
9647
InitializationSequence::SK_ConstructorInitialization);
9648
const FunctionDecl *Function = LastStep->Function.Function;
9649
auto Candidate =
9650
llvm::find_if(Seq.getFailedCandidateSet(),
9651
[Function](const OverloadCandidate &Candidate) -> bool {
9652
return Candidate.Viable &&
9653
Candidate.Function == Function &&
9654
Candidate.Conversions.size() > 0;
9655
});
9656
if (Candidate != Seq.getFailedCandidateSet().end() &&
9657
Function->getNumParams() > 0) {
9658
Candidate->Viable = false;
9659
Candidate->FailureKind = ovl_fail_bad_conversion;
9660
Candidate->Conversions[0].setBad(BadConversionSequence::no_conversion,
9661
InitE,
9662
Function->getParamDecl(0)->getType());
9663
}
9664
}
9665
CurrentParameterCopyTypes.push_back(Entity.getType());
9666
}
9667
9668
ExprResult Result = Seq.Perform(*this, Entity, Kind, InitE);
9669
9670
if (ShouldTrackCopy)
9671
CurrentParameterCopyTypes.pop_back();
9672
9673
return Result;
9674
}
9675
9676
/// Determine whether RD is, or is derived from, a specialization of CTD.
9677
static bool isOrIsDerivedFromSpecializationOf(CXXRecordDecl *RD,
9678
ClassTemplateDecl *CTD) {
9679
auto NotSpecialization = [&] (const CXXRecordDecl *Candidate) {
9680
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Candidate);
9681
return !CTSD || !declaresSameEntity(CTSD->getSpecializedTemplate(), CTD);
9682
};
9683
return !(NotSpecialization(RD) && RD->forallBases(NotSpecialization));
9684
}
9685
9686
QualType Sema::DeduceTemplateSpecializationFromInitializer(
9687
TypeSourceInfo *TSInfo, const InitializedEntity &Entity,
9688
const InitializationKind &Kind, MultiExprArg Inits) {
9689
auto *DeducedTST = dyn_cast<DeducedTemplateSpecializationType>(
9690
TSInfo->getType()->getContainedDeducedType());
9691
assert(DeducedTST && "not a deduced template specialization type");
9692
9693
auto TemplateName = DeducedTST->getTemplateName();
9694
if (TemplateName.isDependent())
9695
return SubstAutoTypeDependent(TSInfo->getType());
9696
9697
// We can only perform deduction for class templates or alias templates.
9698
auto *Template =
9699
dyn_cast_or_null<ClassTemplateDecl>(TemplateName.getAsTemplateDecl());
9700
TemplateDecl *LookupTemplateDecl = Template;
9701
if (!Template) {
9702
if (auto *AliasTemplate = dyn_cast_or_null<TypeAliasTemplateDecl>(
9703
TemplateName.getAsTemplateDecl())) {
9704
Diag(Kind.getLocation(),
9705
diag::warn_cxx17_compat_ctad_for_alias_templates);
9706
LookupTemplateDecl = AliasTemplate;
9707
auto UnderlyingType = AliasTemplate->getTemplatedDecl()
9708
->getUnderlyingType()
9709
.getCanonicalType();
9710
// C++ [over.match.class.deduct#3]: ..., the defining-type-id of A must be
9711
// of the form
9712
// [typename] [nested-name-specifier] [template] simple-template-id
9713
if (const auto *TST =
9714
UnderlyingType->getAs<TemplateSpecializationType>()) {
9715
Template = dyn_cast_or_null<ClassTemplateDecl>(
9716
TST->getTemplateName().getAsTemplateDecl());
9717
} else if (const auto *RT = UnderlyingType->getAs<RecordType>()) {
9718
// Cases where template arguments in the RHS of the alias are not
9719
// dependent. e.g.
9720
// using AliasFoo = Foo<bool>;
9721
if (const auto *CTSD = llvm::dyn_cast<ClassTemplateSpecializationDecl>(
9722
RT->getAsCXXRecordDecl()))
9723
Template = CTSD->getSpecializedTemplate();
9724
}
9725
}
9726
}
9727
if (!Template) {
9728
Diag(Kind.getLocation(),
9729
diag::err_deduced_non_class_or_alias_template_specialization_type)
9730
<< (int)getTemplateNameKindForDiagnostics(TemplateName) << TemplateName;
9731
if (auto *TD = TemplateName.getAsTemplateDecl())
9732
NoteTemplateLocation(*TD);
9733
return QualType();
9734
}
9735
9736
// Can't deduce from dependent arguments.
9737
if (Expr::hasAnyTypeDependentArguments(Inits)) {
9738
Diag(TSInfo->getTypeLoc().getBeginLoc(),
9739
diag::warn_cxx14_compat_class_template_argument_deduction)
9740
<< TSInfo->getTypeLoc().getSourceRange() << 0;
9741
return SubstAutoTypeDependent(TSInfo->getType());
9742
}
9743
9744
// FIXME: Perform "exact type" matching first, per CWG discussion?
9745
// Or implement this via an implied 'T(T) -> T' deduction guide?
9746
9747
// Look up deduction guides, including those synthesized from constructors.
9748
//
9749
// C++1z [over.match.class.deduct]p1:
9750
// A set of functions and function templates is formed comprising:
9751
// - For each constructor of the class template designated by the
9752
// template-name, a function template [...]
9753
// - For each deduction-guide, a function or function template [...]
9754
DeclarationNameInfo NameInfo(
9755
Context.DeclarationNames.getCXXDeductionGuideName(LookupTemplateDecl),
9756
TSInfo->getTypeLoc().getEndLoc());
9757
LookupResult Guides(*this, NameInfo, LookupOrdinaryName);
9758
LookupQualifiedName(Guides, LookupTemplateDecl->getDeclContext());
9759
9760
// FIXME: Do not diagnose inaccessible deduction guides. The standard isn't
9761
// clear on this, but they're not found by name so access does not apply.
9762
Guides.suppressDiagnostics();
9763
9764
// Figure out if this is list-initialization.
9765
InitListExpr *ListInit =
9766
(Inits.size() == 1 && Kind.getKind() != InitializationKind::IK_Direct)
9767
? dyn_cast<InitListExpr>(Inits[0])
9768
: nullptr;
9769
9770
// C++1z [over.match.class.deduct]p1:
9771
// Initialization and overload resolution are performed as described in
9772
// [dcl.init] and [over.match.ctor], [over.match.copy], or [over.match.list]
9773
// (as appropriate for the type of initialization performed) for an object
9774
// of a hypothetical class type, where the selected functions and function
9775
// templates are considered to be the constructors of that class type
9776
//
9777
// Since we know we're initializing a class type of a type unrelated to that
9778
// of the initializer, this reduces to something fairly reasonable.
9779
OverloadCandidateSet Candidates(Kind.getLocation(),
9780
OverloadCandidateSet::CSK_Normal);
9781
OverloadCandidateSet::iterator Best;
9782
9783
bool AllowExplicit = !Kind.isCopyInit() || ListInit;
9784
9785
// Return true if the candidate is added successfully, false otherwise.
9786
auto addDeductionCandidate = [&](FunctionTemplateDecl *TD,
9787
CXXDeductionGuideDecl *GD,
9788
DeclAccessPair FoundDecl,
9789
bool OnlyListConstructors,
9790
bool AllowAggregateDeductionCandidate) {
9791
// C++ [over.match.ctor]p1: (non-list copy-initialization from non-class)
9792
// For copy-initialization, the candidate functions are all the
9793
// converting constructors (12.3.1) of that class.
9794
// C++ [over.match.copy]p1: (non-list copy-initialization from class)
9795
// The converting constructors of T are candidate functions.
9796
if (!AllowExplicit) {
9797
// Overload resolution checks whether the deduction guide is declared
9798
// explicit for us.
9799
9800
// When looking for a converting constructor, deduction guides that
9801
// could never be called with one argument are not interesting to
9802
// check or note.
9803
if (GD->getMinRequiredArguments() > 1 ||
9804
(GD->getNumParams() == 0 && !GD->isVariadic()))
9805
return;
9806
}
9807
9808
// C++ [over.match.list]p1.1: (first phase list initialization)
9809
// Initially, the candidate functions are the initializer-list
9810
// constructors of the class T
9811
if (OnlyListConstructors && !isInitListConstructor(GD))
9812
return;
9813
9814
if (!AllowAggregateDeductionCandidate &&
9815
GD->getDeductionCandidateKind() == DeductionCandidate::Aggregate)
9816
return;
9817
9818
// C++ [over.match.list]p1.2: (second phase list initialization)
9819
// the candidate functions are all the constructors of the class T
9820
// C++ [over.match.ctor]p1: (all other cases)
9821
// the candidate functions are all the constructors of the class of
9822
// the object being initialized
9823
9824
// C++ [over.best.ics]p4:
9825
// When [...] the constructor [...] is a candidate by
9826
// - [over.match.copy] (in all cases)
9827
if (TD) {
9828
SmallVector<Expr *, 8> TmpInits;
9829
for (Expr *E : Inits)
9830
if (auto *DI = dyn_cast<DesignatedInitExpr>(E))
9831
TmpInits.push_back(DI->getInit());
9832
else
9833
TmpInits.push_back(E);
9834
AddTemplateOverloadCandidate(
9835
TD, FoundDecl, /*ExplicitArgs=*/nullptr, TmpInits, Candidates,
9836
/*SuppressUserConversions=*/false,
9837
/*PartialOverloading=*/false, AllowExplicit, ADLCallKind::NotADL,
9838
/*PO=*/{}, AllowAggregateDeductionCandidate);
9839
} else {
9840
AddOverloadCandidate(GD, FoundDecl, Inits, Candidates,
9841
/*SuppressUserConversions=*/false,
9842
/*PartialOverloading=*/false, AllowExplicit);
9843
}
9844
};
9845
9846
bool FoundDeductionGuide = false;
9847
9848
auto TryToResolveOverload =
9849
[&](bool OnlyListConstructors) -> OverloadingResult {
9850
Candidates.clear(OverloadCandidateSet::CSK_Normal);
9851
bool HasAnyDeductionGuide = false;
9852
9853
auto SynthesizeAggrGuide = [&](InitListExpr *ListInit) {
9854
auto *Pattern = Template;
9855
while (Pattern->getInstantiatedFromMemberTemplate()) {
9856
if (Pattern->isMemberSpecialization())
9857
break;
9858
Pattern = Pattern->getInstantiatedFromMemberTemplate();
9859
}
9860
9861
auto *RD = cast<CXXRecordDecl>(Pattern->getTemplatedDecl());
9862
if (!(RD->getDefinition() && RD->isAggregate()))
9863
return;
9864
QualType Ty = Context.getRecordType(RD);
9865
SmallVector<QualType, 8> ElementTypes;
9866
9867
InitListChecker CheckInitList(*this, Entity, ListInit, Ty, ElementTypes);
9868
if (!CheckInitList.HadError()) {
9869
// C++ [over.match.class.deduct]p1.8:
9870
// if e_i is of array type and x_i is a braced-init-list, T_i is an
9871
// rvalue reference to the declared type of e_i and
9872
// C++ [over.match.class.deduct]p1.9:
9873
// if e_i is of array type and x_i is a string-literal, T_i is an
9874
// lvalue reference to the const-qualified declared type of e_i and
9875
// C++ [over.match.class.deduct]p1.10:
9876
// otherwise, T_i is the declared type of e_i
9877
for (int I = 0, E = ListInit->getNumInits();
9878
I < E && !isa<PackExpansionType>(ElementTypes[I]); ++I)
9879
if (ElementTypes[I]->isArrayType()) {
9880
if (isa<InitListExpr, DesignatedInitExpr>(ListInit->getInit(I)))
9881
ElementTypes[I] = Context.getRValueReferenceType(ElementTypes[I]);
9882
else if (isa<StringLiteral>(
9883
ListInit->getInit(I)->IgnoreParenImpCasts()))
9884
ElementTypes[I] =
9885
Context.getLValueReferenceType(ElementTypes[I].withConst());
9886
}
9887
9888
if (FunctionTemplateDecl *TD =
9889
DeclareAggregateDeductionGuideFromInitList(
9890
LookupTemplateDecl, ElementTypes,
9891
TSInfo->getTypeLoc().getEndLoc())) {
9892
auto *GD = cast<CXXDeductionGuideDecl>(TD->getTemplatedDecl());
9893
addDeductionCandidate(TD, GD, DeclAccessPair::make(TD, AS_public),
9894
OnlyListConstructors,
9895
/*AllowAggregateDeductionCandidate=*/true);
9896
HasAnyDeductionGuide = true;
9897
}
9898
}
9899
};
9900
9901
for (auto I = Guides.begin(), E = Guides.end(); I != E; ++I) {
9902
NamedDecl *D = (*I)->getUnderlyingDecl();
9903
if (D->isInvalidDecl())
9904
continue;
9905
9906
auto *TD = dyn_cast<FunctionTemplateDecl>(D);
9907
auto *GD = dyn_cast_if_present<CXXDeductionGuideDecl>(
9908
TD ? TD->getTemplatedDecl() : dyn_cast<FunctionDecl>(D));
9909
if (!GD)
9910
continue;
9911
9912
if (!GD->isImplicit())
9913
HasAnyDeductionGuide = true;
9914
9915
addDeductionCandidate(TD, GD, I.getPair(), OnlyListConstructors,
9916
/*AllowAggregateDeductionCandidate=*/false);
9917
}
9918
9919
// C++ [over.match.class.deduct]p1.4:
9920
// if C is defined and its definition satisfies the conditions for an
9921
// aggregate class ([dcl.init.aggr]) with the assumption that any
9922
// dependent base class has no virtual functions and no virtual base
9923
// classes, and the initializer is a non-empty braced-init-list or
9924
// parenthesized expression-list, and there are no deduction-guides for
9925
// C, the set contains an additional function template, called the
9926
// aggregate deduction candidate, defined as follows.
9927
if (getLangOpts().CPlusPlus20 && !HasAnyDeductionGuide) {
9928
if (ListInit && ListInit->getNumInits()) {
9929
SynthesizeAggrGuide(ListInit);
9930
} else if (Inits.size()) { // parenthesized expression-list
9931
// Inits are expressions inside the parentheses. We don't have
9932
// the parentheses source locations, use the begin/end of Inits as the
9933
// best heuristic.
9934
InitListExpr TempListInit(getASTContext(), Inits.front()->getBeginLoc(),
9935
Inits, Inits.back()->getEndLoc());
9936
SynthesizeAggrGuide(&TempListInit);
9937
}
9938
}
9939
9940
FoundDeductionGuide = FoundDeductionGuide || HasAnyDeductionGuide;
9941
9942
return Candidates.BestViableFunction(*this, Kind.getLocation(), Best);
9943
};
9944
9945
OverloadingResult Result = OR_No_Viable_Function;
9946
9947
// C++11 [over.match.list]p1, per DR1467: for list-initialization, first
9948
// try initializer-list constructors.
9949
if (ListInit) {
9950
bool TryListConstructors = true;
9951
9952
// Try list constructors unless the list is empty and the class has one or
9953
// more default constructors, in which case those constructors win.
9954
if (!ListInit->getNumInits()) {
9955
for (NamedDecl *D : Guides) {
9956
auto *FD = dyn_cast<FunctionDecl>(D->getUnderlyingDecl());
9957
if (FD && FD->getMinRequiredArguments() == 0) {
9958
TryListConstructors = false;
9959
break;
9960
}
9961
}
9962
} else if (ListInit->getNumInits() == 1) {
9963
// C++ [over.match.class.deduct]:
9964
// As an exception, the first phase in [over.match.list] (considering
9965
// initializer-list constructors) is omitted if the initializer list
9966
// consists of a single expression of type cv U, where U is a
9967
// specialization of C or a class derived from a specialization of C.
9968
Expr *E = ListInit->getInit(0);
9969
auto *RD = E->getType()->getAsCXXRecordDecl();
9970
if (!isa<InitListExpr>(E) && RD &&
9971
isCompleteType(Kind.getLocation(), E->getType()) &&
9972
isOrIsDerivedFromSpecializationOf(RD, Template))
9973
TryListConstructors = false;
9974
}
9975
9976
if (TryListConstructors)
9977
Result = TryToResolveOverload(/*OnlyListConstructor*/true);
9978
// Then unwrap the initializer list and try again considering all
9979
// constructors.
9980
Inits = MultiExprArg(ListInit->getInits(), ListInit->getNumInits());
9981
}
9982
9983
// If list-initialization fails, or if we're doing any other kind of
9984
// initialization, we (eventually) consider constructors.
9985
if (Result == OR_No_Viable_Function)
9986
Result = TryToResolveOverload(/*OnlyListConstructor*/false);
9987
9988
switch (Result) {
9989
case OR_Ambiguous:
9990
// FIXME: For list-initialization candidates, it'd usually be better to
9991
// list why they were not viable when given the initializer list itself as
9992
// an argument.
9993
Candidates.NoteCandidates(
9994
PartialDiagnosticAt(
9995
Kind.getLocation(),
9996
PDiag(diag::err_deduced_class_template_ctor_ambiguous)
9997
<< TemplateName),
9998
*this, OCD_AmbiguousCandidates, Inits);
9999
return QualType();
10000
10001
case OR_No_Viable_Function: {
10002
CXXRecordDecl *Primary =
10003
cast<ClassTemplateDecl>(Template)->getTemplatedDecl();
10004
bool Complete =
10005
isCompleteType(Kind.getLocation(), Context.getTypeDeclType(Primary));
10006
Candidates.NoteCandidates(
10007
PartialDiagnosticAt(
10008
Kind.getLocation(),
10009
PDiag(Complete ? diag::err_deduced_class_template_ctor_no_viable
10010
: diag::err_deduced_class_template_incomplete)
10011
<< TemplateName << !Guides.empty()),
10012
*this, OCD_AllCandidates, Inits);
10013
return QualType();
10014
}
10015
10016
case OR_Deleted: {
10017
// FIXME: There are no tests for this diagnostic, and it doesn't seem
10018
// like we ever get here; attempts to trigger this seem to yield a
10019
// generic c'all to deleted function' diagnostic instead.
10020
Diag(Kind.getLocation(), diag::err_deduced_class_template_deleted)
10021
<< TemplateName;
10022
NoteDeletedFunction(Best->Function);
10023
return QualType();
10024
}
10025
10026
case OR_Success:
10027
// C++ [over.match.list]p1:
10028
// In copy-list-initialization, if an explicit constructor is chosen, the
10029
// initialization is ill-formed.
10030
if (Kind.isCopyInit() && ListInit &&
10031
cast<CXXDeductionGuideDecl>(Best->Function)->isExplicit()) {
10032
bool IsDeductionGuide = !Best->Function->isImplicit();
10033
Diag(Kind.getLocation(), diag::err_deduced_class_template_explicit)
10034
<< TemplateName << IsDeductionGuide;
10035
Diag(Best->Function->getLocation(),
10036
diag::note_explicit_ctor_deduction_guide_here)
10037
<< IsDeductionGuide;
10038
return QualType();
10039
}
10040
10041
// Make sure we didn't select an unusable deduction guide, and mark it
10042
// as referenced.
10043
DiagnoseUseOfDecl(Best->FoundDecl, Kind.getLocation());
10044
MarkFunctionReferenced(Kind.getLocation(), Best->Function);
10045
break;
10046
}
10047
10048
// C++ [dcl.type.class.deduct]p1:
10049
// The placeholder is replaced by the return type of the function selected
10050
// by overload resolution for class template deduction.
10051
QualType DeducedType =
10052
SubstAutoType(TSInfo->getType(), Best->Function->getReturnType());
10053
Diag(TSInfo->getTypeLoc().getBeginLoc(),
10054
diag::warn_cxx14_compat_class_template_argument_deduction)
10055
<< TSInfo->getTypeLoc().getSourceRange() << 1 << DeducedType;
10056
10057
// Warn if CTAD was used on a type that does not have any user-defined
10058
// deduction guides.
10059
if (!FoundDeductionGuide) {
10060
Diag(TSInfo->getTypeLoc().getBeginLoc(),
10061
diag::warn_ctad_maybe_unsupported)
10062
<< TemplateName;
10063
Diag(Template->getLocation(), diag::note_suppress_ctad_maybe_unsupported);
10064
}
10065
10066
return DeducedType;
10067
}
10068
10069