blob: e18ae74c2510a7420be942f7e815fd5bfbe952fa [file] [log] [blame]
Steve Narofff8ecff22008-05-01 22:18:59 +00001//===--- SemaInit.cpp - Semantic Analysis for Initializers ----------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Steve Narofff8ecff22008-05-01 22:18:59 +00006//
7//===----------------------------------------------------------------------===//
8//
Sebastian Redl26bcc942011-09-24 17:47:39 +00009// This file implements semantic analysis for initializers.
Chris Lattner0cb78032009-02-24 22:27:37 +000010//
Steve Narofff8ecff22008-05-01 22:18:59 +000011//===----------------------------------------------------------------------===//
12
Steve Narofff8ecff22008-05-01 22:18:59 +000013#include "clang/AST/ASTContext.h"
John McCallde6836a2010-08-24 07:21:54 +000014#include "clang/AST/DeclObjC.h"
Anders Carlsson98cee2f2009-05-27 16:10:08 +000015#include "clang/AST/ExprCXX.h"
Chris Lattnerd8b741c82009-02-24 23:10:27 +000016#include "clang/AST/ExprObjC.h"
Richard Smithafe48f92018-07-23 21:21:22 +000017#include "clang/AST/ExprOpenMP.h"
Douglas Gregor1b303932009-12-22 15:35:07 +000018#include "clang/AST/TypeLoc.h"
Gabor Horvathbfe0c372019-08-14 16:34:56 +000019#include "clang/Basic/CharInfo.h"
James Molloy9eef2652014-06-20 14:35:13 +000020#include "clang/Basic/TargetInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000021#include "clang/Sema/Designator.h"
Mehdi Amini9670f842016-07-18 19:02:11 +000022#include "clang/Sema/Initialization.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000023#include "clang/Sema/Lookup.h"
24#include "clang/Sema/SemaInternal.h"
Sebastian Redlc1839b12012-01-17 22:49:42 +000025#include "llvm/ADT/APInt.h"
Benjamin Kramer49038022012-02-04 13:45:25 +000026#include "llvm/ADT/SmallString.h"
Douglas Gregor3e1e5272009-12-09 23:02:17 +000027#include "llvm/Support/ErrorHandling.h"
Jeffrey Yasskina6667812011-07-26 23:20:30 +000028#include "llvm/Support/raw_ostream.h"
Eugene Zelenko1ced5092016-02-12 22:53:10 +000029
Douglas Gregore4a0bb72009-01-22 00:58:24 +000030using namespace clang;
Steve Narofff8ecff22008-05-01 22:18:59 +000031
Chris Lattner0cb78032009-02-24 22:27:37 +000032//===----------------------------------------------------------------------===//
33// Sema Initialization Checking
34//===----------------------------------------------------------------------===//
35
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000036/// Check whether T is compatible with a wide character type (wchar_t,
Hans Wennborg8f62c5c2013-05-15 11:03:04 +000037/// char16_t or char32_t).
38static bool IsWideCharCompatible(QualType T, ASTContext &Context) {
39 if (Context.typesAreCompatible(Context.getWideCharType(), T))
40 return true;
41 if (Context.getLangOpts().CPlusPlus || Context.getLangOpts().C11) {
42 return Context.typesAreCompatible(Context.Char16Ty, T) ||
43 Context.typesAreCompatible(Context.Char32Ty, T);
44 }
45 return false;
46}
47
48enum StringInitFailureKind {
49 SIF_None,
50 SIF_NarrowStringIntoWideChar,
51 SIF_WideStringIntoChar,
52 SIF_IncompatWideStringIntoWideChar,
Richard Smith3a8244d2018-05-01 05:02:45 +000053 SIF_UTF8StringIntoPlainChar,
54 SIF_PlainStringIntoUTF8Char,
Hans Wennborg8f62c5c2013-05-15 11:03:04 +000055 SIF_Other
56};
57
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000058/// Check whether the array of type AT can be initialized by the Init
Hans Wennborg8f62c5c2013-05-15 11:03:04 +000059/// expression by means of string initialization. Returns SIF_None if so,
60/// otherwise returns a StringInitFailureKind that describes why the
61/// initialization would not work.
62static StringInitFailureKind IsStringInit(Expr *Init, const ArrayType *AT,
63 ASTContext &Context) {
Eli Friedman893abe42009-05-29 18:22:49 +000064 if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT))
Hans Wennborg8f62c5c2013-05-15 11:03:04 +000065 return SIF_Other;
Eli Friedman893abe42009-05-29 18:22:49 +000066
Chris Lattnera9196812009-02-26 23:26:43 +000067 // See if this is a string literal or @encode.
68 Init = Init->IgnoreParens();
Mike Stump11289f42009-09-09 15:08:12 +000069
Chris Lattnera9196812009-02-26 23:26:43 +000070 // Handle @encode, which is a narrow string.
71 if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType())
Hans Wennborg8f62c5c2013-05-15 11:03:04 +000072 return SIF_None;
Chris Lattnera9196812009-02-26 23:26:43 +000073
74 // Otherwise we can only handle string literals.
75 StringLiteral *SL = dyn_cast<StringLiteral>(Init);
Craig Topperc3ec1492014-05-26 06:22:03 +000076 if (!SL)
Hans Wennborg8f62c5c2013-05-15 11:03:04 +000077 return SIF_Other;
Eli Friedman42a84652009-05-31 10:54:53 +000078
Hans Wennborg8f62c5c2013-05-15 11:03:04 +000079 const QualType ElemTy =
80 Context.getCanonicalType(AT->getElementType()).getUnqualifiedType();
Douglas Gregorfb65e592011-07-27 05:40:30 +000081
82 switch (SL->getKind()) {
Douglas Gregorfb65e592011-07-27 05:40:30 +000083 case StringLiteral::UTF8:
Richard Smith3a8244d2018-05-01 05:02:45 +000084 // char8_t array can be initialized with a UTF-8 string.
85 if (ElemTy->isChar8Type())
86 return SIF_None;
87 LLVM_FALLTHROUGH;
88 case StringLiteral::Ascii:
Douglas Gregorfb65e592011-07-27 05:40:30 +000089 // char array can be initialized with a narrow string.
90 // Only allow char x[] = "foo"; not char x[] = L"foo";
Hans Wennborg8f62c5c2013-05-15 11:03:04 +000091 if (ElemTy->isCharType())
Richard Smith3a8244d2018-05-01 05:02:45 +000092 return (SL->getKind() == StringLiteral::UTF8 &&
93 Context.getLangOpts().Char8)
94 ? SIF_UTF8StringIntoPlainChar
95 : SIF_None;
96 if (ElemTy->isChar8Type())
97 return SIF_PlainStringIntoUTF8Char;
Hans Wennborg8f62c5c2013-05-15 11:03:04 +000098 if (IsWideCharCompatible(ElemTy, Context))
99 return SIF_NarrowStringIntoWideChar;
100 return SIF_Other;
101 // C99 6.7.8p15 (with correction from DR343), or C11 6.7.9p15:
102 // "An array with element type compatible with a qualified or unqualified
103 // version of wchar_t, char16_t, or char32_t may be initialized by a wide
104 // string literal with the corresponding encoding prefix (L, u, or U,
105 // respectively), optionally enclosed in braces.
Douglas Gregorfb65e592011-07-27 05:40:30 +0000106 case StringLiteral::UTF16:
Hans Wennborg8f62c5c2013-05-15 11:03:04 +0000107 if (Context.typesAreCompatible(Context.Char16Ty, ElemTy))
108 return SIF_None;
Richard Smith3a8244d2018-05-01 05:02:45 +0000109 if (ElemTy->isCharType() || ElemTy->isChar8Type())
Hans Wennborg8f62c5c2013-05-15 11:03:04 +0000110 return SIF_WideStringIntoChar;
111 if (IsWideCharCompatible(ElemTy, Context))
112 return SIF_IncompatWideStringIntoWideChar;
113 return SIF_Other;
Douglas Gregorfb65e592011-07-27 05:40:30 +0000114 case StringLiteral::UTF32:
Hans Wennborg8f62c5c2013-05-15 11:03:04 +0000115 if (Context.typesAreCompatible(Context.Char32Ty, ElemTy))
116 return SIF_None;
Richard Smith3a8244d2018-05-01 05:02:45 +0000117 if (ElemTy->isCharType() || ElemTy->isChar8Type())
Hans Wennborg8f62c5c2013-05-15 11:03:04 +0000118 return SIF_WideStringIntoChar;
119 if (IsWideCharCompatible(ElemTy, Context))
120 return SIF_IncompatWideStringIntoWideChar;
121 return SIF_Other;
Douglas Gregorfb65e592011-07-27 05:40:30 +0000122 case StringLiteral::Wide:
Hans Wennborg8f62c5c2013-05-15 11:03:04 +0000123 if (Context.typesAreCompatible(Context.getWideCharType(), ElemTy))
124 return SIF_None;
Richard Smith3a8244d2018-05-01 05:02:45 +0000125 if (ElemTy->isCharType() || ElemTy->isChar8Type())
Hans Wennborg8f62c5c2013-05-15 11:03:04 +0000126 return SIF_WideStringIntoChar;
127 if (IsWideCharCompatible(ElemTy, Context))
128 return SIF_IncompatWideStringIntoWideChar;
129 return SIF_Other;
Douglas Gregorfb65e592011-07-27 05:40:30 +0000130 }
Mike Stump11289f42009-09-09 15:08:12 +0000131
Douglas Gregorfb65e592011-07-27 05:40:30 +0000132 llvm_unreachable("missed a StringLiteral kind?");
Chris Lattner0cb78032009-02-24 22:27:37 +0000133}
134
Hans Wennborg950f3182013-05-16 09:22:40 +0000135static StringInitFailureKind IsStringInit(Expr *init, QualType declType,
136 ASTContext &Context) {
John McCall66884dd2011-02-21 07:22:22 +0000137 const ArrayType *arrayType = Context.getAsArrayType(declType);
Hans Wennborg8f62c5c2013-05-15 11:03:04 +0000138 if (!arrayType)
Hans Wennborg950f3182013-05-16 09:22:40 +0000139 return SIF_Other;
140 return IsStringInit(init, arrayType, Context);
John McCall66884dd2011-02-21 07:22:22 +0000141}
142
Richard Smith430c23b2013-05-05 16:40:13 +0000143/// Update the type of a string literal, including any surrounding parentheses,
144/// to match the type of the object which it is initializing.
145static void updateStringLiteralType(Expr *E, QualType Ty) {
Richard Smithd74b16062013-05-06 00:35:47 +0000146 while (true) {
Richard Smith430c23b2013-05-05 16:40:13 +0000147 E->setType(Ty);
Eli Friedman3bf72d72019-02-08 21:18:46 +0000148 E->setValueKind(VK_RValue);
Eli Friedman88fccbd2019-02-11 22:54:27 +0000149 if (isa<StringLiteral>(E) || isa<ObjCEncodeExpr>(E)) {
Richard Smithd74b16062013-05-06 00:35:47 +0000150 break;
Eli Friedman88fccbd2019-02-11 22:54:27 +0000151 } else if (ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
Richard Smithd74b16062013-05-06 00:35:47 +0000152 E = PE->getSubExpr();
Eli Friedman88fccbd2019-02-11 22:54:27 +0000153 } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) {
154 assert(UO->getOpcode() == UO_Extension);
Richard Smithd74b16062013-05-06 00:35:47 +0000155 E = UO->getSubExpr();
Eli Friedman88fccbd2019-02-11 22:54:27 +0000156 } else if (GenericSelectionExpr *GSE = dyn_cast<GenericSelectionExpr>(E)) {
Richard Smithd74b16062013-05-06 00:35:47 +0000157 E = GSE->getResultExpr();
Eli Friedman88fccbd2019-02-11 22:54:27 +0000158 } else if (ChooseExpr *CE = dyn_cast<ChooseExpr>(E)) {
159 E = CE->getChosenSubExpr();
160 } else {
Richard Smithd74b16062013-05-06 00:35:47 +0000161 llvm_unreachable("unexpected expr in string literal init");
Eli Friedman88fccbd2019-02-11 22:54:27 +0000162 }
163 }
164}
165
166/// Fix a compound literal initializing an array so it's correctly marked
167/// as an rvalue.
168static void updateGNUCompoundLiteralRValue(Expr *E) {
169 while (true) {
170 E->setValueKind(VK_RValue);
171 if (isa<CompoundLiteralExpr>(E)) {
172 break;
173 } else if (ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
174 E = PE->getSubExpr();
175 } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) {
176 assert(UO->getOpcode() == UO_Extension);
177 E = UO->getSubExpr();
178 } else if (GenericSelectionExpr *GSE = dyn_cast<GenericSelectionExpr>(E)) {
179 E = GSE->getResultExpr();
180 } else if (ChooseExpr *CE = dyn_cast<ChooseExpr>(E)) {
181 E = CE->getChosenSubExpr();
182 } else {
183 llvm_unreachable("unexpected expr in array compound literal init");
184 }
Richard Smith430c23b2013-05-05 16:40:13 +0000185 }
Richard Smith430c23b2013-05-05 16:40:13 +0000186}
187
John McCall5decec92011-02-21 07:57:55 +0000188static void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT,
189 Sema &S) {
Chris Lattnerd8b741c82009-02-24 23:10:27 +0000190 // Get the length of the string as parsed.
Ben Langmuir577b3932015-01-26 19:04:10 +0000191 auto *ConstantArrayTy =
Ben Langmuir7b30f532015-01-26 20:01:17 +0000192 cast<ConstantArrayType>(Str->getType()->getAsArrayTypeUnsafe());
Ben Langmuir577b3932015-01-26 19:04:10 +0000193 uint64_t StrLength = ConstantArrayTy->getSize().getZExtValue();
Mike Stump11289f42009-09-09 15:08:12 +0000194
Chris Lattner0cb78032009-02-24 22:27:37 +0000195 if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) {
Mike Stump11289f42009-09-09 15:08:12 +0000196 // C99 6.7.8p14. We have an array of character type with unknown size
Chris Lattner0cb78032009-02-24 22:27:37 +0000197 // being initialized to a string literal.
Benjamin Kramere0731772012-08-04 17:00:46 +0000198 llvm::APInt ConstVal(32, StrLength);
Chris Lattner0cb78032009-02-24 22:27:37 +0000199 // Return a new array type (C99 6.7.8p22).
John McCallc5b82252009-10-16 00:14:28 +0000200 DeclT = S.Context.getConstantArrayType(IAT->getElementType(),
201 ConstVal,
202 ArrayType::Normal, 0);
Richard Smith430c23b2013-05-05 16:40:13 +0000203 updateStringLiteralType(Str, DeclT);
Chris Lattner94e6c4b2009-02-24 23:01:39 +0000204 return;
Chris Lattner0cb78032009-02-24 22:27:37 +0000205 }
Mike Stump11289f42009-09-09 15:08:12 +0000206
Eli Friedman893abe42009-05-29 18:22:49 +0000207 const ConstantArrayType *CAT = cast<ConstantArrayType>(AT);
Mike Stump11289f42009-09-09 15:08:12 +0000208
Eli Friedman554eba92011-04-11 00:23:45 +0000209 // We have an array of character type with known size. However,
Eli Friedman893abe42009-05-29 18:22:49 +0000210 // the size may be smaller or larger than the string we are initializing.
211 // FIXME: Avoid truncation for 64-bit length strings.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000212 if (S.getLangOpts().CPlusPlus) {
Richard Smith430c23b2013-05-05 16:40:13 +0000213 if (StringLiteral *SL = dyn_cast<StringLiteral>(Str->IgnoreParens())) {
Anders Carlssond162fb82011-04-14 00:41:11 +0000214 // For Pascal strings it's OK to strip off the terminating null character,
215 // so the example below is valid:
216 //
217 // unsigned char a[2] = "\pa";
218 if (SL->isPascal())
219 StrLength--;
220 }
Fangrui Song6907ce22018-07-30 19:24:48 +0000221
Eli Friedman554eba92011-04-11 00:23:45 +0000222 // [dcl.init.string]p2
223 if (StrLength > CAT->getSize().getZExtValue())
Stephen Kellyf2ceec42018-08-09 21:08:08 +0000224 S.Diag(Str->getBeginLoc(),
Eli Friedman554eba92011-04-11 00:23:45 +0000225 diag::err_initializer_string_for_char_array_too_long)
Stephen Kellyf2ceec42018-08-09 21:08:08 +0000226 << Str->getSourceRange();
Eli Friedman554eba92011-04-11 00:23:45 +0000227 } else {
228 // C99 6.7.8p14.
229 if (StrLength-1 > CAT->getSize().getZExtValue())
Stephen Kellyf2ceec42018-08-09 21:08:08 +0000230 S.Diag(Str->getBeginLoc(),
Richard Smith1b98ccc2014-07-19 01:39:17 +0000231 diag::ext_initializer_string_for_char_array_too_long)
Stephen Kellyf2ceec42018-08-09 21:08:08 +0000232 << Str->getSourceRange();
Eli Friedman554eba92011-04-11 00:23:45 +0000233 }
Mike Stump11289f42009-09-09 15:08:12 +0000234
Eli Friedman893abe42009-05-29 18:22:49 +0000235 // Set the type to the actual size that we are initializing. If we have
236 // something like:
237 // char x[1] = "foo";
238 // then this will set the string literal's type to char[1].
Richard Smith430c23b2013-05-05 16:40:13 +0000239 updateStringLiteralType(Str, DeclT);
Chris Lattner0cb78032009-02-24 22:27:37 +0000240}
241
Chris Lattner0cb78032009-02-24 22:27:37 +0000242//===----------------------------------------------------------------------===//
243// Semantic checking for initializer lists.
244//===----------------------------------------------------------------------===//
245
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000246namespace {
247
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000248/// Semantic checking for initializer lists.
Douglas Gregorcde232f2009-01-29 01:05:33 +0000249///
250/// The InitListChecker class contains a set of routines that each
251/// handle the initialization of a certain kind of entity, e.g.,
252/// arrays, vectors, struct/union types, scalars, etc. The
253/// InitListChecker itself performs a recursive walk of the subobject
254/// structure of the type to be initialized, while stepping through
255/// the initializer list one element at a time. The IList and Index
256/// parameters to each of the Check* routines contain the active
257/// (syntactic) initializer list and the index into that initializer
258/// list that represents the current initializer. Each routine is
259/// responsible for moving that Index forward as it consumes elements.
260///
261/// Each Check* routine also has a StructuredList/StructuredIndex
Abramo Bagnara92141d22011-01-27 19:55:10 +0000262/// arguments, which contains the current "structured" (semantic)
Douglas Gregorcde232f2009-01-29 01:05:33 +0000263/// initializer list and the index into that initializer list where we
264/// are copying initializers as we map them over to the semantic
265/// list. Once we have completed our recursive walk of the subobject
266/// structure, we will have constructed a full semantic initializer
267/// list.
268///
269/// C99 designators cause changes in the initializer list traversal,
270/// because they make the initialization "jump" into a specific
271/// subobject and then continue the initialization from that
272/// point. CheckDesignatedInitializer() recursively steps into the
273/// designated subobject and manages backing out the recursion to
274/// initialize the subobjects after the one designated.
Richard Smithcd839cc2019-08-29 22:49:34 +0000275///
276/// If an initializer list contains any designators, we build a placeholder
277/// structured list even in 'verify only' mode, so that we can track which
278/// elements need 'empty' initializtion.
Douglas Gregor85df8d82009-01-29 00:45:39 +0000279class InitListChecker {
Chris Lattnerb0912a52009-02-24 22:50:46 +0000280 Sema &SemaRef;
Richard Smith33e9be62019-08-29 22:49:33 +0000281 bool hadError = false;
Richard Smithcd839cc2019-08-29 22:49:34 +0000282 bool VerifyOnly; // No diagnostics.
Manman Ren073db022016-03-10 18:53:19 +0000283 bool TreatUnavailableAsInvalid; // Used only in VerifyOnly mode.
Richard Smith50309282019-08-30 22:52:55 +0000284 bool InOverloadResolution;
Richard Smith33e9be62019-08-29 22:49:33 +0000285 InitListExpr *FullyStructuredList = nullptr;
Richard Smithcd839cc2019-08-29 22:49:34 +0000286 NoInitExpr *DummyExpr = nullptr;
287
288 NoInitExpr *getDummyInit() {
289 if (!DummyExpr)
290 DummyExpr = new (SemaRef.Context) NoInitExpr(SemaRef.Context.VoidTy);
291 return DummyExpr;
292 }
Mike Stump11289f42009-09-09 15:08:12 +0000293
Anders Carlsson6cabf312010-01-23 23:23:01 +0000294 void CheckImplicitInitList(const InitializedEntity &Entity,
Anders Carlssondbb25a32010-01-23 20:47:59 +0000295 InitListExpr *ParentIList, QualType T,
Douglas Gregorcde232f2009-01-29 01:05:33 +0000296 unsigned &Index, InitListExpr *StructuredList,
Eli Friedmanc616c5f2011-08-23 20:17:13 +0000297 unsigned &StructuredIndex);
Anders Carlsson6cabf312010-01-23 23:23:01 +0000298 void CheckExplicitInitList(const InitializedEntity &Entity,
Anders Carlssond0849252010-01-23 19:55:29 +0000299 InitListExpr *IList, QualType &T,
Richard Smith4e0d2e42013-09-20 20:10:22 +0000300 InitListExpr *StructuredList,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +0000301 bool TopLevelObject = false);
Anders Carlsson6cabf312010-01-23 23:23:01 +0000302 void CheckListElementTypes(const InitializedEntity &Entity,
Anders Carlssond0849252010-01-23 19:55:29 +0000303 InitListExpr *IList, QualType &DeclType,
Mike Stump11289f42009-09-09 15:08:12 +0000304 bool SubobjectIsDesignatorContext,
Douglas Gregor85df8d82009-01-29 00:45:39 +0000305 unsigned &Index,
Douglas Gregorcde232f2009-01-29 01:05:33 +0000306 InitListExpr *StructuredList,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +0000307 unsigned &StructuredIndex,
308 bool TopLevelObject = false);
Anders Carlsson6cabf312010-01-23 23:23:01 +0000309 void CheckSubElementType(const InitializedEntity &Entity,
Anders Carlssond0849252010-01-23 19:55:29 +0000310 InitListExpr *IList, QualType ElemType,
Douglas Gregor85df8d82009-01-29 00:45:39 +0000311 unsigned &Index,
Douglas Gregorcde232f2009-01-29 01:05:33 +0000312 InitListExpr *StructuredList,
313 unsigned &StructuredIndex);
Eli Friedman6b9c41e2011-09-19 23:17:44 +0000314 void CheckComplexType(const InitializedEntity &Entity,
315 InitListExpr *IList, QualType DeclType,
316 unsigned &Index,
317 InitListExpr *StructuredList,
318 unsigned &StructuredIndex);
Anders Carlsson6cabf312010-01-23 23:23:01 +0000319 void CheckScalarType(const InitializedEntity &Entity,
Anders Carlssond0849252010-01-23 19:55:29 +0000320 InitListExpr *IList, QualType DeclType,
Douglas Gregor85df8d82009-01-29 00:45:39 +0000321 unsigned &Index,
Douglas Gregorcde232f2009-01-29 01:05:33 +0000322 InitListExpr *StructuredList,
323 unsigned &StructuredIndex);
Anders Carlsson6cabf312010-01-23 23:23:01 +0000324 void CheckReferenceType(const InitializedEntity &Entity,
325 InitListExpr *IList, QualType DeclType,
Douglas Gregord14247a2009-01-30 22:09:00 +0000326 unsigned &Index,
327 InitListExpr *StructuredList,
328 unsigned &StructuredIndex);
Anders Carlsson6cabf312010-01-23 23:23:01 +0000329 void CheckVectorType(const InitializedEntity &Entity,
Anders Carlssond0849252010-01-23 19:55:29 +0000330 InitListExpr *IList, QualType DeclType, unsigned &Index,
Douglas Gregorcde232f2009-01-29 01:05:33 +0000331 InitListExpr *StructuredList,
332 unsigned &StructuredIndex);
Anders Carlsson6cabf312010-01-23 23:23:01 +0000333 void CheckStructUnionTypes(const InitializedEntity &Entity,
Anders Carlsson73eb7cd2010-01-23 20:20:40 +0000334 InitListExpr *IList, QualType DeclType,
Richard Smith872307e2016-03-08 22:17:41 +0000335 CXXRecordDecl::base_class_range Bases,
Mike Stump11289f42009-09-09 15:08:12 +0000336 RecordDecl::field_iterator Field,
Douglas Gregor85df8d82009-01-29 00:45:39 +0000337 bool SubobjectIsDesignatorContext, unsigned &Index,
Douglas Gregorcde232f2009-01-29 01:05:33 +0000338 InitListExpr *StructuredList,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +0000339 unsigned &StructuredIndex,
340 bool TopLevelObject = false);
Anders Carlsson6cabf312010-01-23 23:23:01 +0000341 void CheckArrayType(const InitializedEntity &Entity,
Anders Carlsson0cf999b2010-01-23 20:13:41 +0000342 InitListExpr *IList, QualType &DeclType,
Mike Stump11289f42009-09-09 15:08:12 +0000343 llvm::APSInt elementIndex,
Douglas Gregor85df8d82009-01-29 00:45:39 +0000344 bool SubobjectIsDesignatorContext, unsigned &Index,
Douglas Gregorcde232f2009-01-29 01:05:33 +0000345 InitListExpr *StructuredList,
346 unsigned &StructuredIndex);
Anders Carlsson6cabf312010-01-23 23:23:01 +0000347 bool CheckDesignatedInitializer(const InitializedEntity &Entity,
Anders Carlsson3fa93b72010-01-23 22:49:02 +0000348 InitListExpr *IList, DesignatedInitExpr *DIE,
Douglas Gregora5324162009-04-15 04:56:10 +0000349 unsigned DesigIdx,
Mike Stump11289f42009-09-09 15:08:12 +0000350 QualType &CurrentObjectType,
Douglas Gregor85df8d82009-01-29 00:45:39 +0000351 RecordDecl::field_iterator *NextField,
352 llvm::APSInt *NextElementIndex,
353 unsigned &Index,
354 InitListExpr *StructuredList,
355 unsigned &StructuredIndex,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +0000356 bool FinishSubobjectInit,
357 bool TopLevelObject);
Douglas Gregor85df8d82009-01-29 00:45:39 +0000358 InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
359 QualType CurrentObjectType,
360 InitListExpr *StructuredList,
361 unsigned StructuredIndex,
Yunzhong Gaocb779302015-06-10 00:27:52 +0000362 SourceRange InitRange,
363 bool IsFullyOverwritten = false);
Douglas Gregorcde232f2009-01-29 01:05:33 +0000364 void UpdateStructuredListElement(InitListExpr *StructuredList,
365 unsigned &StructuredIndex,
Douglas Gregor85df8d82009-01-29 00:45:39 +0000366 Expr *expr);
Richard Smithcd839cc2019-08-29 22:49:34 +0000367 InitListExpr *createInitListExpr(QualType CurrentObjectType,
368 SourceRange InitRange,
369 unsigned ExpectedNumInits);
Douglas Gregor85df8d82009-01-29 00:45:39 +0000370 int numArrayElements(QualType DeclType);
371 int numStructUnionElements(QualType DeclType);
Douglas Gregord14247a2009-01-30 22:09:00 +0000372
Richard Smithcd839cc2019-08-29 22:49:34 +0000373 ExprResult PerformEmptyInit(SourceLocation Loc,
374 const InitializedEntity &Entity);
Yunzhong Gaocb779302015-06-10 00:27:52 +0000375
Richard Smith50309282019-08-30 22:52:55 +0000376 /// Diagnose that OldInit (or part thereof) has been overridden by NewInit.
377 void diagnoseInitOverride(Expr *OldInit, SourceRange NewInitRange,
378 bool FullyOverwritten = true) {
379 // Overriding an initializer via a designator is valid with C99 designated
380 // initializers, but ill-formed with C++20 designated initializers.
381 unsigned DiagID = SemaRef.getLangOpts().CPlusPlus
382 ? diag::ext_initializer_overrides
383 : diag::warn_initializer_overrides;
384
385 if (InOverloadResolution && SemaRef.getLangOpts().CPlusPlus) {
386 // In overload resolution, we have to strictly enforce the rules, and so
387 // don't allow any overriding of prior initializers. This matters for a
388 // case such as:
389 //
390 // union U { int a, b; };
391 // struct S { int a, b; };
392 // void f(U), f(S);
393 //
394 // Here, f({.a = 1, .b = 2}) is required to call the struct overload. For
395 // consistency, we disallow all overriding of prior initializers in
396 // overload resolution, not only overriding of union members.
397 hadError = true;
398 } else if (OldInit->getType().isDestructedType() && !FullyOverwritten) {
399 // If we'll be keeping around the old initializer but overwriting part of
400 // the object it initialized, and that object is not trivially
401 // destructible, this can leak. Don't allow that, not even as an
402 // extension.
403 //
404 // FIXME: It might be reasonable to allow this in cases where the part of
405 // the initializer that we're overriding has trivial destruction.
406 DiagID = diag::err_initializer_overrides_destructed;
407 } else if (!OldInit->getSourceRange().isValid()) {
408 // We need to check on source range validity because the previous
409 // initializer does not have to be an explicit initializer. e.g.,
410 //
411 // struct P { int a, b; };
412 // struct PP { struct P p } l = { { .a = 2 }, .p.b = 3 };
413 //
414 // There is an overwrite taking place because the first braced initializer
415 // list "{ .a = 2 }" already provides value for .p.b (which is zero).
416 //
417 // Such overwrites are harmless, so we don't diagnose them. (Note that in
418 // C++, this cannot be reached unless we've already seen and diagnosed a
419 // different conformance issue, such as a mixture of designated and
420 // non-designated initializers or a multi-level designator.)
421 return;
422 }
423
424 if (!VerifyOnly) {
425 SemaRef.Diag(NewInitRange.getBegin(), DiagID)
426 << NewInitRange << FullyOverwritten << OldInit->getType();
427 SemaRef.Diag(OldInit->getBeginLoc(), diag::note_previous_initializer)
428 << (OldInit->HasSideEffects(SemaRef.Context) && FullyOverwritten)
429 << OldInit->getSourceRange();
430 }
431 }
432
Yunzhong Gaocb779302015-06-10 00:27:52 +0000433 // Explanation on the "FillWithNoInit" mode:
434 //
435 // Assume we have the following definitions (Case#1):
436 // struct P { char x[6][6]; } xp = { .x[1] = "bar" };
437 // struct PP { struct P lp; } l = { .lp = xp, .lp.x[1][2] = 'f' };
438 //
439 // l.lp.x[1][0..1] should not be filled with implicit initializers because the
440 // "base" initializer "xp" will provide values for them; l.lp.x[1] will be "baf".
441 //
442 // But if we have (Case#2):
443 // struct PP l = { .lp = xp, .lp.x[1] = { [2] = 'f' } };
444 //
445 // l.lp.x[1][0..1] are implicitly initialized and do not use values from the
446 // "base" initializer; l.lp.x[1] will be "\0\0f\0\0\0".
447 //
448 // To distinguish Case#1 from Case#2, and also to avoid leaving many "holes"
449 // in the InitListExpr, the "holes" in Case#1 are filled not with empty
450 // initializers but with special "NoInitExpr" place holders, which tells the
451 // CodeGen not to generate any initializers for these parts.
Richard Smith872307e2016-03-08 22:17:41 +0000452 void FillInEmptyInitForBase(unsigned Init, const CXXBaseSpecifier &Base,
453 const InitializedEntity &ParentEntity,
454 InitListExpr *ILE, bool &RequiresSecondPass,
455 bool FillWithNoInit);
Richard Smith454a7cd2014-06-03 08:26:00 +0000456 void FillInEmptyInitForField(unsigned Init, FieldDecl *Field,
Douglas Gregor2bb07652009-12-22 00:05:34 +0000457 const InitializedEntity &ParentEntity,
Yunzhong Gaocb779302015-06-10 00:27:52 +0000458 InitListExpr *ILE, bool &RequiresSecondPass,
459 bool FillWithNoInit = false);
Richard Smith454a7cd2014-06-03 08:26:00 +0000460 void FillInEmptyInitializations(const InitializedEntity &Entity,
Yunzhong Gaocb779302015-06-10 00:27:52 +0000461 InitListExpr *ILE, bool &RequiresSecondPass,
Richard Smithf3b4ca82018-02-07 22:25:16 +0000462 InitListExpr *OuterILE, unsigned OuterIndex,
Yunzhong Gaocb779302015-06-10 00:27:52 +0000463 bool FillWithNoInit = false);
Eli Friedman3fa64df2011-08-23 22:24:57 +0000464 bool CheckFlexibleArrayInit(const InitializedEntity &Entity,
465 Expr *InitExpr, FieldDecl *Field,
466 bool TopLevelObject);
Richard Smith454a7cd2014-06-03 08:26:00 +0000467 void CheckEmptyInitializable(const InitializedEntity &Entity,
468 SourceLocation Loc);
Sebastian Redl2b47b7a2011-10-16 18:19:20 +0000469
Douglas Gregor85df8d82009-01-29 00:45:39 +0000470public:
Richard Smith50309282019-08-30 22:52:55 +0000471 InitListChecker(Sema &S, const InitializedEntity &Entity, InitListExpr *IL,
472 QualType &T, bool VerifyOnly, bool TreatUnavailableAsInvalid,
473 bool InOverloadResolution = false);
Douglas Gregor85df8d82009-01-29 00:45:39 +0000474 bool HadError() { return hadError; }
475
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000476 // Retrieves the fully-structured initializer list used for
Douglas Gregor85df8d82009-01-29 00:45:39 +0000477 // semantic analysis and code generation.
478 InitListExpr *getFullyStructuredList() const { return FullyStructuredList; }
479};
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000480
Chris Lattner9ececce2009-02-24 22:48:58 +0000481} // end anonymous namespace
Chris Lattnerd9ae05b2009-01-29 05:10:57 +0000482
Richard Smithcd839cc2019-08-29 22:49:34 +0000483ExprResult InitListChecker::PerformEmptyInit(SourceLocation Loc,
484 const InitializedEntity &Entity) {
Sebastian Redl2b47b7a2011-10-16 18:19:20 +0000485 InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc,
486 true);
Richard Smith454a7cd2014-06-03 08:26:00 +0000487 MultiExprArg SubInit;
488 Expr *InitExpr;
489 InitListExpr DummyInitList(SemaRef.Context, Loc, None, Loc);
490
491 // C++ [dcl.init.aggr]p7:
492 // If there are fewer initializer-clauses in the list than there are
493 // members in the aggregate, then each member not explicitly initialized
494 // ...
Nico Weberbcb70ee2014-07-02 23:51:09 +0000495 bool EmptyInitList = SemaRef.getLangOpts().CPlusPlus11 &&
496 Entity.getType()->getBaseElementTypeUnsafe()->isRecordType();
497 if (EmptyInitList) {
Richard Smith454a7cd2014-06-03 08:26:00 +0000498 // C++1y / DR1070:
499 // shall be initialized [...] from an empty initializer list.
500 //
501 // We apply the resolution of this DR to C++11 but not C++98, since C++98
502 // does not have useful semantics for initialization from an init list.
503 // We treat this as copy-initialization, because aggregate initialization
504 // always performs copy-initialization on its elements.
505 //
506 // Only do this if we're initializing a class type, to avoid filling in
507 // the initializer list where possible.
508 InitExpr = VerifyOnly ? &DummyInitList : new (SemaRef.Context)
509 InitListExpr(SemaRef.Context, Loc, None, Loc);
510 InitExpr->setType(SemaRef.Context.VoidTy);
511 SubInit = InitExpr;
512 Kind = InitializationKind::CreateCopy(Loc, Loc);
513 } else {
514 // C++03:
515 // shall be value-initialized.
516 }
517
518 InitializationSequence InitSeq(SemaRef, Entity, Kind, SubInit);
Nico Weberbcb70ee2014-07-02 23:51:09 +0000519 // libstdc++4.6 marks the vector default constructor as explicit in
520 // _GLIBCXX_DEBUG mode, so recover using the C++03 logic in that case.
521 // stlport does so too. Look for std::__debug for libstdc++, and for
522 // std:: for stlport. This is effectively a compiler-side implementation of
523 // LWG2193.
524 if (!InitSeq && EmptyInitList && InitSeq.getFailureKind() ==
525 InitializationSequence::FK_ExplicitConstructor) {
526 OverloadCandidateSet::iterator Best;
527 OverloadingResult O =
528 InitSeq.getFailedCandidateSet()
529 .BestViableFunction(SemaRef, Kind.getLocation(), Best);
530 (void)O;
531 assert(O == OR_Success && "Inconsistent overload resolution");
532 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
533 CXXRecordDecl *R = CtorDecl->getParent();
534
535 if (CtorDecl->getMinRequiredArguments() == 0 &&
536 CtorDecl->isExplicit() && R->getDeclName() &&
537 SemaRef.SourceMgr.isInSystemHeader(CtorDecl->getLocation())) {
Nico Weberbcb70ee2014-07-02 23:51:09 +0000538 bool IsInStd = false;
539 for (NamespaceDecl *ND = dyn_cast<NamespaceDecl>(R->getDeclContext());
Nico Weber5752ad02014-07-03 00:38:25 +0000540 ND && !IsInStd; ND = dyn_cast<NamespaceDecl>(ND->getParent())) {
Nico Weberbcb70ee2014-07-02 23:51:09 +0000541 if (SemaRef.getStdNamespace()->InEnclosingNamespaceSetOf(ND))
542 IsInStd = true;
543 }
544
Fangrui Song6907ce22018-07-30 19:24:48 +0000545 if (IsInStd && llvm::StringSwitch<bool>(R->getName())
Nico Weberbcb70ee2014-07-02 23:51:09 +0000546 .Cases("basic_string", "deque", "forward_list", true)
547 .Cases("list", "map", "multimap", "multiset", true)
548 .Cases("priority_queue", "queue", "set", "stack", true)
549 .Cases("unordered_map", "unordered_set", "vector", true)
550 .Default(false)) {
551 InitSeq.InitializeFrom(
552 SemaRef, Entity,
553 InitializationKind::CreateValue(Loc, Loc, Loc, true),
Manman Ren073db022016-03-10 18:53:19 +0000554 MultiExprArg(), /*TopLevelOfInitList=*/false,
555 TreatUnavailableAsInvalid);
Nico Weberbcb70ee2014-07-02 23:51:09 +0000556 // Emit a warning for this. System header warnings aren't shown
557 // by default, but people working on system headers should see it.
558 if (!VerifyOnly) {
559 SemaRef.Diag(CtorDecl->getLocation(),
560 diag::warn_invalid_initializer_from_system_header);
David Majnemer9588a952015-08-21 06:44:10 +0000561 if (Entity.getKind() == InitializedEntity::EK_Member)
562 SemaRef.Diag(Entity.getDecl()->getLocation(),
563 diag::note_used_in_initialization_here);
564 else if (Entity.getKind() == InitializedEntity::EK_ArrayElement)
565 SemaRef.Diag(Loc, diag::note_used_in_initialization_here);
Nico Weberbcb70ee2014-07-02 23:51:09 +0000566 }
567 }
568 }
569 }
Richard Smith454a7cd2014-06-03 08:26:00 +0000570 if (!InitSeq) {
571 if (!VerifyOnly) {
572 InitSeq.Diagnose(SemaRef, Entity, Kind, SubInit);
573 if (Entity.getKind() == InitializedEntity::EK_Member)
574 SemaRef.Diag(Entity.getDecl()->getLocation(),
575 diag::note_in_omitted_aggregate_initializer)
576 << /*field*/1 << Entity.getDecl();
Richard Smith0511d232016-10-05 22:41:02 +0000577 else if (Entity.getKind() == InitializedEntity::EK_ArrayElement) {
578 bool IsTrailingArrayNewMember =
579 Entity.getParent() &&
580 Entity.getParent()->isVariableLengthArrayNew();
Richard Smith454a7cd2014-06-03 08:26:00 +0000581 SemaRef.Diag(Loc, diag::note_in_omitted_aggregate_initializer)
Richard Smith0511d232016-10-05 22:41:02 +0000582 << (IsTrailingArrayNewMember ? 2 : /*array element*/0)
583 << Entity.getElementIndex();
584 }
Richard Smith454a7cd2014-06-03 08:26:00 +0000585 }
Richard Smithcd839cc2019-08-29 22:49:34 +0000586 hadError = true;
Richard Smith454a7cd2014-06-03 08:26:00 +0000587 return ExprError();
588 }
589
Richard Smithcd839cc2019-08-29 22:49:34 +0000590 return VerifyOnly ? ExprResult()
Richard Smith454a7cd2014-06-03 08:26:00 +0000591 : InitSeq.Perform(SemaRef, Entity, Kind, SubInit);
592}
593
594void InitListChecker::CheckEmptyInitializable(const InitializedEntity &Entity,
595 SourceLocation Loc) {
Richard Smithcd839cc2019-08-29 22:49:34 +0000596 // If we're building a fully-structured list, we'll check this at the end
597 // once we know which elements are actually initialized. Otherwise, we know
598 // that there are no designators so we can just check now.
599 if (FullyStructuredList)
600 return;
601 PerformEmptyInit(Loc, Entity);
Sebastian Redl2b47b7a2011-10-16 18:19:20 +0000602}
603
Richard Smith872307e2016-03-08 22:17:41 +0000604void InitListChecker::FillInEmptyInitForBase(
605 unsigned Init, const CXXBaseSpecifier &Base,
606 const InitializedEntity &ParentEntity, InitListExpr *ILE,
607 bool &RequiresSecondPass, bool FillWithNoInit) {
Richard Smith872307e2016-03-08 22:17:41 +0000608 InitializedEntity BaseEntity = InitializedEntity::InitializeBase(
609 SemaRef.Context, &Base, false, &ParentEntity);
610
Richard Smithcd839cc2019-08-29 22:49:34 +0000611 if (Init >= ILE->getNumInits() || !ILE->getInit(Init)) {
612 ExprResult BaseInit = FillWithNoInit
613 ? new (SemaRef.Context) NoInitExpr(Base.getType())
614 : PerformEmptyInit(ILE->getEndLoc(), BaseEntity);
Richard Smith872307e2016-03-08 22:17:41 +0000615 if (BaseInit.isInvalid()) {
616 hadError = true;
617 return;
618 }
619
Richard Smithcd839cc2019-08-29 22:49:34 +0000620 if (!VerifyOnly) {
621 assert(Init < ILE->getNumInits() && "should have been expanded");
622 ILE->setInit(Init, BaseInit.getAs<Expr>());
623 }
Richard Smith872307e2016-03-08 22:17:41 +0000624 } else if (InitListExpr *InnerILE =
625 dyn_cast<InitListExpr>(ILE->getInit(Init))) {
Richard Smithf3b4ca82018-02-07 22:25:16 +0000626 FillInEmptyInitializations(BaseEntity, InnerILE, RequiresSecondPass,
627 ILE, Init, FillWithNoInit);
Richard Smith872307e2016-03-08 22:17:41 +0000628 } else if (DesignatedInitUpdateExpr *InnerDIUE =
629 dyn_cast<DesignatedInitUpdateExpr>(ILE->getInit(Init))) {
630 FillInEmptyInitializations(BaseEntity, InnerDIUE->getUpdater(),
Richard Smithf3b4ca82018-02-07 22:25:16 +0000631 RequiresSecondPass, ILE, Init,
632 /*FillWithNoInit =*/true);
Richard Smith872307e2016-03-08 22:17:41 +0000633 }
634}
635
Richard Smith454a7cd2014-06-03 08:26:00 +0000636void InitListChecker::FillInEmptyInitForField(unsigned Init, FieldDecl *Field,
Douglas Gregor2bb07652009-12-22 00:05:34 +0000637 const InitializedEntity &ParentEntity,
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +0000638 InitListExpr *ILE,
Yunzhong Gaocb779302015-06-10 00:27:52 +0000639 bool &RequiresSecondPass,
640 bool FillWithNoInit) {
Stephen Kelly1c301dc2018-08-09 21:09:38 +0000641 SourceLocation Loc = ILE->getEndLoc();
Douglas Gregor2bb07652009-12-22 00:05:34 +0000642 unsigned NumInits = ILE->getNumInits();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +0000643 InitializedEntity MemberEntity
Douglas Gregor2bb07652009-12-22 00:05:34 +0000644 = InitializedEntity::InitializeMember(Field, &ParentEntity);
Yunzhong Gaocb779302015-06-10 00:27:52 +0000645
Douglas Gregor2bb07652009-12-22 00:05:34 +0000646 if (Init >= NumInits || !ILE->getInit(Init)) {
Richard Smithcd839cc2019-08-29 22:49:34 +0000647 if (const RecordType *RType = ILE->getType()->getAs<RecordType>())
648 if (!RType->getDecl()->isUnion())
649 assert((Init < NumInits || VerifyOnly) &&
650 "This ILE should have been expanded");
651
Yunzhong Gaocb779302015-06-10 00:27:52 +0000652 if (FillWithNoInit) {
Richard Smithcd839cc2019-08-29 22:49:34 +0000653 assert(!VerifyOnly && "should not fill with no-init in verify-only mode");
Yunzhong Gaocb779302015-06-10 00:27:52 +0000654 Expr *Filler = new (SemaRef.Context) NoInitExpr(Field->getType());
655 if (Init < NumInits)
656 ILE->setInit(Init, Filler);
657 else
658 ILE->updateInit(SemaRef.Context, Init, Filler);
659 return;
660 }
Richard Smith454a7cd2014-06-03 08:26:00 +0000661 // C++1y [dcl.init.aggr]p7:
662 // If there are fewer initializer-clauses in the list than there are
663 // members in the aggregate, then each member not explicitly initialized
664 // shall be initialized from its brace-or-equal-initializer [...]
Richard Smith852c9db2013-04-20 22:23:05 +0000665 if (Field->hasInClassInitializer()) {
Richard Smithcd839cc2019-08-29 22:49:34 +0000666 if (VerifyOnly)
667 return;
668
Reid Klecknerd60b82f2014-11-17 23:36:45 +0000669 ExprResult DIE = SemaRef.BuildCXXDefaultInitExpr(Loc, Field);
670 if (DIE.isInvalid()) {
671 hadError = true;
672 return;
673 }
Richard Smithd87aab92018-07-17 22:24:09 +0000674 SemaRef.checkInitializerLifetime(MemberEntity, DIE.get());
Richard Smith852c9db2013-04-20 22:23:05 +0000675 if (Init < NumInits)
Reid Klecknerd60b82f2014-11-17 23:36:45 +0000676 ILE->setInit(Init, DIE.get());
Richard Smith852c9db2013-04-20 22:23:05 +0000677 else {
Reid Klecknerd60b82f2014-11-17 23:36:45 +0000678 ILE->updateInit(SemaRef.Context, Init, DIE.get());
Richard Smith852c9db2013-04-20 22:23:05 +0000679 RequiresSecondPass = true;
680 }
681 return;
682 }
683
Douglas Gregor2bb07652009-12-22 00:05:34 +0000684 if (Field->getType()->isReferenceType()) {
Richard Smithcd839cc2019-08-29 22:49:34 +0000685 if (!VerifyOnly) {
686 // C++ [dcl.init.aggr]p9:
687 // If an incomplete or empty initializer-list leaves a
688 // member of reference type uninitialized, the program is
689 // ill-formed.
690 SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized)
691 << Field->getType()
692 << ILE->getSyntacticForm()->getSourceRange();
693 SemaRef.Diag(Field->getLocation(),
694 diag::note_uninit_reference_member);
695 }
Douglas Gregor2bb07652009-12-22 00:05:34 +0000696 hadError = true;
697 return;
698 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +0000699
Richard Smithcd839cc2019-08-29 22:49:34 +0000700 ExprResult MemberInit = PerformEmptyInit(Loc, MemberEntity);
Douglas Gregor2bb07652009-12-22 00:05:34 +0000701 if (MemberInit.isInvalid()) {
702 hadError = true;
703 return;
704 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +0000705
Richard Smithcd839cc2019-08-29 22:49:34 +0000706 if (hadError || VerifyOnly) {
Douglas Gregor2bb07652009-12-22 00:05:34 +0000707 // Do nothing
708 } else if (Init < NumInits) {
Nikola Smiljanic01a75982014-05-29 10:55:11 +0000709 ILE->setInit(Init, MemberInit.getAs<Expr>());
Richard Smith454a7cd2014-06-03 08:26:00 +0000710 } else if (!isa<ImplicitValueInitExpr>(MemberInit.get())) {
711 // Empty initialization requires a constructor call, so
Douglas Gregor2bb07652009-12-22 00:05:34 +0000712 // extend the initializer list to include the constructor
713 // call and make a note that we'll need to take another pass
714 // through the initializer list.
Nikola Smiljanic01a75982014-05-29 10:55:11 +0000715 ILE->updateInit(SemaRef.Context, Init, MemberInit.getAs<Expr>());
Douglas Gregor2bb07652009-12-22 00:05:34 +0000716 RequiresSecondPass = true;
717 }
718 } else if (InitListExpr *InnerILE
Richard Smithcd839cc2019-08-29 22:49:34 +0000719 = dyn_cast<InitListExpr>(ILE->getInit(Init))) {
Richard Smith454a7cd2014-06-03 08:26:00 +0000720 FillInEmptyInitializations(MemberEntity, InnerILE,
Richard Smithf3b4ca82018-02-07 22:25:16 +0000721 RequiresSecondPass, ILE, Init, FillWithNoInit);
Richard Smithcd839cc2019-08-29 22:49:34 +0000722 } else if (DesignatedInitUpdateExpr *InnerDIUE =
723 dyn_cast<DesignatedInitUpdateExpr>(ILE->getInit(Init))) {
Yunzhong Gaocb779302015-06-10 00:27:52 +0000724 FillInEmptyInitializations(MemberEntity, InnerDIUE->getUpdater(),
Richard Smithf3b4ca82018-02-07 22:25:16 +0000725 RequiresSecondPass, ILE, Init,
726 /*FillWithNoInit =*/true);
Richard Smithcd839cc2019-08-29 22:49:34 +0000727 }
Douglas Gregor2bb07652009-12-22 00:05:34 +0000728}
729
Douglas Gregor347f7ea2009-01-28 21:54:33 +0000730/// Recursively replaces NULL values within the given initializer list
731/// with expressions that perform value-initialization of the
Richard Smithf3b4ca82018-02-07 22:25:16 +0000732/// appropriate type, and finish off the InitListExpr formation.
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +0000733void
Richard Smith454a7cd2014-06-03 08:26:00 +0000734InitListChecker::FillInEmptyInitializations(const InitializedEntity &Entity,
Douglas Gregor723796a2009-12-16 06:35:08 +0000735 InitListExpr *ILE,
Yunzhong Gaocb779302015-06-10 00:27:52 +0000736 bool &RequiresSecondPass,
Richard Smithf3b4ca82018-02-07 22:25:16 +0000737 InitListExpr *OuterILE,
738 unsigned OuterIndex,
Yunzhong Gaocb779302015-06-10 00:27:52 +0000739 bool FillWithNoInit) {
Mike Stump11289f42009-09-09 15:08:12 +0000740 assert((ILE->getType() != SemaRef.Context.VoidTy) &&
Douglas Gregord14247a2009-01-30 22:09:00 +0000741 "Should not have void type");
Mike Stump11289f42009-09-09 15:08:12 +0000742
Richard Smithcd839cc2019-08-29 22:49:34 +0000743 // We don't need to do any checks when just filling NoInitExprs; that can't
744 // fail.
745 if (FillWithNoInit && VerifyOnly)
746 return;
747
Richard Smithf3b4ca82018-02-07 22:25:16 +0000748 // If this is a nested initializer list, we might have changed its contents
749 // (and therefore some of its properties, such as instantiation-dependence)
750 // while filling it in. Inform the outer initializer list so that its state
751 // can be updated to match.
752 // FIXME: We should fully build the inner initializers before constructing
753 // the outer InitListExpr instead of mutating AST nodes after they have
754 // been used as subexpressions of other nodes.
755 struct UpdateOuterILEWithUpdatedInit {
756 InitListExpr *Outer;
757 unsigned OuterIndex;
758 ~UpdateOuterILEWithUpdatedInit() {
759 if (Outer)
760 Outer->setInit(OuterIndex, Outer->getInit(OuterIndex));
761 }
762 } UpdateOuterRAII = {OuterILE, OuterIndex};
763
Richard Smith382bc512017-02-23 22:41:47 +0000764 // A transparent ILE is not performing aggregate initialization and should
765 // not be filled in.
766 if (ILE->isTransparent())
767 return;
768
Ted Kremenekc23c7e62009-07-29 21:53:49 +0000769 if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) {
Richard Smith852c9db2013-04-20 22:23:05 +0000770 const RecordDecl *RDecl = RType->getDecl();
771 if (RDecl->isUnion() && ILE->getInitializedFieldInUnion())
Richard Smith454a7cd2014-06-03 08:26:00 +0000772 FillInEmptyInitForField(0, ILE->getInitializedFieldInUnion(),
Yunzhong Gaocb779302015-06-10 00:27:52 +0000773 Entity, ILE, RequiresSecondPass, FillWithNoInit);
Richard Smith852c9db2013-04-20 22:23:05 +0000774 else if (RDecl->isUnion() && isa<CXXRecordDecl>(RDecl) &&
775 cast<CXXRecordDecl>(RDecl)->hasInClassInitializer()) {
Aaron Ballmane8a8bae2014-03-08 20:12:42 +0000776 for (auto *Field : RDecl->fields()) {
Richard Smith852c9db2013-04-20 22:23:05 +0000777 if (Field->hasInClassInitializer()) {
Yunzhong Gaocb779302015-06-10 00:27:52 +0000778 FillInEmptyInitForField(0, Field, Entity, ILE, RequiresSecondPass,
779 FillWithNoInit);
Richard Smith852c9db2013-04-20 22:23:05 +0000780 break;
781 }
782 }
783 } else {
Yunzhong Gaocb779302015-06-10 00:27:52 +0000784 // The fields beyond ILE->getNumInits() are default initialized, so in
785 // order to leave them uninitialized, the ILE is expanded and the extra
786 // fields are then filled with NoInitExpr.
Richard Smith872307e2016-03-08 22:17:41 +0000787 unsigned NumElems = numStructUnionElements(ILE->getType());
788 if (RDecl->hasFlexibleArrayMember())
789 ++NumElems;
Richard Smithcd839cc2019-08-29 22:49:34 +0000790 if (!VerifyOnly && ILE->getNumInits() < NumElems)
Richard Smith872307e2016-03-08 22:17:41 +0000791 ILE->resizeInits(SemaRef.Context, NumElems);
Yunzhong Gaocb779302015-06-10 00:27:52 +0000792
Douglas Gregor2bb07652009-12-22 00:05:34 +0000793 unsigned Init = 0;
Richard Smith872307e2016-03-08 22:17:41 +0000794
795 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RDecl)) {
796 for (auto &Base : CXXRD->bases()) {
797 if (hadError)
798 return;
799
800 FillInEmptyInitForBase(Init, Base, Entity, ILE, RequiresSecondPass,
801 FillWithNoInit);
802 ++Init;
803 }
804 }
805
Aaron Ballmane8a8bae2014-03-08 20:12:42 +0000806 for (auto *Field : RDecl->fields()) {
Douglas Gregor2bb07652009-12-22 00:05:34 +0000807 if (Field->isUnnamedBitfield())
808 continue;
Douglas Gregor347f7ea2009-01-28 21:54:33 +0000809
Douglas Gregor2bb07652009-12-22 00:05:34 +0000810 if (hadError)
Douglas Gregora5c9e1a2009-02-02 17:43:21 +0000811 return;
Douglas Gregor2bb07652009-12-22 00:05:34 +0000812
Yunzhong Gaocb779302015-06-10 00:27:52 +0000813 FillInEmptyInitForField(Init, Field, Entity, ILE, RequiresSecondPass,
814 FillWithNoInit);
Douglas Gregor2bb07652009-12-22 00:05:34 +0000815 if (hadError)
Douglas Gregora5c9e1a2009-02-02 17:43:21 +0000816 return;
Douglas Gregora5c9e1a2009-02-02 17:43:21 +0000817
Douglas Gregor2bb07652009-12-22 00:05:34 +0000818 ++Init;
Douglas Gregor723796a2009-12-16 06:35:08 +0000819
Douglas Gregor2bb07652009-12-22 00:05:34 +0000820 // Only look at the first initialization of a union.
Richard Smith852c9db2013-04-20 22:23:05 +0000821 if (RDecl->isUnion())
Douglas Gregor2bb07652009-12-22 00:05:34 +0000822 break;
823 }
Douglas Gregor347f7ea2009-01-28 21:54:33 +0000824 }
825
826 return;
Mike Stump11289f42009-09-09 15:08:12 +0000827 }
Douglas Gregor347f7ea2009-01-28 21:54:33 +0000828
829 QualType ElementType;
Mike Stump11289f42009-09-09 15:08:12 +0000830
Douglas Gregor723796a2009-12-16 06:35:08 +0000831 InitializedEntity ElementEntity = Entity;
Douglas Gregora5c9e1a2009-02-02 17:43:21 +0000832 unsigned NumInits = ILE->getNumInits();
833 unsigned NumElements = NumInits;
Chris Lattnerb0912a52009-02-24 22:50:46 +0000834 if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) {
Douglas Gregor347f7ea2009-01-28 21:54:33 +0000835 ElementType = AType->getElementType();
Richard Smith0511d232016-10-05 22:41:02 +0000836 if (const auto *CAType = dyn_cast<ConstantArrayType>(AType))
Douglas Gregora5c9e1a2009-02-02 17:43:21 +0000837 NumElements = CAType->getSize().getZExtValue();
Richard Smith0511d232016-10-05 22:41:02 +0000838 // For an array new with an unknown bound, ask for one additional element
839 // in order to populate the array filler.
840 if (Entity.isVariableLengthArrayNew())
841 ++NumElements;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +0000842 ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context,
Douglas Gregor723796a2009-12-16 06:35:08 +0000843 0, Entity);
John McCall9dd450b2009-09-21 23:43:11 +0000844 } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) {
Douglas Gregor347f7ea2009-01-28 21:54:33 +0000845 ElementType = VType->getElementType();
Douglas Gregora5c9e1a2009-02-02 17:43:21 +0000846 NumElements = VType->getNumElements();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +0000847 ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context,
Douglas Gregor723796a2009-12-16 06:35:08 +0000848 0, Entity);
Mike Stump11289f42009-09-09 15:08:12 +0000849 } else
Douglas Gregor347f7ea2009-01-28 21:54:33 +0000850 ElementType = ILE->getType();
Mike Stump11289f42009-09-09 15:08:12 +0000851
Richard Smithcd839cc2019-08-29 22:49:34 +0000852 bool SkipEmptyInitChecks = false;
Douglas Gregora5c9e1a2009-02-02 17:43:21 +0000853 for (unsigned Init = 0; Init != NumElements; ++Init) {
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000854 if (hadError)
855 return;
856
Anders Carlssoned8d80d2010-01-23 04:34:47 +0000857 if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement ||
858 ElementEntity.getKind() == InitializedEntity::EK_VectorElement)
Douglas Gregor723796a2009-12-16 06:35:08 +0000859 ElementEntity.setElementIndex(Init);
860
Richard Smithcd839cc2019-08-29 22:49:34 +0000861 if (Init >= NumInits && (ILE->hasArrayFiller() || SkipEmptyInitChecks))
Richard Smith3e268632018-05-23 23:41:38 +0000862 return;
863
Craig Topperc3ec1492014-05-26 06:22:03 +0000864 Expr *InitExpr = (Init < NumInits ? ILE->getInit(Init) : nullptr);
Yunzhong Gaocb779302015-06-10 00:27:52 +0000865 if (!InitExpr && Init < NumInits && ILE->hasArrayFiller())
866 ILE->setInit(Init, ILE->getArrayFiller());
867 else if (!InitExpr && !ILE->hasArrayFiller()) {
Richard Smithcd839cc2019-08-29 22:49:34 +0000868 // In VerifyOnly mode, there's no point performing empty initialization
869 // more than once.
870 if (SkipEmptyInitChecks)
871 continue;
872
Yunzhong Gaocb779302015-06-10 00:27:52 +0000873 Expr *Filler = nullptr;
874
875 if (FillWithNoInit)
876 Filler = new (SemaRef.Context) NoInitExpr(ElementType);
877 else {
Stephen Kelly1c301dc2018-08-09 21:09:38 +0000878 ExprResult ElementInit =
Richard Smithcd839cc2019-08-29 22:49:34 +0000879 PerformEmptyInit(ILE->getEndLoc(), ElementEntity);
Yunzhong Gaocb779302015-06-10 00:27:52 +0000880 if (ElementInit.isInvalid()) {
881 hadError = true;
882 return;
883 }
884
885 Filler = ElementInit.getAs<Expr>();
Douglas Gregor723796a2009-12-16 06:35:08 +0000886 }
887
888 if (hadError) {
889 // Do nothing
Richard Smithcd839cc2019-08-29 22:49:34 +0000890 } else if (VerifyOnly) {
891 SkipEmptyInitChecks = true;
Douglas Gregor723796a2009-12-16 06:35:08 +0000892 } else if (Init < NumInits) {
Argyrios Kyrtzidis446bcf22011-04-21 20:03:38 +0000893 // For arrays, just set the expression used for value-initialization
894 // of the "holes" in the array.
895 if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement)
Yunzhong Gaocb779302015-06-10 00:27:52 +0000896 ILE->setArrayFiller(Filler);
Argyrios Kyrtzidis446bcf22011-04-21 20:03:38 +0000897 else
Yunzhong Gaocb779302015-06-10 00:27:52 +0000898 ILE->setInit(Init, Filler);
Argyrios Kyrtzidisb2ed28e2011-04-21 00:27:41 +0000899 } else {
900 // For arrays, just set the expression used for value-initialization
901 // of the rest of elements and exit.
902 if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) {
Yunzhong Gaocb779302015-06-10 00:27:52 +0000903 ILE->setArrayFiller(Filler);
Argyrios Kyrtzidisb2ed28e2011-04-21 00:27:41 +0000904 return;
905 }
906
Yunzhong Gaocb779302015-06-10 00:27:52 +0000907 if (!isa<ImplicitValueInitExpr>(Filler) && !isa<NoInitExpr>(Filler)) {
Richard Smith454a7cd2014-06-03 08:26:00 +0000908 // Empty initialization requires a constructor call, so
Argyrios Kyrtzidisb2ed28e2011-04-21 00:27:41 +0000909 // extend the initializer list to include the constructor
910 // call and make a note that we'll need to take another pass
911 // through the initializer list.
Yunzhong Gaocb779302015-06-10 00:27:52 +0000912 ILE->updateInit(SemaRef.Context, Init, Filler);
Argyrios Kyrtzidisb2ed28e2011-04-21 00:27:41 +0000913 RequiresSecondPass = true;
914 }
Douglas Gregor723796a2009-12-16 06:35:08 +0000915 }
Mike Stump12b8ce12009-08-04 21:02:39 +0000916 } else if (InitListExpr *InnerILE
Richard Smithcd839cc2019-08-29 22:49:34 +0000917 = dyn_cast_or_null<InitListExpr>(InitExpr)) {
Yunzhong Gaocb779302015-06-10 00:27:52 +0000918 FillInEmptyInitializations(ElementEntity, InnerILE, RequiresSecondPass,
Richard Smithf3b4ca82018-02-07 22:25:16 +0000919 ILE, Init, FillWithNoInit);
Richard Smithcd839cc2019-08-29 22:49:34 +0000920 } else if (DesignatedInitUpdateExpr *InnerDIUE =
921 dyn_cast_or_null<DesignatedInitUpdateExpr>(InitExpr)) {
Yunzhong Gaocb779302015-06-10 00:27:52 +0000922 FillInEmptyInitializations(ElementEntity, InnerDIUE->getUpdater(),
Richard Smithf3b4ca82018-02-07 22:25:16 +0000923 RequiresSecondPass, ILE, Init,
924 /*FillWithNoInit =*/true);
Richard Smithcd839cc2019-08-29 22:49:34 +0000925 }
Douglas Gregor347f7ea2009-01-28 21:54:33 +0000926 }
927}
928
Richard Smithcd839cc2019-08-29 22:49:34 +0000929static bool hasAnyDesignatedInits(const InitListExpr *IL) {
930 for (const Stmt *Init : *IL)
931 if (Init && isa<DesignatedInitExpr>(Init))
932 return true;
933 return false;
934}
935
Douglas Gregor723796a2009-12-16 06:35:08 +0000936InitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity,
Richard Smith33e9be62019-08-29 22:49:33 +0000937 InitListExpr *IL, QualType &T, bool VerifyOnly,
Richard Smith50309282019-08-30 22:52:55 +0000938 bool TreatUnavailableAsInvalid,
939 bool InOverloadResolution)
Richard Smithcd839cc2019-08-29 22:49:34 +0000940 : SemaRef(S), VerifyOnly(VerifyOnly),
Richard Smith50309282019-08-30 22:52:55 +0000941 TreatUnavailableAsInvalid(TreatUnavailableAsInvalid),
942 InOverloadResolution(InOverloadResolution) {
Richard Smithcd839cc2019-08-29 22:49:34 +0000943 if (!VerifyOnly || hasAnyDesignatedInits(IL)) {
Richard Smith33e9be62019-08-29 22:49:33 +0000944 FullyStructuredList =
Richard Smithcd839cc2019-08-29 22:49:34 +0000945 createInitListExpr(T, IL->getSourceRange(), IL->getNumInits());
946
947 // FIXME: Check that IL isn't already the semantic form of some other
948 // InitListExpr. If it is, we'd create a broken AST.
949 if (!VerifyOnly)
950 FullyStructuredList->setSyntacticForm(IL);
Richard Smith33e9be62019-08-29 22:49:33 +0000951 }
Richard Smithcd839cc2019-08-29 22:49:34 +0000952
Richard Smith4e0d2e42013-09-20 20:10:22 +0000953 CheckExplicitInitList(Entity, IL, T, FullyStructuredList,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +0000954 /*TopLevelObject=*/true);
Eli Friedman5a36d3f2008-05-19 20:00:43 +0000955
Richard Smithcd839cc2019-08-29 22:49:34 +0000956 if (!hadError && FullyStructuredList) {
Douglas Gregor723796a2009-12-16 06:35:08 +0000957 bool RequiresSecondPass = false;
Richard Smithf3b4ca82018-02-07 22:25:16 +0000958 FillInEmptyInitializations(Entity, FullyStructuredList, RequiresSecondPass,
959 /*OuterILE=*/nullptr, /*OuterIndex=*/0);
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000960 if (RequiresSecondPass && !hadError)
Richard Smith454a7cd2014-06-03 08:26:00 +0000961 FillInEmptyInitializations(Entity, FullyStructuredList,
Richard Smithf3b4ca82018-02-07 22:25:16 +0000962 RequiresSecondPass, nullptr, 0);
Douglas Gregor723796a2009-12-16 06:35:08 +0000963 }
Steve Narofff8ecff22008-05-01 22:18:59 +0000964}
965
966int InitListChecker::numArrayElements(QualType DeclType) {
Eli Friedman85f54972008-05-25 13:22:35 +0000967 // FIXME: use a proper constant
968 int maxElements = 0x7FFFFFFF;
Chris Lattner7adf0762008-08-04 07:31:14 +0000969 if (const ConstantArrayType *CAT =
Chris Lattnerb0912a52009-02-24 22:50:46 +0000970 SemaRef.Context.getAsConstantArrayType(DeclType)) {
Steve Narofff8ecff22008-05-01 22:18:59 +0000971 maxElements = static_cast<int>(CAT->getSize().getZExtValue());
972 }
973 return maxElements;
974}
975
976int InitListChecker::numStructUnionElements(QualType DeclType) {
Ted Kremenekc23c7e62009-07-29 21:53:49 +0000977 RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl();
Douglas Gregor347f7ea2009-01-28 21:54:33 +0000978 int InitializableMembers = 0;
Richard Smith872307e2016-03-08 22:17:41 +0000979 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(structDecl))
980 InitializableMembers += CXXRD->getNumBases();
Aaron Ballmane8a8bae2014-03-08 20:12:42 +0000981 for (const auto *Field : structDecl->fields())
Douglas Gregor556e5862011-10-10 17:22:13 +0000982 if (!Field->isUnnamedBitfield())
Douglas Gregor347f7ea2009-01-28 21:54:33 +0000983 ++InitializableMembers;
Aaron Ballmane8a8bae2014-03-08 20:12:42 +0000984
Argyrios Kyrtzidis554a07b2008-06-09 23:19:58 +0000985 if (structDecl->isUnion())
Eli Friedman0e56c822008-05-25 14:03:31 +0000986 return std::min(InitializableMembers, 1);
987 return InitializableMembers - structDecl->hasFlexibleArrayMember();
Steve Narofff8ecff22008-05-01 22:18:59 +0000988}
989
Richard Smith283e2072017-10-03 20:36:00 +0000990/// Determine whether Entity is an entity for which it is idiomatic to elide
991/// the braces in aggregate initialization.
992static bool isIdiomaticBraceElisionEntity(const InitializedEntity &Entity) {
993 // Recursive initialization of the one and only field within an aggregate
994 // class is considered idiomatic. This case arises in particular for
995 // initialization of std::array, where the C++ standard suggests the idiom of
996 //
997 // std::array<T, N> arr = {1, 2, 3};
998 //
999 // (where std::array is an aggregate struct containing a single array field.
1000
1001 // FIXME: Should aggregate initialization of a struct with a single
1002 // base class and no members also suppress the warning?
1003 if (Entity.getKind() != InitializedEntity::EK_Member || !Entity.getParent())
1004 return false;
1005
1006 auto *ParentRD =
1007 Entity.getParent()->getType()->castAs<RecordType>()->getDecl();
1008 if (CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(ParentRD))
1009 if (CXXRD->getNumBases())
1010 return false;
1011
1012 auto FieldIt = ParentRD->field_begin();
1013 assert(FieldIt != ParentRD->field_end() &&
1014 "no fields but have initializer for member?");
1015 return ++FieldIt == ParentRD->field_end();
1016}
1017
Richard Smith4e0d2e42013-09-20 20:10:22 +00001018/// Check whether the range of the initializer \p ParentIList from element
1019/// \p Index onwards can be used to initialize an object of type \p T. Update
1020/// \p Index to indicate how many elements of the list were consumed.
1021///
1022/// This also fills in \p StructuredList, from element \p StructuredIndex
1023/// onwards, with the fully-braced, desugared form of the initialization.
Anders Carlsson6cabf312010-01-23 23:23:01 +00001024void InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity,
Anders Carlssondbb25a32010-01-23 20:47:59 +00001025 InitListExpr *ParentIList,
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001026 QualType T, unsigned &Index,
1027 InitListExpr *StructuredList,
Eli Friedmanc616c5f2011-08-23 20:17:13 +00001028 unsigned &StructuredIndex) {
Steve Narofff8ecff22008-05-01 22:18:59 +00001029 int maxElements = 0;
Mike Stump11289f42009-09-09 15:08:12 +00001030
Steve Narofff8ecff22008-05-01 22:18:59 +00001031 if (T->isArrayType())
1032 maxElements = numArrayElements(T);
Douglas Gregor8385a062010-04-26 21:31:17 +00001033 else if (T->isRecordType())
Steve Narofff8ecff22008-05-01 22:18:59 +00001034 maxElements = numStructUnionElements(T);
Eli Friedman23a9e312008-05-19 19:16:24 +00001035 else if (T->isVectorType())
John McCall9dd450b2009-09-21 23:43:11 +00001036 maxElements = T->getAs<VectorType>()->getNumElements();
Steve Narofff8ecff22008-05-01 22:18:59 +00001037 else
David Blaikie83d382b2011-09-23 05:06:16 +00001038 llvm_unreachable("CheckImplicitInitList(): Illegal type");
Eli Friedman23a9e312008-05-19 19:16:24 +00001039
Eli Friedmane0f832b2008-05-25 13:49:22 +00001040 if (maxElements == 0) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001041 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001042 SemaRef.Diag(ParentIList->getInit(Index)->getBeginLoc(),
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001043 diag::err_implicit_empty_initializer);
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001044 ++Index;
Eli Friedmane0f832b2008-05-25 13:49:22 +00001045 hadError = true;
1046 return;
1047 }
1048
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001049 // Build a structured initializer list corresponding to this subobject.
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001050 InitListExpr *StructuredSubobjectInitList = getStructuredSubobjectInit(
1051 ParentIList, Index, T, StructuredList, StructuredIndex,
1052 SourceRange(ParentIList->getInit(Index)->getBeginLoc(),
1053 ParentIList->getSourceRange().getEnd()));
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001054 unsigned StructuredSubobjectInitIndex = 0;
Eli Friedman23a9e312008-05-19 19:16:24 +00001055
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001056 // Check the element types and build the structural subobject.
Douglas Gregora5c9e1a2009-02-02 17:43:21 +00001057 unsigned StartIndex = Index;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001058 CheckListElementTypes(Entity, ParentIList, T,
Anders Carlssondbb25a32010-01-23 20:47:59 +00001059 /*SubobjectIsDesignatorContext=*/false, Index,
Mike Stump11289f42009-09-09 15:08:12 +00001060 StructuredSubobjectInitList,
Eli Friedmanc616c5f2011-08-23 20:17:13 +00001061 StructuredSubobjectInitIndex);
Sebastian Redl8b6412a2011-10-16 18:19:28 +00001062
Richard Smithcd839cc2019-08-29 22:49:34 +00001063 if (StructuredSubobjectInitList) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001064 StructuredSubobjectInitList->setType(T);
Douglas Gregor07d8e3a2009-03-20 00:32:56 +00001065
Sebastian Redl8b6412a2011-10-16 18:19:28 +00001066 unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001067 // Update the structured sub-object initializer so that it's ending
1068 // range corresponds with the end of the last initializer it used.
Reid Kleckner4a09e882015-12-09 23:18:38 +00001069 if (EndIndex < ParentIList->getNumInits() &&
1070 ParentIList->getInit(EndIndex)) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001071 SourceLocation EndLoc
1072 = ParentIList->getInit(EndIndex)->getSourceRange().getEnd();
1073 StructuredSubobjectInitList->setRBraceLoc(EndLoc);
1074 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001075
Sebastian Redl8b6412a2011-10-16 18:19:28 +00001076 // Complain about missing braces.
Richard Smithcd839cc2019-08-29 22:49:34 +00001077 if (!VerifyOnly && (T->isArrayType() || T->isRecordType()) &&
Richard Smith283e2072017-10-03 20:36:00 +00001078 !ParentIList->isIdiomaticZeroInitializer(SemaRef.getLangOpts()) &&
1079 !isIdiomaticBraceElisionEntity(Entity)) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001080 SemaRef.Diag(StructuredSubobjectInitList->getBeginLoc(),
Richard Smithde229232013-06-06 11:41:05 +00001081 diag::warn_missing_braces)
Alp Tokerb6cc5922014-05-03 03:45:55 +00001082 << StructuredSubobjectInitList->getSourceRange()
1083 << FixItHint::CreateInsertion(
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001084 StructuredSubobjectInitList->getBeginLoc(), "{")
Alp Tokerb6cc5922014-05-03 03:45:55 +00001085 << FixItHint::CreateInsertion(
1086 SemaRef.getLocForEndOfToken(
Stephen Kelly1c301dc2018-08-09 21:09:38 +00001087 StructuredSubobjectInitList->getEndLoc()),
Alp Tokerb6cc5922014-05-03 03:45:55 +00001088 "}");
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001089 }
Richard Smith79c88c32018-09-26 19:00:16 +00001090
1091 // Warn if this type won't be an aggregate in future versions of C++.
1092 auto *CXXRD = T->getAsCXXRecordDecl();
Richard Smithcd839cc2019-08-29 22:49:34 +00001093 if (!VerifyOnly && CXXRD && CXXRD->hasUserDeclaredConstructor()) {
Richard Smith79c88c32018-09-26 19:00:16 +00001094 SemaRef.Diag(StructuredSubobjectInitList->getBeginLoc(),
1095 diag::warn_cxx2a_compat_aggregate_init_with_ctors)
1096 << StructuredSubobjectInitList->getSourceRange() << T;
1097 }
Tanya Lattner5029d562010-03-07 04:17:15 +00001098 }
Steve Narofff8ecff22008-05-01 22:18:59 +00001099}
1100
Richard Smith420fa122015-02-12 01:50:05 +00001101/// Warn that \p Entity was of scalar type and was initialized by a
1102/// single-element braced initializer list.
1103static void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity,
1104 SourceRange Braces) {
1105 // Don't warn during template instantiation. If the initialization was
1106 // non-dependent, we warned during the initial parse; otherwise, the
1107 // type might not be scalar in some uses of the template.
Richard Smith51ec0cf2017-02-21 01:17:38 +00001108 if (S.inTemplateInstantiation())
Richard Smith420fa122015-02-12 01:50:05 +00001109 return;
1110
1111 unsigned DiagID = 0;
1112
1113 switch (Entity.getKind()) {
1114 case InitializedEntity::EK_VectorElement:
1115 case InitializedEntity::EK_ComplexElement:
1116 case InitializedEntity::EK_ArrayElement:
1117 case InitializedEntity::EK_Parameter:
1118 case InitializedEntity::EK_Parameter_CF_Audited:
1119 case InitializedEntity::EK_Result:
1120 // Extra braces here are suspicious.
1121 DiagID = diag::warn_braces_around_scalar_init;
1122 break;
1123
1124 case InitializedEntity::EK_Member:
1125 // Warn on aggregate initialization but not on ctor init list or
1126 // default member initializer.
1127 if (Entity.getParent())
1128 DiagID = diag::warn_braces_around_scalar_init;
1129 break;
1130
1131 case InitializedEntity::EK_Variable:
1132 case InitializedEntity::EK_LambdaCapture:
1133 // No warning, might be direct-list-initialization.
1134 // FIXME: Should we warn for copy-list-initialization in these cases?
1135 break;
1136
1137 case InitializedEntity::EK_New:
1138 case InitializedEntity::EK_Temporary:
1139 case InitializedEntity::EK_CompoundLiteralInit:
1140 // No warning, braces are part of the syntax of the underlying construct.
1141 break;
1142
1143 case InitializedEntity::EK_RelatedResult:
1144 // No warning, we already warned when initializing the result.
1145 break;
1146
1147 case InitializedEntity::EK_Exception:
1148 case InitializedEntity::EK_Base:
1149 case InitializedEntity::EK_Delegating:
1150 case InitializedEntity::EK_BlockElement:
Alex Lorenzb4791c72017-04-06 12:53:43 +00001151 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
Richard Smith7873de02016-08-11 22:25:46 +00001152 case InitializedEntity::EK_Binding:
Richard Smith67af95b2018-07-23 19:19:08 +00001153 case InitializedEntity::EK_StmtExprResult:
Richard Smith420fa122015-02-12 01:50:05 +00001154 llvm_unreachable("unexpected braced scalar init");
1155 }
1156
1157 if (DiagID) {
1158 S.Diag(Braces.getBegin(), DiagID)
1159 << Braces
1160 << FixItHint::CreateRemoval(Braces.getBegin())
1161 << FixItHint::CreateRemoval(Braces.getEnd());
1162 }
1163}
1164
Richard Smith4e0d2e42013-09-20 20:10:22 +00001165/// Check whether the initializer \p IList (that was written with explicit
1166/// braces) can be used to initialize an object of type \p T.
1167///
1168/// This also fills in \p StructuredList with the fully-braced, desugared
1169/// form of the initialization.
Anders Carlsson6cabf312010-01-23 23:23:01 +00001170void InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity,
Anders Carlssond0849252010-01-23 19:55:29 +00001171 InitListExpr *IList, QualType &T,
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001172 InitListExpr *StructuredList,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00001173 bool TopLevelObject) {
Richard Smith4e0d2e42013-09-20 20:10:22 +00001174 unsigned Index = 0, StructuredIndex = 0;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001175 CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true,
Anders Carlssond0849252010-01-23 19:55:29 +00001176 Index, StructuredList, StructuredIndex, TopLevelObject);
Richard Smithcd839cc2019-08-29 22:49:34 +00001177 if (StructuredList) {
Eli Friedman91f5ae52012-02-23 02:25:10 +00001178 QualType ExprTy = T;
1179 if (!ExprTy->isArrayType())
1180 ExprTy = ExprTy.getNonLValueExprType(SemaRef.Context);
Richard Smithcd839cc2019-08-29 22:49:34 +00001181 if (!VerifyOnly)
1182 IList->setType(ExprTy);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001183 StructuredList->setType(ExprTy);
1184 }
Eli Friedman85f54972008-05-25 13:22:35 +00001185 if (hadError)
1186 return;
Eli Friedman5a36d3f2008-05-19 20:00:43 +00001187
Richard Smith8823dbc2019-08-29 22:49:32 +00001188 // Don't complain for incomplete types, since we'll get an error elsewhere.
1189 if (Index < IList->getNumInits() && !T->isIncompleteType()) {
Eli Friedman5a36d3f2008-05-19 20:00:43 +00001190 // We have leftover initializers
Richard Smith8823dbc2019-08-29 22:49:32 +00001191 bool ExtraInitsIsError = SemaRef.getLangOpts().CPlusPlus ||
1192 (SemaRef.getLangOpts().OpenCL && T->isVectorType());
1193 hadError = ExtraInitsIsError;
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001194 if (VerifyOnly) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001195 return;
Richard Smith8823dbc2019-08-29 22:49:32 +00001196 } else if (StructuredIndex == 1 &&
1197 IsStringInit(StructuredList->getInit(0), T, SemaRef.Context) ==
1198 SIF_None) {
1199 unsigned DK =
1200 ExtraInitsIsError
1201 ? diag::err_excess_initializers_in_char_array_initializer
1202 : diag::ext_excess_initializers_in_char_array_initializer;
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001203 SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1204 << IList->getInit(Index)->getSourceRange();
Richard Smith8823dbc2019-08-29 22:49:32 +00001205 } else {
1206 int initKind = T->isArrayType() ? 0 :
1207 T->isVectorType() ? 1 :
1208 T->isScalarType() ? 2 :
1209 T->isUnionType() ? 3 :
1210 4;
Douglas Gregor1cba5fe2009-02-18 22:23:55 +00001211
Richard Smith8823dbc2019-08-29 22:49:32 +00001212 unsigned DK = ExtraInitsIsError ? diag::err_excess_initializers
1213 : diag::ext_excess_initializers;
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001214 SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1215 << initKind << IList->getInit(Index)->getSourceRange();
Eli Friedman5a36d3f2008-05-19 20:00:43 +00001216 }
1217 }
Eli Friedman6fcdec22008-05-19 20:20:43 +00001218
Richard Smith79c88c32018-09-26 19:00:16 +00001219 if (!VerifyOnly) {
1220 if (T->isScalarType() && IList->getNumInits() == 1 &&
1221 !isa<InitListExpr>(IList->getInit(0)))
1222 warnBracedScalarInit(SemaRef, Entity, IList->getSourceRange());
1223
1224 // Warn if this is a class type that won't be an aggregate in future
1225 // versions of C++.
1226 auto *CXXRD = T->getAsCXXRecordDecl();
1227 if (CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1228 // Don't warn if there's an equivalent default constructor that would be
1229 // used instead.
1230 bool HasEquivCtor = false;
1231 if (IList->getNumInits() == 0) {
1232 auto *CD = SemaRef.LookupDefaultConstructor(CXXRD);
1233 HasEquivCtor = CD && !CD->isDeleted();
1234 }
1235
1236 if (!HasEquivCtor) {
1237 SemaRef.Diag(IList->getBeginLoc(),
1238 diag::warn_cxx2a_compat_aggregate_init_with_ctors)
1239 << IList->getSourceRange() << T;
1240 }
1241 }
1242 }
Steve Narofff8ecff22008-05-01 22:18:59 +00001243}
1244
Anders Carlsson6cabf312010-01-23 23:23:01 +00001245void InitListChecker::CheckListElementTypes(const InitializedEntity &Entity,
Anders Carlssond0849252010-01-23 19:55:29 +00001246 InitListExpr *IList,
Mike Stump11289f42009-09-09 15:08:12 +00001247 QualType &DeclType,
Douglas Gregord7fb85e2009-01-22 23:26:18 +00001248 bool SubobjectIsDesignatorContext,
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001249 unsigned &Index,
1250 InitListExpr *StructuredList,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00001251 unsigned &StructuredIndex,
1252 bool TopLevelObject) {
Eli Friedman6b9c41e2011-09-19 23:17:44 +00001253 if (DeclType->isAnyComplexType() && SubobjectIsDesignatorContext) {
1254 // Explicitly braced initializer for complex type can be real+imaginary
1255 // parts.
1256 CheckComplexType(Entity, IList, DeclType, Index,
1257 StructuredList, StructuredIndex);
1258 } else if (DeclType->isScalarType()) {
Anders Carlssond0849252010-01-23 19:55:29 +00001259 CheckScalarType(Entity, IList, DeclType, Index,
1260 StructuredList, StructuredIndex);
Eli Friedman5a36d3f2008-05-19 20:00:43 +00001261 } else if (DeclType->isVectorType()) {
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001262 CheckVectorType(Entity, IList, DeclType, Index,
Anders Carlssond0849252010-01-23 19:55:29 +00001263 StructuredList, StructuredIndex);
Richard Smithe20c83d2012-07-07 08:35:56 +00001264 } else if (DeclType->isRecordType()) {
1265 assert(DeclType->isAggregateType() &&
1266 "non-aggregate records should be handed in CheckSubElementType");
1267 RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl();
Richard Smith872307e2016-03-08 22:17:41 +00001268 auto Bases =
1269 CXXRecordDecl::base_class_range(CXXRecordDecl::base_class_iterator(),
1270 CXXRecordDecl::base_class_iterator());
1271 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1272 Bases = CXXRD->bases();
1273 CheckStructUnionTypes(Entity, IList, DeclType, Bases, RD->field_begin(),
1274 SubobjectIsDesignatorContext, Index, StructuredList,
1275 StructuredIndex, TopLevelObject);
Richard Smithe20c83d2012-07-07 08:35:56 +00001276 } else if (DeclType->isArrayType()) {
1277 llvm::APSInt Zero(
1278 SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()),
1279 false);
1280 CheckArrayType(Entity, IList, DeclType, Zero,
1281 SubobjectIsDesignatorContext, Index,
1282 StructuredList, StructuredIndex);
Steve Naroffeaf58532008-08-10 16:05:48 +00001283 } else if (DeclType->isVoidType() || DeclType->isFunctionType()) {
1284 // This type is invalid, issue a diagnostic.
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001285 ++Index;
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001286 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001287 SemaRef.Diag(IList->getBeginLoc(), diag::err_illegal_initializer_type)
1288 << DeclType;
Eli Friedmand0e48ea2008-05-20 05:25:56 +00001289 hadError = true;
Douglas Gregord14247a2009-01-30 22:09:00 +00001290 } else if (DeclType->isReferenceType()) {
Anders Carlsson6cabf312010-01-23 23:23:01 +00001291 CheckReferenceType(Entity, IList, DeclType, Index,
1292 StructuredList, StructuredIndex);
John McCall8b07ec22010-05-15 11:32:37 +00001293 } else if (DeclType->isObjCObjectType()) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001294 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001295 SemaRef.Diag(IList->getBeginLoc(), diag::err_init_objc_class) << DeclType;
Douglas Gregor50ec46d2010-05-03 18:24:37 +00001296 hadError = true;
Andrew Savonichev3fee3512018-11-08 11:25:41 +00001297 } else if (DeclType->isOCLIntelSubgroupAVCType()) {
1298 // Checks for scalar type are sufficient for these types too.
1299 CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1300 StructuredIndex);
Steve Narofff8ecff22008-05-01 22:18:59 +00001301 } else {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001302 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001303 SemaRef.Diag(IList->getBeginLoc(), diag::err_illegal_initializer_type)
1304 << DeclType;
Douglas Gregor50ec46d2010-05-03 18:24:37 +00001305 hadError = true;
Steve Narofff8ecff22008-05-01 22:18:59 +00001306 }
1307}
1308
Anders Carlsson6cabf312010-01-23 23:23:01 +00001309void InitListChecker::CheckSubElementType(const InitializedEntity &Entity,
Anders Carlssond0849252010-01-23 19:55:29 +00001310 InitListExpr *IList,
Mike Stump11289f42009-09-09 15:08:12 +00001311 QualType ElemType,
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001312 unsigned &Index,
1313 InitListExpr *StructuredList,
1314 unsigned &StructuredIndex) {
Douglas Gregorf6d27522009-01-29 00:39:20 +00001315 Expr *expr = IList->getInit(Index);
Richard Smith72752e82013-05-31 02:56:17 +00001316
1317 if (ElemType->isReferenceType())
1318 return CheckReferenceType(Entity, IList, ElemType, Index,
1319 StructuredList, StructuredIndex);
1320
Eli Friedman5a36d3f2008-05-19 20:00:43 +00001321 if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) {
Yunzhong Gaocb779302015-06-10 00:27:52 +00001322 if (SubInitList->getNumInits() == 1 &&
1323 IsStringInit(SubInitList->getInit(0), ElemType, SemaRef.Context) ==
1324 SIF_None) {
Richard Smithcd839cc2019-08-29 22:49:34 +00001325 // FIXME: It would be more faithful and no less correct to include an
1326 // InitListExpr in the semantic form of the initializer list in this case.
Yunzhong Gaocb779302015-06-10 00:27:52 +00001327 expr = SubInitList->getInit(0);
Richard Smithe20c83d2012-07-07 08:35:56 +00001328 }
Richard Smith33e9be62019-08-29 22:49:33 +00001329 // Nested aggregate initialization and C++ initialization are handled later.
Richard Smithc4158e862014-07-18 04:47:25 +00001330 } else if (isa<ImplicitValueInitExpr>(expr)) {
Richard Smith8aa561b2014-07-17 23:12:06 +00001331 // This happens during template instantiation when we see an InitListExpr
1332 // that we've already checked once.
Richard Smithc4158e862014-07-18 04:47:25 +00001333 assert(SemaRef.Context.hasSameType(expr->getType(), ElemType) &&
Richard Smith8aa561b2014-07-17 23:12:06 +00001334 "found implicit initialization for the wrong type");
Richard Smithcd839cc2019-08-29 22:49:34 +00001335 UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
Richard Smith8aa561b2014-07-17 23:12:06 +00001336 ++Index;
1337 return;
Richard Smithe20c83d2012-07-07 08:35:56 +00001338 }
1339
Richard Smith33e9be62019-08-29 22:49:33 +00001340 if (SemaRef.getLangOpts().CPlusPlus || isa<InitListExpr>(expr)) {
Richard Smith3c567fc2015-02-12 01:55:09 +00001341 // C++ [dcl.init.aggr]p2:
1342 // Each member is copy-initialized from the corresponding
1343 // initializer-clause.
1344
1345 // FIXME: Better EqualLoc?
1346 InitializationKind Kind =
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001347 InitializationKind::CreateCopy(expr->getBeginLoc(), SourceLocation());
Anastasia Stulova8d99a5c02019-08-02 11:19:35 +00001348
1349 // Vector elements can be initialized from other vectors in which case
1350 // we need initialization entity with a type of a vector (and not a vector
1351 // element!) initializing multiple vector elements.
1352 auto TmpEntity =
1353 (ElemType->isExtVectorType() && !Entity.getType()->isExtVectorType())
1354 ? InitializedEntity::InitializeTemporary(ElemType)
1355 : Entity;
1356
1357 InitializationSequence Seq(SemaRef, TmpEntity, Kind, expr,
Richard Smith3c567fc2015-02-12 01:55:09 +00001358 /*TopLevelOfInitList*/ true);
1359
1360 // C++14 [dcl.init.aggr]p13:
1361 // If the assignment-expression can initialize a member, the member is
1362 // initialized. Otherwise [...] brace elision is assumed
1363 //
1364 // Brace elision is never performed if the element is not an
1365 // assignment-expression.
1366 if (Seq || isa<InitListExpr>(expr)) {
1367 if (!VerifyOnly) {
Anastasia Stulova8d99a5c02019-08-02 11:19:35 +00001368 ExprResult Result = Seq.Perform(SemaRef, TmpEntity, Kind, expr);
Richard Smith3c567fc2015-02-12 01:55:09 +00001369 if (Result.isInvalid())
1370 hadError = true;
1371
1372 UpdateStructuredListElement(StructuredList, StructuredIndex,
1373 Result.getAs<Expr>());
Richard Smithcd839cc2019-08-29 22:49:34 +00001374 } else if (!Seq) {
Richard Smith40574cc2015-02-16 04:42:59 +00001375 hadError = true;
Richard Smithcd839cc2019-08-29 22:49:34 +00001376 } else if (StructuredList) {
1377 UpdateStructuredListElement(StructuredList, StructuredIndex,
1378 getDummyInit());
1379 }
Richard Smith3c567fc2015-02-12 01:55:09 +00001380 ++Index;
1381 return;
1382 }
1383
1384 // Fall through for subaggregate initialization
1385 } else if (ElemType->isScalarType() || ElemType->isAtomicType()) {
1386 // FIXME: Need to handle atomic aggregate types with implicit init lists.
John McCall5decec92011-02-21 07:57:55 +00001387 return CheckScalarType(Entity, IList, ElemType, Index,
1388 StructuredList, StructuredIndex);
Richard Smith3c567fc2015-02-12 01:55:09 +00001389 } else if (const ArrayType *arrayType =
1390 SemaRef.Context.getAsArrayType(ElemType)) {
John McCall5decec92011-02-21 07:57:55 +00001391 // arrayType can be incomplete if we're initializing a flexible
1392 // array member. There's nothing we can do with the completed
1393 // type here, though.
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001394
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00001395 if (IsStringInit(expr, arrayType, SemaRef.Context) == SIF_None) {
Richard Smithcd839cc2019-08-29 22:49:34 +00001396 // FIXME: Should we do this checking in verify-only mode?
1397 if (!VerifyOnly)
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00001398 CheckStringInit(expr, ElemType, arrayType, SemaRef);
Richard Smithcd839cc2019-08-29 22:49:34 +00001399 if (StructuredList)
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00001400 UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
Douglas Gregord14247a2009-01-30 22:09:00 +00001401 ++Index;
John McCall5decec92011-02-21 07:57:55 +00001402 return;
Douglas Gregord14247a2009-01-30 22:09:00 +00001403 }
John McCall5decec92011-02-21 07:57:55 +00001404
1405 // Fall through for subaggregate initialization.
1406
John McCall5decec92011-02-21 07:57:55 +00001407 } else {
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +00001408 assert((ElemType->isRecordType() || ElemType->isVectorType() ||
Egor Churaev45fe70f2017-05-10 10:28:34 +00001409 ElemType->isOpenCLSpecificType()) && "Unexpected type");
Richard Smith3c567fc2015-02-12 01:55:09 +00001410
John McCall5decec92011-02-21 07:57:55 +00001411 // C99 6.7.8p13:
1412 //
1413 // The initializer for a structure or union object that has
1414 // automatic storage duration shall be either an initializer
1415 // list as described below, or a single expression that has
1416 // compatible structure or union type. In the latter case, the
1417 // initial value of the object, including unnamed members, is
1418 // that of the expression.
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00001419 ExprResult ExprRes = expr;
Richard Smith3c567fc2015-02-12 01:55:09 +00001420 if (SemaRef.CheckSingleAssignmentConstraints(
1421 ElemType, ExprRes, !VerifyOnly) != Sema::Incompatible) {
John Wiegley01296292011-04-08 18:41:53 +00001422 if (ExprRes.isInvalid())
1423 hadError = true;
1424 else {
Nikola Smiljanic01a75982014-05-29 10:55:11 +00001425 ExprRes = SemaRef.DefaultFunctionArrayLvalueConversion(ExprRes.get());
Richard Smith8823dbc2019-08-29 22:49:32 +00001426 if (ExprRes.isInvalid())
1427 hadError = true;
John Wiegley01296292011-04-08 18:41:53 +00001428 }
1429 UpdateStructuredListElement(StructuredList, StructuredIndex,
Nikola Smiljanic01a75982014-05-29 10:55:11 +00001430 ExprRes.getAs<Expr>());
John McCall5decec92011-02-21 07:57:55 +00001431 ++Index;
1432 return;
1433 }
Nikola Smiljanic01a75982014-05-29 10:55:11 +00001434 ExprRes.get();
John McCall5decec92011-02-21 07:57:55 +00001435 // Fall through for subaggregate initialization
1436 }
1437
1438 // C++ [dcl.init.aggr]p12:
1439 //
1440 // [...] Otherwise, if the member is itself a non-empty
1441 // subaggregate, brace elision is assumed and the initializer is
1442 // considered for the initialization of the first member of
1443 // the subaggregate.
Yaxun Liua91da4b2016-10-11 15:53:28 +00001444 // OpenCL vector initializer is handled elsewhere.
1445 if ((!SemaRef.getLangOpts().OpenCL && ElemType->isVectorType()) ||
1446 ElemType->isAggregateType()) {
John McCall5decec92011-02-21 07:57:55 +00001447 CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList,
1448 StructuredIndex);
1449 ++StructuredIndex;
1450 } else {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001451 if (!VerifyOnly) {
Richard Smith8823dbc2019-08-29 22:49:32 +00001452 // We cannot initialize this element, so let PerformCopyInitialization
1453 // produce the appropriate diagnostic. We already checked that this
1454 // initialization will fail.
1455 ExprResult Copy =
1456 SemaRef.PerformCopyInitialization(Entity, SourceLocation(), expr,
1457 /*TopLevelOfInitList=*/true);
1458 (void)Copy;
1459 assert(Copy.isInvalid() &&
1460 "expected non-aggregate initialization to fail");
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001461 }
John McCall5decec92011-02-21 07:57:55 +00001462 hadError = true;
1463 ++Index;
1464 ++StructuredIndex;
Douglas Gregord14247a2009-01-30 22:09:00 +00001465 }
Eli Friedman23a9e312008-05-19 19:16:24 +00001466}
1467
Eli Friedman6b9c41e2011-09-19 23:17:44 +00001468void InitListChecker::CheckComplexType(const InitializedEntity &Entity,
1469 InitListExpr *IList, QualType DeclType,
1470 unsigned &Index,
1471 InitListExpr *StructuredList,
1472 unsigned &StructuredIndex) {
1473 assert(Index == 0 && "Index in explicit init list must be zero");
1474
1475 // As an extension, clang supports complex initializers, which initialize
1476 // a complex number component-wise. When an explicit initializer list for
1477 // a complex number contains two two initializers, this extension kicks in:
1478 // it exepcts the initializer list to contain two elements convertible to
1479 // the element type of the complex type. The first element initializes
1480 // the real part, and the second element intitializes the imaginary part.
1481
1482 if (IList->getNumInits() != 2)
1483 return CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1484 StructuredIndex);
1485
1486 // This is an extension in C. (The builtin _Complex type does not exist
1487 // in the C++ standard.)
David Blaikiebbafb8a2012-03-11 07:00:24 +00001488 if (!SemaRef.getLangOpts().CPlusPlus && !VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001489 SemaRef.Diag(IList->getBeginLoc(), diag::ext_complex_component_init)
1490 << IList->getSourceRange();
Eli Friedman6b9c41e2011-09-19 23:17:44 +00001491
1492 // Initialize the complex number.
1493 QualType elementType = DeclType->getAs<ComplexType>()->getElementType();
1494 InitializedEntity ElementEntity =
1495 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
1496
1497 for (unsigned i = 0; i < 2; ++i) {
1498 ElementEntity.setElementIndex(Index);
1499 CheckSubElementType(ElementEntity, IList, elementType, Index,
1500 StructuredList, StructuredIndex);
1501 }
1502}
1503
Anders Carlsson6cabf312010-01-23 23:23:01 +00001504void InitListChecker::CheckScalarType(const InitializedEntity &Entity,
Anders Carlssond0849252010-01-23 19:55:29 +00001505 InitListExpr *IList, QualType DeclType,
Douglas Gregorf6d27522009-01-29 00:39:20 +00001506 unsigned &Index,
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001507 InitListExpr *StructuredList,
1508 unsigned &StructuredIndex) {
John McCall643169b2010-11-11 00:46:36 +00001509 if (Index >= IList->getNumInits()) {
Richard Smithc8239732011-10-18 21:39:00 +00001510 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001511 SemaRef.Diag(IList->getBeginLoc(),
1512 SemaRef.getLangOpts().CPlusPlus11
1513 ? diag::warn_cxx98_compat_empty_scalar_initializer
1514 : diag::err_empty_scalar_initializer)
1515 << IList->getSourceRange();
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001516 hadError = !SemaRef.getLangOpts().CPlusPlus11;
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001517 ++Index;
1518 ++StructuredIndex;
Eli Friedmanfeb4cc12008-05-19 20:12:18 +00001519 return;
Steve Narofff8ecff22008-05-01 22:18:59 +00001520 }
John McCall643169b2010-11-11 00:46:36 +00001521
1522 Expr *expr = IList->getInit(Index);
1523 if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) {
Richard Smithfe9d2c02013-11-19 03:41:32 +00001524 // FIXME: This is invalid, and accepting it causes overload resolution
1525 // to pick the wrong overload in some corner cases.
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001526 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001527 SemaRef.Diag(SubIList->getBeginLoc(),
Richard Smithfe9d2c02013-11-19 03:41:32 +00001528 diag::ext_many_braces_around_scalar_init)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001529 << SubIList->getSourceRange();
John McCall643169b2010-11-11 00:46:36 +00001530
1531 CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList,
1532 StructuredIndex);
1533 return;
1534 } else if (isa<DesignatedInitExpr>(expr)) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001535 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001536 SemaRef.Diag(expr->getBeginLoc(), diag::err_designator_for_scalar_init)
1537 << DeclType << expr->getSourceRange();
John McCall643169b2010-11-11 00:46:36 +00001538 hadError = true;
1539 ++Index;
1540 ++StructuredIndex;
1541 return;
1542 }
1543
Richard Smithcd839cc2019-08-29 22:49:34 +00001544 ExprResult Result;
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001545 if (VerifyOnly) {
Richard Smithcd839cc2019-08-29 22:49:34 +00001546 if (SemaRef.CanPerformCopyInitialization(Entity, expr))
1547 Result = getDummyInit();
1548 else
1549 Result = ExprError();
1550 } else {
1551 Result =
1552 SemaRef.PerformCopyInitialization(Entity, expr->getBeginLoc(), expr,
1553 /*TopLevelOfInitList=*/true);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001554 }
1555
Craig Topperc3ec1492014-05-26 06:22:03 +00001556 Expr *ResultExpr = nullptr;
John McCall643169b2010-11-11 00:46:36 +00001557
1558 if (Result.isInvalid())
1559 hadError = true; // types weren't compatible.
1560 else {
Nikola Smiljanic01a75982014-05-29 10:55:11 +00001561 ResultExpr = Result.getAs<Expr>();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001562
Richard Smithcd839cc2019-08-29 22:49:34 +00001563 if (ResultExpr != expr && !VerifyOnly) {
John McCall643169b2010-11-11 00:46:36 +00001564 // The type was promoted, update initializer list.
Richard Smithcd839cc2019-08-29 22:49:34 +00001565 // FIXME: Why are we updating the syntactic init list?
John McCall643169b2010-11-11 00:46:36 +00001566 IList->setInit(Index, ResultExpr);
1567 }
1568 }
1569 if (hadError)
1570 ++StructuredIndex;
1571 else
1572 UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1573 ++Index;
Steve Narofff8ecff22008-05-01 22:18:59 +00001574}
1575
Anders Carlsson6cabf312010-01-23 23:23:01 +00001576void InitListChecker::CheckReferenceType(const InitializedEntity &Entity,
1577 InitListExpr *IList, QualType DeclType,
Douglas Gregord14247a2009-01-30 22:09:00 +00001578 unsigned &Index,
1579 InitListExpr *StructuredList,
1580 unsigned &StructuredIndex) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001581 if (Index >= IList->getNumInits()) {
Mike Stump87c57ac2009-05-16 07:39:55 +00001582 // FIXME: It would be wonderful if we could point at the actual member. In
1583 // general, it would be useful to pass location information down the stack,
1584 // so that we know the location (or decl) of the "current object" being
1585 // initialized.
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001586 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001587 SemaRef.Diag(IList->getBeginLoc(),
1588 diag::err_init_reference_member_uninitialized)
1589 << DeclType << IList->getSourceRange();
Douglas Gregord14247a2009-01-30 22:09:00 +00001590 hadError = true;
1591 ++Index;
1592 ++StructuredIndex;
1593 return;
1594 }
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001595
1596 Expr *expr = IList->getInit(Index);
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001597 if (isa<InitListExpr>(expr) && !SemaRef.getLangOpts().CPlusPlus11) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001598 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001599 SemaRef.Diag(IList->getBeginLoc(), diag::err_init_non_aggr_init_list)
1600 << DeclType << IList->getSourceRange();
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001601 hadError = true;
1602 ++Index;
1603 ++StructuredIndex;
1604 return;
1605 }
1606
Richard Smithcd839cc2019-08-29 22:49:34 +00001607 ExprResult Result;
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001608 if (VerifyOnly) {
Richard Smithcd839cc2019-08-29 22:49:34 +00001609 if (SemaRef.CanPerformCopyInitialization(Entity,expr))
1610 Result = getDummyInit();
1611 else
1612 Result = ExprError();
1613 } else {
1614 Result =
1615 SemaRef.PerformCopyInitialization(Entity, expr->getBeginLoc(), expr,
1616 /*TopLevelOfInitList=*/true);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001617 }
1618
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001619 if (Result.isInvalid())
1620 hadError = true;
1621
Nikola Smiljanic01a75982014-05-29 10:55:11 +00001622 expr = Result.getAs<Expr>();
Richard Smithcd839cc2019-08-29 22:49:34 +00001623 // FIXME: Why are we updating the syntactic init list?
1624 if (!VerifyOnly)
1625 IList->setInit(Index, expr);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001626
1627 if (hadError)
1628 ++StructuredIndex;
1629 else
1630 UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1631 ++Index;
Douglas Gregord14247a2009-01-30 22:09:00 +00001632}
1633
Anders Carlsson6cabf312010-01-23 23:23:01 +00001634void InitListChecker::CheckVectorType(const InitializedEntity &Entity,
Anders Carlssond0849252010-01-23 19:55:29 +00001635 InitListExpr *IList, QualType DeclType,
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001636 unsigned &Index,
1637 InitListExpr *StructuredList,
1638 unsigned &StructuredIndex) {
John McCall6a16b2f2010-10-30 00:11:39 +00001639 const VectorType *VT = DeclType->getAs<VectorType>();
1640 unsigned maxElements = VT->getNumElements();
1641 unsigned numEltsInit = 0;
1642 QualType elementType = VT->getElementType();
Anders Carlssond0849252010-01-23 19:55:29 +00001643
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00001644 if (Index >= IList->getNumInits()) {
1645 // Make sure the element type can be value-initialized.
Richard Smithcd839cc2019-08-29 22:49:34 +00001646 CheckEmptyInitializable(
1647 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity),
1648 IList->getEndLoc());
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00001649 return;
1650 }
1651
David Blaikiebbafb8a2012-03-11 07:00:24 +00001652 if (!SemaRef.getLangOpts().OpenCL) {
John McCall6a16b2f2010-10-30 00:11:39 +00001653 // If the initializing element is a vector, try to copy-initialize
1654 // instead of breaking it apart (which is doomed to failure anyway).
1655 Expr *Init = IList->getInit(Index);
1656 if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) {
Richard Smithcd839cc2019-08-29 22:49:34 +00001657 ExprResult Result;
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001658 if (VerifyOnly) {
Richard Smithcd839cc2019-08-29 22:49:34 +00001659 if (SemaRef.CanPerformCopyInitialization(Entity, Init))
1660 Result = getDummyInit();
1661 else
1662 Result = ExprError();
1663 } else {
1664 Result =
1665 SemaRef.PerformCopyInitialization(Entity, Init->getBeginLoc(), Init,
1666 /*TopLevelOfInitList=*/true);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001667 }
1668
Craig Topperc3ec1492014-05-26 06:22:03 +00001669 Expr *ResultExpr = nullptr;
John McCall6a16b2f2010-10-30 00:11:39 +00001670 if (Result.isInvalid())
1671 hadError = true; // types weren't compatible.
1672 else {
Nikola Smiljanic01a75982014-05-29 10:55:11 +00001673 ResultExpr = Result.getAs<Expr>();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001674
Richard Smithcd839cc2019-08-29 22:49:34 +00001675 if (ResultExpr != Init && !VerifyOnly) {
John McCall6a16b2f2010-10-30 00:11:39 +00001676 // The type was promoted, update initializer list.
Richard Smithcd839cc2019-08-29 22:49:34 +00001677 // FIXME: Why are we updating the syntactic init list?
John McCall6a16b2f2010-10-30 00:11:39 +00001678 IList->setInit(Index, ResultExpr);
Nate Begeman5ec4b312009-08-10 23:49:36 +00001679 }
1680 }
John McCall6a16b2f2010-10-30 00:11:39 +00001681 if (hadError)
1682 ++StructuredIndex;
1683 else
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001684 UpdateStructuredListElement(StructuredList, StructuredIndex,
1685 ResultExpr);
John McCall6a16b2f2010-10-30 00:11:39 +00001686 ++Index;
1687 return;
Steve Narofff8ecff22008-05-01 22:18:59 +00001688 }
Mike Stump11289f42009-09-09 15:08:12 +00001689
John McCall6a16b2f2010-10-30 00:11:39 +00001690 InitializedEntity ElementEntity =
1691 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001692
John McCall6a16b2f2010-10-30 00:11:39 +00001693 for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) {
1694 // Don't attempt to go past the end of the init list
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00001695 if (Index >= IList->getNumInits()) {
Richard Smithcd839cc2019-08-29 22:49:34 +00001696 CheckEmptyInitializable(ElementEntity, IList->getEndLoc());
John McCall6a16b2f2010-10-30 00:11:39 +00001697 break;
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00001698 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001699
John McCall6a16b2f2010-10-30 00:11:39 +00001700 ElementEntity.setElementIndex(Index);
1701 CheckSubElementType(ElementEntity, IList, elementType, Index,
1702 StructuredList, StructuredIndex);
1703 }
James Molloy9eef2652014-06-20 14:35:13 +00001704
1705 if (VerifyOnly)
1706 return;
1707
1708 bool isBigEndian = SemaRef.Context.getTargetInfo().isBigEndian();
1709 const VectorType *T = Entity.getType()->getAs<VectorType>();
1710 if (isBigEndian && (T->getVectorKind() == VectorType::NeonVector ||
1711 T->getVectorKind() == VectorType::NeonPolyVector)) {
1712 // The ability to use vector initializer lists is a GNU vector extension
1713 // and is unrelated to the NEON intrinsics in arm_neon.h. On little
Fangrui Song6907ce22018-07-30 19:24:48 +00001714 // endian machines it works fine, however on big endian machines it
James Molloy9eef2652014-06-20 14:35:13 +00001715 // exhibits surprising behaviour:
1716 //
1717 // uint32x2_t x = {42, 64};
1718 // return vget_lane_u32(x, 0); // Will return 64.
1719 //
1720 // Because of this, explicitly call out that it is non-portable.
1721 //
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001722 SemaRef.Diag(IList->getBeginLoc(),
James Molloy9eef2652014-06-20 14:35:13 +00001723 diag::warn_neon_vector_initializer_non_portable);
1724
1725 const char *typeCode;
1726 unsigned typeSize = SemaRef.Context.getTypeSize(elementType);
1727
1728 if (elementType->isFloatingType())
1729 typeCode = "f";
1730 else if (elementType->isSignedIntegerType())
1731 typeCode = "s";
1732 else if (elementType->isUnsignedIntegerType())
1733 typeCode = "u";
1734 else
1735 llvm_unreachable("Invalid element type!");
1736
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001737 SemaRef.Diag(IList->getBeginLoc(),
1738 SemaRef.Context.getTypeSize(VT) > 64
1739 ? diag::note_neon_vector_initializer_non_portable_q
1740 : diag::note_neon_vector_initializer_non_portable)
1741 << typeCode << typeSize;
James Molloy9eef2652014-06-20 14:35:13 +00001742 }
1743
John McCall6a16b2f2010-10-30 00:11:39 +00001744 return;
Steve Narofff8ecff22008-05-01 22:18:59 +00001745 }
John McCall6a16b2f2010-10-30 00:11:39 +00001746
1747 InitializedEntity ElementEntity =
1748 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001749
John McCall6a16b2f2010-10-30 00:11:39 +00001750 // OpenCL initializers allows vectors to be constructed from vectors.
1751 for (unsigned i = 0; i < maxElements; ++i) {
1752 // Don't attempt to go past the end of the init list
1753 if (Index >= IList->getNumInits())
1754 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001755
John McCall6a16b2f2010-10-30 00:11:39 +00001756 ElementEntity.setElementIndex(Index);
1757
1758 QualType IType = IList->getInit(Index)->getType();
1759 if (!IType->isVectorType()) {
1760 CheckSubElementType(ElementEntity, IList, elementType, Index,
1761 StructuredList, StructuredIndex);
1762 ++numEltsInit;
1763 } else {
1764 QualType VecType;
1765 const VectorType *IVT = IType->getAs<VectorType>();
1766 unsigned numIElts = IVT->getNumElements();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001767
John McCall6a16b2f2010-10-30 00:11:39 +00001768 if (IType->isExtVectorType())
1769 VecType = SemaRef.Context.getExtVectorType(elementType, numIElts);
1770 else
1771 VecType = SemaRef.Context.getVectorType(elementType, numIElts,
Bob Wilsonaeb56442010-11-10 21:56:12 +00001772 IVT->getVectorKind());
John McCall6a16b2f2010-10-30 00:11:39 +00001773 CheckSubElementType(ElementEntity, IList, VecType, Index,
1774 StructuredList, StructuredIndex);
1775 numEltsInit += numIElts;
1776 }
1777 }
1778
1779 // OpenCL requires all elements to be initialized.
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00001780 if (numEltsInit != maxElements) {
1781 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001782 SemaRef.Diag(IList->getBeginLoc(),
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00001783 diag::err_vector_incorrect_num_initializers)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001784 << (numEltsInit < maxElements) << maxElements << numEltsInit;
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00001785 hadError = true;
1786 }
Steve Narofff8ecff22008-05-01 22:18:59 +00001787}
1788
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +00001789/// Check if the type of a class element has an accessible destructor, and marks
1790/// it referenced. Returns true if we shouldn't form a reference to the
1791/// destructor.
1792///
1793/// Aggregate initialization requires a class element's destructor be
1794/// accessible per 11.6.1 [dcl.init.aggr]:
1795///
1796/// The destructor for each element of class type is potentially invoked
1797/// (15.4 [class.dtor]) from the context where the aggregate initialization
1798/// occurs.
1799static bool checkDestructorReference(QualType ElementType, SourceLocation Loc,
1800 Sema &SemaRef) {
1801 auto *CXXRD = ElementType->getAsCXXRecordDecl();
1802 if (!CXXRD)
1803 return false;
1804
1805 CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(CXXRD);
1806 SemaRef.CheckDestructorAccess(Loc, Destructor,
1807 SemaRef.PDiag(diag::err_access_dtor_temp)
1808 << ElementType);
1809 SemaRef.MarkFunctionReferenced(Loc, Destructor);
1810 return SemaRef.DiagnoseUseOfDecl(Destructor, Loc);
1811}
1812
Anders Carlsson6cabf312010-01-23 23:23:01 +00001813void InitListChecker::CheckArrayType(const InitializedEntity &Entity,
Anders Carlsson0cf999b2010-01-23 20:13:41 +00001814 InitListExpr *IList, QualType &DeclType,
Douglas Gregord7fb85e2009-01-22 23:26:18 +00001815 llvm::APSInt elementIndex,
Mike Stump11289f42009-09-09 15:08:12 +00001816 bool SubobjectIsDesignatorContext,
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001817 unsigned &Index,
1818 InitListExpr *StructuredList,
1819 unsigned &StructuredIndex) {
John McCall66884dd2011-02-21 07:22:22 +00001820 const ArrayType *arrayType = SemaRef.Context.getAsArrayType(DeclType);
1821
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +00001822 if (!VerifyOnly) {
1823 if (checkDestructorReference(arrayType->getElementType(),
1824 IList->getEndLoc(), SemaRef)) {
1825 hadError = true;
1826 return;
1827 }
1828 }
1829
Steve Narofff8ecff22008-05-01 22:18:59 +00001830 // Check for the special-case of initializing an array with a string.
1831 if (Index < IList->getNumInits()) {
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00001832 if (IsStringInit(IList->getInit(Index), arrayType, SemaRef.Context) ==
1833 SIF_None) {
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001834 // We place the string literal directly into the resulting
1835 // initializer list. This is the only place where the structure
1836 // of the structured initializer list doesn't match exactly,
1837 // because doing so would involve allocating one character
1838 // constant for each string.
Richard Smithcd839cc2019-08-29 22:49:34 +00001839 // FIXME: Should we do these checks in verify-only mode too?
1840 if (!VerifyOnly)
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00001841 CheckStringInit(IList->getInit(Index), DeclType, arrayType, SemaRef);
Richard Smithcd839cc2019-08-29 22:49:34 +00001842 if (StructuredList) {
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00001843 UpdateStructuredListElement(StructuredList, StructuredIndex,
1844 IList->getInit(Index));
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001845 StructuredList->resizeInits(SemaRef.Context, StructuredIndex);
1846 }
Steve Narofff8ecff22008-05-01 22:18:59 +00001847 ++Index;
Steve Narofff8ecff22008-05-01 22:18:59 +00001848 return;
1849 }
1850 }
John McCall66884dd2011-02-21 07:22:22 +00001851 if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) {
Eli Friedman85f54972008-05-25 13:22:35 +00001852 // Check for VLAs; in standard C it would be possible to check this
1853 // earlier, but I don't know where clang accepts VLAs (gcc accepts
1854 // them in all sorts of strange places).
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001855 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001856 SemaRef.Diag(VAT->getSizeExpr()->getBeginLoc(),
1857 diag::err_variable_object_no_init)
1858 << VAT->getSizeExpr()->getSourceRange();
Eli Friedman85f54972008-05-25 13:22:35 +00001859 hadError = true;
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001860 ++Index;
1861 ++StructuredIndex;
Eli Friedman85f54972008-05-25 13:22:35 +00001862 return;
1863 }
1864
Douglas Gregore4a0bb72009-01-22 00:58:24 +00001865 // We might know the maximum number of elements in advance.
Douglas Gregor347f7ea2009-01-28 21:54:33 +00001866 llvm::APSInt maxElements(elementIndex.getBitWidth(),
1867 elementIndex.isUnsigned());
Douglas Gregore4a0bb72009-01-22 00:58:24 +00001868 bool maxElementsKnown = false;
John McCall66884dd2011-02-21 07:22:22 +00001869 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(arrayType)) {
Douglas Gregore4a0bb72009-01-22 00:58:24 +00001870 maxElements = CAT->getSize();
Jay Foad6d4db0c2010-12-07 08:25:34 +00001871 elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth());
Douglas Gregor583cf0a2009-01-23 18:58:42 +00001872 elementIndex.setIsUnsigned(maxElements.isUnsigned());
Douglas Gregore4a0bb72009-01-22 00:58:24 +00001873 maxElementsKnown = true;
1874 }
1875
John McCall66884dd2011-02-21 07:22:22 +00001876 QualType elementType = arrayType->getElementType();
Douglas Gregore4a0bb72009-01-22 00:58:24 +00001877 while (Index < IList->getNumInits()) {
1878 Expr *Init = IList->getInit(Index);
1879 if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) {
Douglas Gregord7fb85e2009-01-22 23:26:18 +00001880 // If we're not the subobject that matches up with the '{' for
1881 // the designator, we shouldn't be handling the
1882 // designator. Return immediately.
1883 if (!SubobjectIsDesignatorContext)
1884 return;
Douglas Gregore4a0bb72009-01-22 00:58:24 +00001885
Douglas Gregord7fb85e2009-01-22 23:26:18 +00001886 // Handle this designated initializer. elementIndex will be
1887 // updated to be the next array element we'll initialize.
Anders Carlsson3fa93b72010-01-23 22:49:02 +00001888 if (CheckDesignatedInitializer(Entity, IList, DIE, 0,
Craig Topperc3ec1492014-05-26 06:22:03 +00001889 DeclType, nullptr, &elementIndex, Index,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00001890 StructuredList, StructuredIndex, true,
1891 false)) {
Douglas Gregord7fb85e2009-01-22 23:26:18 +00001892 hadError = true;
1893 continue;
1894 }
1895
Douglas Gregor033d1252009-01-23 16:54:12 +00001896 if (elementIndex.getBitWidth() > maxElements.getBitWidth())
Jay Foad6d4db0c2010-12-07 08:25:34 +00001897 maxElements = maxElements.extend(elementIndex.getBitWidth());
Douglas Gregor033d1252009-01-23 16:54:12 +00001898 else if (elementIndex.getBitWidth() < maxElements.getBitWidth())
Jay Foad6d4db0c2010-12-07 08:25:34 +00001899 elementIndex = elementIndex.extend(maxElements.getBitWidth());
Douglas Gregor583cf0a2009-01-23 18:58:42 +00001900 elementIndex.setIsUnsigned(maxElements.isUnsigned());
Douglas Gregor033d1252009-01-23 16:54:12 +00001901
Douglas Gregord7fb85e2009-01-22 23:26:18 +00001902 // If the array is of incomplete type, keep track of the number of
1903 // elements in the initializer.
1904 if (!maxElementsKnown && elementIndex > maxElements)
1905 maxElements = elementIndex;
1906
Douglas Gregore4a0bb72009-01-22 00:58:24 +00001907 continue;
1908 }
1909
1910 // If we know the maximum number of elements, and we've already
1911 // hit it, stop consuming elements in the initializer list.
1912 if (maxElementsKnown && elementIndex == maxElements)
Steve Narofff8ecff22008-05-01 22:18:59 +00001913 break;
Douglas Gregore4a0bb72009-01-22 00:58:24 +00001914
Anders Carlsson6cabf312010-01-23 23:23:01 +00001915 InitializedEntity ElementEntity =
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00001916 InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex,
Anders Carlsson6cabf312010-01-23 23:23:01 +00001917 Entity);
1918 // Check this element.
1919 CheckSubElementType(ElementEntity, IList, elementType, Index,
1920 StructuredList, StructuredIndex);
Douglas Gregore4a0bb72009-01-22 00:58:24 +00001921 ++elementIndex;
1922
1923 // If the array is of incomplete type, keep track of the number of
1924 // elements in the initializer.
1925 if (!maxElementsKnown && elementIndex > maxElements)
1926 maxElements = elementIndex;
Steve Narofff8ecff22008-05-01 22:18:59 +00001927 }
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001928 if (!hadError && DeclType->isIncompleteArrayType() && !VerifyOnly) {
Steve Narofff8ecff22008-05-01 22:18:59 +00001929 // If this is an incomplete array type, the actual type needs to
Daniel Dunbaraa64b7e2008-08-18 20:28:46 +00001930 // be calculated here.
Douglas Gregor583cf0a2009-01-23 18:58:42 +00001931 llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned());
Richard Smith73edb6d2017-01-24 23:18:28 +00001932 if (maxElements == Zero && !Entity.isVariableLengthArrayNew()) {
Daniel Dunbaraa64b7e2008-08-18 20:28:46 +00001933 // Sizing an array implicitly to zero is not allowed by ISO C,
1934 // but is supported by GNU.
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001935 SemaRef.Diag(IList->getBeginLoc(), diag::ext_typecheck_zero_array_size);
Steve Narofff8ecff22008-05-01 22:18:59 +00001936 }
Daniel Dunbaraa64b7e2008-08-18 20:28:46 +00001937
Mike Stump11289f42009-09-09 15:08:12 +00001938 DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements,
Daniel Dunbaraa64b7e2008-08-18 20:28:46 +00001939 ArrayType::Normal, 0);
Steve Narofff8ecff22008-05-01 22:18:59 +00001940 }
Richard Smithcd839cc2019-08-29 22:49:34 +00001941 if (!hadError) {
Richard Smith0511d232016-10-05 22:41:02 +00001942 // If there are any members of the array that get value-initialized, check
1943 // that is possible. That happens if we know the bound and don't have
1944 // enough elements, or if we're performing an array new with an unknown
1945 // bound.
Richard Smith0511d232016-10-05 22:41:02 +00001946 if ((maxElementsKnown && elementIndex < maxElements) ||
1947 Entity.isVariableLengthArrayNew())
Stephen Kelly1c301dc2018-08-09 21:09:38 +00001948 CheckEmptyInitializable(
1949 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity),
1950 IList->getEndLoc());
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00001951 }
Steve Narofff8ecff22008-05-01 22:18:59 +00001952}
1953
Eli Friedman3fa64df2011-08-23 22:24:57 +00001954bool InitListChecker::CheckFlexibleArrayInit(const InitializedEntity &Entity,
1955 Expr *InitExpr,
1956 FieldDecl *Field,
1957 bool TopLevelObject) {
1958 // Handle GNU flexible array initializers.
1959 unsigned FlexArrayDiag;
1960 if (isa<InitListExpr>(InitExpr) &&
1961 cast<InitListExpr>(InitExpr)->getNumInits() == 0) {
1962 // Empty flexible array init always allowed as an extension
1963 FlexArrayDiag = diag::ext_flexible_array_init;
David Blaikiebbafb8a2012-03-11 07:00:24 +00001964 } else if (SemaRef.getLangOpts().CPlusPlus) {
Eli Friedman3fa64df2011-08-23 22:24:57 +00001965 // Disallow flexible array init in C++; it is not required for gcc
1966 // compatibility, and it needs work to IRGen correctly in general.
1967 FlexArrayDiag = diag::err_flexible_array_init;
1968 } else if (!TopLevelObject) {
1969 // Disallow flexible array init on non-top-level object
1970 FlexArrayDiag = diag::err_flexible_array_init;
1971 } else if (Entity.getKind() != InitializedEntity::EK_Variable) {
1972 // Disallow flexible array init on anything which is not a variable.
1973 FlexArrayDiag = diag::err_flexible_array_init;
1974 } else if (cast<VarDecl>(Entity.getDecl())->hasLocalStorage()) {
1975 // Disallow flexible array init on local variables.
1976 FlexArrayDiag = diag::err_flexible_array_init;
1977 } else {
1978 // Allow other cases.
1979 FlexArrayDiag = diag::ext_flexible_array_init;
1980 }
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001981
1982 if (!VerifyOnly) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00001983 SemaRef.Diag(InitExpr->getBeginLoc(), FlexArrayDiag)
1984 << InitExpr->getBeginLoc();
Sebastian Redlb49c46c2011-09-24 17:48:00 +00001985 SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
1986 << Field;
1987 }
Eli Friedman3fa64df2011-08-23 22:24:57 +00001988
1989 return FlexArrayDiag != diag::ext_flexible_array_init;
1990}
1991
Richard Smith872307e2016-03-08 22:17:41 +00001992void InitListChecker::CheckStructUnionTypes(
1993 const InitializedEntity &Entity, InitListExpr *IList, QualType DeclType,
1994 CXXRecordDecl::base_class_range Bases, RecordDecl::field_iterator Field,
1995 bool SubobjectIsDesignatorContext, unsigned &Index,
1996 InitListExpr *StructuredList, unsigned &StructuredIndex,
1997 bool TopLevelObject) {
1998 RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl();
Mike Stump11289f42009-09-09 15:08:12 +00001999
Eli Friedman23a9e312008-05-19 19:16:24 +00002000 // If the record is invalid, some of it's members are invalid. To avoid
2001 // confusion, we forgo checking the intializer for the entire record.
2002 if (structDecl->isInvalidDecl()) {
Richard Smith845aa662012-09-28 21:23:50 +00002003 // Assume it was supposed to consume a single initializer.
2004 ++Index;
Eli Friedman23a9e312008-05-19 19:16:24 +00002005 hadError = true;
2006 return;
Mike Stump11289f42009-09-09 15:08:12 +00002007 }
Douglas Gregor0202cb42009-01-29 17:44:32 +00002008
2009 if (DeclType->isUnionType() && IList->getNumInits() == 0) {
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00002010 RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl();
Richard Smith852c9db2013-04-20 22:23:05 +00002011
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002012 if (!VerifyOnly)
2013 for (FieldDecl *FD : RD->fields()) {
2014 QualType ET = SemaRef.Context.getBaseElementType(FD->getType());
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +00002015 if (checkDestructorReference(ET, IList->getEndLoc(), SemaRef)) {
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002016 hadError = true;
2017 return;
2018 }
2019 }
2020
Richard Smith852c9db2013-04-20 22:23:05 +00002021 // If there's a default initializer, use it.
Richard Smith50309282019-08-30 22:52:55 +00002022 if (isa<CXXRecordDecl>(RD) &&
2023 cast<CXXRecordDecl>(RD)->hasInClassInitializer()) {
Richard Smithcd839cc2019-08-29 22:49:34 +00002024 if (!StructuredList)
Richard Smith852c9db2013-04-20 22:23:05 +00002025 return;
2026 for (RecordDecl::field_iterator FieldEnd = RD->field_end();
2027 Field != FieldEnd; ++Field) {
2028 if (Field->hasInClassInitializer()) {
2029 StructuredList->setInitializedFieldInUnion(*Field);
2030 // FIXME: Actually build a CXXDefaultInitExpr?
2031 return;
2032 }
2033 }
2034 }
2035
Reid Kleckner6d829bd2014-11-12 21:30:23 +00002036 // Value-initialize the first member of the union that isn't an unnamed
2037 // bitfield.
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00002038 for (RecordDecl::field_iterator FieldEnd = RD->field_end();
2039 Field != FieldEnd; ++Field) {
Reid Kleckner6d829bd2014-11-12 21:30:23 +00002040 if (!Field->isUnnamedBitfield()) {
Richard Smithcd839cc2019-08-29 22:49:34 +00002041 CheckEmptyInitializable(
2042 InitializedEntity::InitializeMember(*Field, &Entity),
2043 IList->getEndLoc());
2044 if (StructuredList)
David Blaikie40ed2972012-06-06 20:45:41 +00002045 StructuredList->setInitializedFieldInUnion(*Field);
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00002046 break;
Douglas Gregor0202cb42009-01-29 17:44:32 +00002047 }
2048 }
2049 return;
2050 }
2051
Richard Smith872307e2016-03-08 22:17:41 +00002052 bool InitializedSomething = false;
2053
2054 // If we have any base classes, they are initialized prior to the fields.
2055 for (auto &Base : Bases) {
2056 Expr *Init = Index < IList->getNumInits() ? IList->getInit(Index) : nullptr;
Richard Smith872307e2016-03-08 22:17:41 +00002057
2058 // Designated inits always initialize fields, so if we see one, all
2059 // remaining base classes have no explicit initializer.
2060 if (Init && isa<DesignatedInitExpr>(Init))
2061 Init = nullptr;
2062
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002063 SourceLocation InitLoc = Init ? Init->getBeginLoc() : IList->getEndLoc();
Richard Smith872307e2016-03-08 22:17:41 +00002064 InitializedEntity BaseEntity = InitializedEntity::InitializeBase(
2065 SemaRef.Context, &Base, false, &Entity);
2066 if (Init) {
2067 CheckSubElementType(BaseEntity, IList, Base.getType(), Index,
2068 StructuredList, StructuredIndex);
2069 InitializedSomething = true;
Richard Smithcd839cc2019-08-29 22:49:34 +00002070 } else {
Richard Smith872307e2016-03-08 22:17:41 +00002071 CheckEmptyInitializable(BaseEntity, InitLoc);
2072 }
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002073
2074 if (!VerifyOnly)
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +00002075 if (checkDestructorReference(Base.getType(), InitLoc, SemaRef)) {
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002076 hadError = true;
2077 return;
2078 }
Richard Smith872307e2016-03-08 22:17:41 +00002079 }
2080
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002081 // If structDecl is a forward declaration, this loop won't do
2082 // anything except look at designated initializers; That's okay,
2083 // because an error should get printed out elsewhere. It might be
2084 // worthwhile to skip over the rest of the initializer, though.
Ted Kremenekc23c7e62009-07-29 21:53:49 +00002085 RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl();
Argyrios Kyrtzidiscfbfe782009-06-30 02:36:12 +00002086 RecordDecl::field_iterator FieldEnd = RD->field_end();
Daniel Marjamaki817a3bf2017-09-29 09:44:41 +00002087 bool CheckForMissingFields =
2088 !IList->isIdiomaticZeroInitializer(SemaRef.getLangOpts());
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002089 bool HasDesignatedInit = false;
Daniel Marjamaki817a3bf2017-09-29 09:44:41 +00002090
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002091 while (Index < IList->getNumInits()) {
2092 Expr *Init = IList->getInit(Index);
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002093 SourceLocation InitLoc = Init->getBeginLoc();
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002094
2095 if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) {
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002096 // If we're not the subobject that matches up with the '{' for
2097 // the designator, we shouldn't be handling the
2098 // designator. Return immediately.
2099 if (!SubobjectIsDesignatorContext)
2100 return;
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002101
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002102 HasDesignatedInit = true;
2103
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002104 // Handle this designated initializer. Field will be updated to
2105 // the next field that we'll be initializing.
Anders Carlsson3fa93b72010-01-23 22:49:02 +00002106 if (CheckDesignatedInitializer(Entity, IList, DIE, 0,
Craig Topperc3ec1492014-05-26 06:22:03 +00002107 DeclType, &Field, nullptr, Index,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002108 StructuredList, StructuredIndex,
2109 true, TopLevelObject))
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002110 hadError = true;
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002111 else if (!VerifyOnly) {
2112 // Find the field named by the designated initializer.
2113 RecordDecl::field_iterator F = RD->field_begin();
2114 while (std::next(F) != Field)
2115 ++F;
2116 QualType ET = SemaRef.Context.getBaseElementType(F->getType());
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +00002117 if (checkDestructorReference(ET, InitLoc, SemaRef)) {
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002118 hadError = true;
2119 return;
2120 }
2121 }
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002122
Douglas Gregora9add4e2009-02-12 19:00:39 +00002123 InitializedSomething = true;
John McCalle40b58e2010-03-11 19:32:38 +00002124
2125 // Disable check for missing fields when designators are used.
2126 // This matches gcc behaviour.
2127 CheckForMissingFields = false;
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002128 continue;
2129 }
2130
2131 if (Field == FieldEnd) {
2132 // We've run out of fields. We're done.
2133 break;
2134 }
2135
Douglas Gregora9add4e2009-02-12 19:00:39 +00002136 // We've already initialized a member of a union. We're done.
2137 if (InitializedSomething && DeclType->isUnionType())
2138 break;
2139
Douglas Gregor91f84212008-12-11 16:49:14 +00002140 // If we've hit the flexible array member at the end, we're done.
2141 if (Field->getType()->isIncompleteArrayType())
2142 break;
2143
Douglas Gregor51695702009-01-29 16:53:55 +00002144 if (Field->isUnnamedBitfield()) {
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002145 // Don't initialize unnamed bitfields, e.g. "int : 20;"
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002146 ++Field;
Eli Friedman23a9e312008-05-19 19:16:24 +00002147 continue;
Steve Narofff8ecff22008-05-01 22:18:59 +00002148 }
Douglas Gregor91f84212008-12-11 16:49:14 +00002149
Douglas Gregora82064c2011-06-29 21:51:31 +00002150 // Make sure we can use this declaration.
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002151 bool InvalidUse;
2152 if (VerifyOnly)
Manman Ren073db022016-03-10 18:53:19 +00002153 InvalidUse = !SemaRef.CanUseDecl(*Field, TreatUnavailableAsInvalid);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002154 else
Stephen Kellyf2ceec42018-08-09 21:08:08 +00002155 InvalidUse = SemaRef.DiagnoseUseOfDecl(
2156 *Field, IList->getInit(Index)->getBeginLoc());
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002157 if (InvalidUse) {
Douglas Gregora82064c2011-06-29 21:51:31 +00002158 ++Index;
2159 ++Field;
2160 hadError = true;
2161 continue;
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002162 }
Douglas Gregora82064c2011-06-29 21:51:31 +00002163
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002164 if (!VerifyOnly) {
2165 QualType ET = SemaRef.Context.getBaseElementType(Field->getType());
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +00002166 if (checkDestructorReference(ET, InitLoc, SemaRef)) {
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002167 hadError = true;
2168 return;
2169 }
2170 }
2171
Anders Carlsson6cabf312010-01-23 23:23:01 +00002172 InitializedEntity MemberEntity =
David Blaikie40ed2972012-06-06 20:45:41 +00002173 InitializedEntity::InitializeMember(*Field, &Entity);
Anders Carlsson6cabf312010-01-23 23:23:01 +00002174 CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
2175 StructuredList, StructuredIndex);
Douglas Gregora9add4e2009-02-12 19:00:39 +00002176 InitializedSomething = true;
Douglas Gregor51695702009-01-29 16:53:55 +00002177
Richard Smithcd839cc2019-08-29 22:49:34 +00002178 if (DeclType->isUnionType() && StructuredList) {
Douglas Gregor51695702009-01-29 16:53:55 +00002179 // Initialize the first field within the union.
David Blaikie40ed2972012-06-06 20:45:41 +00002180 StructuredList->setInitializedFieldInUnion(*Field);
Douglas Gregor51695702009-01-29 16:53:55 +00002181 }
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002182
2183 ++Field;
Steve Narofff8ecff22008-05-01 22:18:59 +00002184 }
Douglas Gregor91f84212008-12-11 16:49:14 +00002185
John McCalle40b58e2010-03-11 19:32:38 +00002186 // Emit warnings for missing struct field initializers.
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002187 if (!VerifyOnly && InitializedSomething && CheckForMissingFields &&
2188 Field != FieldEnd && !Field->getType()->isIncompleteArrayType() &&
2189 !DeclType->isUnionType()) {
John McCalle40b58e2010-03-11 19:32:38 +00002190 // It is possible we have one or more unnamed bitfields remaining.
2191 // Find first (if any) named field and emit warning.
2192 for (RecordDecl::field_iterator it = Field, end = RD->field_end();
2193 it != end; ++it) {
Richard Smith852c9db2013-04-20 22:23:05 +00002194 if (!it->isUnnamedBitfield() && !it->hasInClassInitializer()) {
John McCalle40b58e2010-03-11 19:32:38 +00002195 SemaRef.Diag(IList->getSourceRange().getEnd(),
Aaron Ballmanb9bb2012014-01-03 14:54:10 +00002196 diag::warn_missing_field_initializers) << *it;
John McCalle40b58e2010-03-11 19:32:38 +00002197 break;
2198 }
2199 }
2200 }
2201
Richard Smithcd839cc2019-08-29 22:49:34 +00002202 // Check that any remaining fields can be value-initialized if we're not
2203 // building a structured list. (If we are, we'll check this later.)
2204 if (!StructuredList && Field != FieldEnd && !DeclType->isUnionType() &&
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00002205 !Field->getType()->isIncompleteArrayType()) {
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00002206 for (; Field != FieldEnd && !hadError; ++Field) {
Richard Smith852c9db2013-04-20 22:23:05 +00002207 if (!Field->isUnnamedBitfield() && !Field->hasInClassInitializer())
Richard Smith454a7cd2014-06-03 08:26:00 +00002208 CheckEmptyInitializable(
2209 InitializedEntity::InitializeMember(*Field, &Entity),
Stephen Kelly1c301dc2018-08-09 21:09:38 +00002210 IList->getEndLoc());
Sebastian Redl2b47b7a2011-10-16 18:19:20 +00002211 }
2212 }
2213
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002214 // Check that the types of the remaining fields have accessible destructors.
2215 if (!VerifyOnly) {
2216 // If the initializer expression has a designated initializer, check the
2217 // elements for which a designated initializer is not provided too.
2218 RecordDecl::field_iterator I = HasDesignatedInit ? RD->field_begin()
2219 : Field;
2220 for (RecordDecl::field_iterator E = RD->field_end(); I != E; ++I) {
2221 QualType ET = SemaRef.Context.getBaseElementType(I->getType());
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +00002222 if (checkDestructorReference(ET, IList->getEndLoc(), SemaRef)) {
Akira Hatanaka2ccb3192018-09-07 02:38:01 +00002223 hadError = true;
2224 return;
2225 }
2226 }
2227 }
2228
Mike Stump11289f42009-09-09 15:08:12 +00002229 if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() ||
Douglas Gregor07d8e3a2009-03-20 00:32:56 +00002230 Index >= IList->getNumInits())
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002231 return;
2232
David Blaikie40ed2972012-06-06 20:45:41 +00002233 if (CheckFlexibleArrayInit(Entity, IList->getInit(Index), *Field,
Eli Friedman3fa64df2011-08-23 22:24:57 +00002234 TopLevelObject)) {
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002235 hadError = true;
Douglas Gregor07d8e3a2009-03-20 00:32:56 +00002236 ++Index;
2237 return;
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002238 }
2239
Anders Carlsson6cabf312010-01-23 23:23:01 +00002240 InitializedEntity MemberEntity =
David Blaikie40ed2972012-06-06 20:45:41 +00002241 InitializedEntity::InitializeMember(*Field, &Entity);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00002242
Anders Carlsson6cabf312010-01-23 23:23:01 +00002243 if (isa<InitListExpr>(IList->getInit(Index)))
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00002244 CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
Anders Carlsson6cabf312010-01-23 23:23:01 +00002245 StructuredList, StructuredIndex);
2246 else
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00002247 CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index,
Anders Carlssondbb25a32010-01-23 20:47:59 +00002248 StructuredList, StructuredIndex);
Steve Narofff8ecff22008-05-01 22:18:59 +00002249}
Steve Narofff8ecff22008-05-01 22:18:59 +00002250
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00002251/// Expand a field designator that refers to a member of an
Douglas Gregord5846a12009-04-15 06:41:24 +00002252/// anonymous struct or union into a series of field designators that
2253/// refers to the field within the appropriate subobject.
2254///
Douglas Gregord5846a12009-04-15 06:41:24 +00002255static void ExpandAnonymousFieldDesignator(Sema &SemaRef,
Mike Stump11289f42009-09-09 15:08:12 +00002256 DesignatedInitExpr *DIE,
2257 unsigned DesigIdx,
Francois Pichetf3e5b4e2010-12-22 03:46:10 +00002258 IndirectFieldDecl *IndirectField) {
Douglas Gregord5846a12009-04-15 06:41:24 +00002259 typedef DesignatedInitExpr::Designator Designator;
2260
Douglas Gregord5846a12009-04-15 06:41:24 +00002261 // Build the replacement designators.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002262 SmallVector<Designator, 4> Replacements;
Francois Pichetf3e5b4e2010-12-22 03:46:10 +00002263 for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(),
2264 PE = IndirectField->chain_end(); PI != PE; ++PI) {
2265 if (PI + 1 == PE)
Craig Topperc3ec1492014-05-26 06:22:03 +00002266 Replacements.push_back(Designator((IdentifierInfo *)nullptr,
Douglas Gregord5846a12009-04-15 06:41:24 +00002267 DIE->getDesignator(DesigIdx)->getDotLoc(),
2268 DIE->getDesignator(DesigIdx)->getFieldLoc()));
2269 else
Craig Topperc3ec1492014-05-26 06:22:03 +00002270 Replacements.push_back(Designator((IdentifierInfo *)nullptr,
2271 SourceLocation(), SourceLocation()));
Francois Pichetf3e5b4e2010-12-22 03:46:10 +00002272 assert(isa<FieldDecl>(*PI));
2273 Replacements.back().setField(cast<FieldDecl>(*PI));
Douglas Gregord5846a12009-04-15 06:41:24 +00002274 }
2275
2276 // Expand the current designator into the set of replacement
2277 // designators, so we have a full subobject path down to where the
2278 // member of the anonymous struct/union is actually stored.
Douglas Gregor03e8bdc2010-01-06 23:17:19 +00002279 DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0],
Douglas Gregord5846a12009-04-15 06:41:24 +00002280 &Replacements[0] + Replacements.size());
Francois Pichetf3e5b4e2010-12-22 03:46:10 +00002281}
Mike Stump11289f42009-09-09 15:08:12 +00002282
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002283static DesignatedInitExpr *CloneDesignatedInitExpr(Sema &SemaRef,
2284 DesignatedInitExpr *DIE) {
2285 unsigned NumIndexExprs = DIE->getNumSubExprs() - 1;
2286 SmallVector<Expr*, 4> IndexExprs(NumIndexExprs);
2287 for (unsigned I = 0; I < NumIndexExprs; ++I)
2288 IndexExprs[I] = DIE->getSubExpr(I + 1);
David Majnemerf7e36092016-06-23 00:15:04 +00002289 return DesignatedInitExpr::Create(SemaRef.Context, DIE->designators(),
2290 IndexExprs,
Benjamin Kramerc215e762012-08-24 11:54:20 +00002291 DIE->getEqualOrColonLoc(),
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002292 DIE->usesGNUSyntax(), DIE->getInit());
2293}
2294
Kaelyn Uhrainb02c5e92012-01-12 19:27:05 +00002295namespace {
2296
2297// Callback to only accept typo corrections that are for field members of
2298// the given struct or union.
Bruno Ricci70ad3962019-03-25 17:08:51 +00002299class FieldInitializerValidatorCCC final : public CorrectionCandidateCallback {
Kaelyn Uhrainb02c5e92012-01-12 19:27:05 +00002300 public:
2301 explicit FieldInitializerValidatorCCC(RecordDecl *RD)
2302 : Record(RD) {}
2303
Craig Toppere14c0f82014-03-12 04:55:44 +00002304 bool ValidateCandidate(const TypoCorrection &candidate) override {
Kaelyn Uhrainb02c5e92012-01-12 19:27:05 +00002305 FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>();
2306 return FD && FD->getDeclContext()->getRedeclContext()->Equals(Record);
2307 }
2308
Bruno Ricci70ad3962019-03-25 17:08:51 +00002309 std::unique_ptr<CorrectionCandidateCallback> clone() override {
Jonas Devlieghere2b3d49b2019-08-14 23:04:18 +00002310 return std::make_unique<FieldInitializerValidatorCCC>(*this);
Bruno Ricci70ad3962019-03-25 17:08:51 +00002311 }
2312
Kaelyn Uhrainb02c5e92012-01-12 19:27:05 +00002313 private:
2314 RecordDecl *Record;
2315};
2316
Eugene Zelenko1ced5092016-02-12 22:53:10 +00002317} // end anonymous namespace
Kaelyn Uhrainb02c5e92012-01-12 19:27:05 +00002318
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00002319/// Check the well-formedness of a C99 designated initializer.
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002320///
2321/// Determines whether the designated initializer @p DIE, which
2322/// resides at the given @p Index within the initializer list @p
2323/// IList, is well-formed for a current object of type @p DeclType
2324/// (C99 6.7.8). The actual subobject that this designator refers to
Mike Stump11289f42009-09-09 15:08:12 +00002325/// within the current subobject is returned in either
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002326/// @p NextField or @p NextElementIndex (whichever is appropriate).
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002327///
2328/// @param IList The initializer list in which this designated
2329/// initializer occurs.
2330///
Douglas Gregora5324162009-04-15 04:56:10 +00002331/// @param DIE The designated initializer expression.
2332///
2333/// @param DesigIdx The index of the current designator.
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002334///
Dmitri Gribenkoadba9be2012-08-23 17:58:28 +00002335/// @param CurrentObjectType The type of the "current object" (C99 6.7.8p17),
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002336/// into which the designation in @p DIE should refer.
2337///
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002338/// @param NextField If non-NULL and the first designator in @p DIE is
2339/// a field, this will be set to the field declaration corresponding
Richard Smith50309282019-08-30 22:52:55 +00002340/// to the field named by the designator. On input, this is expected to be
2341/// the next field that would be initialized in the absence of designation,
2342/// if the complete object being initialized is a struct.
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002343///
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002344/// @param NextElementIndex If non-NULL and the first designator in @p
2345/// DIE is an array designator or GNU array-range designator, this
2346/// will be set to the last index initialized by this designator.
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002347///
2348/// @param Index Index into @p IList where the designated initializer
2349/// @p DIE occurs.
2350///
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002351/// @param StructuredList The initializer list expression that
2352/// describes all of the subobject initializers in the order they'll
2353/// actually be initialized.
2354///
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002355/// @returns true if there was an error, false otherwise.
Mike Stump11289f42009-09-09 15:08:12 +00002356bool
Anders Carlsson6cabf312010-01-23 23:23:01 +00002357InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
Anders Carlsson3fa93b72010-01-23 22:49:02 +00002358 InitListExpr *IList,
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002359 DesignatedInitExpr *DIE,
2360 unsigned DesigIdx,
2361 QualType &CurrentObjectType,
2362 RecordDecl::field_iterator *NextField,
2363 llvm::APSInt *NextElementIndex,
2364 unsigned &Index,
2365 InitListExpr *StructuredList,
2366 unsigned &StructuredIndex,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002367 bool FinishSubobjectInit,
2368 bool TopLevelObject) {
Douglas Gregora5324162009-04-15 04:56:10 +00002369 if (DesigIdx == DIE->size()) {
Richard Smithff9bf922019-08-31 01:00:37 +00002370 // C++20 designated initialization can result in direct-list-initialization
2371 // of the designated subobject. This is the only way that we can end up
2372 // performing direct initialization as part of aggregate initialization, so
2373 // it needs special handling.
2374 if (DIE->isDirectInit()) {
2375 Expr *Init = DIE->getInit();
2376 assert(isa<InitListExpr>(Init) &&
2377 "designator result in direct non-list initialization?");
2378 InitializationKind Kind = InitializationKind::CreateDirectList(
2379 DIE->getBeginLoc(), Init->getBeginLoc(), Init->getEndLoc());
2380 InitializationSequence Seq(SemaRef, Entity, Kind, Init,
2381 /*TopLevelOfInitList*/ true);
2382 if (StructuredList) {
2383 ExprResult Result = VerifyOnly
2384 ? getDummyInit()
2385 : Seq.Perform(SemaRef, Entity, Kind, Init);
2386 UpdateStructuredListElement(StructuredList, StructuredIndex,
2387 Result.get());
2388 }
2389 ++Index;
2390 return !Seq;
2391 }
2392
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002393 // Check the actual initialization for the designated object type.
2394 bool prevHadError = hadError;
Douglas Gregorf6d27522009-01-29 00:39:20 +00002395
2396 // Temporarily remove the designator expression from the
2397 // initializer list that the child calls see, so that we don't try
2398 // to re-process the designator.
2399 unsigned OldIndex = Index;
2400 IList->setInit(OldIndex, DIE->getInit());
2401
Anders Carlsson3fa93b72010-01-23 22:49:02 +00002402 CheckSubElementType(Entity, IList, CurrentObjectType, Index,
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002403 StructuredList, StructuredIndex);
Douglas Gregorf6d27522009-01-29 00:39:20 +00002404
2405 // Restore the designated initializer expression in the syntactic
2406 // form of the initializer list.
2407 if (IList->getInit(OldIndex) != DIE->getInit())
2408 DIE->setInit(IList->getInit(OldIndex));
2409 IList->setInit(OldIndex, DIE);
2410
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002411 return hadError && !prevHadError;
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002412 }
2413
Douglas Gregora5324162009-04-15 04:56:10 +00002414 DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002415 bool IsFirstDesignator = (DesigIdx == 0);
Richard Smithcd839cc2019-08-29 22:49:34 +00002416 if (IsFirstDesignator ? FullyStructuredList : StructuredList) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002417 // Determine the structural initializer list that corresponds to the
2418 // current subobject.
Yunzhong Gaocb779302015-06-10 00:27:52 +00002419 if (IsFirstDesignator)
Richard Smith33e9be62019-08-29 22:49:33 +00002420 StructuredList = FullyStructuredList;
Yunzhong Gaocb779302015-06-10 00:27:52 +00002421 else {
2422 Expr *ExistingInit = StructuredIndex < StructuredList->getNumInits() ?
2423 StructuredList->getInit(StructuredIndex) : nullptr;
2424 if (!ExistingInit && StructuredList->hasArrayFiller())
2425 ExistingInit = StructuredList->getArrayFiller();
2426
2427 if (!ExistingInit)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00002428 StructuredList = getStructuredSubobjectInit(
2429 IList, Index, CurrentObjectType, StructuredList, StructuredIndex,
Stephen Kelly1c301dc2018-08-09 21:09:38 +00002430 SourceRange(D->getBeginLoc(), DIE->getEndLoc()));
Yunzhong Gaocb779302015-06-10 00:27:52 +00002431 else if (InitListExpr *Result = dyn_cast<InitListExpr>(ExistingInit))
2432 StructuredList = Result;
Richard Smith50309282019-08-30 22:52:55 +00002433 else {
2434 // We are creating an initializer list that initializes the
2435 // subobjects of the current object, but there was already an
2436 // initialization that completely initialized the current
2437 // subobject, e.g., by a compound literal:
Yunzhong Gaocb779302015-06-10 00:27:52 +00002438 //
Richard Smith50309282019-08-30 22:52:55 +00002439 // struct X { int a, b; };
2440 // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 };
Yunzhong Gaocb779302015-06-10 00:27:52 +00002441 //
Richard Smith50309282019-08-30 22:52:55 +00002442 // Here, xs[0].a == 1 and xs[0].b == 3, since the second,
2443 // designated initializer re-initializes only its current object
2444 // subobject [0].b.
2445 diagnoseInitOverride(ExistingInit,
2446 SourceRange(D->getBeginLoc(), DIE->getEndLoc()),
2447 /*FullyOverwritten=*/false);
Fangrui Song6907ce22018-07-30 19:24:48 +00002448
Richard Smith50309282019-08-30 22:52:55 +00002449 if (!VerifyOnly) {
2450 if (DesignatedInitUpdateExpr *E =
2451 dyn_cast<DesignatedInitUpdateExpr>(ExistingInit))
2452 StructuredList = E->getUpdater();
2453 else {
2454 DesignatedInitUpdateExpr *DIUE = new (SemaRef.Context)
2455 DesignatedInitUpdateExpr(SemaRef.Context, D->getBeginLoc(),
2456 ExistingInit, DIE->getEndLoc());
2457 StructuredList->updateInit(SemaRef.Context, StructuredIndex, DIUE);
2458 StructuredList = DIUE->getUpdater();
2459 }
2460 } else {
2461 // We don't need to track the structured representation of a
2462 // designated init update of an already-fully-initialized object in
2463 // verify-only mode. The only reason we would need the structure is
2464 // to determine where the uninitialized "holes" are, and in this
2465 // case, we know there aren't any and we can't introduce any.
2466 StructuredList = nullptr;
Yunzhong Gaocb779302015-06-10 00:27:52 +00002467 }
2468 }
2469 }
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002470 }
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002471
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002472 if (D->isFieldDesignator()) {
2473 // C99 6.7.8p7:
2474 //
2475 // If a designator has the form
2476 //
2477 // . identifier
2478 //
2479 // then the current object (defined below) shall have
2480 // structure or union type and the identifier shall be the
Mike Stump11289f42009-09-09 15:08:12 +00002481 // name of a member of that type.
Ted Kremenekc23c7e62009-07-29 21:53:49 +00002482 const RecordType *RT = CurrentObjectType->getAs<RecordType>();
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002483 if (!RT) {
2484 SourceLocation Loc = D->getDotLoc();
2485 if (Loc.isInvalid())
2486 Loc = D->getFieldLoc();
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002487 if (!VerifyOnly)
2488 SemaRef.Diag(Loc, diag::err_field_designator_non_aggr)
David Blaikiebbafb8a2012-03-11 07:00:24 +00002489 << SemaRef.getLangOpts().CPlusPlus << CurrentObjectType;
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002490 ++Index;
2491 return true;
2492 }
2493
Douglas Gregord5846a12009-04-15 06:41:24 +00002494 FieldDecl *KnownField = D->getField();
David Majnemer36ef8982014-08-11 18:33:59 +00002495 if (!KnownField) {
2496 IdentifierInfo *FieldName = D->getFieldName();
2497 DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName);
2498 for (NamedDecl *ND : Lookup) {
2499 if (auto *FD = dyn_cast<FieldDecl>(ND)) {
2500 KnownField = FD;
2501 break;
2502 }
2503 if (auto *IFD = dyn_cast<IndirectFieldDecl>(ND)) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002504 // In verify mode, don't modify the original.
2505 if (VerifyOnly)
2506 DIE = CloneDesignatedInitExpr(SemaRef, DIE);
David Majnemer36ef8982014-08-11 18:33:59 +00002507 ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IFD);
Francois Pichetf3e5b4e2010-12-22 03:46:10 +00002508 D = DIE->getDesignator(DesigIdx);
David Majnemer36ef8982014-08-11 18:33:59 +00002509 KnownField = cast<FieldDecl>(*IFD->chain_begin());
Francois Pichetf3e5b4e2010-12-22 03:46:10 +00002510 break;
2511 }
2512 }
David Majnemer36ef8982014-08-11 18:33:59 +00002513 if (!KnownField) {
2514 if (VerifyOnly) {
2515 ++Index;
2516 return true; // No typo correction when just trying this out.
2517 }
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002518
David Majnemer36ef8982014-08-11 18:33:59 +00002519 // Name lookup found something, but it wasn't a field.
2520 if (!Lookup.empty()) {
2521 SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield)
2522 << FieldName;
2523 SemaRef.Diag(Lookup.front()->getLocation(),
2524 diag::note_field_designator_found);
2525 ++Index;
2526 return true;
2527 }
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002528
David Majnemer36ef8982014-08-11 18:33:59 +00002529 // Name lookup didn't find anything.
2530 // Determine whether this was a typo for another field name.
Bruno Ricci70ad3962019-03-25 17:08:51 +00002531 FieldInitializerValidatorCCC CCC(RT->getDecl());
Richard Smithf9b15102013-08-17 00:46:16 +00002532 if (TypoCorrection Corrected = SemaRef.CorrectTypo(
2533 DeclarationNameInfo(FieldName, D->getFieldLoc()),
Bruno Ricci70ad3962019-03-25 17:08:51 +00002534 Sema::LookupMemberName, /*Scope=*/nullptr, /*SS=*/nullptr, CCC,
Kaelyn Takata89c881b2014-10-27 18:07:29 +00002535 Sema::CTK_ErrorRecovery, RT->getDecl())) {
Richard Smithf9b15102013-08-17 00:46:16 +00002536 SemaRef.diagnoseTypo(
2537 Corrected,
2538 SemaRef.PDiag(diag::err_field_designator_unknown_suggest)
David Majnemer36ef8982014-08-11 18:33:59 +00002539 << FieldName << CurrentObjectType);
2540 KnownField = Corrected.getCorrectionDeclAs<FieldDecl>();
Benjamin Kramerafe718f2011-09-25 02:41:26 +00002541 hadError = true;
Douglas Gregor4e0299b2010-01-01 00:03:05 +00002542 } else {
David Majnemer36ef8982014-08-11 18:33:59 +00002543 // Typo correction didn't find anything.
Douglas Gregor4e0299b2010-01-01 00:03:05 +00002544 SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown)
2545 << FieldName << CurrentObjectType;
2546 ++Index;
2547 return true;
2548 }
Douglas Gregor4e0299b2010-01-01 00:03:05 +00002549 }
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002550 }
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002551
Richard Smith50309282019-08-30 22:52:55 +00002552 unsigned NumBases = 0;
Akira Hatanaka8eccb9b2017-01-17 19:35:54 +00002553 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
Richard Smith50309282019-08-30 22:52:55 +00002554 NumBases = CXXRD->getNumBases();
2555
2556 unsigned FieldIndex = NumBases;
Akira Hatanaka8eccb9b2017-01-17 19:35:54 +00002557
David Majnemer58e4ea92014-08-23 01:48:50 +00002558 for (auto *FI : RT->getDecl()->fields()) {
2559 if (FI->isUnnamedBitfield())
2560 continue;
Richard Smithfe1bc702016-04-08 19:57:40 +00002561 if (declaresSameEntity(KnownField, FI)) {
2562 KnownField = FI;
David Majnemer58e4ea92014-08-23 01:48:50 +00002563 break;
Richard Smithfe1bc702016-04-08 19:57:40 +00002564 }
David Majnemer58e4ea92014-08-23 01:48:50 +00002565 ++FieldIndex;
2566 }
2567
David Majnemer36ef8982014-08-11 18:33:59 +00002568 RecordDecl::field_iterator Field =
2569 RecordDecl::field_iterator(DeclContext::decl_iterator(KnownField));
2570
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002571 // All of the fields of a union are located at the same place in
2572 // the initializer list.
Douglas Gregor51695702009-01-29 16:53:55 +00002573 if (RT->getDecl()->isUnion()) {
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002574 FieldIndex = 0;
Richard Smithcd839cc2019-08-29 22:49:34 +00002575 if (StructuredList) {
Matthew Curtis274a9cc2013-10-03 12:14:24 +00002576 FieldDecl *CurrentField = StructuredList->getInitializedFieldInUnion();
Richard Smithfe1bc702016-04-08 19:57:40 +00002577 if (CurrentField && !declaresSameEntity(CurrentField, *Field)) {
Matthew Curtis274a9cc2013-10-03 12:14:24 +00002578 assert(StructuredList->getNumInits() == 1
2579 && "A union should never have more than one initializer!");
2580
Matthew Curtis274a9cc2013-10-03 12:14:24 +00002581 Expr *ExistingInit = StructuredList->getInit(0);
Richard Smith50309282019-08-30 22:52:55 +00002582 if (ExistingInit) {
Vassil Vassilev1a1678e2017-04-14 08:48:08 +00002583 // We're about to throw away an initializer, emit warning.
Richard Smith50309282019-08-30 22:52:55 +00002584 diagnoseInitOverride(
2585 ExistingInit, SourceRange(D->getBeginLoc(), DIE->getEndLoc()));
Vassil Vassilev1a1678e2017-04-14 08:48:08 +00002586 }
Matthew Curtis274a9cc2013-10-03 12:14:24 +00002587
2588 // remove existing initializer
2589 StructuredList->resizeInits(SemaRef.Context, 0);
Craig Topperc3ec1492014-05-26 06:22:03 +00002590 StructuredList->setInitializedFieldInUnion(nullptr);
Matthew Curtis274a9cc2013-10-03 12:14:24 +00002591 }
2592
David Blaikie40ed2972012-06-06 20:45:41 +00002593 StructuredList->setInitializedFieldInUnion(*Field);
Matthew Curtis274a9cc2013-10-03 12:14:24 +00002594 }
Douglas Gregor51695702009-01-29 16:53:55 +00002595 }
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002596
Douglas Gregora82064c2011-06-29 21:51:31 +00002597 // Make sure we can use this declaration.
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002598 bool InvalidUse;
2599 if (VerifyOnly)
Manman Ren073db022016-03-10 18:53:19 +00002600 InvalidUse = !SemaRef.CanUseDecl(*Field, TreatUnavailableAsInvalid);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002601 else
David Blaikie40ed2972012-06-06 20:45:41 +00002602 InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc());
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002603 if (InvalidUse) {
Douglas Gregora82064c2011-06-29 21:51:31 +00002604 ++Index;
2605 return true;
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002606 }
Douglas Gregora82064c2011-06-29 21:51:31 +00002607
Richard Smith50309282019-08-30 22:52:55 +00002608 // C++20 [dcl.init.list]p3:
2609 // The ordered identifiers in the designators of the designated-
2610 // initializer-list shall form a subsequence of the ordered identifiers
2611 // in the direct non-static data members of T.
2612 //
2613 // Note that this is not a condition on forming the aggregate
2614 // initialization, only on actually performing initialization,
2615 // so it is not checked in VerifyOnly mode.
2616 //
2617 // FIXME: This is the only reordering diagnostic we produce, and it only
2618 // catches cases where we have a top-level field designator that jumps
2619 // backwards. This is the only such case that is reachable in an
2620 // otherwise-valid C++20 program, so is the only case that's required for
2621 // conformance, but for consistency, we should diagnose all the other
2622 // cases where a designator takes us backwards too.
2623 if (IsFirstDesignator && !VerifyOnly && SemaRef.getLangOpts().CPlusPlus &&
2624 NextField &&
2625 (*NextField == RT->getDecl()->field_end() ||
2626 (*NextField)->getFieldIndex() > Field->getFieldIndex() + 1)) {
2627 // Find the field that we just initialized.
2628 FieldDecl *PrevField = nullptr;
2629 for (auto FI = RT->getDecl()->field_begin();
2630 FI != RT->getDecl()->field_end(); ++FI) {
2631 if (FI->isUnnamedBitfield())
2632 continue;
2633 if (*NextField != RT->getDecl()->field_end() &&
2634 declaresSameEntity(*FI, **NextField))
2635 break;
2636 PrevField = *FI;
2637 }
2638
2639 if (PrevField &&
2640 PrevField->getFieldIndex() > KnownField->getFieldIndex()) {
2641 SemaRef.Diag(DIE->getBeginLoc(), diag::ext_designated_init_reordered)
2642 << KnownField << PrevField << DIE->getSourceRange();
2643
2644 unsigned OldIndex = NumBases + PrevField->getFieldIndex();
2645 if (StructuredList && OldIndex <= StructuredList->getNumInits()) {
2646 if (Expr *PrevInit = StructuredList->getInit(OldIndex)) {
2647 SemaRef.Diag(PrevInit->getBeginLoc(),
2648 diag::note_previous_field_init)
2649 << PrevField << PrevInit->getSourceRange();
2650 }
2651 }
2652 }
2653 }
2654
2655
Richard Smithcd839cc2019-08-29 22:49:34 +00002656 // Update the designator with the field declaration.
2657 if (!VerifyOnly)
David Blaikie40ed2972012-06-06 20:45:41 +00002658 D->setField(*Field);
Mike Stump11289f42009-09-09 15:08:12 +00002659
Richard Smithcd839cc2019-08-29 22:49:34 +00002660 // Make sure that our non-designated initializer list has space
2661 // for a subobject corresponding to this field.
2662 if (StructuredList && FieldIndex >= StructuredList->getNumInits())
2663 StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1);
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002664
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002665 // This designator names a flexible array member.
2666 if (Field->getType()->isIncompleteArrayType()) {
2667 bool Invalid = false;
Douglas Gregora5324162009-04-15 04:56:10 +00002668 if ((DesigIdx + 1) != DIE->size()) {
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002669 // We can't designate an object within the flexible array
2670 // member (because GCC doesn't allow it).
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002671 if (!VerifyOnly) {
2672 DesignatedInitExpr::Designator *NextD
2673 = DIE->getDesignator(DesigIdx + 1);
Stephen Kellyf2ceec42018-08-09 21:08:08 +00002674 SemaRef.Diag(NextD->getBeginLoc(),
2675 diag::err_designator_into_flexible_array_member)
Stephen Kelly1c301dc2018-08-09 21:09:38 +00002676 << SourceRange(NextD->getBeginLoc(), DIE->getEndLoc());
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002677 SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
David Blaikie40ed2972012-06-06 20:45:41 +00002678 << *Field;
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002679 }
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002680 Invalid = true;
2681 }
2682
Chris Lattner001b29c2010-10-10 17:49:49 +00002683 if (!hadError && !isa<InitListExpr>(DIE->getInit()) &&
2684 !isa<StringLiteral>(DIE->getInit())) {
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002685 // The initializer is not an initializer list.
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002686 if (!VerifyOnly) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00002687 SemaRef.Diag(DIE->getInit()->getBeginLoc(),
2688 diag::err_flexible_array_init_needs_braces)
2689 << DIE->getInit()->getSourceRange();
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002690 SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
David Blaikie40ed2972012-06-06 20:45:41 +00002691 << *Field;
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002692 }
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002693 Invalid = true;
2694 }
2695
Eli Friedman3fa64df2011-08-23 22:24:57 +00002696 // Check GNU flexible array initializer.
David Blaikie40ed2972012-06-06 20:45:41 +00002697 if (!Invalid && CheckFlexibleArrayInit(Entity, DIE->getInit(), *Field,
Eli Friedman3fa64df2011-08-23 22:24:57 +00002698 TopLevelObject))
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002699 Invalid = true;
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002700
2701 if (Invalid) {
2702 ++Index;
2703 return true;
2704 }
2705
2706 // Initialize the array.
2707 bool prevHadError = hadError;
2708 unsigned newStructuredIndex = FieldIndex;
2709 unsigned OldIndex = Index;
2710 IList->setInit(Index, DIE->getInit());
Anders Carlsson6cabf312010-01-23 23:23:01 +00002711
2712 InitializedEntity MemberEntity =
David Blaikie40ed2972012-06-06 20:45:41 +00002713 InitializedEntity::InitializeMember(*Field, &Entity);
Anders Carlsson6cabf312010-01-23 23:23:01 +00002714 CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002715 StructuredList, newStructuredIndex);
Anders Carlsson6cabf312010-01-23 23:23:01 +00002716
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002717 IList->setInit(OldIndex, DIE);
2718 if (hadError && !prevHadError) {
2719 ++Field;
2720 ++FieldIndex;
2721 if (NextField)
2722 *NextField = Field;
2723 StructuredIndex = FieldIndex;
2724 return true;
2725 }
2726 } else {
2727 // Recurse to check later designated subobjects.
David Blaikie2d7c57e2012-04-30 02:36:29 +00002728 QualType FieldType = Field->getType();
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002729 unsigned newStructuredIndex = FieldIndex;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00002730
Anders Carlsson3fa93b72010-01-23 22:49:02 +00002731 InitializedEntity MemberEntity =
David Blaikie40ed2972012-06-06 20:45:41 +00002732 InitializedEntity::InitializeMember(*Field, &Entity);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00002733 if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1,
Craig Topperc3ec1492014-05-26 06:22:03 +00002734 FieldType, nullptr, nullptr, Index,
Anders Carlsson3fa93b72010-01-23 22:49:02 +00002735 StructuredList, newStructuredIndex,
Alexey Bataev86a489e2016-01-25 05:14:03 +00002736 FinishSubobjectInit, false))
Douglas Gregorfc4f8a12009-02-04 22:46:25 +00002737 return true;
2738 }
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002739
2740 // Find the position of the next field to be initialized in this
2741 // subobject.
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002742 ++Field;
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002743 ++FieldIndex;
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002744
2745 // If this the first designator, our caller will continue checking
2746 // the rest of this struct/class/union subobject.
2747 if (IsFirstDesignator) {
2748 if (NextField)
2749 *NextField = Field;
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002750 StructuredIndex = FieldIndex;
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002751 return false;
2752 }
2753
Douglas Gregor17bd0942009-01-28 23:36:17 +00002754 if (!FinishSubobjectInit)
2755 return false;
2756
Douglas Gregord5846a12009-04-15 06:41:24 +00002757 // We've already initialized something in the union; we're done.
2758 if (RT->getDecl()->isUnion())
2759 return hadError;
2760
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002761 // Check the remaining fields within this class/struct/union subobject.
2762 bool prevHadError = hadError;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00002763
Richard Smith872307e2016-03-08 22:17:41 +00002764 auto NoBases =
2765 CXXRecordDecl::base_class_range(CXXRecordDecl::base_class_iterator(),
2766 CXXRecordDecl::base_class_iterator());
2767 CheckStructUnionTypes(Entity, IList, CurrentObjectType, NoBases, Field,
2768 false, Index, StructuredList, FieldIndex);
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002769 return hadError && !prevHadError;
2770 }
2771
2772 // C99 6.7.8p6:
2773 //
2774 // If a designator has the form
2775 //
2776 // [ constant-expression ]
2777 //
2778 // then the current object (defined below) shall have array
2779 // type and the expression shall be an integer constant
2780 // expression. If the array is of unknown size, any
2781 // nonnegative value is valid.
2782 //
2783 // Additionally, cope with the GNU extension that permits
2784 // designators of the form
2785 //
2786 // [ constant-expression ... constant-expression ]
Chris Lattnerb0912a52009-02-24 22:50:46 +00002787 const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType);
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002788 if (!AT) {
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002789 if (!VerifyOnly)
2790 SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array)
2791 << CurrentObjectType;
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002792 ++Index;
2793 return true;
2794 }
2795
Craig Topperc3ec1492014-05-26 06:22:03 +00002796 Expr *IndexExpr = nullptr;
Douglas Gregor17bd0942009-01-28 23:36:17 +00002797 llvm::APSInt DesignatedStartIndex, DesignatedEndIndex;
2798 if (D->isArrayDesignator()) {
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002799 IndexExpr = DIE->getArrayIndex(*D);
Richard Smithcaf33902011-10-10 18:28:20 +00002800 DesignatedStartIndex = IndexExpr->EvaluateKnownConstInt(SemaRef.Context);
Douglas Gregor17bd0942009-01-28 23:36:17 +00002801 DesignatedEndIndex = DesignatedStartIndex;
2802 } else {
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002803 assert(D->isArrayRangeDesignator() && "Need array-range designator");
Douglas Gregor17bd0942009-01-28 23:36:17 +00002804
Mike Stump11289f42009-09-09 15:08:12 +00002805 DesignatedStartIndex =
Richard Smithcaf33902011-10-10 18:28:20 +00002806 DIE->getArrayRangeStart(*D)->EvaluateKnownConstInt(SemaRef.Context);
Mike Stump11289f42009-09-09 15:08:12 +00002807 DesignatedEndIndex =
Richard Smithcaf33902011-10-10 18:28:20 +00002808 DIE->getArrayRangeEnd(*D)->EvaluateKnownConstInt(SemaRef.Context);
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002809 IndexExpr = DIE->getArrayRangeEnd(*D);
Douglas Gregor17bd0942009-01-28 23:36:17 +00002810
Chris Lattnerb0ed51d2011-02-19 22:28:58 +00002811 // Codegen can't handle evaluating array range designators that have side
2812 // effects, because we replicate the AST value for each initialized element.
2813 // As such, set the sawArrayRangeDesignator() bit if we initialize multiple
2814 // elements with something that has a side effect, so codegen can emit an
2815 // "error unsupported" error instead of miscompiling the app.
2816 if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&&
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002817 DIE->getInit()->HasSideEffects(SemaRef.Context) && !VerifyOnly)
Douglas Gregorbf7207a2009-01-29 19:42:23 +00002818 FullyStructuredList->sawArrayRangeDesignator();
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002819 }
2820
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002821 if (isa<ConstantArrayType>(AT)) {
2822 llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false);
Jay Foad6d4db0c2010-12-07 08:25:34 +00002823 DesignatedStartIndex
2824 = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth());
Douglas Gregor17bd0942009-01-28 23:36:17 +00002825 DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned());
Jay Foad6d4db0c2010-12-07 08:25:34 +00002826 DesignatedEndIndex
2827 = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth());
Douglas Gregor17bd0942009-01-28 23:36:17 +00002828 DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned());
2829 if (DesignatedEndIndex >= MaxElements) {
Eli Friedmaned0f9162011-09-26 18:53:43 +00002830 if (!VerifyOnly)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00002831 SemaRef.Diag(IndexExpr->getBeginLoc(),
2832 diag::err_array_designator_too_large)
2833 << DesignatedEndIndex.toString(10) << MaxElements.toString(10)
2834 << IndexExpr->getSourceRange();
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002835 ++Index;
2836 return true;
2837 }
Douglas Gregor17bd0942009-01-28 23:36:17 +00002838 } else {
Argyrios Kyrtzidis4746c2f2015-07-27 23:16:53 +00002839 unsigned DesignatedIndexBitWidth =
2840 ConstantArrayType::getMaxSizeBits(SemaRef.Context);
2841 DesignatedStartIndex =
2842 DesignatedStartIndex.extOrTrunc(DesignatedIndexBitWidth);
2843 DesignatedEndIndex =
2844 DesignatedEndIndex.extOrTrunc(DesignatedIndexBitWidth);
Douglas Gregor17bd0942009-01-28 23:36:17 +00002845 DesignatedStartIndex.setIsUnsigned(true);
2846 DesignatedEndIndex.setIsUnsigned(true);
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002847 }
Mike Stump11289f42009-09-09 15:08:12 +00002848
Richard Smithcd839cc2019-08-29 22:49:34 +00002849 bool IsStringLiteralInitUpdate =
2850 StructuredList && StructuredList->isStringLiteralInit();
2851 if (IsStringLiteralInitUpdate && VerifyOnly) {
2852 // We're just verifying an update to a string literal init. We don't need
2853 // to split the string up into individual characters to do that.
2854 StructuredList = nullptr;
2855 } else if (IsStringLiteralInitUpdate) {
Eli Friedman1f16b742013-06-11 21:48:11 +00002856 // We're modifying a string literal init; we have to decompose the string
2857 // so we can modify the individual characters.
2858 ASTContext &Context = SemaRef.Context;
2859 Expr *SubExpr = StructuredList->getInit(0)->IgnoreParens();
2860
2861 // Compute the character type
2862 QualType CharTy = AT->getElementType();
2863
2864 // Compute the type of the integer literals.
2865 QualType PromotedCharTy = CharTy;
2866 if (CharTy->isPromotableIntegerType())
2867 PromotedCharTy = Context.getPromotedIntegerType(CharTy);
2868 unsigned PromotedCharTyWidth = Context.getTypeSize(PromotedCharTy);
2869
2870 if (StringLiteral *SL = dyn_cast<StringLiteral>(SubExpr)) {
2871 // Get the length of the string.
2872 uint64_t StrLen = SL->getLength();
2873 if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
2874 StrLen = cast<ConstantArrayType>(AT)->getSize().getZExtValue();
2875 StructuredList->resizeInits(Context, StrLen);
2876
2877 // Build a literal for each character in the string, and put them into
2878 // the init list.
2879 for (unsigned i = 0, e = StrLen; i != e; ++i) {
2880 llvm::APInt CodeUnit(PromotedCharTyWidth, SL->getCodeUnit(i));
2881 Expr *Init = new (Context) IntegerLiteral(
Eli Friedman6cc05f72013-06-11 22:26:34 +00002882 Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc());
Eli Friedman1f16b742013-06-11 21:48:11 +00002883 if (CharTy != PromotedCharTy)
2884 Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast,
Craig Topperc3ec1492014-05-26 06:22:03 +00002885 Init, nullptr, VK_RValue);
Eli Friedman1f16b742013-06-11 21:48:11 +00002886 StructuredList->updateInit(Context, i, Init);
2887 }
2888 } else {
2889 ObjCEncodeExpr *E = cast<ObjCEncodeExpr>(SubExpr);
2890 std::string Str;
2891 Context.getObjCEncodingForType(E->getEncodedType(), Str);
2892
2893 // Get the length of the string.
2894 uint64_t StrLen = Str.size();
2895 if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
2896 StrLen = cast<ConstantArrayType>(AT)->getSize().getZExtValue();
2897 StructuredList->resizeInits(Context, StrLen);
2898
2899 // Build a literal for each character in the string, and put them into
2900 // the init list.
2901 for (unsigned i = 0, e = StrLen; i != e; ++i) {
2902 llvm::APInt CodeUnit(PromotedCharTyWidth, Str[i]);
2903 Expr *Init = new (Context) IntegerLiteral(
Eli Friedman6cc05f72013-06-11 22:26:34 +00002904 Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc());
Eli Friedman1f16b742013-06-11 21:48:11 +00002905 if (CharTy != PromotedCharTy)
2906 Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast,
Craig Topperc3ec1492014-05-26 06:22:03 +00002907 Init, nullptr, VK_RValue);
Eli Friedman1f16b742013-06-11 21:48:11 +00002908 StructuredList->updateInit(Context, i, Init);
2909 }
2910 }
2911 }
2912
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002913 // Make sure that our non-designated initializer list has space
2914 // for a subobject corresponding to this array element.
Richard Smithcd839cc2019-08-29 22:49:34 +00002915 if (StructuredList &&
Sebastian Redlb49c46c2011-09-24 17:48:00 +00002916 DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits())
Mike Stump11289f42009-09-09 15:08:12 +00002917 StructuredList->resizeInits(SemaRef.Context,
Douglas Gregor17bd0942009-01-28 23:36:17 +00002918 DesignatedEndIndex.getZExtValue() + 1);
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002919
Douglas Gregor17bd0942009-01-28 23:36:17 +00002920 // Repeatedly perform subobject initializations in the range
2921 // [DesignatedStartIndex, DesignatedEndIndex].
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002922
Douglas Gregor17bd0942009-01-28 23:36:17 +00002923 // Move to the next designator
2924 unsigned ElementIndex = DesignatedStartIndex.getZExtValue();
2925 unsigned OldIndex = Index;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00002926
Anders Carlsson3fa93b72010-01-23 22:49:02 +00002927 InitializedEntity ElementEntity =
Anders Carlsson6cabf312010-01-23 23:23:01 +00002928 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
Anders Carlsson3fa93b72010-01-23 22:49:02 +00002929
Douglas Gregor17bd0942009-01-28 23:36:17 +00002930 while (DesignatedStartIndex <= DesignatedEndIndex) {
2931 // Recurse to check later designated subobjects.
2932 QualType ElementType = AT->getElementType();
2933 Index = OldIndex;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00002934
Anders Carlsson3fa93b72010-01-23 22:49:02 +00002935 ElementEntity.setElementIndex(ElementIndex);
Alexey Bataev86a489e2016-01-25 05:14:03 +00002936 if (CheckDesignatedInitializer(
2937 ElementEntity, IList, DIE, DesigIdx + 1, ElementType, nullptr,
2938 nullptr, Index, StructuredList, ElementIndex,
2939 FinishSubobjectInit && (DesignatedStartIndex == DesignatedEndIndex),
2940 false))
Douglas Gregor17bd0942009-01-28 23:36:17 +00002941 return true;
2942
2943 // Move to the next index in the array that we'll be initializing.
2944 ++DesignatedStartIndex;
2945 ElementIndex = DesignatedStartIndex.getZExtValue();
2946 }
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002947
2948 // If this the first designator, our caller will continue checking
2949 // the rest of this array subobject.
2950 if (IsFirstDesignator) {
2951 if (NextElementIndex)
Douglas Gregor17bd0942009-01-28 23:36:17 +00002952 *NextElementIndex = DesignatedStartIndex;
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002953 StructuredIndex = ElementIndex;
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002954 return false;
2955 }
Mike Stump11289f42009-09-09 15:08:12 +00002956
Douglas Gregor17bd0942009-01-28 23:36:17 +00002957 if (!FinishSubobjectInit)
2958 return false;
2959
Douglas Gregord7fb85e2009-01-22 23:26:18 +00002960 // Check the remaining elements within this array subobject.
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002961 bool prevHadError = hadError;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00002962 CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex,
Anders Carlsson0cf999b2010-01-23 20:13:41 +00002963 /*SubobjectIsDesignatorContext=*/false, Index,
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002964 StructuredList, ElementIndex);
Mike Stump11289f42009-09-09 15:08:12 +00002965 return hadError && !prevHadError;
Douglas Gregore4a0bb72009-01-22 00:58:24 +00002966}
2967
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002968// Get the structured initializer list for a subobject of type
2969// @p CurrentObjectType.
2970InitListExpr *
2971InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
2972 QualType CurrentObjectType,
2973 InitListExpr *StructuredList,
2974 unsigned StructuredIndex,
Yunzhong Gaocb779302015-06-10 00:27:52 +00002975 SourceRange InitRange,
2976 bool IsFullyOverwritten) {
Richard Smithcd839cc2019-08-29 22:49:34 +00002977 if (!StructuredList)
2978 return nullptr;
2979
Craig Topperc3ec1492014-05-26 06:22:03 +00002980 Expr *ExistingInit = nullptr;
Richard Smithcd839cc2019-08-29 22:49:34 +00002981 if (StructuredIndex < StructuredList->getNumInits())
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002982 ExistingInit = StructuredList->getInit(StructuredIndex);
Mike Stump11289f42009-09-09 15:08:12 +00002983
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002984 if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit))
Yunzhong Gaocb779302015-06-10 00:27:52 +00002985 // There might have already been initializers for subobjects of the current
2986 // object, but a subsequent initializer list will overwrite the entirety
2987 // of the current object. (See DR 253 and C99 6.7.8p21). e.g.,
2988 //
2989 // struct P { char x[6]; };
2990 // struct P l = { .x[2] = 'x', .x = { [0] = 'f' } };
2991 //
2992 // The first designated initializer is ignored, and l.x is just "f".
2993 if (!IsFullyOverwritten)
2994 return Result;
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002995
Richard Smith50309282019-08-30 22:52:55 +00002996 if (ExistingInit) {
Douglas Gregor347f7ea2009-01-28 21:54:33 +00002997 // We are creating an initializer list that initializes the
2998 // subobjects of the current object, but there was already an
2999 // initialization that completely initialized the current
Richard Smithcd839cc2019-08-29 22:49:34 +00003000 // subobject:
Mike Stump11289f42009-09-09 15:08:12 +00003001 //
Douglas Gregor347f7ea2009-01-28 21:54:33 +00003002 // struct X { int a, b; };
Richard Smithcd839cc2019-08-29 22:49:34 +00003003 // struct X xs[] = { [0] = { 1, 2 }, [0].b = 3 };
3004 //
3005 // Here, xs[0].a == 1 and xs[0].b == 3, since the second,
3006 // designated initializer overwrites the [0].b initializer
3007 // from the prior initialization.
3008 //
3009 // When the existing initializer is an expression rather than an
3010 // initializer list, we cannot decompose and update it in this way.
3011 // For example:
3012 //
Douglas Gregor347f7ea2009-01-28 21:54:33 +00003013 // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 };
Mike Stump11289f42009-09-09 15:08:12 +00003014 //
Richard Smithcd839cc2019-08-29 22:49:34 +00003015 // This case is handled by CheckDesignatedInitializer.
Richard Smith50309282019-08-30 22:52:55 +00003016 diagnoseInitOverride(ExistingInit, InitRange);
Douglas Gregor347f7ea2009-01-28 21:54:33 +00003017 }
3018
Richard Smithcd839cc2019-08-29 22:49:34 +00003019 unsigned ExpectedNumInits = 0;
3020 if (Index < IList->getNumInits()) {
3021 if (auto *Init = dyn_cast_or_null<InitListExpr>(IList->getInit(Index)))
3022 ExpectedNumInits = Init->getNumInits();
3023 else
3024 ExpectedNumInits = IList->getNumInits() - Index;
3025 }
3026
3027 InitListExpr *Result =
3028 createInitListExpr(CurrentObjectType, InitRange, ExpectedNumInits);
3029
3030 // Link this new initializer list into the structured initializer
3031 // lists.
3032 StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result);
3033 return Result;
3034}
3035
3036InitListExpr *
3037InitListChecker::createInitListExpr(QualType CurrentObjectType,
3038 SourceRange InitRange,
3039 unsigned ExpectedNumInits) {
Mike Stump11289f42009-09-09 15:08:12 +00003040 InitListExpr *Result
Ted Kremenekac034612010-04-13 23:39:13 +00003041 = new (SemaRef.Context) InitListExpr(SemaRef.Context,
Dmitri Gribenko78852e92013-05-05 20:40:26 +00003042 InitRange.getBegin(), None,
Ted Kremenek013041e2010-02-19 01:50:18 +00003043 InitRange.getEnd());
Douglas Gregor5741efb2009-03-01 17:12:46 +00003044
Eli Friedman91f5ae52012-02-23 02:25:10 +00003045 QualType ResultType = CurrentObjectType;
3046 if (!ResultType->isArrayType())
3047 ResultType = ResultType.getNonLValueExprType(SemaRef.Context);
3048 Result->setType(ResultType);
Douglas Gregor347f7ea2009-01-28 21:54:33 +00003049
Douglas Gregor6d00c992009-03-20 23:58:33 +00003050 // Pre-allocate storage for the structured initializer list.
3051 unsigned NumElements = 0;
Douglas Gregor221c9a52009-03-21 18:13:52 +00003052
Mike Stump11289f42009-09-09 15:08:12 +00003053 if (const ArrayType *AType
Douglas Gregor6d00c992009-03-20 23:58:33 +00003054 = SemaRef.Context.getAsArrayType(CurrentObjectType)) {
3055 if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) {
3056 NumElements = CAType->getSize().getZExtValue();
3057 // Simple heuristic so that we don't allocate a very large
3058 // initializer with many empty entries at the end.
Richard Smithcd839cc2019-08-29 22:49:34 +00003059 if (NumElements > ExpectedNumInits)
Douglas Gregor6d00c992009-03-20 23:58:33 +00003060 NumElements = 0;
3061 }
Richard Smithcd839cc2019-08-29 22:49:34 +00003062 } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) {
Douglas Gregor6d00c992009-03-20 23:58:33 +00003063 NumElements = VType->getNumElements();
Richard Smithcd839cc2019-08-29 22:49:34 +00003064 } else if (CurrentObjectType->isRecordType()) {
3065 NumElements = numStructUnionElements(CurrentObjectType);
Douglas Gregor6d00c992009-03-20 23:58:33 +00003066 }
3067
Ted Kremenekac034612010-04-13 23:39:13 +00003068 Result->reserveInits(SemaRef.Context, NumElements);
Douglas Gregor6d00c992009-03-20 23:58:33 +00003069
Douglas Gregor347f7ea2009-01-28 21:54:33 +00003070 return Result;
3071}
3072
3073/// Update the initializer at index @p StructuredIndex within the
3074/// structured initializer list to the value @p expr.
3075void InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList,
3076 unsigned &StructuredIndex,
3077 Expr *expr) {
3078 // No structured initializer list to update
3079 if (!StructuredList)
3080 return;
3081
Ted Kremenekac034612010-04-13 23:39:13 +00003082 if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context,
3083 StructuredIndex, expr)) {
Douglas Gregor347f7ea2009-01-28 21:54:33 +00003084 // This initializer overwrites a previous initializer. Warn.
Richard Smith50309282019-08-30 22:52:55 +00003085 diagnoseInitOverride(PrevInit, expr->getSourceRange());
Douglas Gregor347f7ea2009-01-28 21:54:33 +00003086 }
Mike Stump11289f42009-09-09 15:08:12 +00003087
Douglas Gregor347f7ea2009-01-28 21:54:33 +00003088 ++StructuredIndex;
3089}
3090
Richard Smith50309282019-08-30 22:52:55 +00003091/// Determine whether we can perform aggregate initialization for the purposes
3092/// of overload resolution.
3093bool Sema::CanPerformAggregateInitializationForOverloadResolution(
3094 const InitializedEntity &Entity, InitListExpr *From) {
3095 QualType Type = Entity.getType();
3096 InitListChecker Check(*this, Entity, From, Type, /*VerifyOnly=*/true,
3097 /*TreatUnavailableAsInvalid=*/false,
3098 /*InOverloadResolution=*/true);
3099 return !Check.HadError();
3100}
3101
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003102/// Check that the given Index expression is a valid array designator
Richard Smithf4c51d92012-02-04 09:53:13 +00003103/// value. This is essentially just a wrapper around
Chris Lattnerc71d08b2009-04-25 21:59:05 +00003104/// VerifyIntegerConstantExpression that also checks for negative values
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003105/// and produces a reasonable diagnostic if there is a
Richard Smithf4c51d92012-02-04 09:53:13 +00003106/// failure. Returns the index expression, possibly with an implicit cast
3107/// added, on success. If everything went okay, Value will receive the
3108/// value of the constant expression.
3109static ExprResult
Chris Lattnerc71d08b2009-04-25 21:59:05 +00003110CheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00003111 SourceLocation Loc = Index->getBeginLoc();
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003112
3113 // Make sure this is an integer constant expression.
Richard Smithf4c51d92012-02-04 09:53:13 +00003114 ExprResult Result = S.VerifyIntegerConstantExpression(Index, &Value);
3115 if (Result.isInvalid())
3116 return Result;
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003117
Chris Lattnerc71d08b2009-04-25 21:59:05 +00003118 if (Value.isSigned() && Value.isNegative())
3119 return S.Diag(Loc, diag::err_array_designator_negative)
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003120 << Value.toString(10) << Index->getSourceRange();
3121
Douglas Gregor51650d32009-01-23 21:04:18 +00003122 Value.setIsUnsigned(true);
Richard Smithf4c51d92012-02-04 09:53:13 +00003123 return Result;
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003124}
3125
John McCalldadc5752010-08-24 06:29:42 +00003126ExprResult Sema::ActOnDesignatedInitializer(Designation &Desig,
Richard Smithff9bf922019-08-31 01:00:37 +00003127 SourceLocation EqualOrColonLoc,
Nick Lewycky9331ed82010-11-20 01:29:55 +00003128 bool GNUSyntax,
3129 ExprResult Init) {
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003130 typedef DesignatedInitExpr::Designator ASTDesignator;
3131
3132 bool Invalid = false;
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003133 SmallVector<ASTDesignator, 32> Designators;
3134 SmallVector<Expr *, 32> InitExpressions;
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003135
3136 // Build designators and check array designator expressions.
3137 for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) {
3138 const Designator &D = Desig.getDesignator(Idx);
3139 switch (D.getKind()) {
3140 case Designator::FieldDesignator:
Mike Stump11289f42009-09-09 15:08:12 +00003141 Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(),
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003142 D.getFieldLoc()));
3143 break;
3144
3145 case Designator::ArrayDesignator: {
3146 Expr *Index = static_cast<Expr *>(D.getArrayIndex());
3147 llvm::APSInt IndexValue;
Richard Smithf4c51d92012-02-04 09:53:13 +00003148 if (!Index->isTypeDependent() && !Index->isValueDependent())
Nikola Smiljanic01a75982014-05-29 10:55:11 +00003149 Index = CheckArrayDesignatorExpr(*this, Index, IndexValue).get();
Richard Smithf4c51d92012-02-04 09:53:13 +00003150 if (!Index)
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003151 Invalid = true;
3152 else {
3153 Designators.push_back(ASTDesignator(InitExpressions.size(),
Mike Stump11289f42009-09-09 15:08:12 +00003154 D.getLBracketLoc(),
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003155 D.getRBracketLoc()));
3156 InitExpressions.push_back(Index);
3157 }
3158 break;
3159 }
3160
3161 case Designator::ArrayRangeDesignator: {
3162 Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart());
3163 Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd());
3164 llvm::APSInt StartValue;
3165 llvm::APSInt EndValue;
Douglas Gregorca1aeec2009-05-21 23:17:49 +00003166 bool StartDependent = StartIndex->isTypeDependent() ||
3167 StartIndex->isValueDependent();
3168 bool EndDependent = EndIndex->isTypeDependent() ||
3169 EndIndex->isValueDependent();
Richard Smithf4c51d92012-02-04 09:53:13 +00003170 if (!StartDependent)
3171 StartIndex =
Nikola Smiljanic01a75982014-05-29 10:55:11 +00003172 CheckArrayDesignatorExpr(*this, StartIndex, StartValue).get();
Richard Smithf4c51d92012-02-04 09:53:13 +00003173 if (!EndDependent)
Nikola Smiljanic01a75982014-05-29 10:55:11 +00003174 EndIndex = CheckArrayDesignatorExpr(*this, EndIndex, EndValue).get();
Richard Smithf4c51d92012-02-04 09:53:13 +00003175
3176 if (!StartIndex || !EndIndex)
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003177 Invalid = true;
Douglas Gregor7a95b082009-01-23 22:22:29 +00003178 else {
3179 // Make sure we're comparing values with the same bit width.
Douglas Gregorca1aeec2009-05-21 23:17:49 +00003180 if (StartDependent || EndDependent) {
3181 // Nothing to compute.
3182 } else if (StartValue.getBitWidth() > EndValue.getBitWidth())
Jay Foad6d4db0c2010-12-07 08:25:34 +00003183 EndValue = EndValue.extend(StartValue.getBitWidth());
Douglas Gregor7a95b082009-01-23 22:22:29 +00003184 else if (StartValue.getBitWidth() < EndValue.getBitWidth())
Jay Foad6d4db0c2010-12-07 08:25:34 +00003185 StartValue = StartValue.extend(EndValue.getBitWidth());
Douglas Gregor7a95b082009-01-23 22:22:29 +00003186
Douglas Gregor0f9d4002009-05-21 23:30:39 +00003187 if (!StartDependent && !EndDependent && EndValue < StartValue) {
Douglas Gregor7a95b082009-01-23 22:22:29 +00003188 Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range)
Mike Stump11289f42009-09-09 15:08:12 +00003189 << StartValue.toString(10) << EndValue.toString(10)
Douglas Gregor7a95b082009-01-23 22:22:29 +00003190 << StartIndex->getSourceRange() << EndIndex->getSourceRange();
3191 Invalid = true;
3192 } else {
3193 Designators.push_back(ASTDesignator(InitExpressions.size(),
Mike Stump11289f42009-09-09 15:08:12 +00003194 D.getLBracketLoc(),
Douglas Gregor7a95b082009-01-23 22:22:29 +00003195 D.getEllipsisLoc(),
3196 D.getRBracketLoc()));
3197 InitExpressions.push_back(StartIndex);
3198 InitExpressions.push_back(EndIndex);
3199 }
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003200 }
3201 break;
3202 }
3203 }
3204 }
3205
3206 if (Invalid || Init.isInvalid())
3207 return ExprError();
3208
3209 // Clear out the expressions within the designation.
3210 Desig.ClearExprs(*this);
3211
Richard Smithff9bf922019-08-31 01:00:37 +00003212 return DesignatedInitExpr::Create(Context, Designators, InitExpressions,
3213 EqualOrColonLoc, GNUSyntax,
3214 Init.getAs<Expr>());
Douglas Gregore4a0bb72009-01-22 00:58:24 +00003215}
Douglas Gregor85df8d82009-01-29 00:45:39 +00003216
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003217//===----------------------------------------------------------------------===//
3218// Initialization entity
3219//===----------------------------------------------------------------------===//
3220
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003221InitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index,
Douglas Gregor723796a2009-12-16 06:35:08 +00003222 const InitializedEntity &Parent)
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003223 : Parent(&Parent), Index(Index)
Douglas Gregor723796a2009-12-16 06:35:08 +00003224{
Anders Carlssoned8d80d2010-01-23 04:34:47 +00003225 if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) {
3226 Kind = EK_ArrayElement;
Douglas Gregor1b303932009-12-22 15:35:07 +00003227 Type = AT->getElementType();
Eli Friedman6b9c41e2011-09-19 23:17:44 +00003228 } else if (const VectorType *VT = Parent.getType()->getAs<VectorType>()) {
Anders Carlssoned8d80d2010-01-23 04:34:47 +00003229 Kind = EK_VectorElement;
Eli Friedman6b9c41e2011-09-19 23:17:44 +00003230 Type = VT->getElementType();
3231 } else {
3232 const ComplexType *CT = Parent.getType()->getAs<ComplexType>();
3233 assert(CT && "Unexpected type");
3234 Kind = EK_ComplexElement;
3235 Type = CT->getElementType();
Anders Carlssoned8d80d2010-01-23 04:34:47 +00003236 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003237}
3238
Benjamin Kramer8bf44352013-07-24 15:28:33 +00003239InitializedEntity
3240InitializedEntity::InitializeBase(ASTContext &Context,
3241 const CXXBaseSpecifier *Base,
Richard Smith872307e2016-03-08 22:17:41 +00003242 bool IsInheritedVirtualBase,
3243 const InitializedEntity *Parent) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003244 InitializedEntity Result;
3245 Result.Kind = EK_Base;
Richard Smith872307e2016-03-08 22:17:41 +00003246 Result.Parent = Parent;
Anders Carlsson43c64af2010-04-21 19:52:01 +00003247 Result.Base = reinterpret_cast<uintptr_t>(Base);
3248 if (IsInheritedVirtualBase)
3249 Result.Base |= 0x01;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003250
Douglas Gregor1b303932009-12-22 15:35:07 +00003251 Result.Type = Base->getType();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003252 return Result;
3253}
3254
Douglas Gregor85dabae2009-12-16 01:38:02 +00003255DeclarationName InitializedEntity::getName() const {
3256 switch (getKind()) {
Fariborz Jahanian131996b2013-07-31 18:21:45 +00003257 case EK_Parameter:
3258 case EK_Parameter_CF_Audited: {
John McCall31168b02011-06-15 23:02:42 +00003259 ParmVarDecl *D = reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1);
3260 return (D ? D->getDeclName() : DeclarationName());
3261 }
Douglas Gregorbbeb5c32009-12-22 16:09:06 +00003262
3263 case EK_Variable:
Douglas Gregor85dabae2009-12-16 01:38:02 +00003264 case EK_Member:
Richard Smith7873de02016-08-11 22:25:46 +00003265 case EK_Binding:
Richard Smith410306b2016-12-12 02:53:20 +00003266 return Variable.VariableOrMember->getDeclName();
Douglas Gregor85dabae2009-12-16 01:38:02 +00003267
Douglas Gregor19666fb2012-02-15 16:57:26 +00003268 case EK_LambdaCapture:
Faisal Vali5fb7c3c2013-12-05 01:40:41 +00003269 return DeclarationName(Capture.VarID);
Fangrui Song6907ce22018-07-30 19:24:48 +00003270
Douglas Gregor85dabae2009-12-16 01:38:02 +00003271 case EK_Result:
Richard Smith67af95b2018-07-23 19:19:08 +00003272 case EK_StmtExprResult:
Douglas Gregor85dabae2009-12-16 01:38:02 +00003273 case EK_Exception:
Douglas Gregore1314a62009-12-18 05:02:21 +00003274 case EK_New:
Douglas Gregor85dabae2009-12-16 01:38:02 +00003275 case EK_Temporary:
3276 case EK_Base:
Alexis Hunt61bc1732011-05-01 07:04:31 +00003277 case EK_Delegating:
Anders Carlssoned8d80d2010-01-23 04:34:47 +00003278 case EK_ArrayElement:
3279 case EK_VectorElement:
Eli Friedman6b9c41e2011-09-19 23:17:44 +00003280 case EK_ComplexElement:
Fariborz Jahanian28ed9272010-06-07 16:14:00 +00003281 case EK_BlockElement:
Alex Lorenzb4791c72017-04-06 12:53:43 +00003282 case EK_LambdaToBlockConversionBlockElement:
Jordan Rose6c0505e2013-05-06 16:48:12 +00003283 case EK_CompoundLiteralInit:
Fariborz Jahanianb248ca52013-07-11 16:48:06 +00003284 case EK_RelatedResult:
Douglas Gregor85dabae2009-12-16 01:38:02 +00003285 return DeclarationName();
3286 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003287
David Blaikie8a40f702012-01-17 06:56:22 +00003288 llvm_unreachable("Invalid EntityKind!");
Douglas Gregor85dabae2009-12-16 01:38:02 +00003289}
3290
Richard Smith7873de02016-08-11 22:25:46 +00003291ValueDecl *InitializedEntity::getDecl() const {
Douglas Gregora4b592a2009-12-19 03:01:41 +00003292 switch (getKind()) {
3293 case EK_Variable:
Douglas Gregora4b592a2009-12-19 03:01:41 +00003294 case EK_Member:
Richard Smith7873de02016-08-11 22:25:46 +00003295 case EK_Binding:
Richard Smith410306b2016-12-12 02:53:20 +00003296 return Variable.VariableOrMember;
Douglas Gregora4b592a2009-12-19 03:01:41 +00003297
John McCall31168b02011-06-15 23:02:42 +00003298 case EK_Parameter:
Fariborz Jahanian131996b2013-07-31 18:21:45 +00003299 case EK_Parameter_CF_Audited:
John McCall31168b02011-06-15 23:02:42 +00003300 return reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1);
3301
Douglas Gregora4b592a2009-12-19 03:01:41 +00003302 case EK_Result:
Richard Smith67af95b2018-07-23 19:19:08 +00003303 case EK_StmtExprResult:
Douglas Gregora4b592a2009-12-19 03:01:41 +00003304 case EK_Exception:
3305 case EK_New:
3306 case EK_Temporary:
3307 case EK_Base:
Alexis Hunt61bc1732011-05-01 07:04:31 +00003308 case EK_Delegating:
Anders Carlssoned8d80d2010-01-23 04:34:47 +00003309 case EK_ArrayElement:
3310 case EK_VectorElement:
Eli Friedman6b9c41e2011-09-19 23:17:44 +00003311 case EK_ComplexElement:
Fariborz Jahanian28ed9272010-06-07 16:14:00 +00003312 case EK_BlockElement:
Alex Lorenzb4791c72017-04-06 12:53:43 +00003313 case EK_LambdaToBlockConversionBlockElement:
Douglas Gregor19666fb2012-02-15 16:57:26 +00003314 case EK_LambdaCapture:
Jordan Rose6c0505e2013-05-06 16:48:12 +00003315 case EK_CompoundLiteralInit:
Fariborz Jahanianb248ca52013-07-11 16:48:06 +00003316 case EK_RelatedResult:
Craig Topperc3ec1492014-05-26 06:22:03 +00003317 return nullptr;
Douglas Gregora4b592a2009-12-19 03:01:41 +00003318 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003319
David Blaikie8a40f702012-01-17 06:56:22 +00003320 llvm_unreachable("Invalid EntityKind!");
Douglas Gregora4b592a2009-12-19 03:01:41 +00003321}
3322
Douglas Gregor222cf0e2010-05-15 00:13:29 +00003323bool InitializedEntity::allowsNRVO() const {
3324 switch (getKind()) {
3325 case EK_Result:
3326 case EK_Exception:
3327 return LocAndNRVO.NRVO;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003328
Richard Smith67af95b2018-07-23 19:19:08 +00003329 case EK_StmtExprResult:
Douglas Gregor222cf0e2010-05-15 00:13:29 +00003330 case EK_Variable:
3331 case EK_Parameter:
Fariborz Jahanian131996b2013-07-31 18:21:45 +00003332 case EK_Parameter_CF_Audited:
Douglas Gregor222cf0e2010-05-15 00:13:29 +00003333 case EK_Member:
Richard Smith7873de02016-08-11 22:25:46 +00003334 case EK_Binding:
Douglas Gregor222cf0e2010-05-15 00:13:29 +00003335 case EK_New:
3336 case EK_Temporary:
Jordan Rose6c0505e2013-05-06 16:48:12 +00003337 case EK_CompoundLiteralInit:
Douglas Gregor222cf0e2010-05-15 00:13:29 +00003338 case EK_Base:
Alexis Hunt61bc1732011-05-01 07:04:31 +00003339 case EK_Delegating:
Douglas Gregor222cf0e2010-05-15 00:13:29 +00003340 case EK_ArrayElement:
3341 case EK_VectorElement:
Eli Friedman6b9c41e2011-09-19 23:17:44 +00003342 case EK_ComplexElement:
Fariborz Jahanian28ed9272010-06-07 16:14:00 +00003343 case EK_BlockElement:
Alex Lorenzb4791c72017-04-06 12:53:43 +00003344 case EK_LambdaToBlockConversionBlockElement:
Douglas Gregor19666fb2012-02-15 16:57:26 +00003345 case EK_LambdaCapture:
Fariborz Jahanianb248ca52013-07-11 16:48:06 +00003346 case EK_RelatedResult:
Douglas Gregor222cf0e2010-05-15 00:13:29 +00003347 break;
3348 }
3349
3350 return false;
3351}
3352
Richard Smithe6c01442013-06-05 00:46:14 +00003353unsigned InitializedEntity::dumpImpl(raw_ostream &OS) const {
Richard Smithe3b28bc2013-06-12 21:51:50 +00003354 assert(getParent() != this);
Richard Smithe6c01442013-06-05 00:46:14 +00003355 unsigned Depth = getParent() ? getParent()->dumpImpl(OS) : 0;
3356 for (unsigned I = 0; I != Depth; ++I)
3357 OS << "`-";
3358
3359 switch (getKind()) {
3360 case EK_Variable: OS << "Variable"; break;
3361 case EK_Parameter: OS << "Parameter"; break;
Fariborz Jahanian131996b2013-07-31 18:21:45 +00003362 case EK_Parameter_CF_Audited: OS << "CF audited function Parameter";
3363 break;
Richard Smithe6c01442013-06-05 00:46:14 +00003364 case EK_Result: OS << "Result"; break;
Richard Smith67af95b2018-07-23 19:19:08 +00003365 case EK_StmtExprResult: OS << "StmtExprResult"; break;
Richard Smithe6c01442013-06-05 00:46:14 +00003366 case EK_Exception: OS << "Exception"; break;
3367 case EK_Member: OS << "Member"; break;
Richard Smith7873de02016-08-11 22:25:46 +00003368 case EK_Binding: OS << "Binding"; break;
Richard Smithe6c01442013-06-05 00:46:14 +00003369 case EK_New: OS << "New"; break;
3370 case EK_Temporary: OS << "Temporary"; break;
3371 case EK_CompoundLiteralInit: OS << "CompoundLiteral";break;
Fariborz Jahanianb248ca52013-07-11 16:48:06 +00003372 case EK_RelatedResult: OS << "RelatedResult"; break;
Richard Smithe6c01442013-06-05 00:46:14 +00003373 case EK_Base: OS << "Base"; break;
3374 case EK_Delegating: OS << "Delegating"; break;
3375 case EK_ArrayElement: OS << "ArrayElement " << Index; break;
3376 case EK_VectorElement: OS << "VectorElement " << Index; break;
3377 case EK_ComplexElement: OS << "ComplexElement " << Index; break;
3378 case EK_BlockElement: OS << "Block"; break;
Alex Lorenzb4791c72017-04-06 12:53:43 +00003379 case EK_LambdaToBlockConversionBlockElement:
3380 OS << "Block (lambda)";
3381 break;
Richard Smithe6c01442013-06-05 00:46:14 +00003382 case EK_LambdaCapture:
3383 OS << "LambdaCapture ";
Faisal Vali5fb7c3c2013-12-05 01:40:41 +00003384 OS << DeclarationName(Capture.VarID);
Richard Smithe6c01442013-06-05 00:46:14 +00003385 break;
3386 }
3387
Richard Smith7873de02016-08-11 22:25:46 +00003388 if (auto *D = getDecl()) {
Richard Smithe6c01442013-06-05 00:46:14 +00003389 OS << " ";
Richard Smith7873de02016-08-11 22:25:46 +00003390 D->printQualifiedName(OS);
Richard Smithe6c01442013-06-05 00:46:14 +00003391 }
3392
3393 OS << " '" << getType().getAsString() << "'\n";
3394
3395 return Depth + 1;
3396}
3397
Yaron Kerencdae9412016-01-29 19:38:18 +00003398LLVM_DUMP_METHOD void InitializedEntity::dump() const {
Richard Smithe6c01442013-06-05 00:46:14 +00003399 dumpImpl(llvm::errs());
3400}
3401
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003402//===----------------------------------------------------------------------===//
3403// Initialization sequence
3404//===----------------------------------------------------------------------===//
3405
3406void InitializationSequence::Step::Destroy() {
3407 switch (Kind) {
3408 case SK_ResolveAddressOfOverloadedFunction:
3409 case SK_CastDerivedToBaseRValue:
Sebastian Redlc57d34b2010-07-20 04:20:21 +00003410 case SK_CastDerivedToBaseXValue:
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003411 case SK_CastDerivedToBaseLValue:
3412 case SK_BindReference:
3413 case SK_BindReferenceToTemporary:
Richard Smithb8c0f552016-12-09 18:49:13 +00003414 case SK_FinalCopy:
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00003415 case SK_ExtraneousCopyToTemporary:
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003416 case SK_UserConversion:
3417 case SK_QualificationConversionRValue:
Sebastian Redlc57d34b2010-07-20 04:20:21 +00003418 case SK_QualificationConversionXValue:
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003419 case SK_QualificationConversionLValue:
Richard Smith77be48a2014-07-31 06:31:19 +00003420 case SK_AtomicConversion:
Douglas Gregor51e77d52009-12-10 17:56:55 +00003421 case SK_ListInitialization:
Sebastian Redl29526f02011-11-27 16:50:07 +00003422 case SK_UnwrapInitList:
3423 case SK_RewrapInitList:
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00003424 case SK_ConstructorInitialization:
Richard Smith53324112014-07-16 21:33:43 +00003425 case SK_ConstructorInitializationFromList:
Douglas Gregor7dc42e52009-12-15 00:01:57 +00003426 case SK_ZeroInitialization:
Douglas Gregore1314a62009-12-18 05:02:21 +00003427 case SK_CAssignment:
Eli Friedman78275202009-12-19 08:11:05 +00003428 case SK_StringInit:
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00003429 case SK_ObjCObjectConversion:
Richard Smith410306b2016-12-12 02:53:20 +00003430 case SK_ArrayLoopIndex:
3431 case SK_ArrayLoopInit:
Douglas Gregore2f943b2011-02-22 18:29:51 +00003432 case SK_ArrayInit:
Richard Smith378b8c82016-12-14 03:22:16 +00003433 case SK_GNUArrayInit:
Richard Smithebeed412012-02-15 22:38:09 +00003434 case SK_ParenthesizedArrayInit:
John McCall31168b02011-06-15 23:02:42 +00003435 case SK_PassByIndirectCopyRestore:
3436 case SK_PassByIndirectRestore:
3437 case SK_ProduceObjCObject:
Sebastian Redlc1839b12012-01-17 22:49:42 +00003438 case SK_StdInitializerList:
Richard Smithf8adcdc2014-07-17 05:12:35 +00003439 case SK_StdInitializerListConstructorCall:
Guy Benyei61054192013-02-07 10:55:47 +00003440 case SK_OCLSamplerInit:
Andrew Savonichevb555b762018-10-23 15:19:20 +00003441 case SK_OCLZeroOpaqueType:
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003442 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003443
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003444 case SK_ConversionSequence:
Richard Smithaaa0ec42013-09-21 21:19:19 +00003445 case SK_ConversionSequenceNoNarrowing:
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003446 delete ICS;
3447 }
3448}
3449
Douglas Gregor838fcc32010-03-26 20:14:36 +00003450bool InitializationSequence::isDirectReferenceBinding() const {
Richard Smithb8c0f552016-12-09 18:49:13 +00003451 // There can be some lvalue adjustments after the SK_BindReference step.
3452 for (auto I = Steps.rbegin(); I != Steps.rend(); ++I) {
3453 if (I->Kind == SK_BindReference)
3454 return true;
3455 if (I->Kind == SK_BindReferenceToTemporary)
3456 return false;
3457 }
3458 return false;
Douglas Gregor838fcc32010-03-26 20:14:36 +00003459}
3460
3461bool InitializationSequence::isAmbiguous() const {
Sebastian Redl724bfe12011-06-05 13:59:05 +00003462 if (!Failed())
Douglas Gregor838fcc32010-03-26 20:14:36 +00003463 return false;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003464
Douglas Gregor838fcc32010-03-26 20:14:36 +00003465 switch (getFailureKind()) {
3466 case FK_TooManyInitsForReference:
Richard Smith49a6b6e2017-03-24 01:14:25 +00003467 case FK_ParenthesizedListInitForReference:
Douglas Gregor838fcc32010-03-26 20:14:36 +00003468 case FK_ArrayNeedsInitList:
3469 case FK_ArrayNeedsInitListOrStringLiteral:
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00003470 case FK_ArrayNeedsInitListOrWideStringLiteral:
3471 case FK_NarrowStringIntoWideCharArray:
3472 case FK_WideStringIntoCharArray:
3473 case FK_IncompatWideStringIntoWideChar:
Richard Smith3a8244d2018-05-01 05:02:45 +00003474 case FK_PlainStringIntoUTF8Char:
3475 case FK_UTF8StringIntoPlainChar:
Douglas Gregor838fcc32010-03-26 20:14:36 +00003476 case FK_AddressOfOverloadFailed: // FIXME: Could do better
3477 case FK_NonConstLValueReferenceBindingToTemporary:
Richard Smithb8c0f552016-12-09 18:49:13 +00003478 case FK_NonConstLValueReferenceBindingToBitfield:
3479 case FK_NonConstLValueReferenceBindingToVectorElement:
Douglas Gregor838fcc32010-03-26 20:14:36 +00003480 case FK_NonConstLValueReferenceBindingToUnrelated:
3481 case FK_RValueReferenceBindingToLValue:
Anastasia Stulova5145b1e2019-06-05 14:03:34 +00003482 case FK_ReferenceAddrspaceMismatchTemporary:
Douglas Gregor838fcc32010-03-26 20:14:36 +00003483 case FK_ReferenceInitDropsQualifiers:
3484 case FK_ReferenceInitFailed:
3485 case FK_ConversionFailed:
John Wiegley01296292011-04-08 18:41:53 +00003486 case FK_ConversionFromPropertyFailed:
Douglas Gregor838fcc32010-03-26 20:14:36 +00003487 case FK_TooManyInitsForScalar:
Richard Smith49a6b6e2017-03-24 01:14:25 +00003488 case FK_ParenthesizedListInitForScalar:
Douglas Gregor838fcc32010-03-26 20:14:36 +00003489 case FK_ReferenceBindingToInitList:
3490 case FK_InitListBadDestinationType:
3491 case FK_DefaultInitOfConst:
Douglas Gregor3f4f03a2010-05-20 22:12:02 +00003492 case FK_Incomplete:
Douglas Gregore2f943b2011-02-22 18:29:51 +00003493 case FK_ArrayTypeMismatch:
3494 case FK_NonConstantArrayInit:
Sebastian Redl7de1fb42011-09-24 17:47:52 +00003495 case FK_ListInitializationFailed:
John McCalla59dc2f2012-01-05 00:13:19 +00003496 case FK_VariableLengthArrayHasInitializer:
John McCall4124c492011-10-17 18:40:02 +00003497 case FK_PlaceholderType:
Sebastian Redl048a6d72012-04-01 19:54:59 +00003498 case FK_ExplicitConstructor:
George Burgess IV3e3bb95b2015-12-02 21:58:08 +00003499 case FK_AddressOfUnaddressableFunction:
Douglas Gregor838fcc32010-03-26 20:14:36 +00003500 return false;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003501
Douglas Gregor838fcc32010-03-26 20:14:36 +00003502 case FK_ReferenceInitOverloadFailed:
3503 case FK_UserConversionOverloadFailed:
3504 case FK_ConstructorOverloadFailed:
Sebastian Redl6901c0d2011-12-22 18:58:38 +00003505 case FK_ListConstructorOverloadFailed:
Douglas Gregor838fcc32010-03-26 20:14:36 +00003506 return FailedOverloadResult == OR_Ambiguous;
3507 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003508
David Blaikie8a40f702012-01-17 06:56:22 +00003509 llvm_unreachable("Invalid EntityKind!");
Douglas Gregor838fcc32010-03-26 20:14:36 +00003510}
3511
Douglas Gregorb33eed02010-04-16 22:09:46 +00003512bool InitializationSequence::isConstructorInitialization() const {
3513 return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization;
3514}
3515
Abramo Bagnara5001caa2011-11-19 11:44:21 +00003516void
3517InitializationSequence
3518::AddAddressOverloadResolutionStep(FunctionDecl *Function,
3519 DeclAccessPair Found,
3520 bool HadMultipleCandidates) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003521 Step S;
3522 S.Kind = SK_ResolveAddressOfOverloadedFunction;
3523 S.Type = Function->getType();
Abramo Bagnara5001caa2011-11-19 11:44:21 +00003524 S.Function.HadMultipleCandidates = HadMultipleCandidates;
John McCalla0296f72010-03-19 07:35:19 +00003525 S.Function.Function = Function;
John McCall16df1e52010-03-30 21:47:33 +00003526 S.Function.FoundDecl = Found;
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003527 Steps.push_back(S);
3528}
3529
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003530void InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType,
John McCall2536c6d2010-08-25 10:28:54 +00003531 ExprValueKind VK) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003532 Step S;
John McCall2536c6d2010-08-25 10:28:54 +00003533 switch (VK) {
3534 case VK_RValue: S.Kind = SK_CastDerivedToBaseRValue; break;
3535 case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break;
3536 case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break;
Sebastian Redlc57d34b2010-07-20 04:20:21 +00003537 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003538 S.Type = BaseType;
3539 Steps.push_back(S);
3540}
3541
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003542void InitializationSequence::AddReferenceBindingStep(QualType T,
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003543 bool BindingTemporary) {
3544 Step S;
3545 S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference;
3546 S.Type = T;
3547 Steps.push_back(S);
3548}
3549
Richard Smithb8c0f552016-12-09 18:49:13 +00003550void InitializationSequence::AddFinalCopy(QualType T) {
3551 Step S;
3552 S.Kind = SK_FinalCopy;
3553 S.Type = T;
3554 Steps.push_back(S);
3555}
3556
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00003557void InitializationSequence::AddExtraneousCopyToTemporary(QualType T) {
3558 Step S;
3559 S.Kind = SK_ExtraneousCopyToTemporary;
3560 S.Type = T;
3561 Steps.push_back(S);
3562}
3563
Abramo Bagnara5001caa2011-11-19 11:44:21 +00003564void
3565InitializationSequence::AddUserConversionStep(FunctionDecl *Function,
3566 DeclAccessPair FoundDecl,
3567 QualType T,
3568 bool HadMultipleCandidates) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003569 Step S;
3570 S.Kind = SK_UserConversion;
Eli Friedmanad6c2e52009-12-11 02:42:07 +00003571 S.Type = T;
Abramo Bagnara5001caa2011-11-19 11:44:21 +00003572 S.Function.HadMultipleCandidates = HadMultipleCandidates;
John McCalla0296f72010-03-19 07:35:19 +00003573 S.Function.Function = Function;
3574 S.Function.FoundDecl = FoundDecl;
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003575 Steps.push_back(S);
3576}
3577
3578void InitializationSequence::AddQualificationConversionStep(QualType Ty,
John McCall2536c6d2010-08-25 10:28:54 +00003579 ExprValueKind VK) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003580 Step S;
John McCall7a1da892010-08-26 16:36:35 +00003581 S.Kind = SK_QualificationConversionRValue; // work around a gcc warning
John McCall2536c6d2010-08-25 10:28:54 +00003582 switch (VK) {
3583 case VK_RValue:
Sebastian Redlc57d34b2010-07-20 04:20:21 +00003584 S.Kind = SK_QualificationConversionRValue;
3585 break;
John McCall2536c6d2010-08-25 10:28:54 +00003586 case VK_XValue:
Sebastian Redlc57d34b2010-07-20 04:20:21 +00003587 S.Kind = SK_QualificationConversionXValue;
3588 break;
John McCall2536c6d2010-08-25 10:28:54 +00003589 case VK_LValue:
Sebastian Redlc57d34b2010-07-20 04:20:21 +00003590 S.Kind = SK_QualificationConversionLValue;
3591 break;
Sebastian Redlc57d34b2010-07-20 04:20:21 +00003592 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003593 S.Type = Ty;
3594 Steps.push_back(S);
3595}
3596
Richard Smith77be48a2014-07-31 06:31:19 +00003597void InitializationSequence::AddAtomicConversionStep(QualType Ty) {
3598 Step S;
3599 S.Kind = SK_AtomicConversion;
3600 S.Type = Ty;
3601 Steps.push_back(S);
3602}
3603
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003604void InitializationSequence::AddConversionSequenceStep(
Richard Smithaaa0ec42013-09-21 21:19:19 +00003605 const ImplicitConversionSequence &ICS, QualType T,
3606 bool TopLevelOfInitList) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003607 Step S;
Richard Smithaaa0ec42013-09-21 21:19:19 +00003608 S.Kind = TopLevelOfInitList ? SK_ConversionSequenceNoNarrowing
3609 : SK_ConversionSequence;
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003610 S.Type = T;
3611 S.ICS = new ImplicitConversionSequence(ICS);
3612 Steps.push_back(S);
3613}
3614
Douglas Gregor51e77d52009-12-10 17:56:55 +00003615void InitializationSequence::AddListInitializationStep(QualType T) {
3616 Step S;
3617 S.Kind = SK_ListInitialization;
3618 S.Type = T;
3619 Steps.push_back(S);
3620}
3621
Richard Smith55c28882016-05-12 23:45:49 +00003622void InitializationSequence::AddConstructorInitializationStep(
3623 DeclAccessPair FoundDecl, CXXConstructorDecl *Constructor, QualType T,
3624 bool HadMultipleCandidates, bool FromInitList, bool AsInitList) {
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00003625 Step S;
Richard Smithf8adcdc2014-07-17 05:12:35 +00003626 S.Kind = FromInitList ? AsInitList ? SK_StdInitializerListConstructorCall
Richard Smith53324112014-07-16 21:33:43 +00003627 : SK_ConstructorInitializationFromList
3628 : SK_ConstructorInitialization;
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00003629 S.Type = T;
Abramo Bagnara5001caa2011-11-19 11:44:21 +00003630 S.Function.HadMultipleCandidates = HadMultipleCandidates;
John McCalla0296f72010-03-19 07:35:19 +00003631 S.Function.Function = Constructor;
Richard Smith55c28882016-05-12 23:45:49 +00003632 S.Function.FoundDecl = FoundDecl;
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00003633 Steps.push_back(S);
3634}
3635
Douglas Gregor7dc42e52009-12-15 00:01:57 +00003636void InitializationSequence::AddZeroInitializationStep(QualType T) {
3637 Step S;
3638 S.Kind = SK_ZeroInitialization;
3639 S.Type = T;
3640 Steps.push_back(S);
3641}
3642
Douglas Gregore1314a62009-12-18 05:02:21 +00003643void InitializationSequence::AddCAssignmentStep(QualType T) {
3644 Step S;
3645 S.Kind = SK_CAssignment;
3646 S.Type = T;
3647 Steps.push_back(S);
3648}
3649
Eli Friedman78275202009-12-19 08:11:05 +00003650void InitializationSequence::AddStringInitStep(QualType T) {
3651 Step S;
3652 S.Kind = SK_StringInit;
3653 S.Type = T;
3654 Steps.push_back(S);
3655}
3656
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00003657void InitializationSequence::AddObjCObjectConversionStep(QualType T) {
3658 Step S;
3659 S.Kind = SK_ObjCObjectConversion;
3660 S.Type = T;
3661 Steps.push_back(S);
3662}
3663
Richard Smith378b8c82016-12-14 03:22:16 +00003664void InitializationSequence::AddArrayInitStep(QualType T, bool IsGNUExtension) {
Douglas Gregore2f943b2011-02-22 18:29:51 +00003665 Step S;
Richard Smith378b8c82016-12-14 03:22:16 +00003666 S.Kind = IsGNUExtension ? SK_GNUArrayInit : SK_ArrayInit;
Douglas Gregore2f943b2011-02-22 18:29:51 +00003667 S.Type = T;
3668 Steps.push_back(S);
3669}
3670
Richard Smith410306b2016-12-12 02:53:20 +00003671void InitializationSequence::AddArrayInitLoopStep(QualType T, QualType EltT) {
3672 Step S;
3673 S.Kind = SK_ArrayLoopIndex;
3674 S.Type = EltT;
3675 Steps.insert(Steps.begin(), S);
3676
3677 S.Kind = SK_ArrayLoopInit;
3678 S.Type = T;
3679 Steps.push_back(S);
3680}
3681
Richard Smithebeed412012-02-15 22:38:09 +00003682void InitializationSequence::AddParenthesizedArrayInitStep(QualType T) {
3683 Step S;
3684 S.Kind = SK_ParenthesizedArrayInit;
3685 S.Type = T;
3686 Steps.push_back(S);
3687}
3688
John McCall31168b02011-06-15 23:02:42 +00003689void InitializationSequence::AddPassByIndirectCopyRestoreStep(QualType type,
3690 bool shouldCopy) {
3691 Step s;
3692 s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore
3693 : SK_PassByIndirectRestore);
3694 s.Type = type;
3695 Steps.push_back(s);
3696}
3697
3698void InitializationSequence::AddProduceObjCObjectStep(QualType T) {
3699 Step S;
3700 S.Kind = SK_ProduceObjCObject;
3701 S.Type = T;
3702 Steps.push_back(S);
3703}
3704
Sebastian Redlc1839b12012-01-17 22:49:42 +00003705void InitializationSequence::AddStdInitializerListConstructionStep(QualType T) {
3706 Step S;
3707 S.Kind = SK_StdInitializerList;
3708 S.Type = T;
3709 Steps.push_back(S);
3710}
3711
Guy Benyei61054192013-02-07 10:55:47 +00003712void InitializationSequence::AddOCLSamplerInitStep(QualType T) {
3713 Step S;
3714 S.Kind = SK_OCLSamplerInit;
3715 S.Type = T;
3716 Steps.push_back(S);
3717}
3718
Andrew Savonichevb555b762018-10-23 15:19:20 +00003719void InitializationSequence::AddOCLZeroOpaqueTypeStep(QualType T) {
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00003720 Step S;
Andrew Savonichevb555b762018-10-23 15:19:20 +00003721 S.Kind = SK_OCLZeroOpaqueType;
Egor Churaev89831422016-12-23 14:55:49 +00003722 S.Type = T;
3723 Steps.push_back(S);
3724}
3725
Sebastian Redl29526f02011-11-27 16:50:07 +00003726void InitializationSequence::RewrapReferenceInitList(QualType T,
3727 InitListExpr *Syntactic) {
3728 assert(Syntactic->getNumInits() == 1 &&
3729 "Can only rewrap trivial init lists.");
3730 Step S;
3731 S.Kind = SK_UnwrapInitList;
3732 S.Type = Syntactic->getInit(0)->getType();
3733 Steps.insert(Steps.begin(), S);
3734
3735 S.Kind = SK_RewrapInitList;
3736 S.Type = T;
3737 S.WrappingSyntacticList = Syntactic;
3738 Steps.push_back(S);
3739}
3740
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00003741void InitializationSequence::SetOverloadFailure(FailureKind Failure,
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003742 OverloadingResult Result) {
Sebastian Redld201edf2011-06-05 13:59:11 +00003743 setSequenceKind(FailedSequence);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00003744 this->Failure = Failure;
3745 this->FailedOverloadResult = Result;
3746}
3747
3748//===----------------------------------------------------------------------===//
3749// Attempt initialization
3750//===----------------------------------------------------------------------===//
3751
Nico Weber337d5aa2015-04-17 08:32:38 +00003752/// Tries to add a zero initializer. Returns true if that worked.
3753static bool
3754maybeRecoverWithZeroInitialization(Sema &S, InitializationSequence &Sequence,
3755 const InitializedEntity &Entity) {
3756 if (Entity.getKind() != InitializedEntity::EK_Variable)
3757 return false;
3758
3759 VarDecl *VD = cast<VarDecl>(Entity.getDecl());
Stephen Kelly1c301dc2018-08-09 21:09:38 +00003760 if (VD->getInit() || VD->getEndLoc().isMacroID())
Nico Weber337d5aa2015-04-17 08:32:38 +00003761 return false;
3762
3763 QualType VariableTy = VD->getType().getCanonicalType();
Stephen Kelly1c301dc2018-08-09 21:09:38 +00003764 SourceLocation Loc = S.getLocForEndOfToken(VD->getEndLoc());
Nico Weber337d5aa2015-04-17 08:32:38 +00003765 std::string Init = S.getFixItZeroInitializerForType(VariableTy, Loc);
3766 if (!Init.empty()) {
3767 Sequence.AddZeroInitializationStep(Entity.getType());
3768 Sequence.SetZeroInitializationFixit(Init, Loc);
3769 return true;
3770 }
3771 return false;
3772}
3773
John McCall31168b02011-06-15 23:02:42 +00003774static void MaybeProduceObjCObject(Sema &S,
3775 InitializationSequence &Sequence,
3776 const InitializedEntity &Entity) {
David Blaikiebbafb8a2012-03-11 07:00:24 +00003777 if (!S.getLangOpts().ObjCAutoRefCount) return;
John McCall31168b02011-06-15 23:02:42 +00003778
3779 /// When initializing a parameter, produce the value if it's marked
3780 /// __attribute__((ns_consumed)).
Fariborz Jahanian131996b2013-07-31 18:21:45 +00003781 if (Entity.isParameterKind()) {
John McCall31168b02011-06-15 23:02:42 +00003782 if (!Entity.isParameterConsumed())
3783 return;
3784
3785 assert(Entity.getType()->isObjCRetainableType() &&
3786 "consuming an object of unretainable type?");
3787 Sequence.AddProduceObjCObjectStep(Entity.getType());
3788
3789 /// When initializing a return value, if the return type is a
3790 /// retainable type, then returns need to immediately retain the
3791 /// object. If an autorelease is required, it will be done at the
3792 /// last instant.
Richard Smith67af95b2018-07-23 19:19:08 +00003793 } else if (Entity.getKind() == InitializedEntity::EK_Result ||
3794 Entity.getKind() == InitializedEntity::EK_StmtExprResult) {
John McCall31168b02011-06-15 23:02:42 +00003795 if (!Entity.getType()->isObjCRetainableType())
3796 return;
3797
3798 Sequence.AddProduceObjCObjectStep(Entity.getType());
3799 }
3800}
3801
Richard Smithcc1b96d2013-06-12 22:31:48 +00003802static void TryListInitialization(Sema &S,
3803 const InitializedEntity &Entity,
3804 const InitializationKind &Kind,
3805 InitListExpr *InitList,
Manman Ren073db022016-03-10 18:53:19 +00003806 InitializationSequence &Sequence,
3807 bool TreatUnavailableAsInvalid);
Richard Smithcc1b96d2013-06-12 22:31:48 +00003808
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00003809/// When initializing from init list via constructor, handle
Richard Smithd86812d2012-07-05 08:39:21 +00003810/// initialization of an object of type std::initializer_list<T>.
Sebastian Redled2e5322011-12-22 14:44:04 +00003811///
Richard Smithd86812d2012-07-05 08:39:21 +00003812/// \return true if we have handled initialization of an object of type
3813/// std::initializer_list<T>, false otherwise.
3814static bool TryInitializerListConstruction(Sema &S,
3815 InitListExpr *List,
3816 QualType DestType,
Manman Ren073db022016-03-10 18:53:19 +00003817 InitializationSequence &Sequence,
3818 bool TreatUnavailableAsInvalid) {
Richard Smithd86812d2012-07-05 08:39:21 +00003819 QualType E;
3820 if (!S.isStdInitializerList(DestType, &E))
Richard Smith1bfe0682012-02-14 21:14:13 +00003821 return false;
3822
Richard Smithdb0ac552015-12-18 22:40:25 +00003823 if (!S.isCompleteType(List->getExprLoc(), E)) {
Richard Smithcc1b96d2013-06-12 22:31:48 +00003824 Sequence.setIncompleteTypeFailure(E);
3825 return true;
Sebastian Redled2e5322011-12-22 14:44:04 +00003826 }
Richard Smithcc1b96d2013-06-12 22:31:48 +00003827
3828 // Try initializing a temporary array from the init list.
3829 QualType ArrayType = S.Context.getConstantArrayType(
3830 E.withConst(), llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
3831 List->getNumInits()),
3832 clang::ArrayType::Normal, 0);
3833 InitializedEntity HiddenArray =
3834 InitializedEntity::InitializeTemporary(ArrayType);
Vedant Kumara14a1f92018-01-17 18:53:51 +00003835 InitializationKind Kind = InitializationKind::CreateDirectList(
Stephen Kelly1c301dc2018-08-09 21:09:38 +00003836 List->getExprLoc(), List->getBeginLoc(), List->getEndLoc());
Manman Ren073db022016-03-10 18:53:19 +00003837 TryListInitialization(S, HiddenArray, Kind, List, Sequence,
3838 TreatUnavailableAsInvalid);
Richard Smithcc1b96d2013-06-12 22:31:48 +00003839 if (Sequence)
3840 Sequence.AddStdInitializerListConstructionStep(DestType);
Richard Smithd86812d2012-07-05 08:39:21 +00003841 return true;
Sebastian Redled2e5322011-12-22 14:44:04 +00003842}
3843
Richard Smith7c2bcc92016-09-07 02:14:33 +00003844/// Determine if the constructor has the signature of a copy or move
3845/// constructor for the type T of the class in which it was found. That is,
3846/// determine if its first parameter is of type T or reference to (possibly
3847/// cv-qualified) T.
3848static bool hasCopyOrMoveCtorParam(ASTContext &Ctx,
3849 const ConstructorInfo &Info) {
3850 if (Info.Constructor->getNumParams() == 0)
3851 return false;
3852
3853 QualType ParmT =
3854 Info.Constructor->getParamDecl(0)->getType().getNonReferenceType();
3855 QualType ClassT =
3856 Ctx.getRecordType(cast<CXXRecordDecl>(Info.FoundDecl->getDeclContext()));
3857
3858 return Ctx.hasSameUnqualifiedType(ParmT, ClassT);
3859}
3860
Sebastian Redlab3f7a42012-02-04 21:27:39 +00003861static OverloadingResult
3862ResolveConstructorOverload(Sema &S, SourceLocation DeclLoc,
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00003863 MultiExprArg Args,
Sebastian Redlab3f7a42012-02-04 21:27:39 +00003864 OverloadCandidateSet &CandidateSet,
Richard Smith67ef14f2017-09-26 18:37:55 +00003865 QualType DestType,
Richard Smith40c78062015-02-21 02:31:57 +00003866 DeclContext::lookup_result Ctors,
Sebastian Redlab3f7a42012-02-04 21:27:39 +00003867 OverloadCandidateSet::iterator &Best,
3868 bool CopyInitializing, bool AllowExplicit,
Richard Smith7c2bcc92016-09-07 02:14:33 +00003869 bool OnlyListConstructors, bool IsListInit,
3870 bool SecondStepOfCopyInit = false) {
Richard Smith67ef14f2017-09-26 18:37:55 +00003871 CandidateSet.clear(OverloadCandidateSet::CSK_InitByConstructor);
Anastasia Stulovac25ea862019-06-20 16:23:28 +00003872 CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
Sebastian Redlab3f7a42012-02-04 21:27:39 +00003873
Richard Smith40c78062015-02-21 02:31:57 +00003874 for (NamedDecl *D : Ctors) {
Richard Smithc2bebe92016-05-11 20:37:46 +00003875 auto Info = getConstructorInfo(D);
Richard Smith7c2bcc92016-09-07 02:14:33 +00003876 if (!Info.Constructor || Info.Constructor->isInvalidDecl())
Richard Smithc2bebe92016-05-11 20:37:46 +00003877 continue;
3878
Richard Smith7c2bcc92016-09-07 02:14:33 +00003879 if (!AllowExplicit && Info.Constructor->isExplicit())
3880 continue;
Sebastian Redlab3f7a42012-02-04 21:27:39 +00003881
Richard Smith7c2bcc92016-09-07 02:14:33 +00003882 if (OnlyListConstructors && !S.isInitListConstructor(Info.Constructor))
3883 continue;
Sebastian Redlab3f7a42012-02-04 21:27:39 +00003884
Richard Smith7c2bcc92016-09-07 02:14:33 +00003885 // C++11 [over.best.ics]p4:
3886 // ... and the constructor or user-defined conversion function is a
3887 // candidate by
3888 // - 13.3.1.3, when the argument is the temporary in the second step
3889 // of a class copy-initialization, or
3890 // - 13.3.1.4, 13.3.1.5, or 13.3.1.6 (in all cases), [not handled here]
3891 // - the second phase of 13.3.1.7 when the initializer list has exactly
3892 // one element that is itself an initializer list, and the target is
3893 // the first parameter of a constructor of class X, and the conversion
3894 // is to X or reference to (possibly cv-qualified X),
3895 // user-defined conversion sequences are not considered.
3896 bool SuppressUserConversions =
3897 SecondStepOfCopyInit ||
3898 (IsListInit && Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
3899 hasCopyOrMoveCtorParam(S.Context, Info));
3900
3901 if (Info.ConstructorTmpl)
Richard Smith76b90272019-05-09 03:59:21 +00003902 S.AddTemplateOverloadCandidate(
3903 Info.ConstructorTmpl, Info.FoundDecl,
3904 /*ExplicitArgs*/ nullptr, Args, CandidateSet, SuppressUserConversions,
3905 /*PartialOverloading=*/false, AllowExplicit);
Richard Smith7c2bcc92016-09-07 02:14:33 +00003906 else {
3907 // C++ [over.match.copy]p1:
Fangrui Song6907ce22018-07-30 19:24:48 +00003908 // - When initializing a temporary to be bound to the first parameter
Richard Smith7c2bcc92016-09-07 02:14:33 +00003909 // of a constructor [for type T] that takes a reference to possibly
3910 // cv-qualified T as its first argument, called with a single
3911 // argument in the context of direct-initialization, explicit
3912 // conversion functions are also considered.
3913 // FIXME: What if a constructor template instantiates to such a signature?
Fangrui Song6907ce22018-07-30 19:24:48 +00003914 bool AllowExplicitConv = AllowExplicit && !CopyInitializing &&
Richard Smith7c2bcc92016-09-07 02:14:33 +00003915 Args.size() == 1 &&
3916 hasCopyOrMoveCtorParam(S.Context, Info);
3917 S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl, Args,
3918 CandidateSet, SuppressUserConversions,
Richard Smith76b90272019-05-09 03:59:21 +00003919 /*PartialOverloading=*/false, AllowExplicit,
3920 AllowExplicitConv);
Sebastian Redlab3f7a42012-02-04 21:27:39 +00003921 }
3922 }
3923
Richard Smith67ef14f2017-09-26 18:37:55 +00003924 // FIXME: Work around a bug in C++17 guaranteed copy elision.
3925 //
3926 // When initializing an object of class type T by constructor
3927 // ([over.match.ctor]) or by list-initialization ([over.match.list])
3928 // from a single expression of class type U, conversion functions of
3929 // U that convert to the non-reference type cv T are candidates.
3930 // Explicit conversion functions are only candidates during
3931 // direct-initialization.
3932 //
3933 // Note: SecondStepOfCopyInit is only ever true in this case when
3934 // evaluating whether to produce a C++98 compatibility warning.
Aaron Ballmanc351fba2017-12-04 20:27:34 +00003935 if (S.getLangOpts().CPlusPlus17 && Args.size() == 1 &&
Richard Smith67ef14f2017-09-26 18:37:55 +00003936 !SecondStepOfCopyInit) {
3937 Expr *Initializer = Args[0];
3938 auto *SourceRD = Initializer->getType()->getAsCXXRecordDecl();
3939 if (SourceRD && S.isCompleteType(DeclLoc, Initializer->getType())) {
3940 const auto &Conversions = SourceRD->getVisibleConversionFunctions();
3941 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
3942 NamedDecl *D = *I;
3943 CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
3944 D = D->getUnderlyingDecl();
3945
3946 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
3947 CXXConversionDecl *Conv;
3948 if (ConvTemplate)
3949 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
3950 else
3951 Conv = cast<CXXConversionDecl>(D);
3952
Richard Smith76b90272019-05-09 03:59:21 +00003953 if (AllowExplicit || !Conv->isExplicit()) {
Richard Smith67ef14f2017-09-26 18:37:55 +00003954 if (ConvTemplate)
Richard Smith76b90272019-05-09 03:59:21 +00003955 S.AddTemplateConversionCandidate(
3956 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
3957 CandidateSet, AllowExplicit, AllowExplicit,
3958 /*AllowResultConversion*/ false);
Richard Smith67ef14f2017-09-26 18:37:55 +00003959 else
3960 S.AddConversionCandidate(Conv, I.getPair(), ActingDC, Initializer,
3961 DestType, CandidateSet, AllowExplicit,
Richard Smith76b90272019-05-09 03:59:21 +00003962 AllowExplicit,
3963 /*AllowResultConversion*/ false);
Richard Smith67ef14f2017-09-26 18:37:55 +00003964 }
3965 }
3966 }
3967 }
3968
Sebastian Redlab3f7a42012-02-04 21:27:39 +00003969 // Perform overload resolution and return the result.
3970 return CandidateSet.BestViableFunction(S, DeclLoc, Best);
3971}
3972
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00003973/// Attempt initialization by constructor (C++ [dcl.init]), which
Sebastian Redled2e5322011-12-22 14:44:04 +00003974/// enumerates the constructors of the initialized entity and performs overload
3975/// resolution to select the best.
Richard Smith410306b2016-12-12 02:53:20 +00003976/// \param DestType The destination class type.
3977/// \param DestArrayType The destination type, which is either DestType or
3978/// a (possibly multidimensional) array of DestType.
NAKAMURA Takumiffcc98a2015-02-05 23:12:13 +00003979/// \param IsListInit Is this list-initialization?
Richard Smithed83ebd2015-02-05 07:02:11 +00003980/// \param IsInitListCopy Is this non-list-initialization resulting from a
3981/// list-initialization from {x} where x is the same
3982/// type as the entity?
Sebastian Redled2e5322011-12-22 14:44:04 +00003983static void TryConstructorInitialization(Sema &S,
3984 const InitializedEntity &Entity,
3985 const InitializationKind &Kind,
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00003986 MultiExprArg Args, QualType DestType,
Richard Smith410306b2016-12-12 02:53:20 +00003987 QualType DestArrayType,
Sebastian Redled2e5322011-12-22 14:44:04 +00003988 InitializationSequence &Sequence,
Richard Smithed83ebd2015-02-05 07:02:11 +00003989 bool IsListInit = false,
3990 bool IsInitListCopy = false) {
Richard Smith122f88d2016-12-06 23:52:28 +00003991 assert(((!IsListInit && !IsInitListCopy) ||
3992 (Args.size() == 1 && isa<InitListExpr>(Args[0]))) &&
3993 "IsListInit/IsInitListCopy must come with a single initializer list "
3994 "argument.");
3995 InitListExpr *ILE =
3996 (IsListInit || IsInitListCopy) ? cast<InitListExpr>(Args[0]) : nullptr;
3997 MultiExprArg UnwrappedArgs =
3998 ILE ? MultiExprArg(ILE->getInits(), ILE->getNumInits()) : Args;
Sebastian Redl88e4d492012-02-04 21:27:33 +00003999
Sebastian Redled2e5322011-12-22 14:44:04 +00004000 // The type we're constructing needs to be complete.
Richard Smithdb0ac552015-12-18 22:40:25 +00004001 if (!S.isCompleteType(Kind.getLocation(), DestType)) {
Douglas Gregor85f34232012-04-10 20:43:46 +00004002 Sequence.setIncompleteTypeFailure(DestType);
Sebastian Redlab3f7a42012-02-04 21:27:39 +00004003 return;
Sebastian Redled2e5322011-12-22 14:44:04 +00004004 }
4005
Aaron Ballmanc351fba2017-12-04 20:27:34 +00004006 // C++17 [dcl.init]p17:
Richard Smith122f88d2016-12-06 23:52:28 +00004007 // - If the initializer expression is a prvalue and the cv-unqualified
4008 // version of the source type is the same class as the class of the
4009 // destination, the initializer expression is used to initialize the
4010 // destination object.
4011 // Per DR (no number yet), this does not apply when initializing a base
4012 // class or delegating to another constructor from a mem-initializer.
Alex Lorenzb4791c72017-04-06 12:53:43 +00004013 // ObjC++: Lambda captured by the block in the lambda to block conversion
4014 // should avoid copy elision.
Aaron Ballmanc351fba2017-12-04 20:27:34 +00004015 if (S.getLangOpts().CPlusPlus17 &&
Richard Smith122f88d2016-12-06 23:52:28 +00004016 Entity.getKind() != InitializedEntity::EK_Base &&
4017 Entity.getKind() != InitializedEntity::EK_Delegating &&
Alex Lorenzb4791c72017-04-06 12:53:43 +00004018 Entity.getKind() !=
4019 InitializedEntity::EK_LambdaToBlockConversionBlockElement &&
Richard Smith122f88d2016-12-06 23:52:28 +00004020 UnwrappedArgs.size() == 1 && UnwrappedArgs[0]->isRValue() &&
4021 S.Context.hasSameUnqualifiedType(UnwrappedArgs[0]->getType(), DestType)) {
4022 // Convert qualifications if necessary.
Richard Smith16d31502016-12-21 01:31:56 +00004023 Sequence.AddQualificationConversionStep(DestType, VK_RValue);
Richard Smith122f88d2016-12-06 23:52:28 +00004024 if (ILE)
4025 Sequence.RewrapReferenceInitList(DestType, ILE);
4026 return;
4027 }
4028
Sebastian Redled2e5322011-12-22 14:44:04 +00004029 const RecordType *DestRecordType = DestType->getAs<RecordType>();
4030 assert(DestRecordType && "Constructor initialization requires record type");
4031 CXXRecordDecl *DestRecordDecl
4032 = cast<CXXRecordDecl>(DestRecordType->getDecl());
4033
Sebastian Redlab3f7a42012-02-04 21:27:39 +00004034 // Build the candidate set directly in the initialization sequence
4035 // structure, so that it will persist if we fail.
4036 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
4037
4038 // Determine whether we are allowed to call explicit constructors or
4039 // explicit conversion operators.
Richard Smithed83ebd2015-02-05 07:02:11 +00004040 bool AllowExplicit = Kind.AllowExplicit() || IsListInit;
Sebastian Redl860eb7c2012-02-04 21:27:47 +00004041 bool CopyInitialization = Kind.getKind() == InitializationKind::IK_Copy;
Sebastian Redl88e4d492012-02-04 21:27:33 +00004042
Sebastian Redled2e5322011-12-22 14:44:04 +00004043 // - Otherwise, if T is a class type, constructors are considered. The
4044 // applicable constructors are enumerated, and the best one is chosen
4045 // through overload resolution.
Richard Smith40c78062015-02-21 02:31:57 +00004046 DeclContext::lookup_result Ctors = S.LookupConstructors(DestRecordDecl);
Sebastian Redled2e5322011-12-22 14:44:04 +00004047
Sebastian Redl860eb7c2012-02-04 21:27:47 +00004048 OverloadingResult Result = OR_No_Viable_Function;
Sebastian Redled2e5322011-12-22 14:44:04 +00004049 OverloadCandidateSet::iterator Best;
Sebastian Redl860eb7c2012-02-04 21:27:47 +00004050 bool AsInitializerList = false;
4051
Larisse Voufo19d08672015-01-27 18:47:05 +00004052 // C++11 [over.match.list]p1, per DR1467:
Larisse Voufod2010992015-01-24 23:09:54 +00004053 // When objects of non-aggregate type T are list-initialized, such that
4054 // 8.5.4 [dcl.init.list] specifies that overload resolution is performed
4055 // according to the rules in this section, overload resolution selects
4056 // the constructor in two phases:
4057 //
Sebastian Redl860eb7c2012-02-04 21:27:47 +00004058 // - Initially, the candidate functions are the initializer-list
4059 // constructors of the class T and the argument list consists of the
4060 // initializer list as a single argument.
Richard Smithed83ebd2015-02-05 07:02:11 +00004061 if (IsListInit) {
Sebastian Redl860eb7c2012-02-04 21:27:47 +00004062 AsInitializerList = true;
Richard Smithd86812d2012-07-05 08:39:21 +00004063
4064 // If the initializer list has no elements and T has a default constructor,
4065 // the first phase is omitted.
Richard Smith122f88d2016-12-06 23:52:28 +00004066 if (!(UnwrappedArgs.empty() && DestRecordDecl->hasDefaultConstructor()))
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00004067 Result = ResolveConstructorOverload(S, Kind.getLocation(), Args,
Richard Smith67ef14f2017-09-26 18:37:55 +00004068 CandidateSet, DestType, Ctors, Best,
Richard Smithd86812d2012-07-05 08:39:21 +00004069 CopyInitialization, AllowExplicit,
Rui Ueyama49a3ad22019-07-16 04:46:31 +00004070 /*OnlyListConstructors=*/true,
Larisse Voufobcf327a2015-02-10 02:20:14 +00004071 IsListInit);
Sebastian Redl860eb7c2012-02-04 21:27:47 +00004072 }
4073
4074 // C++11 [over.match.list]p1:
4075 // - If no viable initializer-list constructor is found, overload resolution
4076 // is performed again, where the candidate functions are all the
Richard Smithd86812d2012-07-05 08:39:21 +00004077 // constructors of the class T and the argument list consists of the
Sebastian Redl860eb7c2012-02-04 21:27:47 +00004078 // elements of the initializer list.
4079 if (Result == OR_No_Viable_Function) {
4080 AsInitializerList = false;
Richard Smith122f88d2016-12-06 23:52:28 +00004081 Result = ResolveConstructorOverload(S, Kind.getLocation(), UnwrappedArgs,
Richard Smith67ef14f2017-09-26 18:37:55 +00004082 CandidateSet, DestType, Ctors, Best,
Sebastian Redl860eb7c2012-02-04 21:27:47 +00004083 CopyInitialization, AllowExplicit,
Larisse Voufobcf327a2015-02-10 02:20:14 +00004084 /*OnlyListConstructors=*/false,
4085 IsListInit);
Sebastian Redl860eb7c2012-02-04 21:27:47 +00004086 }
4087 if (Result) {
Richard Smithed83ebd2015-02-05 07:02:11 +00004088 Sequence.SetOverloadFailure(IsListInit ?
Sebastian Redl6901c0d2011-12-22 18:58:38 +00004089 InitializationSequence::FK_ListConstructorOverloadFailed :
4090 InitializationSequence::FK_ConstructorOverloadFailed,
Sebastian Redled2e5322011-12-22 14:44:04 +00004091 Result);
4092 return;
4093 }
4094
Richard Smith67ef14f2017-09-26 18:37:55 +00004095 bool HadMultipleCandidates = (CandidateSet.size() > 1);
4096
4097 // In C++17, ResolveConstructorOverload can select a conversion function
4098 // instead of a constructor.
4099 if (auto *CD = dyn_cast<CXXConversionDecl>(Best->Function)) {
4100 // Add the user-defined conversion step that calls the conversion function.
4101 QualType ConvType = CD->getConversionType();
4102 assert(S.Context.hasSameUnqualifiedType(ConvType, DestType) &&
4103 "should not have selected this conversion function");
4104 Sequence.AddUserConversionStep(CD, Best->FoundDecl, ConvType,
4105 HadMultipleCandidates);
4106 if (!S.Context.hasSameType(ConvType, DestType))
4107 Sequence.AddQualificationConversionStep(DestType, VK_RValue);
4108 if (IsListInit)
4109 Sequence.RewrapReferenceInitList(Entity.getType(), ILE);
4110 return;
4111 }
4112
Richard Smithd86812d2012-07-05 08:39:21 +00004113 // C++11 [dcl.init]p6:
Sebastian Redled2e5322011-12-22 14:44:04 +00004114 // If a program calls for the default initialization of an object
4115 // of a const-qualified type T, T shall be a class type with a
4116 // user-provided default constructor.
Nico Weber6a6376b2016-02-19 01:52:46 +00004117 // C++ core issue 253 proposal:
4118 // If the implicit default constructor initializes all subobjects, no
4119 // initializer should be required.
4120 // The 253 proposal is for example needed to process libstdc++ headers in 5.x.
4121 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
Sebastian Redled2e5322011-12-22 14:44:04 +00004122 if (Kind.getKind() == InitializationKind::IK_Default &&
Nico Weber6a6376b2016-02-19 01:52:46 +00004123 Entity.getType().isConstQualified()) {
4124 if (!CtorDecl->getParent()->allowConstDefaultInit()) {
4125 if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
4126 Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
4127 return;
4128 }
Sebastian Redled2e5322011-12-22 14:44:04 +00004129 }
4130
Sebastian Redl048a6d72012-04-01 19:54:59 +00004131 // C++11 [over.match.list]p1:
4132 // In copy-list-initialization, if an explicit constructor is chosen, the
4133 // initializer is ill-formed.
Richard Smithed83ebd2015-02-05 07:02:11 +00004134 if (IsListInit && !Kind.AllowExplicit() && CtorDecl->isExplicit()) {
Sebastian Redl048a6d72012-04-01 19:54:59 +00004135 Sequence.SetFailed(InitializationSequence::FK_ExplicitConstructor);
4136 return;
4137 }
4138
Sebastian Redled2e5322011-12-22 14:44:04 +00004139 // Add the constructor initialization step. Any cv-qualification conversion is
4140 // subsumed by the initialization.
Richard Smithed83ebd2015-02-05 07:02:11 +00004141 Sequence.AddConstructorInitializationStep(
Richard Smith410306b2016-12-12 02:53:20 +00004142 Best->FoundDecl, CtorDecl, DestArrayType, HadMultipleCandidates,
Richard Smithed83ebd2015-02-05 07:02:11 +00004143 IsListInit | IsInitListCopy, AsInitializerList);
Sebastian Redled2e5322011-12-22 14:44:04 +00004144}
4145
Sebastian Redl29526f02011-11-27 16:50:07 +00004146static bool
4147ResolveOverloadedFunctionForReferenceBinding(Sema &S,
4148 Expr *Initializer,
4149 QualType &SourceType,
4150 QualType &UnqualifiedSourceType,
4151 QualType UnqualifiedTargetType,
4152 InitializationSequence &Sequence) {
4153 if (S.Context.getCanonicalType(UnqualifiedSourceType) ==
4154 S.Context.OverloadTy) {
4155 DeclAccessPair Found;
4156 bool HadMultipleCandidates = false;
4157 if (FunctionDecl *Fn
4158 = S.ResolveAddressOfOverloadedFunction(Initializer,
4159 UnqualifiedTargetType,
4160 false, Found,
4161 &HadMultipleCandidates)) {
4162 Sequence.AddAddressOverloadResolutionStep(Fn, Found,
4163 HadMultipleCandidates);
4164 SourceType = Fn->getType();
4165 UnqualifiedSourceType = SourceType.getUnqualifiedType();
4166 } else if (!UnqualifiedTargetType->isRecordType()) {
4167 Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
4168 return true;
4169 }
4170 }
4171 return false;
4172}
4173
4174static void TryReferenceInitializationCore(Sema &S,
4175 const InitializedEntity &Entity,
4176 const InitializationKind &Kind,
4177 Expr *Initializer,
4178 QualType cv1T1, QualType T1,
4179 Qualifiers T1Quals,
4180 QualType cv2T2, QualType T2,
4181 Qualifiers T2Quals,
4182 InitializationSequence &Sequence);
4183
Richard Smithd86812d2012-07-05 08:39:21 +00004184static void TryValueInitialization(Sema &S,
4185 const InitializedEntity &Entity,
4186 const InitializationKind &Kind,
4187 InitializationSequence &Sequence,
Craig Topperc3ec1492014-05-26 06:22:03 +00004188 InitListExpr *InitList = nullptr);
Richard Smithd86812d2012-07-05 08:39:21 +00004189
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00004190/// Attempt list initialization of a reference.
Sebastian Redl29526f02011-11-27 16:50:07 +00004191static void TryReferenceListInitialization(Sema &S,
4192 const InitializedEntity &Entity,
4193 const InitializationKind &Kind,
4194 InitListExpr *InitList,
Manman Ren073db022016-03-10 18:53:19 +00004195 InitializationSequence &Sequence,
4196 bool TreatUnavailableAsInvalid) {
Sebastian Redl29526f02011-11-27 16:50:07 +00004197 // First, catch C++03 where this isn't possible.
Richard Smith2bf7fdb2013-01-02 11:42:31 +00004198 if (!S.getLangOpts().CPlusPlus11) {
Sebastian Redl29526f02011-11-27 16:50:07 +00004199 Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList);
4200 return;
4201 }
David Majnemer9370dc22015-04-26 07:35:03 +00004202 // Can't reference initialize a compound literal.
4203 if (Entity.getKind() == InitializedEntity::EK_CompoundLiteralInit) {
4204 Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList);
4205 return;
4206 }
Sebastian Redl29526f02011-11-27 16:50:07 +00004207
4208 QualType DestType = Entity.getType();
4209 QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType();
4210 Qualifiers T1Quals;
4211 QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
4212
4213 // Reference initialization via an initializer list works thus:
4214 // If the initializer list consists of a single element that is
4215 // reference-related to the referenced type, bind directly to that element
4216 // (possibly creating temporaries).
4217 // Otherwise, initialize a temporary with the initializer list and
4218 // bind to that.
4219 if (InitList->getNumInits() == 1) {
4220 Expr *Initializer = InitList->getInit(0);
4221 QualType cv2T2 = Initializer->getType();
4222 Qualifiers T2Quals;
4223 QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
4224
4225 // If this fails, creating a temporary wouldn't work either.
4226 if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2,
4227 T1, Sequence))
4228 return;
4229
Stephen Kellyf2ceec42018-08-09 21:08:08 +00004230 SourceLocation DeclLoc = Initializer->getBeginLoc();
Sebastian Redl29526f02011-11-27 16:50:07 +00004231 bool dummy1, dummy2, dummy3;
4232 Sema::ReferenceCompareResult RefRelationship
4233 = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, dummy1,
4234 dummy2, dummy3);
4235 if (RefRelationship >= Sema::Ref_Related) {
4236 // Try to bind the reference here.
4237 TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
4238 T1Quals, cv2T2, T2, T2Quals, Sequence);
4239 if (Sequence)
4240 Sequence.RewrapReferenceInitList(cv1T1, InitList);
4241 return;
4242 }
Richard Smith03d93932013-01-15 07:58:29 +00004243
4244 // Update the initializer if we've resolved an overloaded function.
4245 if (Sequence.step_begin() != Sequence.step_end())
4246 Sequence.RewrapReferenceInitList(cv1T1, InitList);
Sebastian Redl29526f02011-11-27 16:50:07 +00004247 }
4248
4249 // Not reference-related. Create a temporary and bind to that.
4250 InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1);
4251
Manman Ren073db022016-03-10 18:53:19 +00004252 TryListInitialization(S, TempEntity, Kind, InitList, Sequence,
4253 TreatUnavailableAsInvalid);
Sebastian Redl29526f02011-11-27 16:50:07 +00004254 if (Sequence) {
4255 if (DestType->isRValueReferenceType() ||
4256 (T1Quals.hasConst() && !T1Quals.hasVolatile()))
Rui Ueyama49a3ad22019-07-16 04:46:31 +00004257 Sequence.AddReferenceBindingStep(cv1T1, /*BindingTemporary=*/true);
Sebastian Redl29526f02011-11-27 16:50:07 +00004258 else
4259 Sequence.SetFailed(
4260 InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary);
4261 }
4262}
4263
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00004264/// Attempt list initialization (C++0x [dcl.init.list])
Rafael Espindola699fc4d2011-07-14 22:58:04 +00004265static void TryListInitialization(Sema &S,
4266 const InitializedEntity &Entity,
4267 const InitializationKind &Kind,
4268 InitListExpr *InitList,
Manman Ren073db022016-03-10 18:53:19 +00004269 InitializationSequence &Sequence,
4270 bool TreatUnavailableAsInvalid) {
Rafael Espindola699fc4d2011-07-14 22:58:04 +00004271 QualType DestType = Entity.getType();
4272
Sebastian Redlb49c46c2011-09-24 17:48:00 +00004273 // C++ doesn't allow scalar initialization with more than one argument.
4274 // But C99 complex numbers are scalars and it makes sense there.
David Blaikiebbafb8a2012-03-11 07:00:24 +00004275 if (S.getLangOpts().CPlusPlus && DestType->isScalarType() &&
Sebastian Redlb49c46c2011-09-24 17:48:00 +00004276 !DestType->isAnyComplexType() && InitList->getNumInits() > 1) {
4277 Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar);
4278 return;
4279 }
Sebastian Redlb49c46c2011-09-24 17:48:00 +00004280 if (DestType->isReferenceType()) {
Manman Ren073db022016-03-10 18:53:19 +00004281 TryReferenceListInitialization(S, Entity, Kind, InitList, Sequence,
4282 TreatUnavailableAsInvalid);
Rafael Espindola699fc4d2011-07-14 22:58:04 +00004283 return;
Sebastian Redlb49c46c2011-09-24 17:48:00 +00004284 }
Sebastian Redl4f28b582012-02-19 12:27:43 +00004285
Larisse Voufod2010992015-01-24 23:09:54 +00004286 if (DestType->isRecordType() &&
Stephen Kellyf2ceec42018-08-09 21:08:08 +00004287 !S.isCompleteType(InitList->getBeginLoc(), DestType)) {
Larisse Voufod2010992015-01-24 23:09:54 +00004288 Sequence.setIncompleteTypeFailure(DestType);
4289 return;
4290 }
Richard Smithd86812d2012-07-05 08:39:21 +00004291
Larisse Voufo19d08672015-01-27 18:47:05 +00004292 // C++11 [dcl.init.list]p3, per DR1467:
Larisse Voufod2010992015-01-24 23:09:54 +00004293 // - If T is a class type and the initializer list has a single element of
4294 // type cv U, where U is T or a class derived from T, the object is
4295 // initialized from that element (by copy-initialization for
4296 // copy-list-initialization, or by direct-initialization for
4297 // direct-list-initialization).
4298 // - Otherwise, if T is a character array and the initializer list has a
4299 // single element that is an appropriately-typed string literal
4300 // (8.5.2 [dcl.init.string]), initialization is performed as described
4301 // in that section.
Larisse Voufo19d08672015-01-27 18:47:05 +00004302 // - Otherwise, if T is an aggregate, [...] (continue below).
4303 if (S.getLangOpts().CPlusPlus11 && InitList->getNumInits() == 1) {
Larisse Voufod2010992015-01-24 23:09:54 +00004304 if (DestType->isRecordType()) {
4305 QualType InitType = InitList->getInit(0)->getType();
4306 if (S.Context.hasSameUnqualifiedType(InitType, DestType) ||
Stephen Kellyf2ceec42018-08-09 21:08:08 +00004307 S.IsDerivedFrom(InitList->getBeginLoc(), InitType, DestType)) {
Richard Smith122f88d2016-12-06 23:52:28 +00004308 Expr *InitListAsExpr = InitList;
4309 TryConstructorInitialization(S, Entity, Kind, InitListAsExpr, DestType,
Richard Smith410306b2016-12-12 02:53:20 +00004310 DestType, Sequence,
4311 /*InitListSyntax*/false,
4312 /*IsInitListCopy*/true);
Larisse Voufod2010992015-01-24 23:09:54 +00004313 return;
4314 }
4315 }
4316 if (const ArrayType *DestAT = S.Context.getAsArrayType(DestType)) {
4317 Expr *SubInit[1] = {InitList->getInit(0)};
4318 if (!isa<VariableArrayType>(DestAT) &&
4319 IsStringInit(SubInit[0], DestAT, S.Context) == SIF_None) {
4320 InitializationKind SubKind =
4321 Kind.getKind() == InitializationKind::IK_DirectList
4322 ? InitializationKind::CreateDirect(Kind.getLocation(),
4323 InitList->getLBraceLoc(),
4324 InitList->getRBraceLoc())
4325 : Kind;
4326 Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
Manman Ren073db022016-03-10 18:53:19 +00004327 /*TopLevelOfInitList*/ true,
4328 TreatUnavailableAsInvalid);
Larisse Voufod2010992015-01-24 23:09:54 +00004329
4330 // TryStringLiteralInitialization() (in InitializeFrom()) will fail if
4331 // the element is not an appropriately-typed string literal, in which
4332 // case we should proceed as in C++11 (below).
4333 if (Sequence) {
4334 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
4335 return;
4336 }
4337 }
Sebastian Redl4f28b582012-02-19 12:27:43 +00004338 }
Rafael Espindola699fc4d2011-07-14 22:58:04 +00004339 }
Larisse Voufod2010992015-01-24 23:09:54 +00004340
4341 // C++11 [dcl.init.list]p3:
4342 // - If T is an aggregate, aggregate initialization is performed.
Faisal Vali30622bb2015-12-07 02:37:44 +00004343 if ((DestType->isRecordType() && !DestType->isAggregateType()) ||
4344 (S.getLangOpts().CPlusPlus11 &&
4345 S.isStdInitializerList(DestType, nullptr))) {
Larisse Voufod2010992015-01-24 23:09:54 +00004346 if (S.getLangOpts().CPlusPlus11) {
4347 // - Otherwise, if the initializer list has no elements and T is a
4348 // class type with a default constructor, the object is
4349 // value-initialized.
4350 if (InitList->getNumInits() == 0) {
4351 CXXRecordDecl *RD = DestType->getAsCXXRecordDecl();
4352 if (RD->hasDefaultConstructor()) {
4353 TryValueInitialization(S, Entity, Kind, Sequence, InitList);
4354 return;
4355 }
4356 }
4357
4358 // - Otherwise, if T is a specialization of std::initializer_list<E>,
4359 // an initializer_list object constructed [...]
Manman Ren073db022016-03-10 18:53:19 +00004360 if (TryInitializerListConstruction(S, InitList, DestType, Sequence,
4361 TreatUnavailableAsInvalid))
Larisse Voufod2010992015-01-24 23:09:54 +00004362 return;
4363
4364 // - Otherwise, if T is a class type, constructors are considered.
4365 Expr *InitListAsExpr = InitList;
4366 TryConstructorInitialization(S, Entity, Kind, InitListAsExpr, DestType,
Richard Smith410306b2016-12-12 02:53:20 +00004367 DestType, Sequence, /*InitListSyntax*/true);
Larisse Voufod2010992015-01-24 23:09:54 +00004368 } else
4369 Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType);
4370 return;
4371 }
4372
Richard Smith089c3162013-09-21 21:55:46 +00004373 if (S.getLangOpts().CPlusPlus && !DestType->isAggregateType() &&
Richard Smithed638862016-03-28 06:08:37 +00004374 InitList->getNumInits() == 1) {
4375 Expr *E = InitList->getInit(0);
4376
4377 // - Otherwise, if T is an enumeration with a fixed underlying type,
4378 // the initializer-list has a single element v, and the initialization
4379 // is direct-list-initialization, the object is initialized with the
4380 // value T(v); if a narrowing conversion is required to convert v to
4381 // the underlying type of T, the program is ill-formed.
4382 auto *ET = DestType->getAs<EnumType>();
Aaron Ballmanc351fba2017-12-04 20:27:34 +00004383 if (S.getLangOpts().CPlusPlus17 &&
Richard Smithed638862016-03-28 06:08:37 +00004384 Kind.getKind() == InitializationKind::IK_DirectList &&
4385 ET && ET->getDecl()->isFixed() &&
4386 !S.Context.hasSameUnqualifiedType(E->getType(), DestType) &&
4387 (E->getType()->isIntegralOrEnumerationType() ||
4388 E->getType()->isFloatingType())) {
4389 // There are two ways that T(v) can work when T is an enumeration type.
4390 // If there is either an implicit conversion sequence from v to T or
4391 // a conversion function that can convert from v to T, then we use that.
4392 // Otherwise, if v is of integral, enumeration, or floating-point type,
4393 // it is converted to the enumeration type via its underlying type.
4394 // There is no overlap possible between these two cases (except when the
4395 // source value is already of the destination type), and the first
4396 // case is handled by the general case for single-element lists below.
4397 ImplicitConversionSequence ICS;
4398 ICS.setStandard();
4399 ICS.Standard.setAsIdentityConversion();
Vedant Kumarf4217f82017-02-16 01:20:00 +00004400 if (!E->isRValue())
4401 ICS.Standard.First = ICK_Lvalue_To_Rvalue;
Richard Smithed638862016-03-28 06:08:37 +00004402 // If E is of a floating-point type, then the conversion is ill-formed
4403 // due to narrowing, but go through the motions in order to produce the
4404 // right diagnostic.
4405 ICS.Standard.Second = E->getType()->isFloatingType()
4406 ? ICK_Floating_Integral
4407 : ICK_Integral_Conversion;
4408 ICS.Standard.setFromType(E->getType());
4409 ICS.Standard.setToType(0, E->getType());
4410 ICS.Standard.setToType(1, DestType);
4411 ICS.Standard.setToType(2, DestType);
4412 Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2),
4413 /*TopLevelOfInitList*/true);
4414 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
4415 return;
4416 }
4417
Richard Smith089c3162013-09-21 21:55:46 +00004418 // - Otherwise, if the initializer list has a single element of type E
4419 // [...references are handled above...], the object or reference is
Larisse Voufod2010992015-01-24 23:09:54 +00004420 // initialized from that element (by copy-initialization for
4421 // copy-list-initialization, or by direct-initialization for
4422 // direct-list-initialization); if a narrowing conversion is required
4423 // to convert the element to T, the program is ill-formed.
4424 //
Richard Smith089c3162013-09-21 21:55:46 +00004425 // Per core-24034, this is direct-initialization if we were performing
4426 // direct-list-initialization and copy-initialization otherwise.
4427 // We can't use InitListChecker for this, because it always performs
4428 // copy-initialization. This only matters if we might use an 'explicit'
4429 // conversion operator, so we only need to handle the cases where the source
4430 // is of record type.
Richard Smithed638862016-03-28 06:08:37 +00004431 if (InitList->getInit(0)->getType()->isRecordType()) {
4432 InitializationKind SubKind =
4433 Kind.getKind() == InitializationKind::IK_DirectList
4434 ? InitializationKind::CreateDirect(Kind.getLocation(),
4435 InitList->getLBraceLoc(),
4436 InitList->getRBraceLoc())
4437 : Kind;
4438 Expr *SubInit[1] = { InitList->getInit(0) };
4439 Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
4440 /*TopLevelOfInitList*/true,
4441 TreatUnavailableAsInvalid);
4442 if (Sequence)
4443 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
4444 return;
4445 }
Richard Smith089c3162013-09-21 21:55:46 +00004446 }
Rafael Espindola699fc4d2011-07-14 22:58:04 +00004447
Sebastian Redlb49c46c2011-09-24 17:48:00 +00004448 InitListChecker CheckInitList(S, Entity, InitList,
Manman Ren073db022016-03-10 18:53:19 +00004449 DestType, /*VerifyOnly=*/true, TreatUnavailableAsInvalid);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00004450 if (CheckInitList.HadError()) {
4451 Sequence.SetFailed(InitializationSequence::FK_ListInitializationFailed);
4452 return;
4453 }
4454
4455 // Add the list initialization step with the built init list.
Rafael Espindola699fc4d2011-07-14 22:58:04 +00004456 Sequence.AddListInitializationStep(DestType);
4457}
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004458
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00004459/// Try a reference initialization that involves calling a conversion
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004460/// function.
Richard Smithb8c0f552016-12-09 18:49:13 +00004461static OverloadingResult TryRefInitWithConversionFunction(
4462 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
4463 Expr *Initializer, bool AllowRValues, bool IsLValueRef,
4464 InitializationSequence &Sequence) {
Douglas Gregor1b303932009-12-22 15:35:07 +00004465 QualType DestType = Entity.getType();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004466 QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType();
4467 QualType T1 = cv1T1.getUnqualifiedType();
4468 QualType cv2T2 = Initializer->getType();
4469 QualType T2 = cv2T2.getUnqualifiedType();
4470
4471 bool DerivedToBase;
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00004472 bool ObjCConversion;
John McCall31168b02011-06-15 23:02:42 +00004473 bool ObjCLifetimeConversion;
Stephen Kellyf2ceec42018-08-09 21:08:08 +00004474 assert(!S.CompareReferenceRelationship(Initializer->getBeginLoc(), T1, T2,
4475 DerivedToBase, ObjCConversion,
John McCall31168b02011-06-15 23:02:42 +00004476 ObjCLifetimeConversion) &&
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004477 "Must have incompatible references when binding via conversion");
Chandler Carruth8abbc652009-12-13 01:37:04 +00004478 (void)DerivedToBase;
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00004479 (void)ObjCConversion;
John McCall31168b02011-06-15 23:02:42 +00004480 (void)ObjCLifetimeConversion;
Fangrui Song6907ce22018-07-30 19:24:48 +00004481
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004482 // Build the candidate set directly in the initialization sequence
4483 // structure, so that it will persist if we fail.
4484 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
Richard Smith67ef14f2017-09-26 18:37:55 +00004485 CandidateSet.clear(OverloadCandidateSet::CSK_InitByUserDefinedConversion);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004486
Richard Smithb368ea82018-07-02 23:25:22 +00004487 // Determine whether we are allowed to call explicit conversion operators.
4488 // Note that none of [over.match.copy], [over.match.conv], nor
4489 // [over.match.ref] permit an explicit constructor to be chosen when
4490 // initializing a reference, not even for direct-initialization.
4491 bool AllowExplicitCtors = false;
Richard Smith6c6ddab2013-09-21 21:23:47 +00004492 bool AllowExplicitConvs = Kind.allowExplicitConversionFunctionsInRefBinding();
4493
Craig Topperc3ec1492014-05-26 06:22:03 +00004494 const RecordType *T1RecordType = nullptr;
Douglas Gregor496e8b342010-05-07 19:42:26 +00004495 if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) &&
Richard Smithdb0ac552015-12-18 22:40:25 +00004496 S.isCompleteType(Kind.getLocation(), T1)) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004497 // The type we're converting to is a class type. Enumerate its constructors
4498 // to see if there is a suitable conversion.
4499 CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl());
John McCall3696dcb2010-08-17 07:23:57 +00004500
Richard Smith40c78062015-02-21 02:31:57 +00004501 for (NamedDecl *D : S.LookupConstructors(T1RecordDecl)) {
Richard Smithc2bebe92016-05-11 20:37:46 +00004502 auto Info = getConstructorInfo(D);
4503 if (!Info.Constructor)
4504 continue;
John McCalla0296f72010-03-19 07:35:19 +00004505
Richard Smithc2bebe92016-05-11 20:37:46 +00004506 if (!Info.Constructor->isInvalidDecl() &&
Richard Smithb368ea82018-07-02 23:25:22 +00004507 Info.Constructor->isConvertingConstructor(AllowExplicitCtors)) {
Richard Smithc2bebe92016-05-11 20:37:46 +00004508 if (Info.ConstructorTmpl)
Richard Smith76b90272019-05-09 03:59:21 +00004509 S.AddTemplateOverloadCandidate(
4510 Info.ConstructorTmpl, Info.FoundDecl,
4511 /*ExplicitArgs*/ nullptr, Initializer, CandidateSet,
4512 /*SuppressUserConversions=*/true,
4513 /*PartialOverloading*/ false, AllowExplicitCtors);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004514 else
Richard Smith76b90272019-05-09 03:59:21 +00004515 S.AddOverloadCandidate(
4516 Info.Constructor, Info.FoundDecl, Initializer, CandidateSet,
4517 /*SuppressUserConversions=*/true,
4518 /*PartialOverloading*/ false, AllowExplicitCtors);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004519 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004520 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004521 }
John McCall3696dcb2010-08-17 07:23:57 +00004522 if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl())
4523 return OR_No_Viable_Function;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004524
Craig Topperc3ec1492014-05-26 06:22:03 +00004525 const RecordType *T2RecordType = nullptr;
Douglas Gregor496e8b342010-05-07 19:42:26 +00004526 if ((T2RecordType = T2->getAs<RecordType>()) &&
Richard Smithdb0ac552015-12-18 22:40:25 +00004527 S.isCompleteType(Kind.getLocation(), T2)) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004528 // The type we're converting from is a class type, enumerate its conversion
4529 // functions.
4530 CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl());
4531
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004532 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
4533 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004534 NamedDecl *D = *I;
4535 CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
4536 if (isa<UsingShadowDecl>(D))
4537 D = cast<UsingShadowDecl>(D)->getTargetDecl();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004538
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004539 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
4540 CXXConversionDecl *Conv;
4541 if (ConvTemplate)
4542 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
4543 else
Sebastian Redld92badf2010-06-30 18:13:39 +00004544 Conv = cast<CXXConversionDecl>(D);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004545
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004546 // If the conversion function doesn't return a reference type,
4547 // it can't be considered for this conversion unless we're allowed to
4548 // consider rvalues.
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004549 // FIXME: Do we need to make sure that we only consider conversion
4550 // candidates with reference-compatible results? That might be needed to
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004551 // break recursion.
Douglas Gregor6073dca2012-02-24 23:56:31 +00004552 if ((AllowExplicitConvs || !Conv->isExplicit()) &&
Richard Smith76b90272019-05-09 03:59:21 +00004553 (AllowRValues ||
4554 Conv->getConversionType()->isLValueReferenceType())) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004555 if (ConvTemplate)
Richard Smith76b90272019-05-09 03:59:21 +00004556 S.AddTemplateConversionCandidate(
4557 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
4558 CandidateSet,
4559 /*AllowObjCConversionOnExplicit=*/false, AllowExplicitConvs);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004560 else
Richard Smith76b90272019-05-09 03:59:21 +00004561 S.AddConversionCandidate(
4562 Conv, I.getPair(), ActingDC, Initializer, DestType, CandidateSet,
4563 /*AllowObjCConversionOnExplicit=*/false, AllowExplicitConvs);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004564 }
4565 }
4566 }
John McCall3696dcb2010-08-17 07:23:57 +00004567 if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl())
4568 return OR_No_Viable_Function;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004569
Stephen Kellyf2ceec42018-08-09 21:08:08 +00004570 SourceLocation DeclLoc = Initializer->getBeginLoc();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004571
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004572 // Perform overload resolution. If it fails, return the failed result.
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004573 OverloadCandidateSet::iterator Best;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004574 if (OverloadingResult Result
Richard Smith67ef14f2017-09-26 18:37:55 +00004575 = CandidateSet.BestViableFunction(S, DeclLoc, Best))
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004576 return Result;
Eli Friedmanad6c2e52009-12-11 02:42:07 +00004577
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004578 FunctionDecl *Function = Best->Function;
Nick Lewyckya096b142013-02-12 08:08:54 +00004579 // This is the overload that will be used for this initialization step if we
4580 // use this initialization. Mark it as referenced.
4581 Function->setReferenced();
Chandler Carruth30141632011-02-25 19:41:05 +00004582
Richard Smithb8c0f552016-12-09 18:49:13 +00004583 // Compute the returned type and value kind of the conversion.
4584 QualType cv3T3;
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004585 if (isa<CXXConversionDecl>(Function))
Richard Smithb8c0f552016-12-09 18:49:13 +00004586 cv3T3 = Function->getReturnType();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004587 else
Richard Smithb8c0f552016-12-09 18:49:13 +00004588 cv3T3 = T1;
4589
4590 ExprValueKind VK = VK_RValue;
4591 if (cv3T3->isLValueReferenceType())
4592 VK = VK_LValue;
4593 else if (const auto *RRef = cv3T3->getAs<RValueReferenceType>())
4594 VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue;
4595 cv3T3 = cv3T3.getNonLValueExprType(S.Context);
Eli Friedmanad6c2e52009-12-11 02:42:07 +00004596
4597 // Add the user-defined conversion step.
Abramo Bagnara5001caa2011-11-19 11:44:21 +00004598 bool HadMultipleCandidates = (CandidateSet.size() > 1);
Richard Smithb8c0f552016-12-09 18:49:13 +00004599 Sequence.AddUserConversionStep(Function, Best->FoundDecl, cv3T3,
Abramo Bagnara5001caa2011-11-19 11:44:21 +00004600 HadMultipleCandidates);
Eli Friedmanad6c2e52009-12-11 02:42:07 +00004601
Richard Smithb8c0f552016-12-09 18:49:13 +00004602 // Determine whether we'll need to perform derived-to-base adjustments or
4603 // other conversions.
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004604 bool NewDerivedToBase = false;
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00004605 bool NewObjCConversion = false;
John McCall31168b02011-06-15 23:02:42 +00004606 bool NewObjCLifetimeConversion = false;
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004607 Sema::ReferenceCompareResult NewRefRelationship
Richard Smithb8c0f552016-12-09 18:49:13 +00004608 = S.CompareReferenceRelationship(DeclLoc, T1, cv3T3,
John McCall31168b02011-06-15 23:02:42 +00004609 NewDerivedToBase, NewObjCConversion,
4610 NewObjCLifetimeConversion);
Richard Smithb8c0f552016-12-09 18:49:13 +00004611
4612 // Add the final conversion sequence, if necessary.
Douglas Gregor1ce52ca2010-03-07 23:17:44 +00004613 if (NewRefRelationship == Sema::Ref_Incompatible) {
Richard Smithb8c0f552016-12-09 18:49:13 +00004614 assert(!isa<CXXConstructorDecl>(Function) &&
4615 "should not have conversion after constructor");
4616
Douglas Gregor1ce52ca2010-03-07 23:17:44 +00004617 ImplicitConversionSequence ICS;
4618 ICS.setStandard();
4619 ICS.Standard = Best->FinalConversion;
Richard Smithb8c0f552016-12-09 18:49:13 +00004620 Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2));
4621
4622 // Every implicit conversion results in a prvalue, except for a glvalue
4623 // derived-to-base conversion, which we handle below.
4624 cv3T3 = ICS.Standard.getToType(2);
4625 VK = VK_RValue;
4626 }
4627
4628 // If the converted initializer is a prvalue, its type T4 is adjusted to
4629 // type "cv1 T4" and the temporary materialization conversion is applied.
4630 //
4631 // We adjust the cv-qualifications to match the reference regardless of
4632 // whether we have a prvalue so that the AST records the change. In this
4633 // case, T4 is "cv3 T3".
4634 QualType cv1T4 = S.Context.getQualifiedType(cv3T3, cv1T1.getQualifiers());
4635 if (cv1T4.getQualifiers() != cv3T3.getQualifiers())
4636 Sequence.AddQualificationConversionStep(cv1T4, VK);
4637 Sequence.AddReferenceBindingStep(cv1T4, VK == VK_RValue);
4638 VK = IsLValueRef ? VK_LValue : VK_XValue;
4639
4640 if (NewDerivedToBase)
4641 Sequence.AddDerivedToBaseCastStep(cv1T1, VK);
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00004642 else if (NewObjCConversion)
Richard Smithb8c0f552016-12-09 18:49:13 +00004643 Sequence.AddObjCObjectConversionStep(cv1T1);
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00004644
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004645 return OR_Success;
4646}
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004647
Richard Smithc620f552011-10-19 16:55:56 +00004648static void CheckCXX98CompatAccessibleCopy(Sema &S,
4649 const InitializedEntity &Entity,
4650 Expr *CurInitExpr);
4651
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00004652/// Attempt reference initialization (C++0x [dcl.init.ref])
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004653static void TryReferenceInitialization(Sema &S,
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004654 const InitializedEntity &Entity,
4655 const InitializationKind &Kind,
4656 Expr *Initializer,
4657 InitializationSequence &Sequence) {
Douglas Gregor1b303932009-12-22 15:35:07 +00004658 QualType DestType = Entity.getType();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004659 QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType();
Chandler Carruth04bdce62010-01-12 20:32:25 +00004660 Qualifiers T1Quals;
4661 QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004662 QualType cv2T2 = Initializer->getType();
Chandler Carruth04bdce62010-01-12 20:32:25 +00004663 Qualifiers T2Quals;
4664 QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
Sebastian Redld92badf2010-06-30 18:13:39 +00004665
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004666 // If the initializer is the address of an overloaded function, try
4667 // to resolve the overloaded function. If all goes well, T2 is the
4668 // type of the resulting function.
Sebastian Redl29526f02011-11-27 16:50:07 +00004669 if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2,
4670 T1, Sequence))
4671 return;
Sebastian Redld92badf2010-06-30 18:13:39 +00004672
Sebastian Redl29526f02011-11-27 16:50:07 +00004673 // Delegate everything else to a subfunction.
4674 TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
4675 T1Quals, cv2T2, T2, T2Quals, Sequence);
4676}
4677
Richard Smithb8c0f552016-12-09 18:49:13 +00004678/// Determine whether an expression is a non-referenceable glvalue (one to
Alexander Kornienko2a8c18d2018-04-06 15:14:32 +00004679/// which a reference can never bind). Attempting to bind a reference to
Richard Smithb8c0f552016-12-09 18:49:13 +00004680/// such a glvalue will always create a temporary.
4681static bool isNonReferenceableGLValue(Expr *E) {
4682 return E->refersToBitField() || E->refersToVectorElement();
Jordan Roseb1312a52013-04-11 00:58:58 +00004683}
4684
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00004685/// Reference initialization without resolving overloaded functions.
Sebastian Redl29526f02011-11-27 16:50:07 +00004686static void TryReferenceInitializationCore(Sema &S,
4687 const InitializedEntity &Entity,
4688 const InitializationKind &Kind,
4689 Expr *Initializer,
4690 QualType cv1T1, QualType T1,
4691 Qualifiers T1Quals,
4692 QualType cv2T2, QualType T2,
4693 Qualifiers T2Quals,
4694 InitializationSequence &Sequence) {
4695 QualType DestType = Entity.getType();
Stephen Kellyf2ceec42018-08-09 21:08:08 +00004696 SourceLocation DeclLoc = Initializer->getBeginLoc();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004697 // Compute some basic properties of the types and the initializer.
4698 bool isLValueRef = DestType->isLValueReferenceType();
4699 bool isRValueRef = !isLValueRef;
4700 bool DerivedToBase = false;
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00004701 bool ObjCConversion = false;
John McCall31168b02011-06-15 23:02:42 +00004702 bool ObjCLifetimeConversion = false;
Sebastian Redld92badf2010-06-30 18:13:39 +00004703 Expr::Classification InitCategory = Initializer->Classify(S.Context);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004704 Sema::ReferenceCompareResult RefRelationship
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00004705 = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase,
John McCall31168b02011-06-15 23:02:42 +00004706 ObjCConversion, ObjCLifetimeConversion);
Sebastian Redld92badf2010-06-30 18:13:39 +00004707
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004708 // C++0x [dcl.init.ref]p5:
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004709 // A reference to type "cv1 T1" is initialized by an expression of type
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004710 // "cv2 T2" as follows:
4711 //
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004712 // - If the reference is an lvalue reference and the initializer
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004713 // expression
Richard Smith6c6ddab2013-09-21 21:23:47 +00004714 // Note the analogous bullet points for rvalue refs to functions. Because
Sebastian Redld92badf2010-06-30 18:13:39 +00004715 // there are no function rvalues in C++, rvalue refs to functions are treated
4716 // like lvalue refs.
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004717 OverloadingResult ConvOvlResult = OR_Success;
Sebastian Redld92badf2010-06-30 18:13:39 +00004718 bool T1Function = T1->isFunctionType();
4719 if (isLValueRef || T1Function) {
Richard Smithb8c0f552016-12-09 18:49:13 +00004720 if (InitCategory.isLValue() && !isNonReferenceableGLValue(Initializer) &&
Richard Smithce766292016-10-21 23:01:55 +00004721 (RefRelationship == Sema::Ref_Compatible ||
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004722 (Kind.isCStyleOrFunctionalCast() &&
Douglas Gregor58281352011-01-27 00:58:17 +00004723 RefRelationship == Sema::Ref_Related))) {
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004724 // - is an lvalue (but is not a bit-field), and "cv1 T1" is
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004725 // reference-compatible with "cv2 T2," or
Richard Smithb8c0f552016-12-09 18:49:13 +00004726 if (T1Quals != T2Quals)
4727 // Convert to cv1 T2. This should only add qualifiers unless this is a
4728 // c-style cast. The removal of qualifiers in that case notionally
4729 // happens after the reference binding, but that doesn't matter.
4730 Sequence.AddQualificationConversionStep(
4731 S.Context.getQualifiedType(T2, T1Quals),
4732 Initializer->getValueKind());
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004733 if (DerivedToBase)
Richard Smithb8c0f552016-12-09 18:49:13 +00004734 Sequence.AddDerivedToBaseCastStep(cv1T1, VK_LValue);
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00004735 else if (ObjCConversion)
Richard Smithb8c0f552016-12-09 18:49:13 +00004736 Sequence.AddObjCObjectConversionStep(cv1T1);
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00004737
Richard Smithb8c0f552016-12-09 18:49:13 +00004738 // We only create a temporary here when binding a reference to a
4739 // bit-field or vector element. Those cases are't supposed to be
4740 // handled by this bullet, but the outcome is the same either way.
4741 Sequence.AddReferenceBindingStep(cv1T1, false);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004742 return;
4743 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004744
4745 // - has a class type (i.e., T2 is a class type), where T1 is not
4746 // reference-related to T2, and can be implicitly converted to an
4747 // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible
4748 // with "cv3 T3" (this conversion is selected by enumerating the
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004749 // applicable conversion functions (13.3.1.6) and choosing the best
4750 // one through overload resolution (13.3)),
Sebastian Redld92badf2010-06-30 18:13:39 +00004751 // If we have an rvalue ref to function type here, the rhs must be
Richard Smith6c6ddab2013-09-21 21:23:47 +00004752 // an rvalue. DR1287 removed the "implicitly" here.
Sebastian Redld92badf2010-06-30 18:13:39 +00004753 if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() &&
4754 (isLValueRef || InitCategory.isRValue())) {
Richard Smith6c6ddab2013-09-21 21:23:47 +00004755 ConvOvlResult = TryRefInitWithConversionFunction(
Richard Smithb8c0f552016-12-09 18:49:13 +00004756 S, Entity, Kind, Initializer, /*AllowRValues*/ isRValueRef,
4757 /*IsLValueRef*/ isLValueRef, Sequence);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004758 if (ConvOvlResult == OR_Success)
4759 return;
Richard Smith6c6ddab2013-09-21 21:23:47 +00004760 if (ConvOvlResult != OR_No_Viable_Function)
John McCall0d1da222010-01-12 00:44:57 +00004761 Sequence.SetOverloadFailure(
Richard Smith6c6ddab2013-09-21 21:23:47 +00004762 InitializationSequence::FK_ReferenceInitOverloadFailed,
4763 ConvOvlResult);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004764 }
4765 }
Sebastian Redld92badf2010-06-30 18:13:39 +00004766
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004767 // - Otherwise, the reference shall be an lvalue reference to a
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004768 // non-volatile const type (i.e., cv1 shall be const), or the reference
Douglas Gregor7a2a1162011-01-20 16:08:06 +00004769 // shall be an rvalue reference.
Anastasia Stulova3562edb2019-06-21 11:36:15 +00004770 // For address spaces, we interpret this to mean that an addr space
4771 // of a reference "cv1 T1" is a superset of addr space of "cv2 T2".
4772 if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile() &&
4773 T1Quals.isAddressSpaceSupersetOf(T2Quals))) {
Douglas Gregorbcd62532010-11-08 15:20:28 +00004774 if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy)
4775 Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
4776 else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004777 Sequence.SetOverloadFailure(
4778 InitializationSequence::FK_ReferenceInitOverloadFailed,
4779 ConvOvlResult);
Richard Smithb8c0f552016-12-09 18:49:13 +00004780 else if (!InitCategory.isLValue())
4781 Sequence.SetFailed(
Anastasia Stulova3562edb2019-06-21 11:36:15 +00004782 T1Quals.isAddressSpaceSupersetOf(T2Quals)
4783 ? InitializationSequence::
4784 FK_NonConstLValueReferenceBindingToTemporary
4785 : InitializationSequence::FK_ReferenceInitDropsQualifiers);
Richard Smithb8c0f552016-12-09 18:49:13 +00004786 else {
4787 InitializationSequence::FailureKind FK;
4788 switch (RefRelationship) {
4789 case Sema::Ref_Compatible:
4790 if (Initializer->refersToBitField())
4791 FK = InitializationSequence::
4792 FK_NonConstLValueReferenceBindingToBitfield;
4793 else if (Initializer->refersToVectorElement())
4794 FK = InitializationSequence::
4795 FK_NonConstLValueReferenceBindingToVectorElement;
4796 else
4797 llvm_unreachable("unexpected kind of compatible initializer");
4798 break;
4799 case Sema::Ref_Related:
4800 FK = InitializationSequence::FK_ReferenceInitDropsQualifiers;
4801 break;
4802 case Sema::Ref_Incompatible:
4803 FK = InitializationSequence::
4804 FK_NonConstLValueReferenceBindingToUnrelated;
4805 break;
4806 }
4807 Sequence.SetFailed(FK);
4808 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004809 return;
4810 }
Sebastian Redld92badf2010-06-30 18:13:39 +00004811
Douglas Gregor92e460e2011-01-20 16:44:54 +00004812 // - If the initializer expression
Richard Smithb8c0f552016-12-09 18:49:13 +00004813 // - is an
4814 // [<=14] xvalue (but not a bit-field), class prvalue, array prvalue, or
4815 // [1z] rvalue (but not a bit-field) or
4816 // function lvalue and "cv1 T1" is reference-compatible with "cv2 T2"
4817 //
4818 // Note: functions are handled above and below rather than here...
Douglas Gregor92e460e2011-01-20 16:44:54 +00004819 if (!T1Function &&
Richard Smithce766292016-10-21 23:01:55 +00004820 (RefRelationship == Sema::Ref_Compatible ||
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004821 (Kind.isCStyleOrFunctionalCast() &&
Douglas Gregor58281352011-01-27 00:58:17 +00004822 RefRelationship == Sema::Ref_Related)) &&
Richard Smithb8c0f552016-12-09 18:49:13 +00004823 ((InitCategory.isXValue() && !isNonReferenceableGLValue(Initializer)) ||
Richard Smith122f88d2016-12-06 23:52:28 +00004824 (InitCategory.isPRValue() &&
Aaron Ballmanc351fba2017-12-04 20:27:34 +00004825 (S.getLangOpts().CPlusPlus17 || T2->isRecordType() ||
Richard Smith122f88d2016-12-06 23:52:28 +00004826 T2->isArrayType())))) {
Richard Smithb8c0f552016-12-09 18:49:13 +00004827 ExprValueKind ValueKind = InitCategory.isXValue() ? VK_XValue : VK_RValue;
Douglas Gregor92e460e2011-01-20 16:44:54 +00004828 if (InitCategory.isPRValue() && T2->isRecordType()) {
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00004829 // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the
4830 // compiler the freedom to perform a copy here or bind to the
4831 // object, while C++0x requires that we bind directly to the
4832 // object. Hence, we always bind to the object without making an
4833 // extra copy. However, in C++03 requires that we check for the
4834 // presence of a suitable copy constructor:
4835 //
4836 // The constructor that would be used to make the copy shall
4837 // be callable whether or not the copy is actually done.
Richard Smith2bf7fdb2013-01-02 11:42:31 +00004838 if (!S.getLangOpts().CPlusPlus11 && !S.getLangOpts().MicrosoftExt)
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00004839 Sequence.AddExtraneousCopyToTemporary(cv2T2);
Richard Smith2bf7fdb2013-01-02 11:42:31 +00004840 else if (S.getLangOpts().CPlusPlus11)
Richard Smithc620f552011-10-19 16:55:56 +00004841 CheckCXX98CompatAccessibleCopy(S, Entity, Initializer);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004842 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004843
Richard Smithb8c0f552016-12-09 18:49:13 +00004844 // C++1z [dcl.init.ref]/5.2.1.2:
4845 // If the converted initializer is a prvalue, its type T4 is adjusted
4846 // to type "cv1 T4" and the temporary materialization conversion is
4847 // applied.
Anastasia Stulovad1986d12019-01-14 11:44:22 +00004848 // Postpone address space conversions to after the temporary materialization
4849 // conversion to allow creating temporaries in the alloca address space.
Anastasia Stulovae368e4d2019-02-05 11:32:58 +00004850 auto T1QualsIgnoreAS = T1Quals;
4851 auto T2QualsIgnoreAS = T2Quals;
4852 if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
4853 T1QualsIgnoreAS.removeAddressSpace();
4854 T2QualsIgnoreAS.removeAddressSpace();
4855 }
4856 QualType cv1T4 = S.Context.getQualifiedType(cv2T2, T1QualsIgnoreAS);
4857 if (T1QualsIgnoreAS != T2QualsIgnoreAS)
Richard Smithb8c0f552016-12-09 18:49:13 +00004858 Sequence.AddQualificationConversionStep(cv1T4, ValueKind);
4859 Sequence.AddReferenceBindingStep(cv1T4, ValueKind == VK_RValue);
4860 ValueKind = isLValueRef ? VK_LValue : VK_XValue;
Anastasia Stulovae368e4d2019-02-05 11:32:58 +00004861 // Add addr space conversion if required.
4862 if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
4863 auto T4Quals = cv1T4.getQualifiers();
4864 T4Quals.addAddressSpace(T1Quals.getAddressSpace());
4865 QualType cv1T4WithAS = S.Context.getQualifiedType(T2, T4Quals);
4866 Sequence.AddQualificationConversionStep(cv1T4WithAS, ValueKind);
Anastasia Stulovad1986d12019-01-14 11:44:22 +00004867 }
Richard Smithb8c0f552016-12-09 18:49:13 +00004868
4869 // In any case, the reference is bound to the resulting glvalue (or to
4870 // an appropriate base class subobject).
Douglas Gregor92e460e2011-01-20 16:44:54 +00004871 if (DerivedToBase)
Richard Smithb8c0f552016-12-09 18:49:13 +00004872 Sequence.AddDerivedToBaseCastStep(cv1T1, ValueKind);
Douglas Gregor92e460e2011-01-20 16:44:54 +00004873 else if (ObjCConversion)
Richard Smithb8c0f552016-12-09 18:49:13 +00004874 Sequence.AddObjCObjectConversionStep(cv1T1);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004875 return;
Douglas Gregor92e460e2011-01-20 16:44:54 +00004876 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004877
4878 // - has a class type (i.e., T2 is a class type), where T1 is not
4879 // reference-related to T2, and can be implicitly converted to an
Douglas Gregor92e460e2011-01-20 16:44:54 +00004880 // xvalue, class prvalue, or function lvalue of type "cv3 T3",
4881 // where "cv1 T1" is reference-compatible with "cv3 T3",
Richard Smith6c6ddab2013-09-21 21:23:47 +00004882 //
4883 // DR1287 removes the "implicitly" here.
Douglas Gregor92e460e2011-01-20 16:44:54 +00004884 if (T2->isRecordType()) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004885 if (RefRelationship == Sema::Ref_Incompatible) {
Richard Smith6c6ddab2013-09-21 21:23:47 +00004886 ConvOvlResult = TryRefInitWithConversionFunction(
Richard Smithb8c0f552016-12-09 18:49:13 +00004887 S, Entity, Kind, Initializer, /*AllowRValues*/ true,
4888 /*IsLValueRef*/ isLValueRef, Sequence);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004889 if (ConvOvlResult)
4890 Sequence.SetOverloadFailure(
Richard Smith6c6ddab2013-09-21 21:23:47 +00004891 InitializationSequence::FK_ReferenceInitOverloadFailed,
4892 ConvOvlResult);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004893
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004894 return;
4895 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004896
Richard Smithce766292016-10-21 23:01:55 +00004897 if (RefRelationship == Sema::Ref_Compatible &&
Douglas Gregor6fa6ab02013-03-26 23:59:23 +00004898 isRValueRef && InitCategory.isLValue()) {
4899 Sequence.SetFailed(
4900 InitializationSequence::FK_RValueReferenceBindingToLValue);
4901 return;
4902 }
4903
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004904 Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers);
4905 return;
4906 }
NAKAMURA Takumi7c288862011-01-27 07:09:49 +00004907
4908 // - Otherwise, a temporary of type "cv1 T1" is created and initialized
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004909 // from the initializer expression using the rules for a non-reference
Richard Smith2eabf782013-06-13 00:57:57 +00004910 // copy-initialization (8.5). The reference is then bound to the
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004911 // temporary. [...]
John McCallec6f4e92010-06-04 02:29:22 +00004912
Anastasia Stulovad3ae87e2019-03-06 13:02:41 +00004913 // Ignore address space of reference type at this point and perform address
4914 // space conversion after the reference binding step.
4915 QualType cv1T1IgnoreAS =
4916 T1Quals.hasAddressSpace()
4917 ? S.Context.getQualifiedType(T1, T1Quals.withoutAddressSpace())
4918 : cv1T1;
4919
4920 InitializedEntity TempEntity =
4921 InitializedEntity::InitializeTemporary(cv1T1IgnoreAS);
John McCallec6f4e92010-06-04 02:29:22 +00004922
Richard Smith2eabf782013-06-13 00:57:57 +00004923 // FIXME: Why do we use an implicit conversion here rather than trying
4924 // copy-initialization?
John McCall31168b02011-06-15 23:02:42 +00004925 ImplicitConversionSequence ICS
4926 = S.TryImplicitConversion(Initializer, TempEntity.getType(),
Richard Smith2eabf782013-06-13 00:57:57 +00004927 /*SuppressUserConversions=*/false,
4928 /*AllowExplicit=*/false,
Douglas Gregor58281352011-01-27 00:58:17 +00004929 /*FIXME:InOverloadResolution=*/false,
John McCall31168b02011-06-15 23:02:42 +00004930 /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
4931 /*AllowObjCWritebackConversion=*/false);
Fangrui Song6907ce22018-07-30 19:24:48 +00004932
John McCall31168b02011-06-15 23:02:42 +00004933 if (ICS.isBad()) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004934 // FIXME: Use the conversion function set stored in ICS to turn
4935 // this into an overloading ambiguity diagnostic. However, we need
4936 // to keep that set as an OverloadCandidateSet rather than as some
4937 // other kind of set.
Douglas Gregore1314a62009-12-18 05:02:21 +00004938 if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
4939 Sequence.SetOverloadFailure(
4940 InitializationSequence::FK_ReferenceInitOverloadFailed,
4941 ConvOvlResult);
Douglas Gregorbcd62532010-11-08 15:20:28 +00004942 else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy)
4943 Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
Douglas Gregore1314a62009-12-18 05:02:21 +00004944 else
4945 Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004946 return;
John McCall31168b02011-06-15 23:02:42 +00004947 } else {
4948 Sequence.AddConversionSequenceStep(ICS, TempEntity.getType());
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004949 }
4950
4951 // [...] If T1 is reference-related to T2, cv1 must be the
4952 // same cv-qualification as, or greater cv-qualification
4953 // than, cv2; otherwise, the program is ill-formed.
Chandler Carruth04bdce62010-01-12 20:32:25 +00004954 unsigned T1CVRQuals = T1Quals.getCVRQualifiers();
4955 unsigned T2CVRQuals = T2Quals.getCVRQualifiers();
Anastasia Stulovad3ae87e2019-03-06 13:02:41 +00004956 if ((RefRelationship == Sema::Ref_Related &&
4957 (T1CVRQuals | T2CVRQuals) != T1CVRQuals) ||
4958 !T1Quals.isAddressSpaceSupersetOf(T2Quals)) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004959 Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers);
4960 return;
4961 }
4962
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004963 // [...] If T1 is reference-related to T2 and the reference is an rvalue
Douglas Gregor24f2e8e2011-01-21 00:52:42 +00004964 // reference, the initializer expression shall not be an lvalue.
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004965 if (RefRelationship >= Sema::Ref_Related && !isLValueRef &&
Douglas Gregor24f2e8e2011-01-21 00:52:42 +00004966 InitCategory.isLValue()) {
4967 Sequence.SetFailed(
4968 InitializationSequence::FK_RValueReferenceBindingToLValue);
4969 return;
4970 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004971
Rui Ueyama49a3ad22019-07-16 04:46:31 +00004972 Sequence.AddReferenceBindingStep(cv1T1IgnoreAS, /*BindingTemporary=*/true);
Anastasia Stulovad3ae87e2019-03-06 13:02:41 +00004973
Anastasia Stulova5145b1e2019-06-05 14:03:34 +00004974 if (T1Quals.hasAddressSpace()) {
4975 if (!Qualifiers::isAddressSpaceSupersetOf(T1Quals.getAddressSpace(),
4976 LangAS::Default)) {
4977 Sequence.SetFailed(
4978 InitializationSequence::FK_ReferenceAddrspaceMismatchTemporary);
4979 return;
4980 }
Anastasia Stulovad3ae87e2019-03-06 13:02:41 +00004981 Sequence.AddQualificationConversionStep(cv1T1, isLValueRef ? VK_LValue
4982 : VK_XValue);
Anastasia Stulova5145b1e2019-06-05 14:03:34 +00004983 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004984}
4985
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00004986/// Attempt character array initialization from a string literal
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004987/// (C++ [dcl.init.string], C99 6.7.8).
4988static void TryStringLiteralInitialization(Sema &S,
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004989 const InitializedEntity &Entity,
4990 const InitializationKind &Kind,
4991 Expr *Initializer,
4992 InitializationSequence &Sequence) {
Douglas Gregor1b303932009-12-22 15:35:07 +00004993 Sequence.AddStringInitStep(Entity.getType());
Douglas Gregor3e1e5272009-12-09 23:02:17 +00004994}
4995
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00004996/// Attempt value initialization (C++ [dcl.init]p7).
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00004997static void TryValueInitialization(Sema &S,
Douglas Gregor7dc42e52009-12-15 00:01:57 +00004998 const InitializedEntity &Entity,
4999 const InitializationKind &Kind,
Richard Smithd86812d2012-07-05 08:39:21 +00005000 InitializationSequence &Sequence,
5001 InitListExpr *InitList) {
5002 assert((!InitList || InitList->getNumInits() == 0) &&
5003 "Shouldn't use value-init for non-empty init lists");
5004
Richard Smith1bfe0682012-02-14 21:14:13 +00005005 // C++98 [dcl.init]p5, C++11 [dcl.init]p7:
Douglas Gregor7dc42e52009-12-15 00:01:57 +00005006 //
5007 // To value-initialize an object of type T means:
Douglas Gregor1b303932009-12-22 15:35:07 +00005008 QualType T = Entity.getType();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005009
Douglas Gregor7dc42e52009-12-15 00:01:57 +00005010 // -- if T is an array type, then each element is value-initialized;
Richard Smith1bfe0682012-02-14 21:14:13 +00005011 T = S.Context.getBaseElementType(T);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005012
Douglas Gregor7dc42e52009-12-15 00:01:57 +00005013 if (const RecordType *RT = T->getAs<RecordType>()) {
5014 if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
Richard Smithd86812d2012-07-05 08:39:21 +00005015 bool NeedZeroInitialization = true;
Richard Smith505ef812016-12-21 01:57:02 +00005016 // C++98:
5017 // -- if T is a class type (clause 9) with a user-declared constructor
5018 // (12.1), then the default constructor for T is called (and the
5019 // initialization is ill-formed if T has no accessible default
5020 // constructor);
5021 // C++11:
5022 // -- if T is a class type (clause 9) with either no default constructor
5023 // (12.1 [class.ctor]) or a default constructor that is user-provided
5024 // or deleted, then the object is default-initialized;
5025 //
5026 // Note that the C++11 rule is the same as the C++98 rule if there are no
5027 // defaulted or deleted constructors, so we just use it unconditionally.
5028 CXXConstructorDecl *CD = S.LookupDefaultConstructor(ClassDecl);
5029 if (!CD || !CD->getCanonicalDecl()->isDefaulted() || CD->isDeleted())
5030 NeedZeroInitialization = false;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005031
Richard Smith1bfe0682012-02-14 21:14:13 +00005032 // -- if T is a (possibly cv-qualified) non-union class type without a
5033 // user-provided or deleted default constructor, then the object is
5034 // zero-initialized and, if T has a non-trivial default constructor,
5035 // default-initialized;
Richard Smithfb266522012-10-18 00:44:17 +00005036 // The 'non-union' here was removed by DR1502. The 'non-trivial default
5037 // constructor' part was removed by DR1507.
Richard Smithd86812d2012-07-05 08:39:21 +00005038 if (NeedZeroInitialization)
5039 Sequence.AddZeroInitializationStep(Entity.getType());
5040
Richard Smith593f9932012-12-08 02:01:17 +00005041 // C++03:
5042 // -- if T is a non-union class type without a user-declared constructor,
5043 // then every non-static data member and base class component of T is
5044 // value-initialized;
5045 // [...] A program that calls for [...] value-initialization of an
5046 // entity of reference type is ill-formed.
5047 //
5048 // C++11 doesn't need this handling, because value-initialization does not
5049 // occur recursively there, and the implicit default constructor is
5050 // defined as deleted in the problematic cases.
Richard Smith2bf7fdb2013-01-02 11:42:31 +00005051 if (!S.getLangOpts().CPlusPlus11 &&
Richard Smith593f9932012-12-08 02:01:17 +00005052 ClassDecl->hasUninitializedReferenceMember()) {
5053 Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForReference);
5054 return;
5055 }
5056
Richard Smithd86812d2012-07-05 08:39:21 +00005057 // If this is list-value-initialization, pass the empty init list on when
5058 // building the constructor call. This affects the semantics of a few
5059 // things (such as whether an explicit default constructor can be called).
5060 Expr *InitListAsExpr = InitList;
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00005061 MultiExprArg Args(&InitListAsExpr, InitList ? 1 : 0);
Richard Smithd86812d2012-07-05 08:39:21 +00005062 bool InitListSyntax = InitList;
5063
Richard Smith81f5ade2016-12-15 02:28:18 +00005064 // FIXME: Instead of creating a CXXConstructExpr of array type here,
Richard Smith410306b2016-12-12 02:53:20 +00005065 // wrap a class-typed CXXConstructExpr in an ArrayInitLoopExpr.
5066 return TryConstructorInitialization(
5067 S, Entity, Kind, Args, T, Entity.getType(), Sequence, InitListSyntax);
Douglas Gregor7dc42e52009-12-15 00:01:57 +00005068 }
5069 }
5070
Douglas Gregor1b303932009-12-22 15:35:07 +00005071 Sequence.AddZeroInitializationStep(Entity.getType());
Douglas Gregor7dc42e52009-12-15 00:01:57 +00005072}
5073
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00005074/// Attempt default initialization (C++ [dcl.init]p6).
Douglas Gregor85dabae2009-12-16 01:38:02 +00005075static void TryDefaultInitialization(Sema &S,
5076 const InitializedEntity &Entity,
5077 const InitializationKind &Kind,
5078 InitializationSequence &Sequence) {
5079 assert(Kind.getKind() == InitializationKind::IK_Default);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005080
Douglas Gregor85dabae2009-12-16 01:38:02 +00005081 // C++ [dcl.init]p6:
5082 // To default-initialize an object of type T means:
5083 // - if T is an array type, each element is default-initialized;
John McCall31168b02011-06-15 23:02:42 +00005084 QualType DestType = S.Context.getBaseElementType(Entity.getType());
Fangrui Song6907ce22018-07-30 19:24:48 +00005085
Douglas Gregor85dabae2009-12-16 01:38:02 +00005086 // - if T is a (possibly cv-qualified) class type (Clause 9), the default
5087 // constructor for T is called (and the initialization is ill-formed if
5088 // T has no accessible default constructor);
David Blaikiebbafb8a2012-03-11 07:00:24 +00005089 if (DestType->isRecordType() && S.getLangOpts().CPlusPlus) {
Richard Smith410306b2016-12-12 02:53:20 +00005090 TryConstructorInitialization(S, Entity, Kind, None, DestType,
5091 Entity.getType(), Sequence);
Chandler Carruthc9262402010-08-23 07:55:51 +00005092 return;
Douglas Gregor85dabae2009-12-16 01:38:02 +00005093 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005094
Douglas Gregor85dabae2009-12-16 01:38:02 +00005095 // - otherwise, no initialization is performed.
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005096
Douglas Gregor85dabae2009-12-16 01:38:02 +00005097 // If a program calls for the default initialization of an object of
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005098 // a const-qualified type T, T shall be a class type with a user-provided
Douglas Gregor85dabae2009-12-16 01:38:02 +00005099 // default constructor.
David Blaikiebbafb8a2012-03-11 07:00:24 +00005100 if (DestType.isConstQualified() && S.getLangOpts().CPlusPlus) {
Nico Weber337d5aa2015-04-17 08:32:38 +00005101 if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
5102 Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
John McCall31168b02011-06-15 23:02:42 +00005103 return;
5104 }
5105
5106 // If the destination type has a lifetime property, zero-initialize it.
5107 if (DestType.getQualifiers().hasObjCLifetime()) {
5108 Sequence.AddZeroInitializationStep(Entity.getType());
5109 return;
5110 }
Douglas Gregor85dabae2009-12-16 01:38:02 +00005111}
5112
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00005113/// Attempt a user-defined conversion between two types (C++ [dcl.init]),
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005114/// which enumerates all conversion functions and performs overload resolution
5115/// to select the best.
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005116static void TryUserDefinedConversion(Sema &S,
Richard Smith77be48a2014-07-31 06:31:19 +00005117 QualType DestType,
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005118 const InitializationKind &Kind,
5119 Expr *Initializer,
Richard Smithaaa0ec42013-09-21 21:19:19 +00005120 InitializationSequence &Sequence,
5121 bool TopLevelOfInitList) {
Douglas Gregor540c3b02009-12-14 17:27:33 +00005122 assert(!DestType->isReferenceType() && "References are handled elsewhere");
5123 QualType SourceType = Initializer->getType();
5124 assert((DestType->isRecordType() || SourceType->isRecordType()) &&
5125 "Must have a class type to perform a user-defined conversion");
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005126
Douglas Gregor540c3b02009-12-14 17:27:33 +00005127 // Build the candidate set directly in the initialization sequence
5128 // structure, so that it will persist if we fail.
5129 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
Richard Smith67ef14f2017-09-26 18:37:55 +00005130 CandidateSet.clear(OverloadCandidateSet::CSK_InitByUserDefinedConversion);
Anastasia Stulovac25ea862019-06-20 16:23:28 +00005131 CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005132
Douglas Gregor540c3b02009-12-14 17:27:33 +00005133 // Determine whether we are allowed to call explicit constructors or
5134 // explicit conversion operators.
Sebastian Redl5a41f682012-02-12 16:37:24 +00005135 bool AllowExplicit = Kind.AllowExplicit();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005136
Douglas Gregor540c3b02009-12-14 17:27:33 +00005137 if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) {
5138 // The type we're converting to is a class type. Enumerate its constructors
5139 // to see if there is a suitable conversion.
5140 CXXRecordDecl *DestRecordDecl
5141 = cast<CXXRecordDecl>(DestRecordType->getDecl());
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005142
Douglas Gregord9848152010-04-26 14:36:57 +00005143 // Try to complete the type we're converting to.
Richard Smithdb0ac552015-12-18 22:40:25 +00005144 if (S.isCompleteType(Kind.getLocation(), DestType)) {
Richard Smith776e9c32017-02-01 03:28:59 +00005145 for (NamedDecl *D : S.LookupConstructors(DestRecordDecl)) {
Richard Smithc2bebe92016-05-11 20:37:46 +00005146 auto Info = getConstructorInfo(D);
5147 if (!Info.Constructor)
5148 continue;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005149
Richard Smithc2bebe92016-05-11 20:37:46 +00005150 if (!Info.Constructor->isInvalidDecl() &&
5151 Info.Constructor->isConvertingConstructor(AllowExplicit)) {
5152 if (Info.ConstructorTmpl)
Richard Smith76b90272019-05-09 03:59:21 +00005153 S.AddTemplateOverloadCandidate(
5154 Info.ConstructorTmpl, Info.FoundDecl,
5155 /*ExplicitArgs*/ nullptr, Initializer, CandidateSet,
5156 /*SuppressUserConversions=*/true,
5157 /*PartialOverloading*/ false, AllowExplicit);
Douglas Gregord9848152010-04-26 14:36:57 +00005158 else
Richard Smithc2bebe92016-05-11 20:37:46 +00005159 S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl,
Ahmed Charlesb24b9aa2012-02-25 11:00:22 +00005160 Initializer, CandidateSet,
Richard Smith76b90272019-05-09 03:59:21 +00005161 /*SuppressUserConversions=*/true,
5162 /*PartialOverloading*/ false, AllowExplicit);
Douglas Gregord9848152010-04-26 14:36:57 +00005163 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005164 }
Douglas Gregord9848152010-04-26 14:36:57 +00005165 }
Douglas Gregor540c3b02009-12-14 17:27:33 +00005166 }
Eli Friedman78275202009-12-19 08:11:05 +00005167
Stephen Kellyf2ceec42018-08-09 21:08:08 +00005168 SourceLocation DeclLoc = Initializer->getBeginLoc();
Eli Friedman78275202009-12-19 08:11:05 +00005169
Douglas Gregor540c3b02009-12-14 17:27:33 +00005170 if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) {
5171 // The type we're converting from is a class type, enumerate its conversion
5172 // functions.
Eli Friedman78275202009-12-19 08:11:05 +00005173
Eli Friedman4afe9a32009-12-20 22:12:03 +00005174 // We can only enumerate the conversion functions for a complete type; if
5175 // the type isn't complete, simply skip this step.
Richard Smithdb0ac552015-12-18 22:40:25 +00005176 if (S.isCompleteType(DeclLoc, SourceType)) {
Eli Friedman4afe9a32009-12-20 22:12:03 +00005177 CXXRecordDecl *SourceRecordDecl
5178 = cast<CXXRecordDecl>(SourceRecordType->getDecl());
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005179
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00005180 const auto &Conversions =
5181 SourceRecordDecl->getVisibleConversionFunctions();
5182 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
Eli Friedman4afe9a32009-12-20 22:12:03 +00005183 NamedDecl *D = *I;
5184 CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
5185 if (isa<UsingShadowDecl>(D))
5186 D = cast<UsingShadowDecl>(D)->getTargetDecl();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005187
Eli Friedman4afe9a32009-12-20 22:12:03 +00005188 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
5189 CXXConversionDecl *Conv;
Douglas Gregor540c3b02009-12-14 17:27:33 +00005190 if (ConvTemplate)
Eli Friedman4afe9a32009-12-20 22:12:03 +00005191 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
Douglas Gregor540c3b02009-12-14 17:27:33 +00005192 else
John McCallda4458e2010-03-31 01:36:47 +00005193 Conv = cast<CXXConversionDecl>(D);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005194
Eli Friedman4afe9a32009-12-20 22:12:03 +00005195 if (AllowExplicit || !Conv->isExplicit()) {
5196 if (ConvTemplate)
Richard Smith76b90272019-05-09 03:59:21 +00005197 S.AddTemplateConversionCandidate(
5198 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
5199 CandidateSet, AllowExplicit, AllowExplicit);
Eli Friedman4afe9a32009-12-20 22:12:03 +00005200 else
Richard Smith76b90272019-05-09 03:59:21 +00005201 S.AddConversionCandidate(Conv, I.getPair(), ActingDC, Initializer,
5202 DestType, CandidateSet, AllowExplicit,
Douglas Gregor68782142013-12-18 21:46:16 +00005203 AllowExplicit);
Eli Friedman4afe9a32009-12-20 22:12:03 +00005204 }
Douglas Gregor540c3b02009-12-14 17:27:33 +00005205 }
5206 }
5207 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005208
5209 // Perform overload resolution. If it fails, return the failed result.
Douglas Gregor540c3b02009-12-14 17:27:33 +00005210 OverloadCandidateSet::iterator Best;
John McCall0d1da222010-01-12 00:44:57 +00005211 if (OverloadingResult Result
Richard Smith67ef14f2017-09-26 18:37:55 +00005212 = CandidateSet.BestViableFunction(S, DeclLoc, Best)) {
Douglas Gregor540c3b02009-12-14 17:27:33 +00005213 Sequence.SetOverloadFailure(
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005214 InitializationSequence::FK_UserConversionOverloadFailed,
Douglas Gregor540c3b02009-12-14 17:27:33 +00005215 Result);
5216 return;
5217 }
John McCall0d1da222010-01-12 00:44:57 +00005218
Douglas Gregor540c3b02009-12-14 17:27:33 +00005219 FunctionDecl *Function = Best->Function;
Nick Lewyckya096b142013-02-12 08:08:54 +00005220 Function->setReferenced();
Abramo Bagnara5001caa2011-11-19 11:44:21 +00005221 bool HadMultipleCandidates = (CandidateSet.size() > 1);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005222
Douglas Gregor540c3b02009-12-14 17:27:33 +00005223 if (isa<CXXConstructorDecl>(Function)) {
5224 // Add the user-defined conversion step. Any cv-qualification conversion is
Richard Smithb24f0672012-02-11 19:22:50 +00005225 // subsumed by the initialization. Per DR5, the created temporary is of the
5226 // cv-unqualified type of the destination.
5227 Sequence.AddUserConversionStep(Function, Best->FoundDecl,
5228 DestType.getUnqualifiedType(),
Abramo Bagnara5001caa2011-11-19 11:44:21 +00005229 HadMultipleCandidates);
Richard Smithb8c0f552016-12-09 18:49:13 +00005230
5231 // C++14 and before:
5232 // - if the function is a constructor, the call initializes a temporary
5233 // of the cv-unqualified version of the destination type. The [...]
5234 // temporary [...] is then used to direct-initialize, according to the
5235 // rules above, the object that is the destination of the
5236 // copy-initialization.
5237 // Note that this just performs a simple object copy from the temporary.
5238 //
Aaron Ballmanc351fba2017-12-04 20:27:34 +00005239 // C++17:
Richard Smithb8c0f552016-12-09 18:49:13 +00005240 // - if the function is a constructor, the call is a prvalue of the
5241 // cv-unqualified version of the destination type whose return object
5242 // is initialized by the constructor. The call is used to
5243 // direct-initialize, according to the rules above, the object that
5244 // is the destination of the copy-initialization.
5245 // Therefore we need to do nothing further.
5246 //
5247 // FIXME: Mark this copy as extraneous.
Aaron Ballmanc351fba2017-12-04 20:27:34 +00005248 if (!S.getLangOpts().CPlusPlus17)
Richard Smithb8c0f552016-12-09 18:49:13 +00005249 Sequence.AddFinalCopy(DestType);
Richard Smith16d31502016-12-21 01:31:56 +00005250 else if (DestType.hasQualifiers())
5251 Sequence.AddQualificationConversionStep(DestType, VK_RValue);
Douglas Gregor540c3b02009-12-14 17:27:33 +00005252 return;
5253 }
5254
5255 // Add the user-defined conversion step that calls the conversion function.
Douglas Gregor603d81b2010-07-13 08:18:22 +00005256 QualType ConvType = Function->getCallResultType();
Abramo Bagnara5001caa2011-11-19 11:44:21 +00005257 Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType,
5258 HadMultipleCandidates);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005259
Richard Smithb8c0f552016-12-09 18:49:13 +00005260 if (ConvType->getAs<RecordType>()) {
5261 // The call is used to direct-initialize [...] the object that is the
5262 // destination of the copy-initialization.
5263 //
Aaron Ballmanc351fba2017-12-04 20:27:34 +00005264 // In C++17, this does not call a constructor if we enter /17.6.1:
Richard Smithb8c0f552016-12-09 18:49:13 +00005265 // - If the initializer expression is a prvalue and the cv-unqualified
5266 // version of the source type is the same as the class of the
5267 // destination [... do not make an extra copy]
5268 //
5269 // FIXME: Mark this copy as extraneous.
Aaron Ballmanc351fba2017-12-04 20:27:34 +00005270 if (!S.getLangOpts().CPlusPlus17 ||
Richard Smithb8c0f552016-12-09 18:49:13 +00005271 Function->getReturnType()->isReferenceType() ||
5272 !S.Context.hasSameUnqualifiedType(ConvType, DestType))
5273 Sequence.AddFinalCopy(DestType);
Richard Smith16d31502016-12-21 01:31:56 +00005274 else if (!S.Context.hasSameType(ConvType, DestType))
5275 Sequence.AddQualificationConversionStep(DestType, VK_RValue);
Richard Smithb8c0f552016-12-09 18:49:13 +00005276 return;
5277 }
5278
Douglas Gregor5ab11652010-04-17 22:01:05 +00005279 // If the conversion following the call to the conversion function
5280 // is interesting, add it as a separate step.
Douglas Gregor540c3b02009-12-14 17:27:33 +00005281 if (Best->FinalConversion.First || Best->FinalConversion.Second ||
5282 Best->FinalConversion.Third) {
5283 ImplicitConversionSequence ICS;
John McCall0d1da222010-01-12 00:44:57 +00005284 ICS.setStandard();
Douglas Gregor540c3b02009-12-14 17:27:33 +00005285 ICS.Standard = Best->FinalConversion;
Richard Smithaaa0ec42013-09-21 21:19:19 +00005286 Sequence.AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
Douglas Gregor540c3b02009-12-14 17:27:33 +00005287 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005288}
5289
Richard Smithf032001b2013-06-20 02:18:31 +00005290/// An egregious hack for compatibility with libstdc++-4.2: in <tr1/hashtable>,
5291/// a function with a pointer return type contains a 'return false;' statement.
5292/// In C++11, 'false' is not a null pointer, so this breaks the build of any
5293/// code using that header.
5294///
5295/// Work around this by treating 'return false;' as zero-initializing the result
5296/// if it's used in a pointer-returning function in a system header.
5297static bool isLibstdcxxPointerReturnFalseHack(Sema &S,
5298 const InitializedEntity &Entity,
5299 const Expr *Init) {
5300 return S.getLangOpts().CPlusPlus11 &&
5301 Entity.getKind() == InitializedEntity::EK_Result &&
5302 Entity.getType()->isPointerType() &&
5303 isa<CXXBoolLiteralExpr>(Init) &&
5304 !cast<CXXBoolLiteralExpr>(Init)->getValue() &&
5305 S.getSourceManager().isInSystemHeader(Init->getExprLoc());
5306}
5307
John McCall31168b02011-06-15 23:02:42 +00005308/// The non-zero enum values here are indexes into diagnostic alternatives.
5309enum InvalidICRKind { IIK_okay, IIK_nonlocal, IIK_nonscalar };
5310
5311/// Determines whether this expression is an acceptable ICR source.
John McCall63f84442011-06-27 23:59:58 +00005312static InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e,
Fariborz Jahanianfbd19742012-11-27 23:02:53 +00005313 bool isAddressOf, bool &isWeakAccess) {
John McCall31168b02011-06-15 23:02:42 +00005314 // Skip parens.
5315 e = e->IgnoreParens();
5316
5317 // Skip address-of nodes.
5318 if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) {
5319 if (op->getOpcode() == UO_AddrOf)
Fariborz Jahanianfbd19742012-11-27 23:02:53 +00005320 return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true,
5321 isWeakAccess);
John McCall31168b02011-06-15 23:02:42 +00005322
5323 // Skip certain casts.
John McCall63f84442011-06-27 23:59:58 +00005324 } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) {
5325 switch (ce->getCastKind()) {
John McCall31168b02011-06-15 23:02:42 +00005326 case CK_Dependent:
5327 case CK_BitCast:
5328 case CK_LValueBitCast:
John McCall31168b02011-06-15 23:02:42 +00005329 case CK_NoOp:
Fariborz Jahanianfbd19742012-11-27 23:02:53 +00005330 return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf, isWeakAccess);
John McCall31168b02011-06-15 23:02:42 +00005331
5332 case CK_ArrayToPointerDecay:
5333 return IIK_nonscalar;
5334
5335 case CK_NullToPointer:
5336 return IIK_okay;
5337
5338 default:
5339 break;
5340 }
5341
5342 // If we have a declaration reference, it had better be a local variable.
John McCall113bee02012-03-10 09:33:50 +00005343 } else if (isa<DeclRefExpr>(e)) {
Fangrui Song6907ce22018-07-30 19:24:48 +00005344 // set isWeakAccess to true, to mean that there will be an implicit
Fariborz Jahanianfbd19742012-11-27 23:02:53 +00005345 // load which requires a cleanup.
5346 if (e->getType().getObjCLifetime() == Qualifiers::OCL_Weak)
5347 isWeakAccess = true;
Fangrui Song6907ce22018-07-30 19:24:48 +00005348
John McCall63f84442011-06-27 23:59:58 +00005349 if (!isAddressOf) return IIK_nonlocal;
5350
John McCall113bee02012-03-10 09:33:50 +00005351 VarDecl *var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl());
5352 if (!var) return IIK_nonlocal;
John McCall63f84442011-06-27 23:59:58 +00005353
5354 return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal);
John McCall31168b02011-06-15 23:02:42 +00005355
5356 // If we have a conditional operator, check both sides.
5357 } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) {
Fariborz Jahanianfbd19742012-11-27 23:02:53 +00005358 if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf,
5359 isWeakAccess))
John McCall31168b02011-06-15 23:02:42 +00005360 return iik;
5361
Fariborz Jahanianfbd19742012-11-27 23:02:53 +00005362 return isInvalidICRSource(C, cond->getRHS(), isAddressOf, isWeakAccess);
John McCall31168b02011-06-15 23:02:42 +00005363
5364 // These are never scalar.
5365 } else if (isa<ArraySubscriptExpr>(e)) {
5366 return IIK_nonscalar;
5367
5368 // Otherwise, it needs to be a null pointer constant.
5369 } else {
5370 return (e->isNullPointerConstant(C, Expr::NPC_ValueDependentIsNull)
5371 ? IIK_okay : IIK_nonlocal);
5372 }
5373
5374 return IIK_nonlocal;
5375}
5376
5377/// Check whether the given expression is a valid operand for an
5378/// indirect copy/restore.
5379static void checkIndirectCopyRestoreSource(Sema &S, Expr *src) {
5380 assert(src->isRValue());
Fariborz Jahanianfbd19742012-11-27 23:02:53 +00005381 bool isWeakAccess = false;
5382 InvalidICRKind iik = isInvalidICRSource(S.Context, src, false, isWeakAccess);
Fangrui Song6907ce22018-07-30 19:24:48 +00005383 // If isWeakAccess to true, there will be an implicit
Fariborz Jahanianfbd19742012-11-27 23:02:53 +00005384 // load which requires a cleanup.
5385 if (S.getLangOpts().ObjCAutoRefCount && isWeakAccess)
Tim Shen4a05bb82016-06-21 20:29:17 +00005386 S.Cleanup.setExprNeedsCleanups(true);
5387
John McCall31168b02011-06-15 23:02:42 +00005388 if (iik == IIK_okay) return;
5389
5390 S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback)
5391 << ((unsigned) iik - 1) // shift index into diagnostic explanations
5392 << src->getSourceRange();
5393}
5394
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00005395/// Determine whether we have compatible array types for the
Douglas Gregore2f943b2011-02-22 18:29:51 +00005396/// purposes of GNU by-copy array initialization.
Larisse Voufod2010992015-01-24 23:09:54 +00005397static bool hasCompatibleArrayTypes(ASTContext &Context, const ArrayType *Dest,
Douglas Gregore2f943b2011-02-22 18:29:51 +00005398 const ArrayType *Source) {
5399 // If the source and destination array types are equivalent, we're
5400 // done.
5401 if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0)))
5402 return true;
5403
5404 // Make sure that the element types are the same.
5405 if (!Context.hasSameType(Dest->getElementType(), Source->getElementType()))
5406 return false;
5407
5408 // The only mismatch we allow is when the destination is an
5409 // incomplete array type and the source is a constant array type.
5410 return Source->isConstantArrayType() && Dest->isIncompleteArrayType();
5411}
5412
John McCall31168b02011-06-15 23:02:42 +00005413static bool tryObjCWritebackConversion(Sema &S,
5414 InitializationSequence &Sequence,
5415 const InitializedEntity &Entity,
5416 Expr *Initializer) {
5417 bool ArrayDecay = false;
5418 QualType ArgType = Initializer->getType();
5419 QualType ArgPointee;
5420 if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) {
5421 ArrayDecay = true;
5422 ArgPointee = ArgArrayType->getElementType();
5423 ArgType = S.Context.getPointerType(ArgPointee);
5424 }
Fangrui Song6907ce22018-07-30 19:24:48 +00005425
John McCall31168b02011-06-15 23:02:42 +00005426 // Handle write-back conversion.
5427 QualType ConvertedArgType;
5428 if (!S.isObjCWritebackConversion(ArgType, Entity.getType(),
5429 ConvertedArgType))
5430 return false;
5431
5432 // We should copy unless we're passing to an argument explicitly
5433 // marked 'out'.
5434 bool ShouldCopy = true;
5435 if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
5436 ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
5437
5438 // Do we need an lvalue conversion?
5439 if (ArrayDecay || Initializer->isGLValue()) {
5440 ImplicitConversionSequence ICS;
5441 ICS.setStandard();
5442 ICS.Standard.setAsIdentityConversion();
5443
5444 QualType ResultType;
5445 if (ArrayDecay) {
5446 ICS.Standard.First = ICK_Array_To_Pointer;
5447 ResultType = S.Context.getPointerType(ArgPointee);
5448 } else {
5449 ICS.Standard.First = ICK_Lvalue_To_Rvalue;
5450 ResultType = Initializer->getType().getNonLValueExprType(S.Context);
5451 }
Fangrui Song6907ce22018-07-30 19:24:48 +00005452
John McCall31168b02011-06-15 23:02:42 +00005453 Sequence.AddConversionSequenceStep(ICS, ResultType);
5454 }
Fangrui Song6907ce22018-07-30 19:24:48 +00005455
John McCall31168b02011-06-15 23:02:42 +00005456 Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy);
5457 return true;
5458}
5459
Guy Benyei61054192013-02-07 10:55:47 +00005460static bool TryOCLSamplerInitialization(Sema &S,
5461 InitializationSequence &Sequence,
5462 QualType DestType,
5463 Expr *Initializer) {
5464 if (!S.getLangOpts().OpenCL || !DestType->isSamplerT() ||
Yaxun Liu0bc4b2d2016-07-28 19:26:30 +00005465 (!Initializer->isIntegerConstantExpr(S.Context) &&
5466 !Initializer->getType()->isSamplerT()))
Guy Benyei61054192013-02-07 10:55:47 +00005467 return false;
5468
5469 Sequence.AddOCLSamplerInitStep(DestType);
5470 return true;
5471}
5472
Andrew Savonichev3fee3512018-11-08 11:25:41 +00005473static bool IsZeroInitializer(Expr *Initializer, Sema &S) {
5474 return Initializer->isIntegerConstantExpr(S.getASTContext()) &&
5475 (Initializer->EvaluateKnownConstInt(S.getASTContext()) == 0);
5476}
5477
Andrew Savonichevb555b762018-10-23 15:19:20 +00005478static bool TryOCLZeroOpaqueTypeInitialization(Sema &S,
5479 InitializationSequence &Sequence,
5480 QualType DestType,
5481 Expr *Initializer) {
5482 if (!S.getLangOpts().OpenCL)
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00005483 return false;
5484
Andrew Savonichevb555b762018-10-23 15:19:20 +00005485 //
5486 // OpenCL 1.2 spec, s6.12.10
5487 //
5488 // The event argument can also be used to associate the
5489 // async_work_group_copy with a previous async copy allowing
5490 // an event to be shared by multiple async copies; otherwise
5491 // event should be zero.
5492 //
5493 if (DestType->isEventT() || DestType->isQueueT()) {
Andrew Savonichev3fee3512018-11-08 11:25:41 +00005494 if (!IsZeroInitializer(Initializer, S))
5495 return false;
5496
5497 Sequence.AddOCLZeroOpaqueTypeStep(DestType);
5498 return true;
5499 }
5500
5501 // We should allow zero initialization for all types defined in the
5502 // cl_intel_device_side_avc_motion_estimation extension, except
5503 // intel_sub_group_avc_mce_payload_t and intel_sub_group_avc_mce_result_t.
5504 if (S.getOpenCLOptions().isEnabled(
5505 "cl_intel_device_side_avc_motion_estimation") &&
5506 DestType->isOCLIntelSubgroupAVCType()) {
5507 if (DestType->isOCLIntelSubgroupAVCMcePayloadType() ||
5508 DestType->isOCLIntelSubgroupAVCMceResultType())
5509 return false;
5510 if (!IsZeroInitializer(Initializer, S))
Andrew Savonichevb555b762018-10-23 15:19:20 +00005511 return false;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00005512
Andrew Savonichevb555b762018-10-23 15:19:20 +00005513 Sequence.AddOCLZeroOpaqueTypeStep(DestType);
5514 return true;
5515 }
Egor Churaev89831422016-12-23 14:55:49 +00005516
Andrew Savonichevb555b762018-10-23 15:19:20 +00005517 return false;
Egor Churaev89831422016-12-23 14:55:49 +00005518}
5519
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005520InitializationSequence::InitializationSequence(Sema &S,
5521 const InitializedEntity &Entity,
5522 const InitializationKind &Kind,
Richard Smithaaa0ec42013-09-21 21:19:19 +00005523 MultiExprArg Args,
Manman Ren073db022016-03-10 18:53:19 +00005524 bool TopLevelOfInitList,
5525 bool TreatUnavailableAsInvalid)
Richard Smith100b24a2014-04-17 01:52:14 +00005526 : FailedCandidateSet(Kind.getLocation(), OverloadCandidateSet::CSK_Normal) {
Manman Ren073db022016-03-10 18:53:19 +00005527 InitializeFrom(S, Entity, Kind, Args, TopLevelOfInitList,
5528 TreatUnavailableAsInvalid);
Richard Smith089c3162013-09-21 21:55:46 +00005529}
5530
George Burgess IV3e3bb95b2015-12-02 21:58:08 +00005531/// Tries to get a FunctionDecl out of `E`. If it succeeds and we can take the
5532/// address of that function, this returns true. Otherwise, it returns false.
5533static bool isExprAnUnaddressableFunction(Sema &S, const Expr *E) {
5534 auto *DRE = dyn_cast<DeclRefExpr>(E);
5535 if (!DRE || !isa<FunctionDecl>(DRE->getDecl()))
5536 return false;
5537
5538 return !S.checkAddressOfFunctionIsAvailable(
5539 cast<FunctionDecl>(DRE->getDecl()));
5540}
5541
Richard Smith410306b2016-12-12 02:53:20 +00005542/// Determine whether we can perform an elementwise array copy for this kind
5543/// of entity.
5544static bool canPerformArrayCopy(const InitializedEntity &Entity) {
5545 switch (Entity.getKind()) {
5546 case InitializedEntity::EK_LambdaCapture:
5547 // C++ [expr.prim.lambda]p24:
5548 // For array members, the array elements are direct-initialized in
5549 // increasing subscript order.
5550 return true;
5551
5552 case InitializedEntity::EK_Variable:
5553 // C++ [dcl.decomp]p1:
5554 // [...] each element is copy-initialized or direct-initialized from the
5555 // corresponding element of the assignment-expression [...]
5556 return isa<DecompositionDecl>(Entity.getDecl());
5557
5558 case InitializedEntity::EK_Member:
5559 // C++ [class.copy.ctor]p14:
5560 // - if the member is an array, each element is direct-initialized with
5561 // the corresponding subobject of x
5562 return Entity.isImplicitMemberInitializer();
5563
5564 case InitializedEntity::EK_ArrayElement:
5565 // All the above cases are intended to apply recursively, even though none
5566 // of them actually say that.
5567 if (auto *E = Entity.getParent())
5568 return canPerformArrayCopy(*E);
5569 break;
5570
5571 default:
5572 break;
5573 }
5574
5575 return false;
5576}
5577
Richard Smith089c3162013-09-21 21:55:46 +00005578void InitializationSequence::InitializeFrom(Sema &S,
5579 const InitializedEntity &Entity,
5580 const InitializationKind &Kind,
5581 MultiExprArg Args,
Manman Ren073db022016-03-10 18:53:19 +00005582 bool TopLevelOfInitList,
5583 bool TreatUnavailableAsInvalid) {
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005584 ASTContext &Context = S.Context;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005585
John McCall5e77d762013-04-16 07:28:30 +00005586 // Eliminate non-overload placeholder types in the arguments. We
5587 // need to do this before checking whether types are dependent
5588 // because lowering a pseudo-object expression might well give us
5589 // something of dependent type.
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00005590 for (unsigned I = 0, E = Args.size(); I != E; ++I)
John McCall5e77d762013-04-16 07:28:30 +00005591 if (Args[I]->getType()->isNonOverloadPlaceholderType()) {
5592 // FIXME: should we be doing this here?
5593 ExprResult result = S.CheckPlaceholderExpr(Args[I]);
5594 if (result.isInvalid()) {
5595 SetFailed(FK_PlaceholderType);
5596 return;
5597 }
Nikola Smiljanic01a75982014-05-29 10:55:11 +00005598 Args[I] = result.get();
John McCall5e77d762013-04-16 07:28:30 +00005599 }
5600
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005601 // C++0x [dcl.init]p16:
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005602 // The semantics of initializers are as follows. The destination type is
5603 // the type of the object or reference being initialized and the source
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005604 // type is the type of the initializer expression. The source type is not
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005605 // defined when the initializer is a braced-init-list or when it is a
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005606 // parenthesized list of expressions.
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005607 QualType DestType = Entity.getType();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005608
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005609 if (DestType->isDependentType() ||
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00005610 Expr::hasAnyTypeDependentArguments(Args)) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005611 SequenceKind = DependentSequence;
5612 return;
5613 }
5614
Sebastian Redld201edf2011-06-05 13:59:11 +00005615 // Almost everything is a normal sequence.
5616 setSequenceKind(NormalSequence);
5617
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005618 QualType SourceType;
Craig Topperc3ec1492014-05-26 06:22:03 +00005619 Expr *Initializer = nullptr;
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00005620 if (Args.size() == 1) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005621 Initializer = Args[0];
Erik Pilkingtonfa983902018-10-30 20:31:30 +00005622 if (S.getLangOpts().ObjC) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00005623 if (S.CheckObjCBridgeRelatedConversions(Initializer->getBeginLoc(),
Fariborz Jahanian283bf892013-12-18 21:04:43 +00005624 DestType, Initializer->getType(),
5625 Initializer) ||
5626 S.ConversionToObjCStringLiteralCheck(DestType, Initializer))
5627 Args[0] = Initializer;
Fariborz Jahanian283bf892013-12-18 21:04:43 +00005628 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005629 if (!isa<InitListExpr>(Initializer))
5630 SourceType = Initializer->getType();
5631 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005632
Sebastian Redl0501c632012-02-12 16:37:36 +00005633 // - If the initializer is a (non-parenthesized) braced-init-list, the
5634 // object is list-initialized (8.5.4).
5635 if (Kind.getKind() != InitializationKind::IK_Direct) {
5636 if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) {
Manman Ren073db022016-03-10 18:53:19 +00005637 TryListInitialization(S, Entity, Kind, InitList, *this,
5638 TreatUnavailableAsInvalid);
Sebastian Redl0501c632012-02-12 16:37:36 +00005639 return;
5640 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005641 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005642
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005643 // - If the destination type is a reference type, see 8.5.3.
5644 if (DestType->isReferenceType()) {
5645 // C++0x [dcl.init.ref]p1:
5646 // A variable declared to be a T& or T&&, that is, "reference to type T"
5647 // (8.3.2), shall be initialized by an object, or function, of type T or
5648 // by an object that can be converted into a T.
5649 // (Therefore, multiple arguments are not permitted.)
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00005650 if (Args.size() != 1)
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005651 SetFailed(FK_TooManyInitsForReference);
Richard Smith49a6b6e2017-03-24 01:14:25 +00005652 // C++17 [dcl.init.ref]p5:
5653 // A reference [...] is initialized by an expression [...] as follows:
5654 // If the initializer is not an expression, presumably we should reject,
5655 // but the standard fails to actually say so.
5656 else if (isa<InitListExpr>(Args[0]))
5657 SetFailed(FK_ParenthesizedListInitForReference);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005658 else
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005659 TryReferenceInitialization(S, Entity, Kind, Args[0], *this);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005660 return;
5661 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005662
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005663 // - If the initializer is (), the object is value-initialized.
Douglas Gregor85dabae2009-12-16 01:38:02 +00005664 if (Kind.getKind() == InitializationKind::IK_Value ||
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00005665 (Kind.getKind() == InitializationKind::IK_Direct && Args.empty())) {
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005666 TryValueInitialization(S, Entity, Kind, *this);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005667 return;
5668 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005669
Douglas Gregor85dabae2009-12-16 01:38:02 +00005670 // Handle default initialization.
Nick Lewycky9331ed82010-11-20 01:29:55 +00005671 if (Kind.getKind() == InitializationKind::IK_Default) {
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005672 TryDefaultInitialization(S, Entity, Kind, *this);
Douglas Gregor85dabae2009-12-16 01:38:02 +00005673 return;
5674 }
Douglas Gregore1314a62009-12-18 05:02:21 +00005675
John McCall66884dd2011-02-21 07:22:22 +00005676 // - If the destination type is an array of characters, an array of
5677 // char16_t, an array of char32_t, or an array of wchar_t, and the
5678 // initializer is a string literal, see 8.5.2.
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005679 // - Otherwise, if the destination type is an array, the program is
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005680 // ill-formed.
Douglas Gregore2f943b2011-02-22 18:29:51 +00005681 if (const ArrayType *DestAT = Context.getAsArrayType(DestType)) {
John McCalla59dc2f2012-01-05 00:13:19 +00005682 if (Initializer && isa<VariableArrayType>(DestAT)) {
5683 SetFailed(FK_VariableLengthArrayHasInitializer);
5684 return;
5685 }
5686
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00005687 if (Initializer) {
5688 switch (IsStringInit(Initializer, DestAT, Context)) {
5689 case SIF_None:
5690 TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this);
5691 return;
5692 case SIF_NarrowStringIntoWideChar:
5693 SetFailed(FK_NarrowStringIntoWideCharArray);
5694 return;
5695 case SIF_WideStringIntoChar:
5696 SetFailed(FK_WideStringIntoCharArray);
5697 return;
5698 case SIF_IncompatWideStringIntoWideChar:
5699 SetFailed(FK_IncompatWideStringIntoWideChar);
5700 return;
Richard Smith3a8244d2018-05-01 05:02:45 +00005701 case SIF_PlainStringIntoUTF8Char:
5702 SetFailed(FK_PlainStringIntoUTF8Char);
5703 return;
5704 case SIF_UTF8StringIntoPlainChar:
5705 SetFailed(FK_UTF8StringIntoPlainChar);
5706 return;
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00005707 case SIF_Other:
5708 break;
5709 }
John McCall66884dd2011-02-21 07:22:22 +00005710 }
5711
Richard Smith410306b2016-12-12 02:53:20 +00005712 // Some kinds of initialization permit an array to be initialized from
5713 // another array of the same type, and perform elementwise initialization.
5714 if (Initializer && isa<ConstantArrayType>(DestAT) &&
5715 S.Context.hasSameUnqualifiedType(Initializer->getType(),
5716 Entity.getType()) &&
5717 canPerformArrayCopy(Entity)) {
5718 // If source is a prvalue, use it directly.
5719 if (Initializer->getValueKind() == VK_RValue) {
Richard Smith378b8c82016-12-14 03:22:16 +00005720 AddArrayInitStep(DestType, /*IsGNUExtension*/false);
Richard Smith410306b2016-12-12 02:53:20 +00005721 return;
5722 }
5723
5724 // Emit element-at-a-time copy loop.
5725 InitializedEntity Element =
5726 InitializedEntity::InitializeElement(S.Context, 0, Entity);
5727 QualType InitEltT =
5728 Context.getAsArrayType(Initializer->getType())->getElementType();
Richard Smith30e304e2016-12-14 00:03:17 +00005729 OpaqueValueExpr OVE(Initializer->getExprLoc(), InitEltT,
5730 Initializer->getValueKind(),
5731 Initializer->getObjectKind());
Richard Smith410306b2016-12-12 02:53:20 +00005732 Expr *OVEAsExpr = &OVE;
5733 InitializeFrom(S, Element, Kind, OVEAsExpr, TopLevelOfInitList,
5734 TreatUnavailableAsInvalid);
5735 if (!Failed())
5736 AddArrayInitLoopStep(Entity.getType(), InitEltT);
5737 return;
5738 }
5739
Douglas Gregore2f943b2011-02-22 18:29:51 +00005740 // Note: as an GNU C extension, we allow initialization of an
5741 // array from a compound literal that creates an array of the same
5742 // type, so long as the initializer has no side effects.
David Blaikiebbafb8a2012-03-11 07:00:24 +00005743 if (!S.getLangOpts().CPlusPlus && Initializer &&
Eli Friedman88fccbd2019-02-11 22:54:27 +00005744 isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) &&
Douglas Gregore2f943b2011-02-22 18:29:51 +00005745 Initializer->getType()->isArrayType()) {
5746 const ArrayType *SourceAT
5747 = Context.getAsArrayType(Initializer->getType());
5748 if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT))
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005749 SetFailed(FK_ArrayTypeMismatch);
Douglas Gregore2f943b2011-02-22 18:29:51 +00005750 else if (Initializer->HasSideEffects(S.Context))
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005751 SetFailed(FK_NonConstantArrayInit);
Douglas Gregore2f943b2011-02-22 18:29:51 +00005752 else {
Richard Smith378b8c82016-12-14 03:22:16 +00005753 AddArrayInitStep(DestType, /*IsGNUExtension*/true);
Douglas Gregore2f943b2011-02-22 18:29:51 +00005754 }
Richard Smithebeed412012-02-15 22:38:09 +00005755 }
Richard Smithd86812d2012-07-05 08:39:21 +00005756 // Note: as a GNU C++ extension, we allow list-initialization of a
5757 // class member of array type from a parenthesized initializer list.
David Blaikiebbafb8a2012-03-11 07:00:24 +00005758 else if (S.getLangOpts().CPlusPlus &&
Richard Smithebeed412012-02-15 22:38:09 +00005759 Entity.getKind() == InitializedEntity::EK_Member &&
5760 Initializer && isa<InitListExpr>(Initializer)) {
5761 TryListInitialization(S, Entity, Kind, cast<InitListExpr>(Initializer),
Manman Ren073db022016-03-10 18:53:19 +00005762 *this, TreatUnavailableAsInvalid);
Richard Smithebeed412012-02-15 22:38:09 +00005763 AddParenthesizedArrayInitStep(DestType);
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00005764 } else if (DestAT->getElementType()->isCharType())
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005765 SetFailed(FK_ArrayNeedsInitListOrStringLiteral);
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00005766 else if (IsWideCharCompatible(DestAT->getElementType(), Context))
5767 SetFailed(FK_ArrayNeedsInitListOrWideStringLiteral);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005768 else
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005769 SetFailed(FK_ArrayNeedsInitList);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005770
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005771 return;
5772 }
Eli Friedman78275202009-12-19 08:11:05 +00005773
Larisse Voufod2010992015-01-24 23:09:54 +00005774 // Determine whether we should consider writeback conversions for
John McCall31168b02011-06-15 23:02:42 +00005775 // Objective-C ARC.
David Blaikiebbafb8a2012-03-11 07:00:24 +00005776 bool allowObjCWritebackConversion = S.getLangOpts().ObjCAutoRefCount &&
Fariborz Jahanian131996b2013-07-31 18:21:45 +00005777 Entity.isParameterKind();
John McCall31168b02011-06-15 23:02:42 +00005778
Neil Hickey8ece3b62019-07-16 14:57:32 +00005779 if (TryOCLSamplerInitialization(S, *this, DestType, Initializer))
5780 return;
5781
John McCall31168b02011-06-15 23:02:42 +00005782 // We're at the end of the line for C: it's either a write-back conversion
5783 // or it's a C assignment. There's no need to check anything else.
David Blaikiebbafb8a2012-03-11 07:00:24 +00005784 if (!S.getLangOpts().CPlusPlus) {
John McCall31168b02011-06-15 23:02:42 +00005785 // If allowed, check whether this is an Objective-C writeback conversion.
5786 if (allowObjCWritebackConversion &&
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005787 tryObjCWritebackConversion(S, *this, Entity, Initializer)) {
John McCall31168b02011-06-15 23:02:42 +00005788 return;
5789 }
Guy Benyei61054192013-02-07 10:55:47 +00005790
Andrew Savonichevb555b762018-10-23 15:19:20 +00005791 if (TryOCLZeroOpaqueTypeInitialization(S, *this, DestType, Initializer))
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00005792 return;
5793
John McCall31168b02011-06-15 23:02:42 +00005794 // Handle initialization in C
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005795 AddCAssignmentStep(DestType);
5796 MaybeProduceObjCObject(S, *this, Entity);
Eli Friedman78275202009-12-19 08:11:05 +00005797 return;
5798 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005799
David Blaikiebbafb8a2012-03-11 07:00:24 +00005800 assert(S.getLangOpts().CPlusPlus);
George Burgess IV3e3bb95b2015-12-02 21:58:08 +00005801
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005802 // - If the destination type is a (possibly cv-qualified) class type:
5803 if (DestType->isRecordType()) {
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005804 // - If the initialization is direct-initialization, or if it is
5805 // copy-initialization where the cv-unqualified version of the
5806 // source type is the same class as, or a derived class of, the
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005807 // class of the destination, constructors are considered. [...]
5808 if (Kind.getKind() == InitializationKind::IK_Direct ||
5809 (Kind.getKind() == InitializationKind::IK_Copy &&
5810 (Context.hasSameUnqualifiedType(SourceType, DestType) ||
Stephen Kellyf2ceec42018-08-09 21:08:08 +00005811 S.IsDerivedFrom(Initializer->getBeginLoc(), SourceType, DestType))))
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00005812 TryConstructorInitialization(S, Entity, Kind, Args,
Richard Smith410306b2016-12-12 02:53:20 +00005813 DestType, DestType, *this);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005814 // - Otherwise (i.e., for the remaining copy-initialization cases),
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005815 // user-defined conversion sequences that can convert from the source
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005816 // type to the destination type or (when a conversion function is
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005817 // used) to a derived class thereof are enumerated as described in
5818 // 13.3.1.4, and the best one is chosen through overload resolution
5819 // (13.3).
5820 else
Richard Smith77be48a2014-07-31 06:31:19 +00005821 TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
Richard Smithaaa0ec42013-09-21 21:19:19 +00005822 TopLevelOfInitList);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005823 return;
5824 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005825
Richard Smith49a6b6e2017-03-24 01:14:25 +00005826 assert(Args.size() >= 1 && "Zero-argument case handled above");
5827
5828 // The remaining cases all need a source type.
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00005829 if (Args.size() > 1) {
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005830 SetFailed(FK_TooManyInitsForScalar);
Douglas Gregor85dabae2009-12-16 01:38:02 +00005831 return;
Richard Smith49a6b6e2017-03-24 01:14:25 +00005832 } else if (isa<InitListExpr>(Args[0])) {
5833 SetFailed(FK_ParenthesizedListInitForScalar);
5834 return;
Douglas Gregor85dabae2009-12-16 01:38:02 +00005835 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005836
5837 // - Otherwise, if the source type is a (possibly cv-qualified) class
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005838 // type, conversion functions are considered.
Douglas Gregor85dabae2009-12-16 01:38:02 +00005839 if (!SourceType.isNull() && SourceType->isRecordType()) {
Richard Smith77be48a2014-07-31 06:31:19 +00005840 // For a conversion to _Atomic(T) from either T or a class type derived
5841 // from T, initialize the T object then convert to _Atomic type.
5842 bool NeedAtomicConversion = false;
5843 if (const AtomicType *Atomic = DestType->getAs<AtomicType>()) {
5844 if (Context.hasSameUnqualifiedType(SourceType, Atomic->getValueType()) ||
Stephen Kellyf2ceec42018-08-09 21:08:08 +00005845 S.IsDerivedFrom(Initializer->getBeginLoc(), SourceType,
Richard Smith0f59cb32015-12-18 21:45:41 +00005846 Atomic->getValueType())) {
Richard Smith77be48a2014-07-31 06:31:19 +00005847 DestType = Atomic->getValueType();
5848 NeedAtomicConversion = true;
5849 }
5850 }
5851
5852 TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
Richard Smithaaa0ec42013-09-21 21:19:19 +00005853 TopLevelOfInitList);
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005854 MaybeProduceObjCObject(S, *this, Entity);
Richard Smith77be48a2014-07-31 06:31:19 +00005855 if (!Failed() && NeedAtomicConversion)
5856 AddAtomicConversionStep(Entity.getType());
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005857 return;
5858 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005859
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005860 // - Otherwise, the initial value of the object being initialized is the
Douglas Gregor540c3b02009-12-14 17:27:33 +00005861 // (possibly converted) value of the initializer expression. Standard
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005862 // conversions (Clause 4) will be used, if necessary, to convert the
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005863 // initializer expression to the cv-unqualified version of the
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005864 // destination type; no user-defined conversions are considered.
Richard Smith77be48a2014-07-31 06:31:19 +00005865
John McCall31168b02011-06-15 23:02:42 +00005866 ImplicitConversionSequence ICS
Richard Smith77be48a2014-07-31 06:31:19 +00005867 = S.TryImplicitConversion(Initializer, DestType,
John McCall31168b02011-06-15 23:02:42 +00005868 /*SuppressUserConversions*/true,
John McCallec6f4e92010-06-04 02:29:22 +00005869 /*AllowExplicitConversions*/ false,
Douglas Gregor58281352011-01-27 00:58:17 +00005870 /*InOverloadResolution*/ false,
John McCall31168b02011-06-15 23:02:42 +00005871 /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
5872 allowObjCWritebackConversion);
Richard Smith77be48a2014-07-31 06:31:19 +00005873
5874 if (ICS.isStandard() &&
John McCall31168b02011-06-15 23:02:42 +00005875 ICS.Standard.Second == ICK_Writeback_Conversion) {
5876 // Objective-C ARC writeback conversion.
Fangrui Song6907ce22018-07-30 19:24:48 +00005877
John McCall31168b02011-06-15 23:02:42 +00005878 // We should copy unless we're passing to an argument explicitly
5879 // marked 'out'.
5880 bool ShouldCopy = true;
5881 if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
5882 ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
Fangrui Song6907ce22018-07-30 19:24:48 +00005883
John McCall31168b02011-06-15 23:02:42 +00005884 // If there was an lvalue adjustment, add it as a separate conversion.
5885 if (ICS.Standard.First == ICK_Array_To_Pointer ||
5886 ICS.Standard.First == ICK_Lvalue_To_Rvalue) {
5887 ImplicitConversionSequence LvalueICS;
5888 LvalueICS.setStandard();
5889 LvalueICS.Standard.setAsIdentityConversion();
5890 LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0));
5891 LvalueICS.Standard.First = ICS.Standard.First;
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005892 AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0));
John McCall31168b02011-06-15 23:02:42 +00005893 }
Fangrui Song6907ce22018-07-30 19:24:48 +00005894
Richard Smith77be48a2014-07-31 06:31:19 +00005895 AddPassByIndirectCopyRestoreStep(DestType, ShouldCopy);
John McCall31168b02011-06-15 23:02:42 +00005896 } else if (ICS.isBad()) {
Douglas Gregorb491ed32011-02-19 21:32:49 +00005897 DeclAccessPair dap;
Richard Smithf032001b2013-06-20 02:18:31 +00005898 if (isLibstdcxxPointerReturnFalseHack(S, Entity, Initializer)) {
5899 AddZeroInitializationStep(Entity.getType());
5900 } else if (Initializer->getType() == Context.OverloadTy &&
5901 !S.ResolveAddressOfOverloadedFunction(Initializer, DestType,
5902 false, dap))
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005903 SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
George Burgess IV3e3bb95b2015-12-02 21:58:08 +00005904 else if (Initializer->getType()->isFunctionType() &&
5905 isExprAnUnaddressableFunction(S, Initializer))
5906 SetFailed(InitializationSequence::FK_AddressOfUnaddressableFunction);
Douglas Gregore81f58e2010-11-08 03:40:48 +00005907 else
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005908 SetFailed(InitializationSequence::FK_ConversionFailed);
John McCall31168b02011-06-15 23:02:42 +00005909 } else {
Richard Smith77be48a2014-07-31 06:31:19 +00005910 AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
John McCallfa272342011-06-16 23:24:51 +00005911
Rafael Espindola699fc4d2011-07-14 22:58:04 +00005912 MaybeProduceObjCObject(S, *this, Entity);
Douglas Gregore81f58e2010-11-08 03:40:48 +00005913 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005914}
5915
5916InitializationSequence::~InitializationSequence() {
Davide Italiano67bb9f72015-07-01 21:51:58 +00005917 for (auto &S : Steps)
5918 S.Destroy();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00005919}
5920
5921//===----------------------------------------------------------------------===//
5922// Perform initialization
5923//===----------------------------------------------------------------------===//
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005924static Sema::AssignmentAction
Fariborz Jahanian3a25d0d2013-07-31 23:19:34 +00005925getAssignmentAction(const InitializedEntity &Entity, bool Diagnose = false) {
Douglas Gregore1314a62009-12-18 05:02:21 +00005926 switch(Entity.getKind()) {
5927 case InitializedEntity::EK_Variable:
5928 case InitializedEntity::EK_New:
Douglas Gregor6dd3a6a2010-12-02 21:47:04 +00005929 case InitializedEntity::EK_Exception:
5930 case InitializedEntity::EK_Base:
Alexis Hunt61bc1732011-05-01 07:04:31 +00005931 case InitializedEntity::EK_Delegating:
Douglas Gregore1314a62009-12-18 05:02:21 +00005932 return Sema::AA_Initializing;
5933
5934 case InitializedEntity::EK_Parameter:
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005935 if (Entity.getDecl() &&
Douglas Gregor6b7f12c2010-04-21 23:24:10 +00005936 isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext()))
5937 return Sema::AA_Sending;
5938
Douglas Gregore1314a62009-12-18 05:02:21 +00005939 return Sema::AA_Passing;
5940
Fariborz Jahanian3a25d0d2013-07-31 23:19:34 +00005941 case InitializedEntity::EK_Parameter_CF_Audited:
5942 if (Entity.getDecl() &&
5943 isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext()))
5944 return Sema::AA_Sending;
Fangrui Song6907ce22018-07-30 19:24:48 +00005945
Fariborz Jahanian3a25d0d2013-07-31 23:19:34 +00005946 return !Diagnose ? Sema::AA_Passing : Sema::AA_Passing_CFAudited;
Fangrui Song6907ce22018-07-30 19:24:48 +00005947
Douglas Gregore1314a62009-12-18 05:02:21 +00005948 case InitializedEntity::EK_Result:
Richard Smith67af95b2018-07-23 19:19:08 +00005949 case InitializedEntity::EK_StmtExprResult: // FIXME: Not quite right.
Douglas Gregore1314a62009-12-18 05:02:21 +00005950 return Sema::AA_Returning;
5951
Douglas Gregore1314a62009-12-18 05:02:21 +00005952 case InitializedEntity::EK_Temporary:
Fariborz Jahanian14e95412013-07-11 19:13:34 +00005953 case InitializedEntity::EK_RelatedResult:
Douglas Gregore1314a62009-12-18 05:02:21 +00005954 // FIXME: Can we tell apart casting vs. converting?
5955 return Sema::AA_Casting;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005956
Douglas Gregore1314a62009-12-18 05:02:21 +00005957 case InitializedEntity::EK_Member:
Richard Smith7873de02016-08-11 22:25:46 +00005958 case InitializedEntity::EK_Binding:
Anders Carlssoned8d80d2010-01-23 04:34:47 +00005959 case InitializedEntity::EK_ArrayElement:
5960 case InitializedEntity::EK_VectorElement:
Eli Friedman6b9c41e2011-09-19 23:17:44 +00005961 case InitializedEntity::EK_ComplexElement:
Fariborz Jahanian28ed9272010-06-07 16:14:00 +00005962 case InitializedEntity::EK_BlockElement:
Alex Lorenzb4791c72017-04-06 12:53:43 +00005963 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
Douglas Gregor19666fb2012-02-15 16:57:26 +00005964 case InitializedEntity::EK_LambdaCapture:
Jordan Rose6c0505e2013-05-06 16:48:12 +00005965 case InitializedEntity::EK_CompoundLiteralInit:
Douglas Gregore1314a62009-12-18 05:02:21 +00005966 return Sema::AA_Initializing;
5967 }
5968
David Blaikie8a40f702012-01-17 06:56:22 +00005969 llvm_unreachable("Invalid EntityKind!");
Douglas Gregore1314a62009-12-18 05:02:21 +00005970}
5971
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00005972/// Whether we should bind a created object as a temporary when
Douglas Gregor95562572010-04-24 23:45:46 +00005973/// initializing the given entity.
Douglas Gregor45cf7e32010-04-02 18:24:57 +00005974static bool shouldBindAsTemporary(const InitializedEntity &Entity) {
Douglas Gregore1314a62009-12-18 05:02:21 +00005975 switch (Entity.getKind()) {
Anders Carlsson0bd52402010-01-24 00:19:41 +00005976 case InitializedEntity::EK_ArrayElement:
5977 case InitializedEntity::EK_Member:
Douglas Gregor45cf7e32010-04-02 18:24:57 +00005978 case InitializedEntity::EK_Result:
Richard Smith67af95b2018-07-23 19:19:08 +00005979 case InitializedEntity::EK_StmtExprResult:
Douglas Gregore1314a62009-12-18 05:02:21 +00005980 case InitializedEntity::EK_New:
5981 case InitializedEntity::EK_Variable:
5982 case InitializedEntity::EK_Base:
Alexis Hunt61bc1732011-05-01 07:04:31 +00005983 case InitializedEntity::EK_Delegating:
Anders Carlssoned8d80d2010-01-23 04:34:47 +00005984 case InitializedEntity::EK_VectorElement:
Eli Friedman6b9c41e2011-09-19 23:17:44 +00005985 case InitializedEntity::EK_ComplexElement:
Anders Carlssonfcd764a2010-02-06 23:23:06 +00005986 case InitializedEntity::EK_Exception:
Fariborz Jahanian28ed9272010-06-07 16:14:00 +00005987 case InitializedEntity::EK_BlockElement:
Alex Lorenzb4791c72017-04-06 12:53:43 +00005988 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
Douglas Gregor19666fb2012-02-15 16:57:26 +00005989 case InitializedEntity::EK_LambdaCapture:
Jordan Rose6c0505e2013-05-06 16:48:12 +00005990 case InitializedEntity::EK_CompoundLiteralInit:
Douglas Gregore1314a62009-12-18 05:02:21 +00005991 return false;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00005992
Douglas Gregore1314a62009-12-18 05:02:21 +00005993 case InitializedEntity::EK_Parameter:
Fariborz Jahanian131996b2013-07-31 18:21:45 +00005994 case InitializedEntity::EK_Parameter_CF_Audited:
Douglas Gregore1314a62009-12-18 05:02:21 +00005995 case InitializedEntity::EK_Temporary:
Fariborz Jahanianb248ca52013-07-11 16:48:06 +00005996 case InitializedEntity::EK_RelatedResult:
Richard Smith7873de02016-08-11 22:25:46 +00005997 case InitializedEntity::EK_Binding:
Douglas Gregore1314a62009-12-18 05:02:21 +00005998 return true;
5999 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00006000
Douglas Gregore1314a62009-12-18 05:02:21 +00006001 llvm_unreachable("missed an InitializedEntity kind?");
6002}
6003
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00006004/// Whether the given entity, when initialized with an object
Douglas Gregor95562572010-04-24 23:45:46 +00006005/// created for that initialization, requires destruction.
Richard Smithb8c0f552016-12-09 18:49:13 +00006006static bool shouldDestroyEntity(const InitializedEntity &Entity) {
Douglas Gregor95562572010-04-24 23:45:46 +00006007 switch (Entity.getKind()) {
Douglas Gregor95562572010-04-24 23:45:46 +00006008 case InitializedEntity::EK_Result:
Richard Smith67af95b2018-07-23 19:19:08 +00006009 case InitializedEntity::EK_StmtExprResult:
Douglas Gregor95562572010-04-24 23:45:46 +00006010 case InitializedEntity::EK_New:
6011 case InitializedEntity::EK_Base:
Alexis Hunt61bc1732011-05-01 07:04:31 +00006012 case InitializedEntity::EK_Delegating:
Douglas Gregor95562572010-04-24 23:45:46 +00006013 case InitializedEntity::EK_VectorElement:
Eli Friedman6b9c41e2011-09-19 23:17:44 +00006014 case InitializedEntity::EK_ComplexElement:
Fariborz Jahanian28ed9272010-06-07 16:14:00 +00006015 case InitializedEntity::EK_BlockElement:
Alex Lorenzb4791c72017-04-06 12:53:43 +00006016 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
Douglas Gregor19666fb2012-02-15 16:57:26 +00006017 case InitializedEntity::EK_LambdaCapture:
Douglas Gregor95562572010-04-24 23:45:46 +00006018 return false;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00006019
Richard Smith27874d62013-01-08 00:08:23 +00006020 case InitializedEntity::EK_Member:
Richard Smith7873de02016-08-11 22:25:46 +00006021 case InitializedEntity::EK_Binding:
Douglas Gregor95562572010-04-24 23:45:46 +00006022 case InitializedEntity::EK_Variable:
6023 case InitializedEntity::EK_Parameter:
Fariborz Jahanian131996b2013-07-31 18:21:45 +00006024 case InitializedEntity::EK_Parameter_CF_Audited:
Douglas Gregor95562572010-04-24 23:45:46 +00006025 case InitializedEntity::EK_Temporary:
6026 case InitializedEntity::EK_ArrayElement:
6027 case InitializedEntity::EK_Exception:
Jordan Rose6c0505e2013-05-06 16:48:12 +00006028 case InitializedEntity::EK_CompoundLiteralInit:
Fariborz Jahanianb248ca52013-07-11 16:48:06 +00006029 case InitializedEntity::EK_RelatedResult:
Douglas Gregor95562572010-04-24 23:45:46 +00006030 return true;
6031 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00006032
6033 llvm_unreachable("missed an InitializedEntity kind?");
Douglas Gregor95562572010-04-24 23:45:46 +00006034}
6035
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00006036/// Get the location at which initialization diagnostics should appear.
Richard Smithc620f552011-10-19 16:55:56 +00006037static SourceLocation getInitializationLoc(const InitializedEntity &Entity,
6038 Expr *Initializer) {
6039 switch (Entity.getKind()) {
6040 case InitializedEntity::EK_Result:
Richard Smith67af95b2018-07-23 19:19:08 +00006041 case InitializedEntity::EK_StmtExprResult:
Richard Smithc620f552011-10-19 16:55:56 +00006042 return Entity.getReturnLoc();
6043
6044 case InitializedEntity::EK_Exception:
6045 return Entity.getThrowLoc();
6046
6047 case InitializedEntity::EK_Variable:
Richard Smith7873de02016-08-11 22:25:46 +00006048 case InitializedEntity::EK_Binding:
Richard Smithc620f552011-10-19 16:55:56 +00006049 return Entity.getDecl()->getLocation();
6050
Douglas Gregor19666fb2012-02-15 16:57:26 +00006051 case InitializedEntity::EK_LambdaCapture:
6052 return Entity.getCaptureLoc();
Fangrui Song6907ce22018-07-30 19:24:48 +00006053
Richard Smithc620f552011-10-19 16:55:56 +00006054 case InitializedEntity::EK_ArrayElement:
6055 case InitializedEntity::EK_Member:
6056 case InitializedEntity::EK_Parameter:
Fariborz Jahanian131996b2013-07-31 18:21:45 +00006057 case InitializedEntity::EK_Parameter_CF_Audited:
Richard Smithc620f552011-10-19 16:55:56 +00006058 case InitializedEntity::EK_Temporary:
6059 case InitializedEntity::EK_New:
6060 case InitializedEntity::EK_Base:
6061 case InitializedEntity::EK_Delegating:
6062 case InitializedEntity::EK_VectorElement:
6063 case InitializedEntity::EK_ComplexElement:
6064 case InitializedEntity::EK_BlockElement:
Alex Lorenzb4791c72017-04-06 12:53:43 +00006065 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
Jordan Rose6c0505e2013-05-06 16:48:12 +00006066 case InitializedEntity::EK_CompoundLiteralInit:
Fariborz Jahanianb248ca52013-07-11 16:48:06 +00006067 case InitializedEntity::EK_RelatedResult:
Stephen Kellyf2ceec42018-08-09 21:08:08 +00006068 return Initializer->getBeginLoc();
Richard Smithc620f552011-10-19 16:55:56 +00006069 }
6070 llvm_unreachable("missed an InitializedEntity kind?");
6071}
6072
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00006073/// Make a (potentially elidable) temporary copy of the object
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00006074/// provided by the given initializer by calling the appropriate copy
6075/// constructor.
6076///
6077/// \param S The Sema object used for type-checking.
6078///
Abramo Bagnara92141d22011-01-27 19:55:10 +00006079/// \param T The type of the temporary object, which must either be
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00006080/// the type of the initializer expression or a superclass thereof.
6081///
James Dennett634962f2012-06-14 21:40:34 +00006082/// \param Entity The entity being initialized.
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00006083///
6084/// \param CurInit The initializer expression.
6085///
6086/// \param IsExtraneousCopy Whether this is an "extraneous" copy that
6087/// is permitted in C++03 (but not C++0x) when binding a reference to
6088/// an rvalue.
6089///
6090/// \returns An expression that copies the initializer expression into
6091/// a temporary object, or an error expression if a copy could not be
6092/// created.
John McCalldadc5752010-08-24 06:29:42 +00006093static ExprResult CopyObject(Sema &S,
Douglas Gregord5b730c92010-09-12 08:07:23 +00006094 QualType T,
6095 const InitializedEntity &Entity,
6096 ExprResult CurInit,
6097 bool IsExtraneousCopy) {
Fariborz Jahanian36f7f132015-01-28 22:08:10 +00006098 if (CurInit.isInvalid())
6099 return CurInit;
Douglas Gregor5ab11652010-04-17 22:01:05 +00006100 // Determine which class type we're copying to.
Anders Carlsson0bd52402010-01-24 00:19:41 +00006101 Expr *CurInitExpr = (Expr *)CurInit.get();
Craig Topperc3ec1492014-05-26 06:22:03 +00006102 CXXRecordDecl *Class = nullptr;
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00006103 if (const RecordType *Record = T->getAs<RecordType>())
Douglas Gregor45cf7e32010-04-02 18:24:57 +00006104 Class = cast<CXXRecordDecl>(Record->getDecl());
6105 if (!Class)
Benjamin Kramer62b95d82012-08-23 21:35:17 +00006106 return CurInit;
Douglas Gregor45cf7e32010-04-02 18:24:57 +00006107
Richard Smithc620f552011-10-19 16:55:56 +00006108 SourceLocation Loc = getInitializationLoc(Entity, CurInit.get());
Douglas Gregord5c231e2010-04-24 21:09:25 +00006109
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00006110 // Make sure that the type we are copying is complete.
Douglas Gregor7bfb2d02012-05-04 16:32:21 +00006111 if (S.RequireCompleteType(Loc, T, diag::err_temp_copy_incomplete))
Benjamin Kramer62b95d82012-08-23 21:35:17 +00006112 return CurInit;
Douglas Gregord5c231e2010-04-24 21:09:25 +00006113
Richard Smith7c2bcc92016-09-07 02:14:33 +00006114 // Perform overload resolution using the class's constructors. Per
6115 // C++11 [dcl.init]p16, second bullet for class types, this initialization
Richard Smithc620f552011-10-19 16:55:56 +00006116 // is direct-initialization.
Richard Smith100b24a2014-04-17 01:52:14 +00006117 OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
Richard Smith7c2bcc92016-09-07 02:14:33 +00006118 DeclContext::lookup_result Ctors = S.LookupConstructors(Class);
Abramo Bagnara635ed24e2011-10-05 07:56:41 +00006119
Douglas Gregore1314a62009-12-18 05:02:21 +00006120 OverloadCandidateSet::iterator Best;
Richard Smith7c2bcc92016-09-07 02:14:33 +00006121 switch (ResolveConstructorOverload(
Richard Smith67ef14f2017-09-26 18:37:55 +00006122 S, Loc, CurInitExpr, CandidateSet, T, Ctors, Best,
Richard Smith7c2bcc92016-09-07 02:14:33 +00006123 /*CopyInitializing=*/false, /*AllowExplicit=*/true,
6124 /*OnlyListConstructors=*/false, /*IsListInit=*/false,
6125 /*SecondStepOfCopyInit=*/true)) {
Douglas Gregore1314a62009-12-18 05:02:21 +00006126 case OR_Success:
6127 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00006128
Douglas Gregore1314a62009-12-18 05:02:21 +00006129 case OR_No_Viable_Function:
David Blaikie5e328052019-05-03 00:44:50 +00006130 CandidateSet.NoteCandidates(
6131 PartialDiagnosticAt(
6132 Loc, S.PDiag(IsExtraneousCopy && !S.isSFINAEContext()
6133 ? diag::ext_rvalue_to_reference_temp_copy_no_viable
6134 : diag::err_temp_copy_no_viable)
6135 << (int)Entity.getKind() << CurInitExpr->getType()
6136 << CurInitExpr->getSourceRange()),
6137 S, OCD_AllCandidates, CurInitExpr);
Jeffrey Yasskincaa710d2010-06-07 15:58:05 +00006138 if (!IsExtraneousCopy || S.isSFINAEContext())
John McCallfaf5fb42010-08-26 23:41:50 +00006139 return ExprError();
Benjamin Kramer62b95d82012-08-23 21:35:17 +00006140 return CurInit;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00006141
Douglas Gregore1314a62009-12-18 05:02:21 +00006142 case OR_Ambiguous:
David Blaikie5e328052019-05-03 00:44:50 +00006143 CandidateSet.NoteCandidates(
6144 PartialDiagnosticAt(Loc, S.PDiag(diag::err_temp_copy_ambiguous)
6145 << (int)Entity.getKind()
6146 << CurInitExpr->getType()
6147 << CurInitExpr->getSourceRange()),
6148 S, OCD_ViableCandidates, CurInitExpr);
John McCallfaf5fb42010-08-26 23:41:50 +00006149 return ExprError();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00006150
Douglas Gregore1314a62009-12-18 05:02:21 +00006151 case OR_Deleted:
6152 S.Diag(Loc, diag::err_temp_copy_deleted)
Douglas Gregora4b592a2009-12-19 03:01:41 +00006153 << (int)Entity.getKind() << CurInitExpr->getType()
Douglas Gregore1314a62009-12-18 05:02:21 +00006154 << CurInitExpr->getSourceRange();
Richard Smith852265f2012-03-30 20:53:28 +00006155 S.NoteDeletedFunction(Best->Function);
John McCallfaf5fb42010-08-26 23:41:50 +00006156 return ExprError();
Douglas Gregore1314a62009-12-18 05:02:21 +00006157 }
6158
Richard Smith7c2bcc92016-09-07 02:14:33 +00006159 bool HadMultipleCandidates = CandidateSet.size() > 1;
6160
Douglas Gregor5ab11652010-04-17 22:01:05 +00006161 CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function);
Benjamin Kramerf0623432012-08-23 22:51:59 +00006162 SmallVector<Expr*, 8> ConstructorArgs;
Nikola Smiljanic01a75982014-05-29 10:55:11 +00006163 CurInit.get(); // Ownership transferred into MultiExprArg, below.
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00006164
Richard Smith5179eb72016-06-28 19:03:57 +00006165 S.CheckConstructorAccess(Loc, Constructor, Best->FoundDecl, Entity,
6166 IsExtraneousCopy);
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00006167
6168 if (IsExtraneousCopy) {
6169 // If this is a totally extraneous copy for C++03 reference
6170 // binding purposes, just return the original initialization
Douglas Gregor30b52772010-04-18 07:57:34 +00006171 // expression. We don't generate an (elided) copy operation here
6172 // because doing so would require us to pass down a flag to avoid
6173 // infinite recursion, where each step adds another extraneous,
6174 // elidable copy.
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00006175
Douglas Gregor30b52772010-04-18 07:57:34 +00006176 // Instantiate the default arguments of any extra parameters in
6177 // the selected copy constructor, as if we were going to create a
6178 // proper call to the copy constructor.
6179 for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) {
6180 ParmVarDecl *Parm = Constructor->getParamDecl(I);
6181 if (S.RequireCompleteType(Loc, Parm->getType(),
Douglas Gregor7bfb2d02012-05-04 16:32:21 +00006182 diag::err_call_incomplete_argument))
Douglas Gregor30b52772010-04-18 07:57:34 +00006183 break;
6184
6185 // Build the default argument expression; we don't actually care
6186 // if this succeeds or not, because this routine will complain
6187 // if there was a problem.
6188 S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm);
6189 }
6190
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00006191 return CurInitExpr;
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00006192 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00006193
Douglas Gregor5ab11652010-04-17 22:01:05 +00006194 // Determine the arguments required to actually perform the
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00006195 // constructor call (we might have derived-to-base conversions, or
6196 // the copy constructor may have default arguments).
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00006197 if (S.CompleteConstructorCall(Constructor, CurInitExpr, Loc, ConstructorArgs))
John McCallfaf5fb42010-08-26 23:41:50 +00006198 return ExprError();
Douglas Gregor5ab11652010-04-17 22:01:05 +00006199
Richard Smith7c2bcc92016-09-07 02:14:33 +00006200 // C++0x [class.copy]p32:
6201 // When certain criteria are met, an implementation is allowed to
6202 // omit the copy/move construction of a class object, even if the
6203 // copy/move constructor and/or destructor for the object have
6204 // side effects. [...]
6205 // - when a temporary class object that has not been bound to a
6206 // reference (12.2) would be copied/moved to a class object
6207 // with the same cv-unqualified type, the copy/move operation
6208 // can be omitted by constructing the temporary object
6209 // directly into the target of the omitted copy/move
6210 //
6211 // Note that the other three bullets are handled elsewhere. Copy
6212 // elision for return statements and throw expressions are handled as part
6213 // of constructor initialization, while copy elision for exception handlers
6214 // is handled by the run-time.
6215 //
6216 // FIXME: If the function parameter is not the same type as the temporary, we
6217 // should still be able to elide the copy, but we don't have a way to
6218 // represent in the AST how much should be elided in this case.
6219 bool Elidable =
6220 CurInitExpr->isTemporaryObject(S.Context, Class) &&
6221 S.Context.hasSameUnqualifiedType(
6222 Best->Function->getParamDecl(0)->getType().getNonReferenceType(),
6223 CurInitExpr->getType());
6224
Douglas Gregord0ace022010-04-25 00:55:24 +00006225 // Actually perform the constructor call.
Richard Smithc2bebe92016-05-11 20:37:46 +00006226 CurInit = S.BuildCXXConstructExpr(Loc, T, Best->FoundDecl, Constructor,
6227 Elidable,
Benjamin Kramer62b95d82012-08-23 21:35:17 +00006228 ConstructorArgs,
Abramo Bagnara635ed24e2011-10-05 07:56:41 +00006229 HadMultipleCandidates,
Richard Smithd59b8322012-12-19 01:39:02 +00006230 /*ListInit*/ false,
Richard Smithf8adcdc2014-07-17 05:12:35 +00006231 /*StdInitListInit*/ false,
John McCallbfd822c2010-08-24 07:32:53 +00006232 /*ZeroInit*/ false,
Chandler Carruth01718152010-10-25 08:47:36 +00006233 CXXConstructExpr::CK_Complete,
6234 SourceRange());
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00006235
Douglas Gregord0ace022010-04-25 00:55:24 +00006236 // If we're supposed to bind temporaries, do so.
6237 if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity))
Nikola Smiljanic01a75982014-05-29 10:55:11 +00006238 CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
Benjamin Kramer62b95d82012-08-23 21:35:17 +00006239 return CurInit;
Douglas Gregore1314a62009-12-18 05:02:21 +00006240}
Douglas Gregor3e1e5272009-12-09 23:02:17 +00006241
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00006242/// Check whether elidable copy construction for binding a reference to
Richard Smithc620f552011-10-19 16:55:56 +00006243/// a temporary would have succeeded if we were building in C++98 mode, for
6244/// -Wc++98-compat.
6245static void CheckCXX98CompatAccessibleCopy(Sema &S,
6246 const InitializedEntity &Entity,
6247 Expr *CurInitExpr) {
Richard Smith2bf7fdb2013-01-02 11:42:31 +00006248 assert(S.getLangOpts().CPlusPlus11);
Richard Smithc620f552011-10-19 16:55:56 +00006249
6250 const RecordType *Record = CurInitExpr->getType()->getAs<RecordType>();
6251 if (!Record)
6252 return;
6253
6254 SourceLocation Loc = getInitializationLoc(Entity, CurInitExpr);
Alp Tokerd4a3f0e2014-06-15 23:30:39 +00006255 if (S.Diags.isIgnored(diag::warn_cxx98_compat_temp_copy, Loc))
Richard Smithc620f552011-10-19 16:55:56 +00006256 return;
6257
6258 // Find constructors which would have been considered.
Richard Smith100b24a2014-04-17 01:52:14 +00006259 OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
Richard Smith7c2bcc92016-09-07 02:14:33 +00006260 DeclContext::lookup_result Ctors =
6261 S.LookupConstructors(cast<CXXRecordDecl>(Record->getDecl()));
Richard Smithc620f552011-10-19 16:55:56 +00006262
6263 // Perform overload resolution.
6264 OverloadCandidateSet::iterator Best;
Richard Smith7c2bcc92016-09-07 02:14:33 +00006265 OverloadingResult OR = ResolveConstructorOverload(
Richard Smith67ef14f2017-09-26 18:37:55 +00006266 S, Loc, CurInitExpr, CandidateSet, CurInitExpr->getType(), Ctors, Best,
Richard Smith7c2bcc92016-09-07 02:14:33 +00006267 /*CopyInitializing=*/false, /*AllowExplicit=*/true,
6268 /*OnlyListConstructors=*/false, /*IsListInit=*/false,
6269 /*SecondStepOfCopyInit=*/true);
Richard Smithc620f552011-10-19 16:55:56 +00006270
6271 PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy)
6272 << OR << (int)Entity.getKind() << CurInitExpr->getType()
6273 << CurInitExpr->getSourceRange();
6274
6275 switch (OR) {
6276 case OR_Success:
6277 S.CheckConstructorAccess(Loc, cast<CXXConstructorDecl>(Best->Function),
Richard Smith5179eb72016-06-28 19:03:57 +00006278 Best->FoundDecl, Entity, Diag);
Richard Smithc620f552011-10-19 16:55:56 +00006279 // FIXME: Check default arguments as far as that's possible.
6280 break;
6281
6282 case OR_No_Viable_Function:
David Blaikie5e328052019-05-03 00:44:50 +00006283 CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S,
6284 OCD_AllCandidates, CurInitExpr);
Richard Smithc620f552011-10-19 16:55:56 +00006285 break;
6286
6287 case OR_Ambiguous:
David Blaikie5e328052019-05-03 00:44:50 +00006288 CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S,
6289 OCD_ViableCandidates, CurInitExpr);
Richard Smithc620f552011-10-19 16:55:56 +00006290 break;
6291
6292 case OR_Deleted:
6293 S.Diag(Loc, Diag);
Richard Smith852265f2012-03-30 20:53:28 +00006294 S.NoteDeletedFunction(Best->Function);
Richard Smithc620f552011-10-19 16:55:56 +00006295 break;
6296 }
6297}
6298
Douglas Gregor4f4946a2010-04-22 00:20:18 +00006299void InitializationSequence::PrintInitLocationNote(Sema &S,
6300 const InitializedEntity &Entity) {
Fariborz Jahanian131996b2013-07-31 18:21:45 +00006301 if (Entity.isParameterKind() && Entity.getDecl()) {
Douglas Gregor4f4946a2010-04-22 00:20:18 +00006302 if (Entity.getDecl()->getLocation().isInvalid())
6303 return;
6304
6305 if (Entity.getDecl()->getDeclName())
6306 S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here)
6307 << Entity.getDecl()->getDeclName();
6308 else
6309 S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here);
6310 }
Fariborz Jahanianb248ca52013-07-11 16:48:06 +00006311 else if (Entity.getKind() == InitializedEntity::EK_RelatedResult &&
6312 Entity.getMethodDecl())
6313 S.Diag(Entity.getMethodDecl()->getLocation(),
6314 diag::note_method_return_type_change)
6315 << Entity.getMethodDecl()->getDeclName();
Douglas Gregor4f4946a2010-04-22 00:20:18 +00006316}
6317
Jordan Rose6c0505e2013-05-06 16:48:12 +00006318/// Returns true if the parameters describe a constructor initialization of
6319/// an explicit temporary object, e.g. "Point(x, y)".
6320static bool isExplicitTemporary(const InitializedEntity &Entity,
6321 const InitializationKind &Kind,
6322 unsigned NumArgs) {
6323 switch (Entity.getKind()) {
6324 case InitializedEntity::EK_Temporary:
6325 case InitializedEntity::EK_CompoundLiteralInit:
Fariborz Jahanianb248ca52013-07-11 16:48:06 +00006326 case InitializedEntity::EK_RelatedResult:
Jordan Rose6c0505e2013-05-06 16:48:12 +00006327 break;
6328 default:
6329 return false;
6330 }
6331
6332 switch (Kind.getKind()) {
6333 case InitializationKind::IK_DirectList:
6334 return true;
6335 // FIXME: Hack to work around cast weirdness.
6336 case InitializationKind::IK_Direct:
6337 case InitializationKind::IK_Value:
6338 return NumArgs != 1;
6339 default:
6340 return false;
6341 }
6342}
6343
Sebastian Redled2e5322011-12-22 14:44:04 +00006344static ExprResult
6345PerformConstructorInitialization(Sema &S,
6346 const InitializedEntity &Entity,
6347 const InitializationKind &Kind,
6348 MultiExprArg Args,
6349 const InitializationSequence::Step& Step,
Richard Smithd59b8322012-12-19 01:39:02 +00006350 bool &ConstructorInitRequiresZeroInit,
Enea Zaffanella76e98fe2013-09-07 05:49:53 +00006351 bool IsListInitialization,
Richard Smithf8adcdc2014-07-17 05:12:35 +00006352 bool IsStdInitListInitialization,
Enea Zaffanella76e98fe2013-09-07 05:49:53 +00006353 SourceLocation LBraceLoc,
6354 SourceLocation RBraceLoc) {
Sebastian Redled2e5322011-12-22 14:44:04 +00006355 unsigned NumArgs = Args.size();
6356 CXXConstructorDecl *Constructor
6357 = cast<CXXConstructorDecl>(Step.Function.Function);
6358 bool HadMultipleCandidates = Step.Function.HadMultipleCandidates;
6359
6360 // Build a call to the selected constructor.
Benjamin Kramerf0623432012-08-23 22:51:59 +00006361 SmallVector<Expr*, 8> ConstructorArgs;
Sebastian Redled2e5322011-12-22 14:44:04 +00006362 SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid())
6363 ? Kind.getEqualLoc()
6364 : Kind.getLocation();
6365
6366 if (Kind.getKind() == InitializationKind::IK_Default) {
6367 // Force even a trivial, implicit default constructor to be
6368 // semantically checked. We do this explicitly because we don't build
6369 // the definition for completely trivial constructors.
Matt Beaumont-Gay47ff1222012-02-24 08:37:56 +00006370 assert(Constructor->getParent() && "No parent class for constructor.");
Sebastian Redled2e5322011-12-22 14:44:04 +00006371 if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() &&
Richard Smith26a92d52019-08-26 18:18:07 +00006372 Constructor->isTrivial() && !Constructor->isUsed(false)) {
6373 S.runWithSufficientStackSpace(Loc, [&] {
6374 S.DefineImplicitDefaultConstructor(Loc, Constructor);
6375 });
6376 }
Sebastian Redled2e5322011-12-22 14:44:04 +00006377 }
6378
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00006379 ExprResult CurInit((Expr *)nullptr);
Sebastian Redled2e5322011-12-22 14:44:04 +00006380
Douglas Gregor6073dca2012-02-24 23:56:31 +00006381 // C++ [over.match.copy]p1:
Fangrui Song6907ce22018-07-30 19:24:48 +00006382 // - When initializing a temporary to be bound to the first parameter
6383 // of a constructor that takes a reference to possibly cv-qualified
6384 // T as its first argument, called with a single argument in the
Douglas Gregor6073dca2012-02-24 23:56:31 +00006385 // context of direct-initialization, explicit conversion functions
6386 // are also considered.
Richard Smith7c2bcc92016-09-07 02:14:33 +00006387 bool AllowExplicitConv =
6388 Kind.AllowExplicit() && !Kind.isCopyInit() && Args.size() == 1 &&
6389 hasCopyOrMoveCtorParam(S.Context,
6390 getConstructorInfo(Step.Function.FoundDecl));
Douglas Gregor6073dca2012-02-24 23:56:31 +00006391
Sebastian Redled2e5322011-12-22 14:44:04 +00006392 // Determine the arguments required to actually perform the constructor
6393 // call.
Benjamin Kramer62b95d82012-08-23 21:35:17 +00006394 if (S.CompleteConstructorCall(Constructor, Args,
Douglas Gregor6073dca2012-02-24 23:56:31 +00006395 Loc, ConstructorArgs,
Richard Smith6b216962013-02-05 05:52:24 +00006396 AllowExplicitConv,
6397 IsListInitialization))
Sebastian Redled2e5322011-12-22 14:44:04 +00006398 return ExprError();
6399
6400
Jordan Rose6c0505e2013-05-06 16:48:12 +00006401 if (isExplicitTemporary(Entity, Kind, NumArgs)) {
Sebastian Redled2e5322011-12-22 14:44:04 +00006402 // An explicitly-constructed temporary, e.g., X(1, 2).
Richard Smith22262ab2013-05-04 06:44:46 +00006403 if (S.DiagnoseUseOfDecl(Constructor, Loc))
6404 return ExprError();
Sebastian Redled2e5322011-12-22 14:44:04 +00006405
6406 TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
6407 if (!TSInfo)
6408 TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc);
Vedant Kumarc9a95312018-11-19 20:10:21 +00006409 SourceRange ParenOrBraceRange =
6410 (Kind.getKind() == InitializationKind::IK_DirectList)
6411 ? SourceRange(LBraceLoc, RBraceLoc)
6412 : Kind.getParenOrBraceRange();
Sebastian Redled2e5322011-12-22 14:44:04 +00006413
Richard Smith5179eb72016-06-28 19:03:57 +00006414 if (auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(
Richard Smith80a47022016-06-29 01:10:27 +00006415 Step.Function.FoundDecl.getDecl())) {
Richard Smith5179eb72016-06-28 19:03:57 +00006416 Constructor = S.findInheritingConstructor(Loc, Constructor, Shadow);
Richard Smith80a47022016-06-29 01:10:27 +00006417 if (S.DiagnoseUseOfDecl(Constructor, Loc))
6418 return ExprError();
6419 }
Richard Smith5179eb72016-06-28 19:03:57 +00006420 S.MarkFunctionReferenced(Loc, Constructor);
6421
Bruno Ricciddb8f6b2018-12-22 14:39:30 +00006422 CurInit = CXXTemporaryObjectExpr::Create(
Richard Smith60437622017-02-09 19:17:44 +00006423 S.Context, Constructor,
6424 Entity.getType().getNonLValueExprType(S.Context), TSInfo,
Richard Smithc2bebe92016-05-11 20:37:46 +00006425 ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates,
6426 IsListInitialization, IsStdInitListInitialization,
6427 ConstructorInitRequiresZeroInit);
Sebastian Redled2e5322011-12-22 14:44:04 +00006428 } else {
6429 CXXConstructExpr::ConstructionKind ConstructKind =
6430 CXXConstructExpr::CK_Complete;
6431
6432 if (Entity.getKind() == InitializedEntity::EK_Base) {
6433 ConstructKind = Entity.getBaseSpecifier()->isVirtual() ?
6434 CXXConstructExpr::CK_VirtualBase :
6435 CXXConstructExpr::CK_NonVirtualBase;
6436 } else if (Entity.getKind() == InitializedEntity::EK_Delegating) {
6437 ConstructKind = CXXConstructExpr::CK_Delegating;
6438 }
6439
Peter Collingbourneb8d17e72014-02-22 02:59:41 +00006440 // Only get the parenthesis or brace range if it is a list initialization or
6441 // direct construction.
6442 SourceRange ParenOrBraceRange;
6443 if (IsListInitialization)
6444 ParenOrBraceRange = SourceRange(LBraceLoc, RBraceLoc);
6445 else if (Kind.getKind() == InitializationKind::IK_Direct)
Vedant Kumara14a1f92018-01-17 18:53:51 +00006446 ParenOrBraceRange = Kind.getParenOrBraceRange();
Sebastian Redled2e5322011-12-22 14:44:04 +00006447
6448 // If the entity allows NRVO, mark the construction as elidable
6449 // unconditionally.
6450 if (Entity.allowsNRVO())
Richard Smith410306b2016-12-12 02:53:20 +00006451 CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,
Richard Smithc2bebe92016-05-11 20:37:46 +00006452 Step.Function.FoundDecl,
Sebastian Redled2e5322011-12-22 14:44:04 +00006453 Constructor, /*Elidable=*/true,
Benjamin Kramer62b95d82012-08-23 21:35:17 +00006454 ConstructorArgs,
Sebastian Redled2e5322011-12-22 14:44:04 +00006455 HadMultipleCandidates,
Richard Smithd59b8322012-12-19 01:39:02 +00006456 IsListInitialization,
Richard Smithf8adcdc2014-07-17 05:12:35 +00006457 IsStdInitListInitialization,
Sebastian Redled2e5322011-12-22 14:44:04 +00006458 ConstructorInitRequiresZeroInit,
6459 ConstructKind,
Peter Collingbourneb8d17e72014-02-22 02:59:41 +00006460 ParenOrBraceRange);
Sebastian Redled2e5322011-12-22 14:44:04 +00006461 else
Richard Smith410306b2016-12-12 02:53:20 +00006462 CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,
Richard Smithc2bebe92016-05-11 20:37:46 +00006463 Step.Function.FoundDecl,
Sebastian Redled2e5322011-12-22 14:44:04 +00006464 Constructor,
Benjamin Kramer62b95d82012-08-23 21:35:17 +00006465 ConstructorArgs,
Sebastian Redled2e5322011-12-22 14:44:04 +00006466 HadMultipleCandidates,
Richard Smithd59b8322012-12-19 01:39:02 +00006467 IsListInitialization,
Richard Smithf8adcdc2014-07-17 05:12:35 +00006468 IsStdInitListInitialization,
Sebastian Redled2e5322011-12-22 14:44:04 +00006469 ConstructorInitRequiresZeroInit,
6470 ConstructKind,
Peter Collingbourneb8d17e72014-02-22 02:59:41 +00006471 ParenOrBraceRange);
Sebastian Redled2e5322011-12-22 14:44:04 +00006472 }
6473 if (CurInit.isInvalid())
6474 return ExprError();
6475
6476 // Only check access if all of that succeeded.
Richard Smith5179eb72016-06-28 19:03:57 +00006477 S.CheckConstructorAccess(Loc, Constructor, Step.Function.FoundDecl, Entity);
Richard Smith22262ab2013-05-04 06:44:46 +00006478 if (S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc))
6479 return ExprError();
Sebastian Redled2e5322011-12-22 14:44:04 +00006480
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +00006481 if (const ArrayType *AT = S.Context.getAsArrayType(Entity.getType()))
6482 if (checkDestructorReference(S.Context.getBaseElementType(AT), Loc, S))
6483 return ExprError();
6484
Sebastian Redled2e5322011-12-22 14:44:04 +00006485 if (shouldBindAsTemporary(Entity))
Nikola Smiljanic01a75982014-05-29 10:55:11 +00006486 CurInit = S.MaybeBindToTemporary(CurInit.get());
Sebastian Redled2e5322011-12-22 14:44:04 +00006487
Benjamin Kramer62b95d82012-08-23 21:35:17 +00006488 return CurInit;
Sebastian Redled2e5322011-12-22 14:44:04 +00006489}
6490
Richard Smithd87aab92018-07-17 22:24:09 +00006491namespace {
6492enum LifetimeKind {
6493 /// The lifetime of a temporary bound to this entity ends at the end of the
6494 /// full-expression, and that's (probably) fine.
6495 LK_FullExpression,
6496
6497 /// The lifetime of a temporary bound to this entity is extended to the
6498 /// lifeitme of the entity itself.
6499 LK_Extended,
6500
6501 /// The lifetime of a temporary bound to this entity probably ends too soon,
6502 /// because the entity is allocated in a new-expression.
6503 LK_New,
6504
6505 /// The lifetime of a temporary bound to this entity ends too soon, because
6506 /// the entity is a return object.
6507 LK_Return,
6508
Richard Smith67af95b2018-07-23 19:19:08 +00006509 /// The lifetime of a temporary bound to this entity ends too soon, because
6510 /// the entity is the result of a statement expression.
6511 LK_StmtExprResult,
6512
Richard Smithd87aab92018-07-17 22:24:09 +00006513 /// This is a mem-initializer: if it would extend a temporary (other than via
6514 /// a default member initializer), the program is ill-formed.
6515 LK_MemInitializer,
6516};
6517using LifetimeResult =
6518 llvm::PointerIntPair<const InitializedEntity *, 3, LifetimeKind>;
6519}
6520
Richard Smithe6c01442013-06-05 00:46:14 +00006521/// Determine the declaration which an initialized entity ultimately refers to,
6522/// for the purpose of lifetime-extending a temporary bound to a reference in
6523/// the initialization of \p Entity.
Richard Smithca975b22018-07-23 18:50:26 +00006524static LifetimeResult getEntityLifetime(
David Majnemerdaff3702014-05-01 17:50:17 +00006525 const InitializedEntity *Entity,
Richard Smithd87aab92018-07-17 22:24:09 +00006526 const InitializedEntity *InitField = nullptr) {
Richard Smithe6c01442013-06-05 00:46:14 +00006527 // C++11 [class.temporary]p5:
David Majnemerdaff3702014-05-01 17:50:17 +00006528 switch (Entity->getKind()) {
Richard Smithe6c01442013-06-05 00:46:14 +00006529 case InitializedEntity::EK_Variable:
6530 // The temporary [...] persists for the lifetime of the reference
Richard Smithd87aab92018-07-17 22:24:09 +00006531 return {Entity, LK_Extended};
Richard Smithe6c01442013-06-05 00:46:14 +00006532
6533 case InitializedEntity::EK_Member:
6534 // For subobjects, we look at the complete object.
David Majnemerdaff3702014-05-01 17:50:17 +00006535 if (Entity->getParent())
Richard Smithca975b22018-07-23 18:50:26 +00006536 return getEntityLifetime(Entity->getParent(), Entity);
Richard Smithe6c01442013-06-05 00:46:14 +00006537
6538 // except:
Richard Smithd87aab92018-07-17 22:24:09 +00006539 // C++17 [class.base.init]p8:
6540 // A temporary expression bound to a reference member in a
6541 // mem-initializer is ill-formed.
6542 // C++17 [class.base.init]p11:
6543 // A temporary expression bound to a reference member from a
6544 // default member initializer is ill-formed.
6545 //
6546 // The context of p11 and its example suggest that it's only the use of a
6547 // default member initializer from a constructor that makes the program
6548 // ill-formed, not its mere existence, and that it can even be used by
6549 // aggregate initialization.
6550 return {Entity, Entity->isDefaultMemberInitializer() ? LK_Extended
6551 : LK_MemInitializer};
Richard Smithe6c01442013-06-05 00:46:14 +00006552
Richard Smith7873de02016-08-11 22:25:46 +00006553 case InitializedEntity::EK_Binding:
Richard Smith3997b1b2016-08-12 01:55:21 +00006554 // Per [dcl.decomp]p3, the binding is treated as a variable of reference
6555 // type.
Richard Smithd87aab92018-07-17 22:24:09 +00006556 return {Entity, LK_Extended};
Richard Smith7873de02016-08-11 22:25:46 +00006557
Richard Smithe6c01442013-06-05 00:46:14 +00006558 case InitializedEntity::EK_Parameter:
Fariborz Jahanian131996b2013-07-31 18:21:45 +00006559 case InitializedEntity::EK_Parameter_CF_Audited:
Richard Smithe6c01442013-06-05 00:46:14 +00006560 // -- A temporary bound to a reference parameter in a function call
6561 // persists until the completion of the full-expression containing
6562 // the call.
Richard Smithd87aab92018-07-17 22:24:09 +00006563 return {nullptr, LK_FullExpression};
6564
Richard Smithe6c01442013-06-05 00:46:14 +00006565 case InitializedEntity::EK_Result:
6566 // -- The lifetime of a temporary bound to the returned value in a
6567 // function return statement is not extended; the temporary is
6568 // destroyed at the end of the full-expression in the return statement.
Richard Smithd87aab92018-07-17 22:24:09 +00006569 return {nullptr, LK_Return};
6570
Richard Smith67af95b2018-07-23 19:19:08 +00006571 case InitializedEntity::EK_StmtExprResult:
6572 // FIXME: Should we lifetime-extend through the result of a statement
6573 // expression?
6574 return {nullptr, LK_StmtExprResult};
6575
Richard Smithe6c01442013-06-05 00:46:14 +00006576 case InitializedEntity::EK_New:
6577 // -- A temporary bound to a reference in a new-initializer persists
6578 // until the completion of the full-expression containing the
6579 // new-initializer.
Richard Smithd87aab92018-07-17 22:24:09 +00006580 return {nullptr, LK_New};
Richard Smithe6c01442013-06-05 00:46:14 +00006581
6582 case InitializedEntity::EK_Temporary:
6583 case InitializedEntity::EK_CompoundLiteralInit:
Fariborz Jahanianb248ca52013-07-11 16:48:06 +00006584 case InitializedEntity::EK_RelatedResult:
Richard Smithe6c01442013-06-05 00:46:14 +00006585 // We don't yet know the storage duration of the surrounding temporary.
6586 // Assume it's got full-expression duration for now, it will patch up our
6587 // storage duration if that's not correct.
Richard Smithd87aab92018-07-17 22:24:09 +00006588 return {nullptr, LK_FullExpression};
Richard Smithe6c01442013-06-05 00:46:14 +00006589
6590 case InitializedEntity::EK_ArrayElement:
6591 // For subobjects, we look at the complete object.
Richard Smithca975b22018-07-23 18:50:26 +00006592 return getEntityLifetime(Entity->getParent(), InitField);
Richard Smithe6c01442013-06-05 00:46:14 +00006593
6594 case InitializedEntity::EK_Base:
Richard Smith872307e2016-03-08 22:17:41 +00006595 // For subobjects, we look at the complete object.
6596 if (Entity->getParent())
Richard Smithca975b22018-07-23 18:50:26 +00006597 return getEntityLifetime(Entity->getParent(), InitField);
Richard Smithd87aab92018-07-17 22:24:09 +00006598 return {InitField, LK_MemInitializer};
6599
Richard Smithe6c01442013-06-05 00:46:14 +00006600 case InitializedEntity::EK_Delegating:
6601 // We can reach this case for aggregate initialization in a constructor:
6602 // struct A { int &&r; };
6603 // struct B : A { B() : A{0} {} };
Richard Smithd87aab92018-07-17 22:24:09 +00006604 // In this case, use the outermost field decl as the context.
6605 return {InitField, LK_MemInitializer};
Richard Smithe6c01442013-06-05 00:46:14 +00006606
6607 case InitializedEntity::EK_BlockElement:
Alex Lorenzb4791c72017-04-06 12:53:43 +00006608 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
Richard Smithe6c01442013-06-05 00:46:14 +00006609 case InitializedEntity::EK_LambdaCapture:
Richard Smithe6c01442013-06-05 00:46:14 +00006610 case InitializedEntity::EK_VectorElement:
6611 case InitializedEntity::EK_ComplexElement:
Richard Smithd87aab92018-07-17 22:24:09 +00006612 return {nullptr, LK_FullExpression};
Richard Smithca975b22018-07-23 18:50:26 +00006613
6614 case InitializedEntity::EK_Exception:
6615 // FIXME: Can we diagnose lifetime problems with exceptions?
6616 return {nullptr, LK_FullExpression};
Richard Smithe6c01442013-06-05 00:46:14 +00006617 }
Benjamin Kramercabc8822013-06-05 15:37:50 +00006618 llvm_unreachable("unknown entity kind");
Richard Smithe6c01442013-06-05 00:46:14 +00006619}
6620
Richard Smithd87aab92018-07-17 22:24:09 +00006621namespace {
Richard Smithca975b22018-07-23 18:50:26 +00006622enum ReferenceKind {
Richard Smithd87aab92018-07-17 22:24:09 +00006623 /// Lifetime would be extended by a reference binding to a temporary.
Richard Smithca975b22018-07-23 18:50:26 +00006624 RK_ReferenceBinding,
Richard Smithd87aab92018-07-17 22:24:09 +00006625 /// Lifetime would be extended by a std::initializer_list object binding to
6626 /// its backing array.
Richard Smithca975b22018-07-23 18:50:26 +00006627 RK_StdInitializerList,
Richard Smithd87aab92018-07-17 22:24:09 +00006628};
Richard Smithca975b22018-07-23 18:50:26 +00006629
Richard Smithafe48f92018-07-23 21:21:22 +00006630/// A temporary or local variable. This will be one of:
6631/// * A MaterializeTemporaryExpr.
6632/// * A DeclRefExpr whose declaration is a local.
6633/// * An AddrLabelExpr.
6634/// * A BlockExpr for a block with captures.
6635using Local = Expr*;
Richard Smithca975b22018-07-23 18:50:26 +00006636
6637/// Expressions we stepped over when looking for the local state. Any steps
6638/// that would inhibit lifetime extension or take us out of subexpressions of
6639/// the initializer are included.
6640struct IndirectLocalPathEntry {
Richard Smithafe48f92018-07-23 21:21:22 +00006641 enum EntryKind {
Richard Smithca975b22018-07-23 18:50:26 +00006642 DefaultInit,
6643 AddressOf,
Richard Smithafe48f92018-07-23 21:21:22 +00006644 VarInit,
6645 LValToRVal,
Richard Smithf4e248c2018-08-01 00:33:25 +00006646 LifetimeBoundCall,
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006647 GslPointerInit
Richard Smithca975b22018-07-23 18:50:26 +00006648 } Kind;
6649 Expr *E;
Richard Smithf4e248c2018-08-01 00:33:25 +00006650 const Decl *D = nullptr;
Richard Smithafe48f92018-07-23 21:21:22 +00006651 IndirectLocalPathEntry() {}
6652 IndirectLocalPathEntry(EntryKind K, Expr *E) : Kind(K), E(E) {}
Richard Smithf4e248c2018-08-01 00:33:25 +00006653 IndirectLocalPathEntry(EntryKind K, Expr *E, const Decl *D)
6654 : Kind(K), E(E), D(D) {}
Richard Smithca975b22018-07-23 18:50:26 +00006655};
6656
6657using IndirectLocalPath = llvm::SmallVectorImpl<IndirectLocalPathEntry>;
Richard Smithe6c01442013-06-05 00:46:14 +00006658
Richard Smithd87aab92018-07-17 22:24:09 +00006659struct RevertToOldSizeRAII {
Richard Smithca975b22018-07-23 18:50:26 +00006660 IndirectLocalPath &Path;
Richard Smithd87aab92018-07-17 22:24:09 +00006661 unsigned OldSize = Path.size();
Richard Smithca975b22018-07-23 18:50:26 +00006662 RevertToOldSizeRAII(IndirectLocalPath &Path) : Path(Path) {}
Richard Smithd87aab92018-07-17 22:24:09 +00006663 ~RevertToOldSizeRAII() { Path.resize(OldSize); }
6664};
Richard Smithafe48f92018-07-23 21:21:22 +00006665
6666using LocalVisitor = llvm::function_ref<bool(IndirectLocalPath &Path, Local L,
6667 ReferenceKind RK)>;
Richard Smithd87aab92018-07-17 22:24:09 +00006668}
6669
Richard Smithafe48f92018-07-23 21:21:22 +00006670static bool isVarOnPath(IndirectLocalPath &Path, VarDecl *VD) {
6671 for (auto E : Path)
6672 if (E.Kind == IndirectLocalPathEntry::VarInit && E.D == VD)
6673 return true;
6674 return false;
6675}
6676
Richard Smith0e3102d2018-07-24 00:55:08 +00006677static bool pathContainsInit(IndirectLocalPath &Path) {
Fangrui Song3117b172018-10-20 17:53:42 +00006678 return llvm::any_of(Path, [=](IndirectLocalPathEntry E) {
Richard Smith0e3102d2018-07-24 00:55:08 +00006679 return E.Kind == IndirectLocalPathEntry::DefaultInit ||
6680 E.Kind == IndirectLocalPathEntry::VarInit;
6681 });
6682}
6683
Richard Smithca975b22018-07-23 18:50:26 +00006684static void visitLocalsRetainedByInitializer(IndirectLocalPath &Path,
6685 Expr *Init, LocalVisitor Visit,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006686 bool RevisitSubinits,
6687 bool EnableLifetimeWarnings);
Richard Smithd87aab92018-07-17 22:24:09 +00006688
Richard Smithf4e248c2018-08-01 00:33:25 +00006689static void visitLocalsRetainedByReferenceBinding(IndirectLocalPath &Path,
6690 Expr *Init, ReferenceKind RK,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006691 LocalVisitor Visit,
6692 bool EnableLifetimeWarnings);
Richard Smithf4e248c2018-08-01 00:33:25 +00006693
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006694template <typename T> static bool isRecordWithAttr(QualType Type) {
6695 if (auto *RD = Type->getAsCXXRecordDecl())
Matthias Gehref64f4882019-09-06 08:56:30 +00006696 return RD->hasAttr<T>();
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006697 return false;
6698}
6699
Gabor Horvathbfe0c372019-08-14 16:34:56 +00006700// Decl::isInStdNamespace will return false for iterators in some STL
6701// implementations due to them being defined in a namespace outside of the std
6702// namespace.
6703static bool isInStlNamespace(const Decl *D) {
6704 const DeclContext *DC = D->getDeclContext();
6705 if (!DC)
6706 return false;
6707 if (const auto *ND = dyn_cast<NamespaceDecl>(DC))
6708 if (const IdentifierInfo *II = ND->getIdentifier()) {
6709 StringRef Name = II->getName();
6710 if (Name.size() >= 2 && Name.front() == '_' &&
6711 (Name[1] == '_' || isUppercase(Name[1])))
6712 return true;
6713 }
6714
6715 return DC->isStdNamespace();
6716}
6717
Gabor Horvathc1dafd72019-08-09 15:16:35 +00006718static bool shouldTrackImplicitObjectArg(const CXXMethodDecl *Callee) {
6719 if (auto *Conv = dyn_cast_or_null<CXXConversionDecl>(Callee))
6720 if (isRecordWithAttr<PointerAttr>(Conv->getConversionType()))
6721 return true;
Gabor Horvathbfe0c372019-08-14 16:34:56 +00006722 if (!isInStlNamespace(Callee->getParent()))
Gabor Horvathc1dafd72019-08-09 15:16:35 +00006723 return false;
6724 if (!isRecordWithAttr<PointerAttr>(Callee->getThisObjectType()) &&
6725 !isRecordWithAttr<OwnerAttr>(Callee->getThisObjectType()))
6726 return false;
Gabor Horvath795c3662019-08-09 23:03:50 +00006727 if (Callee->getReturnType()->isPointerType() ||
6728 isRecordWithAttr<PointerAttr>(Callee->getReturnType())) {
6729 if (!Callee->getIdentifier())
6730 return false;
6731 return llvm::StringSwitch<bool>(Callee->getName())
6732 .Cases("begin", "rbegin", "cbegin", "crbegin", true)
6733 .Cases("end", "rend", "cend", "crend", true)
6734 .Cases("c_str", "data", "get", true)
6735 // Map and set types.
6736 .Cases("find", "equal_range", "lower_bound", "upper_bound", true)
6737 .Default(false);
6738 } else if (Callee->getReturnType()->isReferenceType()) {
6739 if (!Callee->getIdentifier()) {
6740 auto OO = Callee->getOverloadedOperator();
6741 return OO == OverloadedOperatorKind::OO_Subscript ||
6742 OO == OverloadedOperatorKind::OO_Star;
6743 }
6744 return llvm::StringSwitch<bool>(Callee->getName())
Matthias Gehre1bebc222019-08-14 21:55:57 +00006745 .Cases("front", "back", "at", "top", "value", true)
Gabor Horvath795c3662019-08-09 23:03:50 +00006746 .Default(false);
6747 }
6748 return false;
Gabor Horvathc1dafd72019-08-09 15:16:35 +00006749}
6750
Gabor Horvatheaee4de2019-08-20 16:45:06 +00006751static bool shouldTrackFirstArgument(const FunctionDecl *FD) {
6752 if (!FD->getIdentifier() || FD->getNumParams() != 1)
6753 return false;
6754 const auto *RD = FD->getParamDecl(0)->getType()->getPointeeCXXRecordDecl();
6755 if (!FD->isInStdNamespace() || !RD || !RD->isInStdNamespace())
6756 return false;
6757 if (!isRecordWithAttr<PointerAttr>(QualType(RD->getTypeForDecl(), 0)) &&
6758 !isRecordWithAttr<OwnerAttr>(QualType(RD->getTypeForDecl(), 0)))
6759 return false;
6760 if (FD->getReturnType()->isPointerType() ||
6761 isRecordWithAttr<PointerAttr>(FD->getReturnType())) {
6762 return llvm::StringSwitch<bool>(FD->getName())
6763 .Cases("begin", "rbegin", "cbegin", "crbegin", true)
6764 .Cases("end", "rend", "cend", "crend", true)
6765 .Case("data", true)
6766 .Default(false);
6767 } else if (FD->getReturnType()->isReferenceType()) {
6768 return llvm::StringSwitch<bool>(FD->getName())
6769 .Cases("get", "any_cast", true)
6770 .Default(false);
6771 }
6772 return false;
6773}
6774
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006775static void handleGslAnnotatedTypes(IndirectLocalPath &Path, Expr *Call,
6776 LocalVisitor Visit) {
6777 auto VisitPointerArg = [&](const Decl *D, Expr *Arg) {
Gabor Horvath6f984002019-09-03 16:17:24 +00006778 // We are not interested in the temporary base objects of gsl Pointers:
6779 // Temp().ptr; // Here ptr might not dangle.
6780 if (isa<MemberExpr>(Arg->IgnoreImpCasts()))
6781 return;
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006782 Path.push_back({IndirectLocalPathEntry::GslPointerInit, Arg, D});
6783 if (Arg->isGLValue())
6784 visitLocalsRetainedByReferenceBinding(Path, Arg, RK_ReferenceBinding,
Gabor Horvath3ba0f3c92019-08-26 17:03:01 +00006785 Visit,
6786 /*EnableLifetimeWarnings=*/true);
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006787 else
Gabor Horvath3ba0f3c92019-08-26 17:03:01 +00006788 visitLocalsRetainedByInitializer(Path, Arg, Visit, true,
6789 /*EnableLifetimeWarnings=*/true);
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006790 Path.pop_back();
6791 };
6792
6793 if (auto *MCE = dyn_cast<CXXMemberCallExpr>(Call)) {
Gabor Horvathc1dafd72019-08-09 15:16:35 +00006794 const auto *MD = cast_or_null<CXXMethodDecl>(MCE->getDirectCallee());
6795 if (MD && shouldTrackImplicitObjectArg(MD))
6796 VisitPointerArg(MD, MCE->getImplicitObjectArgument());
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006797 return;
Gabor Horvath795c3662019-08-09 23:03:50 +00006798 } else if (auto *OCE = dyn_cast<CXXOperatorCallExpr>(Call)) {
6799 FunctionDecl *Callee = OCE->getDirectCallee();
6800 if (Callee && Callee->isCXXInstanceMember() &&
6801 shouldTrackImplicitObjectArg(cast<CXXMethodDecl>(Callee)))
6802 VisitPointerArg(Callee, OCE->getArg(0));
6803 return;
Gabor Horvatheaee4de2019-08-20 16:45:06 +00006804 } else if (auto *CE = dyn_cast<CallExpr>(Call)) {
6805 FunctionDecl *Callee = CE->getDirectCallee();
6806 if (Callee && shouldTrackFirstArgument(Callee))
6807 VisitPointerArg(Callee, CE->getArg(0));
6808 return;
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006809 }
6810
6811 if (auto *CCE = dyn_cast<CXXConstructExpr>(Call)) {
6812 const auto *Ctor = CCE->getConstructor();
Matthias Gehref64f4882019-09-06 08:56:30 +00006813 const CXXRecordDecl *RD = Ctor->getParent();
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006814 if (CCE->getNumArgs() > 0 && RD->hasAttr<PointerAttr>())
6815 VisitPointerArg(Ctor->getParamDecl(0), CCE->getArgs()[0]);
6816 }
6817}
6818
Richard Smithf4e248c2018-08-01 00:33:25 +00006819static bool implicitObjectParamIsLifetimeBound(const FunctionDecl *FD) {
6820 const TypeSourceInfo *TSI = FD->getTypeSourceInfo();
6821 if (!TSI)
6822 return false;
Martin Storsjod03fa992018-08-02 18:12:08 +00006823 // Don't declare this variable in the second operand of the for-statement;
6824 // GCC miscompiles that by ending its lifetime before evaluating the
6825 // third operand. See gcc.gnu.org/PR86769.
6826 AttributedTypeLoc ATL;
Richard Smithf4e248c2018-08-01 00:33:25 +00006827 for (TypeLoc TL = TSI->getTypeLoc();
Martin Storsjod03fa992018-08-02 18:12:08 +00006828 (ATL = TL.getAsAdjusted<AttributedTypeLoc>());
Richard Smithf4e248c2018-08-01 00:33:25 +00006829 TL = ATL.getModifiedLoc()) {
Richard Smithe43e2b32018-08-20 21:47:29 +00006830 if (ATL.getAttrAs<LifetimeBoundAttr>())
Richard Smithf4e248c2018-08-01 00:33:25 +00006831 return true;
6832 }
6833 return false;
6834}
6835
6836static void visitLifetimeBoundArguments(IndirectLocalPath &Path, Expr *Call,
6837 LocalVisitor Visit) {
6838 const FunctionDecl *Callee;
6839 ArrayRef<Expr*> Args;
6840
6841 if (auto *CE = dyn_cast<CallExpr>(Call)) {
6842 Callee = CE->getDirectCallee();
6843 Args = llvm::makeArrayRef(CE->getArgs(), CE->getNumArgs());
6844 } else {
6845 auto *CCE = cast<CXXConstructExpr>(Call);
6846 Callee = CCE->getConstructor();
6847 Args = llvm::makeArrayRef(CCE->getArgs(), CCE->getNumArgs());
6848 }
6849 if (!Callee)
6850 return;
6851
6852 Expr *ObjectArg = nullptr;
6853 if (isa<CXXOperatorCallExpr>(Call) && Callee->isCXXInstanceMember()) {
6854 ObjectArg = Args[0];
6855 Args = Args.slice(1);
6856 } else if (auto *MCE = dyn_cast<CXXMemberCallExpr>(Call)) {
6857 ObjectArg = MCE->getImplicitObjectArgument();
6858 }
6859
6860 auto VisitLifetimeBoundArg = [&](const Decl *D, Expr *Arg) {
6861 Path.push_back({IndirectLocalPathEntry::LifetimeBoundCall, Arg, D});
6862 if (Arg->isGLValue())
6863 visitLocalsRetainedByReferenceBinding(Path, Arg, RK_ReferenceBinding,
Gabor Horvath3ba0f3c92019-08-26 17:03:01 +00006864 Visit,
6865 /*EnableLifetimeWarnings=*/false);
Richard Smithf4e248c2018-08-01 00:33:25 +00006866 else
Gabor Horvath3ba0f3c92019-08-26 17:03:01 +00006867 visitLocalsRetainedByInitializer(Path, Arg, Visit, true,
6868 /*EnableLifetimeWarnings=*/false);
Richard Smithf4e248c2018-08-01 00:33:25 +00006869 Path.pop_back();
6870 };
6871
6872 if (ObjectArg && implicitObjectParamIsLifetimeBound(Callee))
6873 VisitLifetimeBoundArg(Callee, ObjectArg);
6874
6875 for (unsigned I = 0,
6876 N = std::min<unsigned>(Callee->getNumParams(), Args.size());
6877 I != N; ++I) {
6878 if (Callee->getParamDecl(I)->hasAttr<LifetimeBoundAttr>())
6879 VisitLifetimeBoundArg(Callee->getParamDecl(I), Args[I]);
6880 }
6881}
6882
Richard Smithca975b22018-07-23 18:50:26 +00006883/// Visit the locals that would be reachable through a reference bound to the
6884/// glvalue expression \c Init.
Richard Smithca975b22018-07-23 18:50:26 +00006885static void visitLocalsRetainedByReferenceBinding(IndirectLocalPath &Path,
6886 Expr *Init, ReferenceKind RK,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006887 LocalVisitor Visit,
6888 bool EnableLifetimeWarnings) {
Richard Smithd87aab92018-07-17 22:24:09 +00006889 RevertToOldSizeRAII RAII(Path);
6890
Richard Smith6b6f8aa2013-06-15 00:30:29 +00006891 // Walk past any constructs which we can lifetime-extend across.
6892 Expr *Old;
6893 do {
6894 Old = Init;
6895
Bill Wendling7c44da22018-10-31 03:48:47 +00006896 if (auto *FE = dyn_cast<FullExpr>(Init))
6897 Init = FE->getSubExpr();
Richard Smithafe48f92018-07-23 21:21:22 +00006898
Richard Smithdbc82492015-01-10 01:28:13 +00006899 if (InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) {
Richard Smithd87aab92018-07-17 22:24:09 +00006900 // If this is just redundant braces around an initializer, step over it.
6901 if (ILE->isTransparent())
Richard Smithdbc82492015-01-10 01:28:13 +00006902 Init = ILE->getInit(0);
Richard Smithdbc82492015-01-10 01:28:13 +00006903 }
6904
Richard Smith6b6f8aa2013-06-15 00:30:29 +00006905 // Step over any subobject adjustments; we may have a materialized
6906 // temporary inside them.
Richard Smith4baaa5a2016-12-03 01:14:32 +00006907 Init = const_cast<Expr *>(Init->skipRValueSubobjectAdjustments());
Richard Smith6b6f8aa2013-06-15 00:30:29 +00006908
6909 // Per current approach for DR1376, look through casts to reference type
6910 // when performing lifetime extension.
6911 if (CastExpr *CE = dyn_cast<CastExpr>(Init))
6912 if (CE->getSubExpr()->isGLValue())
6913 Init = CE->getSubExpr();
6914
Richard Smithb3189a12016-12-05 07:49:14 +00006915 // Per the current approach for DR1299, look through array element access
Richard Smithca975b22018-07-23 18:50:26 +00006916 // on array glvalues when performing lifetime extension.
6917 if (auto *ASE = dyn_cast<ArraySubscriptExpr>(Init)) {
Richard Smithafe48f92018-07-23 21:21:22 +00006918 Init = ASE->getBase();
6919 auto *ICE = dyn_cast<ImplicitCastExpr>(Init);
6920 if (ICE && ICE->getCastKind() == CK_ArrayToPointerDecay)
6921 Init = ICE->getSubExpr();
6922 else
6923 // We can't lifetime extend through this but we might still find some
6924 // retained temporaries.
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006925 return visitLocalsRetainedByInitializer(Path, Init, Visit, true,
6926 EnableLifetimeWarnings);
Richard Smithca975b22018-07-23 18:50:26 +00006927 }
Richard Smithd87aab92018-07-17 22:24:09 +00006928
6929 // Step into CXXDefaultInitExprs so we can diagnose cases where a
6930 // constructor inherits one as an implicit mem-initializer.
6931 if (auto *DIE = dyn_cast<CXXDefaultInitExpr>(Init)) {
Richard Smithafe48f92018-07-23 21:21:22 +00006932 Path.push_back(
6933 {IndirectLocalPathEntry::DefaultInit, DIE, DIE->getField()});
Richard Smithd87aab92018-07-17 22:24:09 +00006934 Init = DIE->getExpr();
Richard Smithd87aab92018-07-17 22:24:09 +00006935 }
Richard Smith6b6f8aa2013-06-15 00:30:29 +00006936 } while (Init != Old);
6937
Richard Smithd87aab92018-07-17 22:24:09 +00006938 if (auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) {
Richard Smithca975b22018-07-23 18:50:26 +00006939 if (Visit(Path, Local(MTE), RK))
6940 visitLocalsRetainedByInitializer(Path, MTE->GetTemporaryExpr(), Visit,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006941 true, EnableLifetimeWarnings);
Richard Smithca975b22018-07-23 18:50:26 +00006942 }
6943
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006944 if (isa<CallExpr>(Init)) {
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006945 if (EnableLifetimeWarnings)
6946 handleGslAnnotatedTypes(Path, Init, Visit);
Richard Smithf4e248c2018-08-01 00:33:25 +00006947 return visitLifetimeBoundArguments(Path, Init, Visit);
Gabor Horvathe5e10b52019-08-06 19:13:29 +00006948 }
Richard Smithf4e248c2018-08-01 00:33:25 +00006949
Richard Smithafe48f92018-07-23 21:21:22 +00006950 switch (Init->getStmtClass()) {
6951 case Stmt::DeclRefExprClass: {
6952 // If we find the name of a local non-reference parameter, we could have a
6953 // lifetime problem.
6954 auto *DRE = cast<DeclRefExpr>(Init);
Richard Smithca975b22018-07-23 18:50:26 +00006955 auto *VD = dyn_cast<VarDecl>(DRE->getDecl());
6956 if (VD && VD->hasLocalStorage() &&
6957 !DRE->refersToEnclosingVariableOrCapture()) {
Richard Smithafe48f92018-07-23 21:21:22 +00006958 if (!VD->getType()->isReferenceType()) {
6959 Visit(Path, Local(DRE), RK);
6960 } else if (isa<ParmVarDecl>(DRE->getDecl())) {
6961 // The lifetime of a reference parameter is unknown; assume it's OK
6962 // for now.
6963 break;
6964 } else if (VD->getInit() && !isVarOnPath(Path, VD)) {
6965 Path.push_back({IndirectLocalPathEntry::VarInit, DRE, VD});
6966 visitLocalsRetainedByReferenceBinding(Path, VD->getInit(),
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006967 RK_ReferenceBinding, Visit,
6968 EnableLifetimeWarnings);
Richard Smithafe48f92018-07-23 21:21:22 +00006969 }
Richard Smithca975b22018-07-23 18:50:26 +00006970 }
Richard Smithafe48f92018-07-23 21:21:22 +00006971 break;
6972 }
6973
6974 case Stmt::UnaryOperatorClass: {
6975 // The only unary operator that make sense to handle here
6976 // is Deref. All others don't resolve to a "name." This includes
6977 // handling all sorts of rvalues passed to a unary operator.
6978 const UnaryOperator *U = cast<UnaryOperator>(Init);
6979 if (U->getOpcode() == UO_Deref)
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006980 visitLocalsRetainedByInitializer(Path, U->getSubExpr(), Visit, true,
6981 EnableLifetimeWarnings);
Richard Smithafe48f92018-07-23 21:21:22 +00006982 break;
6983 }
6984
6985 case Stmt::OMPArraySectionExprClass: {
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006986 visitLocalsRetainedByInitializer(Path,
6987 cast<OMPArraySectionExpr>(Init)->getBase(),
6988 Visit, true, EnableLifetimeWarnings);
Richard Smithafe48f92018-07-23 21:21:22 +00006989 break;
6990 }
6991
6992 case Stmt::ConditionalOperatorClass:
6993 case Stmt::BinaryConditionalOperatorClass: {
6994 auto *C = cast<AbstractConditionalOperator>(Init);
6995 if (!C->getTrueExpr()->getType()->isVoidType())
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006996 visitLocalsRetainedByReferenceBinding(Path, C->getTrueExpr(), RK, Visit,
6997 EnableLifetimeWarnings);
Richard Smithafe48f92018-07-23 21:21:22 +00006998 if (!C->getFalseExpr()->getType()->isVoidType())
Gabor Horvath6379e5c2019-08-23 22:21:33 +00006999 visitLocalsRetainedByReferenceBinding(Path, C->getFalseExpr(), RK, Visit,
7000 EnableLifetimeWarnings);
Richard Smithafe48f92018-07-23 21:21:22 +00007001 break;
7002 }
7003
7004 // FIXME: Visit the left-hand side of an -> or ->*.
7005
7006 default:
7007 break;
Richard Smithe6c01442013-06-05 00:46:14 +00007008 }
7009}
7010
Richard Smithca975b22018-07-23 18:50:26 +00007011/// Visit the locals that would be reachable through an object initialized by
7012/// the prvalue expression \c Init.
Richard Smithca975b22018-07-23 18:50:26 +00007013static void visitLocalsRetainedByInitializer(IndirectLocalPath &Path,
7014 Expr *Init, LocalVisitor Visit,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007015 bool RevisitSubinits,
7016 bool EnableLifetimeWarnings) {
Richard Smithd87aab92018-07-17 22:24:09 +00007017 RevertToOldSizeRAII RAII(Path);
7018
Richard Smithf4e248c2018-08-01 00:33:25 +00007019 Expr *Old;
7020 do {
7021 Old = Init;
Richard Smithd87aab92018-07-17 22:24:09 +00007022
Richard Smithf4e248c2018-08-01 00:33:25 +00007023 // Step into CXXDefaultInitExprs so we can diagnose cases where a
7024 // constructor inherits one as an implicit mem-initializer.
7025 if (auto *DIE = dyn_cast<CXXDefaultInitExpr>(Init)) {
7026 Path.push_back({IndirectLocalPathEntry::DefaultInit, DIE, DIE->getField()});
7027 Init = DIE->getExpr();
7028 }
Richard Smithafe48f92018-07-23 21:21:22 +00007029
Bill Wendling7c44da22018-10-31 03:48:47 +00007030 if (auto *FE = dyn_cast<FullExpr>(Init))
7031 Init = FE->getSubExpr();
Richard Smithe6c01442013-06-05 00:46:14 +00007032
Richard Smithf4e248c2018-08-01 00:33:25 +00007033 // Dig out the expression which constructs the extended temporary.
7034 Init = const_cast<Expr *>(Init->skipRValueSubobjectAdjustments());
7035
7036 if (CXXBindTemporaryExpr *BTE = dyn_cast<CXXBindTemporaryExpr>(Init))
7037 Init = BTE->getSubExpr();
7038
7039 Init = Init->IgnoreParens();
7040
7041 // Step over value-preserving rvalue casts.
7042 if (auto *CE = dyn_cast<CastExpr>(Init)) {
7043 switch (CE->getCastKind()) {
7044 case CK_LValueToRValue:
7045 // If we can match the lvalue to a const object, we can look at its
7046 // initializer.
7047 Path.push_back({IndirectLocalPathEntry::LValToRVal, CE});
7048 return visitLocalsRetainedByReferenceBinding(
7049 Path, Init, RK_ReferenceBinding,
7050 [&](IndirectLocalPath &Path, Local L, ReferenceKind RK) -> bool {
7051 if (auto *DRE = dyn_cast<DeclRefExpr>(L)) {
7052 auto *VD = dyn_cast<VarDecl>(DRE->getDecl());
7053 if (VD && VD->getType().isConstQualified() && VD->getInit() &&
7054 !isVarOnPath(Path, VD)) {
7055 Path.push_back({IndirectLocalPathEntry::VarInit, DRE, VD});
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007056 visitLocalsRetainedByInitializer(Path, VD->getInit(), Visit, true,
7057 EnableLifetimeWarnings);
Richard Smithf4e248c2018-08-01 00:33:25 +00007058 }
7059 } else if (auto *MTE = dyn_cast<MaterializeTemporaryExpr>(L)) {
7060 if (MTE->getType().isConstQualified())
7061 visitLocalsRetainedByInitializer(Path, MTE->GetTemporaryExpr(),
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007062 Visit, true,
7063 EnableLifetimeWarnings);
Richard Smithf4e248c2018-08-01 00:33:25 +00007064 }
7065 return false;
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007066 }, EnableLifetimeWarnings);
Richard Smithf4e248c2018-08-01 00:33:25 +00007067
7068 // We assume that objects can be retained by pointers cast to integers,
7069 // but not if the integer is cast to floating-point type or to _Complex.
7070 // We assume that casts to 'bool' do not preserve enough information to
7071 // retain a local object.
7072 case CK_NoOp:
7073 case CK_BitCast:
7074 case CK_BaseToDerived:
7075 case CK_DerivedToBase:
7076 case CK_UncheckedDerivedToBase:
7077 case CK_Dynamic:
7078 case CK_ToUnion:
7079 case CK_UserDefinedConversion:
7080 case CK_ConstructorConversion:
7081 case CK_IntegralToPointer:
7082 case CK_PointerToIntegral:
7083 case CK_VectorSplat:
7084 case CK_IntegralCast:
7085 case CK_CPointerToObjCPointerCast:
7086 case CK_BlockPointerToObjCPointerCast:
7087 case CK_AnyPointerToBlockPointerCast:
7088 case CK_AddressSpaceConversion:
7089 break;
7090
7091 case CK_ArrayToPointerDecay:
7092 // Model array-to-pointer decay as taking the address of the array
7093 // lvalue.
7094 Path.push_back({IndirectLocalPathEntry::AddressOf, CE});
7095 return visitLocalsRetainedByReferenceBinding(Path, CE->getSubExpr(),
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007096 RK_ReferenceBinding, Visit,
7097 EnableLifetimeWarnings);
Richard Smithf4e248c2018-08-01 00:33:25 +00007098
7099 default:
7100 return;
7101 }
7102
7103 Init = CE->getSubExpr();
7104 }
7105 } while (Old != Init);
Richard Smith736a9472013-06-12 20:42:33 +00007106
Richard Smithd87aab92018-07-17 22:24:09 +00007107 // C++17 [dcl.init.list]p6:
7108 // initializing an initializer_list object from the array extends the
7109 // lifetime of the array exactly like binding a reference to a temporary.
7110 if (auto *ILE = dyn_cast<CXXStdInitializerListExpr>(Init))
Richard Smithca975b22018-07-23 18:50:26 +00007111 return visitLocalsRetainedByReferenceBinding(Path, ILE->getSubExpr(),
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007112 RK_StdInitializerList, Visit,
7113 EnableLifetimeWarnings);
Richard Smithcc1b96d2013-06-12 22:31:48 +00007114
Richard Smithe6c01442013-06-05 00:46:14 +00007115 if (InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) {
Richard Smithca975b22018-07-23 18:50:26 +00007116 // We already visited the elements of this initializer list while
7117 // performing the initialization. Don't visit them again unless we've
7118 // changed the lifetime of the initialized entity.
7119 if (!RevisitSubinits)
7120 return;
7121
Richard Smithd87aab92018-07-17 22:24:09 +00007122 if (ILE->isTransparent())
Richard Smithca975b22018-07-23 18:50:26 +00007123 return visitLocalsRetainedByInitializer(Path, ILE->getInit(0), Visit,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007124 RevisitSubinits,
7125 EnableLifetimeWarnings);
Richard Smithd87aab92018-07-17 22:24:09 +00007126
Richard Smithcc1b96d2013-06-12 22:31:48 +00007127 if (ILE->getType()->isArrayType()) {
Richard Smithe6c01442013-06-05 00:46:14 +00007128 for (unsigned I = 0, N = ILE->getNumInits(); I != N; ++I)
Richard Smithca975b22018-07-23 18:50:26 +00007129 visitLocalsRetainedByInitializer(Path, ILE->getInit(I), Visit,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007130 RevisitSubinits,
7131 EnableLifetimeWarnings);
Richard Smithe6c01442013-06-05 00:46:14 +00007132 return;
7133 }
7134
Richard Smithcc1b96d2013-06-12 22:31:48 +00007135 if (CXXRecordDecl *RD = ILE->getType()->getAsCXXRecordDecl()) {
Richard Smithe6c01442013-06-05 00:46:14 +00007136 assert(RD->isAggregate() && "aggregate init on non-aggregate");
7137
7138 // If we lifetime-extend a braced initializer which is initializing an
7139 // aggregate, and that aggregate contains reference members which are
7140 // bound to temporaries, those temporaries are also lifetime-extended.
7141 if (RD->isUnion() && ILE->getInitializedFieldInUnion() &&
7142 ILE->getInitializedFieldInUnion()->getType()->isReferenceType())
Richard Smithca975b22018-07-23 18:50:26 +00007143 visitLocalsRetainedByReferenceBinding(Path, ILE->getInit(0),
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007144 RK_ReferenceBinding, Visit,
7145 EnableLifetimeWarnings);
Richard Smithe6c01442013-06-05 00:46:14 +00007146 else {
7147 unsigned Index = 0;
Richard Smithc69cc842019-06-12 18:32:22 +00007148 for (; Index < RD->getNumBases() && Index < ILE->getNumInits(); ++Index)
7149 visitLocalsRetainedByInitializer(Path, ILE->getInit(Index), Visit,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007150 RevisitSubinits,
7151 EnableLifetimeWarnings);
Aaron Ballmane8a8bae2014-03-08 20:12:42 +00007152 for (const auto *I : RD->fields()) {
Richard Smith0bca59d2013-07-01 06:08:20 +00007153 if (Index >= ILE->getNumInits())
7154 break;
Richard Smithe6c01442013-06-05 00:46:14 +00007155 if (I->isUnnamedBitfield())
7156 continue;
Richard Smith8d7f11d2013-06-27 22:54:33 +00007157 Expr *SubInit = ILE->getInit(Index);
Richard Smithe6c01442013-06-05 00:46:14 +00007158 if (I->getType()->isReferenceType())
Richard Smithca975b22018-07-23 18:50:26 +00007159 visitLocalsRetainedByReferenceBinding(Path, SubInit,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007160 RK_ReferenceBinding, Visit,
7161 EnableLifetimeWarnings);
Richard Smithd87aab92018-07-17 22:24:09 +00007162 else
7163 // This might be either aggregate-initialization of a member or
7164 // initialization of a std::initializer_list object. Regardless,
Richard Smithe6c01442013-06-05 00:46:14 +00007165 // we should recursively lifetime-extend that initializer.
Richard Smithca975b22018-07-23 18:50:26 +00007166 visitLocalsRetainedByInitializer(Path, SubInit, Visit,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007167 RevisitSubinits,
7168 EnableLifetimeWarnings);
Richard Smithe6c01442013-06-05 00:46:14 +00007169 ++Index;
7170 }
7171 }
7172 }
Richard Smithca975b22018-07-23 18:50:26 +00007173 return;
7174 }
7175
Richard Smithb3d203f2018-10-19 19:01:34 +00007176 // The lifetime of an init-capture is that of the closure object constructed
7177 // by a lambda-expression.
7178 if (auto *LE = dyn_cast<LambdaExpr>(Init)) {
7179 for (Expr *E : LE->capture_inits()) {
7180 if (!E)
7181 continue;
7182 if (E->isGLValue())
7183 visitLocalsRetainedByReferenceBinding(Path, E, RK_ReferenceBinding,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007184 Visit, EnableLifetimeWarnings);
Richard Smithb3d203f2018-10-19 19:01:34 +00007185 else
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007186 visitLocalsRetainedByInitializer(Path, E, Visit, true,
7187 EnableLifetimeWarnings);
Richard Smithb3d203f2018-10-19 19:01:34 +00007188 }
7189 }
7190
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007191 if (isa<CallExpr>(Init) || isa<CXXConstructExpr>(Init)) {
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007192 if (EnableLifetimeWarnings)
7193 handleGslAnnotatedTypes(Path, Init, Visit);
Richard Smithf4e248c2018-08-01 00:33:25 +00007194 return visitLifetimeBoundArguments(Path, Init, Visit);
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007195 }
Richard Smithafe48f92018-07-23 21:21:22 +00007196
Richard Smithafe48f92018-07-23 21:21:22 +00007197 switch (Init->getStmtClass()) {
7198 case Stmt::UnaryOperatorClass: {
7199 auto *UO = cast<UnaryOperator>(Init);
7200 // If the initializer is the address of a local, we could have a lifetime
7201 // problem.
7202 if (UO->getOpcode() == UO_AddrOf) {
Richard Smith0e3102d2018-07-24 00:55:08 +00007203 // If this is &rvalue, then it's ill-formed and we have already diagnosed
7204 // it. Don't produce a redundant warning about the lifetime of the
7205 // temporary.
7206 if (isa<MaterializeTemporaryExpr>(UO->getSubExpr()))
7207 return;
7208
Richard Smithafe48f92018-07-23 21:21:22 +00007209 Path.push_back({IndirectLocalPathEntry::AddressOf, UO});
7210 visitLocalsRetainedByReferenceBinding(Path, UO->getSubExpr(),
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007211 RK_ReferenceBinding, Visit,
7212 EnableLifetimeWarnings);
Richard Smithafe48f92018-07-23 21:21:22 +00007213 }
7214 break;
7215 }
7216
7217 case Stmt::BinaryOperatorClass: {
7218 // Handle pointer arithmetic.
7219 auto *BO = cast<BinaryOperator>(Init);
7220 BinaryOperatorKind BOK = BO->getOpcode();
7221 if (!BO->getType()->isPointerType() || (BOK != BO_Add && BOK != BO_Sub))
7222 break;
7223
7224 if (BO->getLHS()->getType()->isPointerType())
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007225 visitLocalsRetainedByInitializer(Path, BO->getLHS(), Visit, true,
7226 EnableLifetimeWarnings);
Richard Smithafe48f92018-07-23 21:21:22 +00007227 else if (BO->getRHS()->getType()->isPointerType())
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007228 visitLocalsRetainedByInitializer(Path, BO->getRHS(), Visit, true,
7229 EnableLifetimeWarnings);
Richard Smithafe48f92018-07-23 21:21:22 +00007230 break;
7231 }
7232
7233 case Stmt::ConditionalOperatorClass:
7234 case Stmt::BinaryConditionalOperatorClass: {
7235 auto *C = cast<AbstractConditionalOperator>(Init);
7236 // In C++, we can have a throw-expression operand, which has 'void' type
7237 // and isn't interesting from a lifetime perspective.
7238 if (!C->getTrueExpr()->getType()->isVoidType())
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007239 visitLocalsRetainedByInitializer(Path, C->getTrueExpr(), Visit, true,
7240 EnableLifetimeWarnings);
Richard Smithafe48f92018-07-23 21:21:22 +00007241 if (!C->getFalseExpr()->getType()->isVoidType())
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007242 visitLocalsRetainedByInitializer(Path, C->getFalseExpr(), Visit, true,
7243 EnableLifetimeWarnings);
Richard Smithafe48f92018-07-23 21:21:22 +00007244 break;
7245 }
7246
7247 case Stmt::BlockExprClass:
7248 if (cast<BlockExpr>(Init)->getBlockDecl()->hasCaptures()) {
7249 // This is a local block, whose lifetime is that of the function.
7250 Visit(Path, Local(cast<BlockExpr>(Init)), RK_ReferenceBinding);
7251 }
7252 break;
7253
7254 case Stmt::AddrLabelExprClass:
7255 // We want to warn if the address of a label would escape the function.
7256 Visit(Path, Local(cast<AddrLabelExpr>(Init)), RK_ReferenceBinding);
7257 break;
7258
7259 default:
7260 break;
Richard Smithe6c01442013-06-05 00:46:14 +00007261 }
7262}
7263
Richard Smithd87aab92018-07-17 22:24:09 +00007264/// Determine whether this is an indirect path to a temporary that we are
7265/// supposed to lifetime-extend along (but don't).
Richard Smithca975b22018-07-23 18:50:26 +00007266static bool shouldLifetimeExtendThroughPath(const IndirectLocalPath &Path) {
Richard Smithd87aab92018-07-17 22:24:09 +00007267 for (auto Elem : Path) {
Richard Smithf66e4f72018-07-23 22:56:45 +00007268 if (Elem.Kind != IndirectLocalPathEntry::DefaultInit)
Richard Smithd87aab92018-07-17 22:24:09 +00007269 return false;
7270 }
7271 return true;
7272}
7273
Richard Smith6a32c052018-07-23 21:21:24 +00007274/// Find the range for the first interesting entry in the path at or after I.
7275static SourceRange nextPathEntryRange(const IndirectLocalPath &Path, unsigned I,
7276 Expr *E) {
7277 for (unsigned N = Path.size(); I != N; ++I) {
7278 switch (Path[I].Kind) {
7279 case IndirectLocalPathEntry::AddressOf:
7280 case IndirectLocalPathEntry::LValToRVal:
Richard Smithf4e248c2018-08-01 00:33:25 +00007281 case IndirectLocalPathEntry::LifetimeBoundCall:
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007282 case IndirectLocalPathEntry::GslPointerInit:
Richard Smith6a32c052018-07-23 21:21:24 +00007283 // These exist primarily to mark the path as not permitting or
7284 // supporting lifetime extension.
7285 break;
7286
Gabor Horvathfd85c892019-08-09 18:58:09 +00007287 case IndirectLocalPathEntry::VarInit:
Gabor Horvathc6802b22019-08-12 16:19:39 +00007288 if (cast<VarDecl>(Path[I].D)->isImplicit())
7289 return SourceRange();
7290 LLVM_FALLTHROUGH;
7291 case IndirectLocalPathEntry::DefaultInit:
Richard Smith6a32c052018-07-23 21:21:24 +00007292 return Path[I].E->getSourceRange();
7293 }
7294 }
7295 return E->getSourceRange();
7296}
7297
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007298static bool pathOnlyInitializesGslPointer(IndirectLocalPath &Path) {
Gabor Horvath3560ed02019-08-11 08:05:28 +00007299 for (auto It = Path.rbegin(), End = Path.rend(); It != End; ++It) {
7300 if (It->Kind == IndirectLocalPathEntry::VarInit)
7301 continue;
Gabor Horvath6f984002019-09-03 16:17:24 +00007302 if (It->Kind == IndirectLocalPathEntry::AddressOf)
7303 continue;
Gabor Horvath3560ed02019-08-11 08:05:28 +00007304 return It->Kind == IndirectLocalPathEntry::GslPointerInit;
7305 }
7306 return false;
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007307}
7308
Richard Smithd87aab92018-07-17 22:24:09 +00007309void Sema::checkInitializerLifetime(const InitializedEntity &Entity,
7310 Expr *Init) {
Richard Smithca975b22018-07-23 18:50:26 +00007311 LifetimeResult LR = getEntityLifetime(&Entity);
Richard Smithd87aab92018-07-17 22:24:09 +00007312 LifetimeKind LK = LR.getInt();
7313 const InitializedEntity *ExtendingEntity = LR.getPointer();
7314
7315 // If this entity doesn't have an interesting lifetime, don't bother looking
7316 // for temporaries within its initializer.
7317 if (LK == LK_FullExpression)
7318 return;
7319
Richard Smithca975b22018-07-23 18:50:26 +00007320 auto TemporaryVisitor = [&](IndirectLocalPath &Path, Local L,
7321 ReferenceKind RK) -> bool {
Richard Smith6a32c052018-07-23 21:21:24 +00007322 SourceRange DiagRange = nextPathEntryRange(Path, 0, L);
7323 SourceLocation DiagLoc = DiagRange.getBegin();
Richard Smithca975b22018-07-23 18:50:26 +00007324
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007325 auto *MTE = dyn_cast<MaterializeTemporaryExpr>(L);
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007326
Gabor Horvathbfe0c372019-08-14 16:34:56 +00007327 bool IsGslPtrInitWithGslTempOwner = false;
7328 bool IsLocalGslOwner = false;
7329 if (pathOnlyInitializesGslPointer(Path)) {
7330 if (isa<DeclRefExpr>(L)) {
7331 // We do not want to follow the references when returning a pointer originating
7332 // from a local owner to avoid the following false positive:
7333 // int &p = *localUniquePtr;
7334 // someContainer.add(std::move(localUniquePtr));
7335 // return p;
7336 IsLocalGslOwner = isRecordWithAttr<OwnerAttr>(L->getType());
7337 if (pathContainsInit(Path) || !IsLocalGslOwner)
7338 return false;
7339 } else {
7340 IsGslPtrInitWithGslTempOwner = MTE && !MTE->getExtendingDecl() &&
7341 isRecordWithAttr<OwnerAttr>(MTE->getType());
7342 // Skipping a chain of initializing gsl::Pointer annotated objects.
7343 // We are looking only for the final source to find out if it was
7344 // a local or temporary owner or the address of a local variable/param.
7345 if (!IsGslPtrInitWithGslTempOwner)
7346 return true;
7347 }
7348 }
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007349
Richard Smithd87aab92018-07-17 22:24:09 +00007350 switch (LK) {
7351 case LK_FullExpression:
7352 llvm_unreachable("already handled this");
7353
Richard Smithafe48f92018-07-23 21:21:22 +00007354 case LK_Extended: {
Richard Smith0e3102d2018-07-24 00:55:08 +00007355 if (!MTE) {
7356 // The initialized entity has lifetime beyond the full-expression,
7357 // and the local entity does too, so don't warn.
7358 //
7359 // FIXME: We should consider warning if a static / thread storage
7360 // duration variable retains an automatic storage duration local.
Richard Smithafe48f92018-07-23 21:21:22 +00007361 return false;
Richard Smith0e3102d2018-07-24 00:55:08 +00007362 }
Richard Smithafe48f92018-07-23 21:21:22 +00007363
Gabor Horvathc6802b22019-08-12 16:19:39 +00007364 if (IsGslPtrInitWithGslTempOwner && DiagLoc.isValid()) {
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007365 Diag(DiagLoc, diag::warn_dangling_lifetime_pointer) << DiagRange;
7366 return false;
7367 }
7368
Richard Smithd87aab92018-07-17 22:24:09 +00007369 // Lifetime-extend the temporary.
7370 if (Path.empty()) {
7371 // Update the storage duration of the materialized temporary.
7372 // FIXME: Rebuild the expression instead of mutating it.
7373 MTE->setExtendingDecl(ExtendingEntity->getDecl(),
7374 ExtendingEntity->allocateManglingNumber());
7375 // Also visit the temporaries lifetime-extended by this initializer.
7376 return true;
7377 }
7378
7379 if (shouldLifetimeExtendThroughPath(Path)) {
7380 // We're supposed to lifetime-extend the temporary along this path (per
7381 // the resolution of DR1815), but we don't support that yet.
7382 //
Richard Smith0e3102d2018-07-24 00:55:08 +00007383 // FIXME: Properly handle this situation. Perhaps the easiest approach
Richard Smithd87aab92018-07-17 22:24:09 +00007384 // would be to clone the initializer expression on each use that would
7385 // lifetime extend its temporaries.
Richard Smith0e3102d2018-07-24 00:55:08 +00007386 Diag(DiagLoc, diag::warn_unsupported_lifetime_extension)
7387 << RK << DiagRange;
Richard Smithd87aab92018-07-17 22:24:09 +00007388 } else {
Richard Smith0e3102d2018-07-24 00:55:08 +00007389 // If the path goes through the initialization of a variable or field,
7390 // it can't possibly reach a temporary created in this full-expression.
7391 // We will have already diagnosed any problems with the initializer.
7392 if (pathContainsInit(Path))
7393 return false;
7394
7395 Diag(DiagLoc, diag::warn_dangling_variable)
Richard Smithad5bbcc2018-08-01 01:03:33 +00007396 << RK << !Entity.getParent()
7397 << ExtendingEntity->getDecl()->isImplicit()
7398 << ExtendingEntity->getDecl() << Init->isGLValue() << DiagRange;
Richard Smithd87aab92018-07-17 22:24:09 +00007399 }
7400 break;
Richard Smithafe48f92018-07-23 21:21:22 +00007401 }
Richard Smithd87aab92018-07-17 22:24:09 +00007402
Richard Smithafe48f92018-07-23 21:21:22 +00007403 case LK_MemInitializer: {
George Burgess IV06df2292018-07-24 02:10:53 +00007404 if (isa<MaterializeTemporaryExpr>(L)) {
Richard Smithafe48f92018-07-23 21:21:22 +00007405 // Under C++ DR1696, if a mem-initializer (or a default member
7406 // initializer used by the absence of one) would lifetime-extend a
7407 // temporary, the program is ill-formed.
7408 if (auto *ExtendingDecl =
7409 ExtendingEntity ? ExtendingEntity->getDecl() : nullptr) {
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007410 if (IsGslPtrInitWithGslTempOwner) {
7411 Diag(DiagLoc, diag::warn_dangling_lifetime_pointer_member)
7412 << ExtendingDecl << DiagRange;
7413 Diag(ExtendingDecl->getLocation(),
7414 diag::note_ref_or_ptr_member_declared_here)
7415 << true;
7416 return false;
7417 }
Richard Smithafe48f92018-07-23 21:21:22 +00007418 bool IsSubobjectMember = ExtendingEntity != &Entity;
Richard Smith0e3102d2018-07-24 00:55:08 +00007419 Diag(DiagLoc, shouldLifetimeExtendThroughPath(Path)
7420 ? diag::err_dangling_member
7421 : diag::warn_dangling_member)
Richard Smithafe48f92018-07-23 21:21:22 +00007422 << ExtendingDecl << IsSubobjectMember << RK << DiagRange;
7423 // Don't bother adding a note pointing to the field if we're inside
7424 // its default member initializer; our primary diagnostic points to
7425 // the same place in that case.
7426 if (Path.empty() ||
7427 Path.back().Kind != IndirectLocalPathEntry::DefaultInit) {
7428 Diag(ExtendingDecl->getLocation(),
7429 diag::note_lifetime_extending_member_declared_here)
7430 << RK << IsSubobjectMember;
7431 }
7432 } else {
7433 // We have a mem-initializer but no particular field within it; this
7434 // is either a base class or a delegating initializer directly
7435 // initializing the base-class from something that doesn't live long
7436 // enough.
7437 //
7438 // FIXME: Warn on this.
7439 return false;
Richard Smithd87aab92018-07-17 22:24:09 +00007440 }
7441 } else {
Richard Smithafe48f92018-07-23 21:21:22 +00007442 // Paths via a default initializer can only occur during error recovery
7443 // (there's no other way that a default initializer can refer to a
7444 // local). Don't produce a bogus warning on those cases.
Richard Smith0e3102d2018-07-24 00:55:08 +00007445 if (pathContainsInit(Path))
Richard Smithafe48f92018-07-23 21:21:22 +00007446 return false;
7447
Gabor Horvath3560ed02019-08-11 08:05:28 +00007448 // Suppress false positives for code like the one below:
Gabor Horvatheb563af2019-08-10 00:32:29 +00007449 // Ctor(unique_ptr<T> up) : member(*up), member2(move(up)) {}
7450 if (IsLocalGslOwner && pathOnlyInitializesGslPointer(Path))
7451 return false;
7452
Richard Smithafe48f92018-07-23 21:21:22 +00007453 auto *DRE = dyn_cast<DeclRefExpr>(L);
7454 auto *VD = DRE ? dyn_cast<VarDecl>(DRE->getDecl()) : nullptr;
7455 if (!VD) {
7456 // A member was initialized to a local block.
7457 // FIXME: Warn on this.
7458 return false;
7459 }
7460
7461 if (auto *Member =
7462 ExtendingEntity ? ExtendingEntity->getDecl() : nullptr) {
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007463 bool IsPointer = !Member->getType()->isReferenceType();
Richard Smithafe48f92018-07-23 21:21:22 +00007464 Diag(DiagLoc, IsPointer ? diag::warn_init_ptr_member_to_parameter_addr
7465 : diag::warn_bind_ref_member_to_parameter)
7466 << Member << VD << isa<ParmVarDecl>(VD) << DiagRange;
7467 Diag(Member->getLocation(),
7468 diag::note_ref_or_ptr_member_declared_here)
7469 << (unsigned)IsPointer;
7470 }
Richard Smithd87aab92018-07-17 22:24:09 +00007471 }
7472 break;
Richard Smithafe48f92018-07-23 21:21:22 +00007473 }
Richard Smithd87aab92018-07-17 22:24:09 +00007474
7475 case LK_New:
George Burgess IV06df2292018-07-24 02:10:53 +00007476 if (isa<MaterializeTemporaryExpr>(L)) {
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007477 if (IsGslPtrInitWithGslTempOwner)
7478 Diag(DiagLoc, diag::warn_dangling_lifetime_pointer) << DiagRange;
7479 else
7480 Diag(DiagLoc, RK == RK_ReferenceBinding
7481 ? diag::warn_new_dangling_reference
7482 : diag::warn_new_dangling_initializer_list)
7483 << !Entity.getParent() << DiagRange;
Richard Smithd87aab92018-07-17 22:24:09 +00007484 } else {
Richard Smithafe48f92018-07-23 21:21:22 +00007485 // We can't determine if the allocation outlives the local declaration.
7486 return false;
Richard Smithd87aab92018-07-17 22:24:09 +00007487 }
7488 break;
7489
7490 case LK_Return:
Richard Smith67af95b2018-07-23 19:19:08 +00007491 case LK_StmtExprResult:
Richard Smithafe48f92018-07-23 21:21:22 +00007492 if (auto *DRE = dyn_cast<DeclRefExpr>(L)) {
7493 // We can't determine if the local variable outlives the statement
7494 // expression.
7495 if (LK == LK_StmtExprResult)
7496 return false;
7497 Diag(DiagLoc, diag::warn_ret_stack_addr_ref)
7498 << Entity.getType()->isReferenceType() << DRE->getDecl()
7499 << isa<ParmVarDecl>(DRE->getDecl()) << DiagRange;
7500 } else if (isa<BlockExpr>(L)) {
7501 Diag(DiagLoc, diag::err_ret_local_block) << DiagRange;
7502 } else if (isa<AddrLabelExpr>(L)) {
Reid Kleckner4c33d192018-08-17 22:11:31 +00007503 // Don't warn when returning a label from a statement expression.
7504 // Leaving the scope doesn't end its lifetime.
7505 if (LK == LK_StmtExprResult)
7506 return false;
Richard Smithafe48f92018-07-23 21:21:22 +00007507 Diag(DiagLoc, diag::warn_ret_addr_label) << DiagRange;
7508 } else {
7509 Diag(DiagLoc, diag::warn_ret_local_temp_addr_ref)
7510 << Entity.getType()->isReferenceType() << DiagRange;
7511 }
7512 break;
Florian Hahn0aa117d2018-07-17 09:23:31 +00007513 }
7514
Richard Smithafe48f92018-07-23 21:21:22 +00007515 for (unsigned I = 0; I != Path.size(); ++I) {
7516 auto Elem = Path[I];
7517
Richard Smithca975b22018-07-23 18:50:26 +00007518 switch (Elem.Kind) {
Richard Smithafe48f92018-07-23 21:21:22 +00007519 case IndirectLocalPathEntry::AddressOf:
7520 case IndirectLocalPathEntry::LValToRVal:
Richard Smith6a32c052018-07-23 21:21:24 +00007521 // These exist primarily to mark the path as not permitting or
7522 // supporting lifetime extension.
Richard Smithca975b22018-07-23 18:50:26 +00007523 break;
7524
Richard Smithf4e248c2018-08-01 00:33:25 +00007525 case IndirectLocalPathEntry::LifetimeBoundCall:
Gabor Horvathe5e10b52019-08-06 19:13:29 +00007526 case IndirectLocalPathEntry::GslPointerInit:
7527 // FIXME: Consider adding a note for these.
Richard Smithf4e248c2018-08-01 00:33:25 +00007528 break;
7529
Richard Smithafe48f92018-07-23 21:21:22 +00007530 case IndirectLocalPathEntry::DefaultInit: {
7531 auto *FD = cast<FieldDecl>(Elem.D);
7532 Diag(FD->getLocation(), diag::note_init_with_default_member_initalizer)
Richard Smith6a32c052018-07-23 21:21:24 +00007533 << FD << nextPathEntryRange(Path, I + 1, L);
Richard Smithafe48f92018-07-23 21:21:22 +00007534 break;
7535 }
7536
7537 case IndirectLocalPathEntry::VarInit:
7538 const VarDecl *VD = cast<VarDecl>(Elem.D);
7539 Diag(VD->getLocation(), diag::note_local_var_initializer)
Richard Smithad5bbcc2018-08-01 01:03:33 +00007540 << VD->getType()->isReferenceType()
7541 << VD->isImplicit() << VD->getDeclName()
Richard Smith6a32c052018-07-23 21:21:24 +00007542 << nextPathEntryRange(Path, I + 1, L);
Richard Smithca975b22018-07-23 18:50:26 +00007543 break;
Florian Hahn0aa117d2018-07-17 09:23:31 +00007544 }
7545 }
Richard Smithd87aab92018-07-17 22:24:09 +00007546
7547 // We didn't lifetime-extend, so don't go any further; we don't need more
7548 // warnings or errors on inner temporaries within this one's initializer.
7549 return false;
7550 };
7551
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007552 bool EnableLifetimeWarnings = !getDiagnostics().isIgnored(
7553 diag::warn_dangling_lifetime_pointer, SourceLocation());
Richard Smithca975b22018-07-23 18:50:26 +00007554 llvm::SmallVector<IndirectLocalPathEntry, 8> Path;
Richard Smithd87aab92018-07-17 22:24:09 +00007555 if (Init->isGLValue())
Richard Smithca975b22018-07-23 18:50:26 +00007556 visitLocalsRetainedByReferenceBinding(Path, Init, RK_ReferenceBinding,
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007557 TemporaryVisitor,
7558 EnableLifetimeWarnings);
Richard Smithd87aab92018-07-17 22:24:09 +00007559 else
Gabor Horvath6379e5c2019-08-23 22:21:33 +00007560 visitLocalsRetainedByInitializer(Path, Init, TemporaryVisitor, false,
7561 EnableLifetimeWarnings);
Richard Smithcc1b96d2013-06-12 22:31:48 +00007562}
7563
Richard Smithaaa0ec42013-09-21 21:19:19 +00007564static void DiagnoseNarrowingInInitList(Sema &S,
7565 const ImplicitConversionSequence &ICS,
7566 QualType PreNarrowingType,
7567 QualType EntityType,
7568 const Expr *PostInit);
7569
Richard Trieuac3eca52015-04-29 01:52:17 +00007570/// Provide warnings when std::move is used on construction.
7571static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr,
7572 bool IsReturnStmt) {
7573 if (!InitExpr)
7574 return;
7575
Richard Smith51ec0cf2017-02-21 01:17:38 +00007576 if (S.inTemplateInstantiation())
Richard Trieu6093d142015-07-29 17:03:34 +00007577 return;
7578
Richard Trieuac3eca52015-04-29 01:52:17 +00007579 QualType DestType = InitExpr->getType();
7580 if (!DestType->isRecordType())
7581 return;
7582
Richard Trieu155b8d02019-08-08 00:12:51 +00007583 const CXXConstructExpr *CCE =
7584 dyn_cast<CXXConstructExpr>(InitExpr->IgnoreParens());
7585 if (!CCE || CCE->getNumArgs() != 1)
7586 return;
Richard Trieuac3eca52015-04-29 01:52:17 +00007587
Richard Trieu155b8d02019-08-08 00:12:51 +00007588 if (!CCE->getConstructor()->isCopyOrMoveConstructor())
7589 return;
Richard Trieuac3eca52015-04-29 01:52:17 +00007590
Richard Trieu155b8d02019-08-08 00:12:51 +00007591 InitExpr = CCE->getArg(0)->IgnoreImpCasts();
Richard Trieuac3eca52015-04-29 01:52:17 +00007592
7593 // Find the std::move call and get the argument.
7594 const CallExpr *CE = dyn_cast<CallExpr>(InitExpr->IgnoreParens());
Nico Weber192184c2018-06-20 15:57:38 +00007595 if (!CE || !CE->isCallToStdMove())
Richard Trieuac3eca52015-04-29 01:52:17 +00007596 return;
7597
Richard Trieu155b8d02019-08-08 00:12:51 +00007598 const Expr *Arg = CE->getArg(0);
Richard Trieuac3eca52015-04-29 01:52:17 +00007599
Richard Trieu155b8d02019-08-08 00:12:51 +00007600 unsigned DiagID = 0;
7601
7602 if (!IsReturnStmt && !isa<MaterializeTemporaryExpr>(Arg))
7603 return;
7604
7605 if (isa<MaterializeTemporaryExpr>(Arg)) {
7606 DiagID = diag::warn_pessimizing_move_on_initialization;
7607 const Expr *ArgStripped = Arg->IgnoreImplicit()->IgnoreParens();
7608 if (!ArgStripped->isRValue() || !ArgStripped->getType()->isRecordType())
7609 return;
7610 } else { // IsReturnStmt
Richard Trieuac3eca52015-04-29 01:52:17 +00007611 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts());
7612 if (!DRE || DRE->refersToEnclosingVariableOrCapture())
7613 return;
7614
7615 const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl());
7616 if (!VD || !VD->hasLocalStorage())
7617 return;
7618
Alex Lorenzbbe51d82017-11-07 21:40:11 +00007619 // __block variables are not moved implicitly.
7620 if (VD->hasAttr<BlocksAttr>())
7621 return;
7622
Richard Trieu8d4006a2015-07-28 19:06:16 +00007623 QualType SourceType = VD->getType();
7624 if (!SourceType->isRecordType())
Richard Trieu1d4911bc2015-05-18 19:54:08 +00007625 return;
7626
Richard Trieu8d4006a2015-07-28 19:06:16 +00007627 if (!S.Context.hasSameUnqualifiedType(DestType, SourceType)) {
Richard Trieu1993dc82015-07-29 23:47:19 +00007628 return;
Richard Trieu8d4006a2015-07-28 19:06:16 +00007629 }
7630
Davide Italiano7842c3f2015-07-18 01:15:19 +00007631 // If we're returning a function parameter, copy elision
7632 // is not possible.
7633 if (isa<ParmVarDecl>(VD))
7634 DiagID = diag::warn_redundant_move_on_return;
Richard Trieu1993dc82015-07-29 23:47:19 +00007635 else
7636 DiagID = diag::warn_pessimizing_move_on_return;
Richard Trieuac3eca52015-04-29 01:52:17 +00007637 }
7638
Stephen Kellyf2ceec42018-08-09 21:08:08 +00007639 S.Diag(CE->getBeginLoc(), DiagID);
Richard Trieuac3eca52015-04-29 01:52:17 +00007640
7641 // Get all the locations for a fix-it. Don't emit the fix-it if any location
7642 // is within a macro.
Richard Trieu155b8d02019-08-08 00:12:51 +00007643 SourceLocation BeginLoc = CCE->getBeginLoc();
7644 if (BeginLoc.isMacroID())
Richard Trieuac3eca52015-04-29 01:52:17 +00007645 return;
7646 SourceLocation RParen = CE->getRParenLoc();
7647 if (RParen.isMacroID())
7648 return;
Stephen Kellyf2ceec42018-08-09 21:08:08 +00007649 SourceLocation ArgLoc = Arg->getBeginLoc();
Richard Trieuac3eca52015-04-29 01:52:17 +00007650
7651 // Special testing for the argument location. Since the fix-it needs the
7652 // location right before the argument, the argument location can be in a
7653 // macro only if it is at the beginning of the macro.
7654 while (ArgLoc.isMacroID() &&
7655 S.getSourceManager().isAtStartOfImmediateMacroExpansion(ArgLoc)) {
Richard Smithb5f81712018-04-30 05:25:48 +00007656 ArgLoc = S.getSourceManager().getImmediateExpansionRange(ArgLoc).getBegin();
Richard Trieuac3eca52015-04-29 01:52:17 +00007657 }
7658
Richard Trieu155b8d02019-08-08 00:12:51 +00007659 SourceLocation LParen = ArgLoc.getLocWithOffset(-1);
Richard Trieuac3eca52015-04-29 01:52:17 +00007660 if (LParen.isMacroID())
7661 return;
Richard Trieu155b8d02019-08-08 00:12:51 +00007662 SourceLocation EndLoc = CCE->getEndLoc();
7663 if (EndLoc.isMacroID())
7664 return;
Richard Trieuac3eca52015-04-29 01:52:17 +00007665
Stephen Kellyf2ceec42018-08-09 21:08:08 +00007666 S.Diag(CE->getBeginLoc(), diag::note_remove_move)
Richard Trieu155b8d02019-08-08 00:12:51 +00007667 << FixItHint::CreateRemoval(SourceRange(BeginLoc, LParen))
7668 << FixItHint::CreateRemoval(SourceRange(RParen, EndLoc));
Richard Trieuac3eca52015-04-29 01:52:17 +00007669}
7670
Nick Lewycky2eeddfb2016-05-14 17:44:14 +00007671static void CheckForNullPointerDereference(Sema &S, const Expr *E) {
7672 // Check to see if we are dereferencing a null pointer. If so, this is
7673 // undefined behavior, so warn about it. This only handles the pattern
7674 // "*null", which is a very syntactic check.
7675 if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E->IgnoreParenCasts()))
7676 if (UO->getOpcode() == UO_Deref &&
7677 UO->getSubExpr()->IgnoreParenCasts()->
7678 isNullPointerConstant(S.Context, Expr::NPC_ValueDependentIsNotNull)) {
7679 S.DiagRuntimeBehavior(UO->getOperatorLoc(), UO,
7680 S.PDiag(diag::warn_binding_null_to_reference)
7681 << UO->getSubExpr()->getSourceRange());
7682 }
7683}
7684
Tim Shen4a05bb82016-06-21 20:29:17 +00007685MaterializeTemporaryExpr *
7686Sema::CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary,
7687 bool BoundToLvalueReference) {
7688 auto MTE = new (Context)
7689 MaterializeTemporaryExpr(T, Temporary, BoundToLvalueReference);
7690
7691 // Order an ExprWithCleanups for lifetime marks.
7692 //
7693 // TODO: It'll be good to have a single place to check the access of the
7694 // destructor and generate ExprWithCleanups for various uses. Currently these
7695 // are done in both CreateMaterializeTemporaryExpr and MaybeBindToTemporary,
7696 // but there may be a chance to merge them.
7697 Cleanup.setExprNeedsCleanups(false);
7698 return MTE;
7699}
7700
Richard Smith4baaa5a2016-12-03 01:14:32 +00007701ExprResult Sema::TemporaryMaterializationConversion(Expr *E) {
7702 // In C++98, we don't want to implicitly create an xvalue.
7703 // FIXME: This means that AST consumers need to deal with "prvalues" that
7704 // denote materialized temporaries. Maybe we should add another ValueKind
7705 // for "xvalue pretending to be a prvalue" for C++98 support.
7706 if (!E->isRValue() || !getLangOpts().CPlusPlus11)
7707 return E;
7708
7709 // C++1z [conv.rval]/1: T shall be a complete type.
Richard Smith81f5ade2016-12-15 02:28:18 +00007710 // FIXME: Does this ever matter (can we form a prvalue of incomplete type)?
7711 // If so, we should check for a non-abstract class type here too.
Richard Smith4baaa5a2016-12-03 01:14:32 +00007712 QualType T = E->getType();
7713 if (RequireCompleteType(E->getExprLoc(), T, diag::err_incomplete_type))
7714 return ExprError();
7715
7716 return CreateMaterializeTemporaryExpr(E->getType(), E, false);
7717}
7718
Anastasia Stulova04307942018-11-16 16:22:56 +00007719ExprResult Sema::PerformQualificationConversion(Expr *E, QualType Ty,
7720 ExprValueKind VK,
7721 CheckedConversionKind CCK) {
Anastasia Stulova094c7262019-04-04 10:48:36 +00007722
7723 CastKind CK = CK_NoOp;
7724
7725 if (VK == VK_RValue) {
7726 auto PointeeTy = Ty->getPointeeType();
7727 auto ExprPointeeTy = E->getType()->getPointeeType();
7728 if (!PointeeTy.isNull() &&
7729 PointeeTy.getAddressSpace() != ExprPointeeTy.getAddressSpace())
7730 CK = CK_AddressSpaceConversion;
7731 } else if (Ty.getAddressSpace() != E->getType().getAddressSpace()) {
7732 CK = CK_AddressSpaceConversion;
7733 }
7734
Anastasia Stulova04307942018-11-16 16:22:56 +00007735 return ImpCastExprToType(E, Ty, CK, VK, /*BasePath=*/nullptr, CCK);
7736}
7737
7738ExprResult InitializationSequence::Perform(Sema &S,
7739 const InitializedEntity &Entity,
7740 const InitializationKind &Kind,
7741 MultiExprArg Args,
7742 QualType *ResultType) {
Sebastian Redl724bfe12011-06-05 13:59:05 +00007743 if (Failed()) {
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00007744 Diagnose(S, Entity, Kind, Args);
John McCallfaf5fb42010-08-26 23:41:50 +00007745 return ExprError();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007746 }
Nico Weber337d5aa2015-04-17 08:32:38 +00007747 if (!ZeroInitializationFixit.empty()) {
7748 unsigned DiagID = diag::err_default_init_const;
7749 if (Decl *D = Entity.getDecl())
7750 if (S.getLangOpts().MSVCCompat && D->hasAttr<SelectAnyAttr>())
7751 DiagID = diag::ext_default_init_const;
7752
7753 // The initialization would have succeeded with this fixit. Since the fixit
7754 // is on the error, we need to build a valid AST in this case, so this isn't
7755 // handled in the Failed() branch above.
7756 QualType DestType = Entity.getType();
7757 S.Diag(Kind.getLocation(), DiagID)
7758 << DestType << (bool)DestType->getAs<RecordType>()
7759 << FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
7760 ZeroInitializationFixit);
7761 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007762
Sebastian Redld201edf2011-06-05 13:59:11 +00007763 if (getKind() == DependentSequence) {
Douglas Gregor51e77d52009-12-10 17:56:55 +00007764 // If the declaration is a non-dependent, incomplete array type
7765 // that has an initializer, then its type will be completed once
7766 // the initializer is instantiated.
Douglas Gregor1b303932009-12-22 15:35:07 +00007767 if (ResultType && !Entity.getType()->isDependentType() &&
Douglas Gregor51e77d52009-12-10 17:56:55 +00007768 Args.size() == 1) {
Douglas Gregor1b303932009-12-22 15:35:07 +00007769 QualType DeclType = Entity.getType();
Douglas Gregor51e77d52009-12-10 17:56:55 +00007770 if (const IncompleteArrayType *ArrayT
7771 = S.Context.getAsIncompleteArrayType(DeclType)) {
7772 // FIXME: We don't currently have the ability to accurately
7773 // compute the length of an initializer list without
7774 // performing full type-checking of the initializer list
7775 // (since we have to determine where braces are implicitly
7776 // introduced and such). So, we fall back to making the array
7777 // type a dependently-sized array type with no specified
7778 // bound.
Benjamin Kramer62b95d82012-08-23 21:35:17 +00007779 if (isa<InitListExpr>((Expr *)Args[0])) {
Douglas Gregor51e77d52009-12-10 17:56:55 +00007780 SourceRange Brackets;
Douglas Gregor1b303932009-12-22 15:35:07 +00007781
Douglas Gregor51e77d52009-12-10 17:56:55 +00007782 // Scavange the location of the brackets from the entity, if we can.
Richard Smith7873de02016-08-11 22:25:46 +00007783 if (auto *DD = dyn_cast_or_null<DeclaratorDecl>(Entity.getDecl())) {
Douglas Gregor1b303932009-12-22 15:35:07 +00007784 if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) {
7785 TypeLoc TL = TInfo->getTypeLoc();
David Blaikie6adc78e2013-02-18 22:06:02 +00007786 if (IncompleteArrayTypeLoc ArrayLoc =
7787 TL.getAs<IncompleteArrayTypeLoc>())
7788 Brackets = ArrayLoc.getBracketsRange();
Douglas Gregor1b303932009-12-22 15:35:07 +00007789 }
Douglas Gregor51e77d52009-12-10 17:56:55 +00007790 }
7791
7792 *ResultType
7793 = S.Context.getDependentSizedArrayType(ArrayT->getElementType(),
Craig Topperc3ec1492014-05-26 06:22:03 +00007794 /*NumElts=*/nullptr,
Douglas Gregor51e77d52009-12-10 17:56:55 +00007795 ArrayT->getSizeModifier(),
7796 ArrayT->getIndexTypeCVRQualifiers(),
7797 Brackets);
7798 }
7799
7800 }
7801 }
Sebastian Redla9351792012-02-11 23:51:47 +00007802 if (Kind.getKind() == InitializationKind::IK_Direct &&
7803 !Kind.isExplicitCast()) {
7804 // Rebuild the ParenListExpr.
Vedant Kumara14a1f92018-01-17 18:53:51 +00007805 SourceRange ParenRange = Kind.getParenOrBraceRange();
Sebastian Redla9351792012-02-11 23:51:47 +00007806 return S.ActOnParenListExpr(ParenRange.getBegin(), ParenRange.getEnd(),
Benjamin Kramer62b95d82012-08-23 21:35:17 +00007807 Args);
Sebastian Redla9351792012-02-11 23:51:47 +00007808 }
Manuel Klimekf2b4b692011-06-22 20:02:16 +00007809 assert(Kind.getKind() == InitializationKind::IK_Copy ||
Fangrui Song6907ce22018-07-30 19:24:48 +00007810 Kind.isExplicitCast() ||
Douglas Gregorbf138952012-04-04 04:06:51 +00007811 Kind.getKind() == InitializationKind::IK_DirectList);
Benjamin Kramer62b95d82012-08-23 21:35:17 +00007812 return ExprResult(Args[0]);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007813 }
7814
Sebastian Redld201edf2011-06-05 13:59:11 +00007815 // No steps means no initialization.
7816 if (Steps.empty())
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00007817 return ExprResult((Expr *)nullptr);
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007818
Richard Smith2bf7fdb2013-01-02 11:42:31 +00007819 if (S.getLangOpts().CPlusPlus11 && Entity.getType()->isReferenceType() &&
Benjamin Kramer62b95d82012-08-23 21:35:17 +00007820 Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
Fariborz Jahanian131996b2013-07-31 18:21:45 +00007821 !Entity.isParameterKind()) {
Richard Smith2b349ae2012-04-19 06:58:00 +00007822 // Produce a C++98 compatibility warning if we are initializing a reference
7823 // from an initializer list. For parameters, we produce a better warning
7824 // elsewhere.
Benjamin Kramer62b95d82012-08-23 21:35:17 +00007825 Expr *Init = Args[0];
Stephen Kellyf2ceec42018-08-09 21:08:08 +00007826 S.Diag(Init->getBeginLoc(), diag::warn_cxx98_compat_reference_list_init)
7827 << Init->getSourceRange();
Richard Smith2b349ae2012-04-19 06:58:00 +00007828 }
7829
Egor Churaev3bccec52017-04-05 12:47:10 +00007830 // OpenCL v2.0 s6.13.11.1. atomic variables can be initialized in global scope
7831 QualType ETy = Entity.getType();
7832 Qualifiers TyQualifiers = ETy.getQualifiers();
7833 bool HasGlobalAS = TyQualifiers.hasAddressSpace() &&
7834 TyQualifiers.getAddressSpace() == LangAS::opencl_global;
7835
7836 if (S.getLangOpts().OpenCLVersion >= 200 &&
7837 ETy->isAtomicType() && !HasGlobalAS &&
7838 Entity.getKind() == InitializedEntity::EK_Variable && Args.size() > 0) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00007839 S.Diag(Args[0]->getBeginLoc(), diag::err_opencl_atomic_init)
7840 << 1
Stephen Kelly1c301dc2018-08-09 21:09:38 +00007841 << SourceRange(Entity.getDecl()->getBeginLoc(), Args[0]->getEndLoc());
Egor Churaev3bccec52017-04-05 12:47:10 +00007842 return ExprError();
7843 }
7844
Douglas Gregor1b303932009-12-22 15:35:07 +00007845 QualType DestType = Entity.getType().getNonReferenceType();
7846 // FIXME: Ugly hack around the fact that Entity.getType() is not
Eli Friedman463e5232009-12-22 02:10:53 +00007847 // the same as Entity.getDecl()->getType() in cases involving type merging,
7848 // and we want latter when it makes sense.
Douglas Gregor51e77d52009-12-10 17:56:55 +00007849 if (ResultType)
Eli Friedman463e5232009-12-22 02:10:53 +00007850 *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() :
Douglas Gregor1b303932009-12-22 15:35:07 +00007851 Entity.getType();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007852
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00007853 ExprResult CurInit((Expr *)nullptr);
Richard Smith410306b2016-12-12 02:53:20 +00007854 SmallVector<Expr*, 4> ArrayLoopCommonExprs;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007855
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007856 // For initialization steps that start with a single initializer,
Douglas Gregor85dabae2009-12-16 01:38:02 +00007857 // grab the only argument out the Args and place it into the "current"
7858 // initializer.
7859 switch (Steps.front().Kind) {
Douglas Gregore1314a62009-12-18 05:02:21 +00007860 case SK_ResolveAddressOfOverloadedFunction:
7861 case SK_CastDerivedToBaseRValue:
Sebastian Redlc57d34b2010-07-20 04:20:21 +00007862 case SK_CastDerivedToBaseXValue:
Douglas Gregore1314a62009-12-18 05:02:21 +00007863 case SK_CastDerivedToBaseLValue:
7864 case SK_BindReference:
7865 case SK_BindReferenceToTemporary:
Richard Smithb8c0f552016-12-09 18:49:13 +00007866 case SK_FinalCopy:
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00007867 case SK_ExtraneousCopyToTemporary:
Douglas Gregore1314a62009-12-18 05:02:21 +00007868 case SK_UserConversion:
7869 case SK_QualificationConversionLValue:
Sebastian Redlc57d34b2010-07-20 04:20:21 +00007870 case SK_QualificationConversionXValue:
Douglas Gregore1314a62009-12-18 05:02:21 +00007871 case SK_QualificationConversionRValue:
Richard Smith77be48a2014-07-31 06:31:19 +00007872 case SK_AtomicConversion:
Douglas Gregore1314a62009-12-18 05:02:21 +00007873 case SK_ConversionSequence:
Richard Smithaaa0ec42013-09-21 21:19:19 +00007874 case SK_ConversionSequenceNoNarrowing:
Douglas Gregore1314a62009-12-18 05:02:21 +00007875 case SK_ListInitialization:
Sebastian Redl29526f02011-11-27 16:50:07 +00007876 case SK_UnwrapInitList:
7877 case SK_RewrapInitList:
Douglas Gregore1314a62009-12-18 05:02:21 +00007878 case SK_CAssignment:
Eli Friedman78275202009-12-19 08:11:05 +00007879 case SK_StringInit:
Douglas Gregore2f943b2011-02-22 18:29:51 +00007880 case SK_ObjCObjectConversion:
Richard Smith410306b2016-12-12 02:53:20 +00007881 case SK_ArrayLoopIndex:
7882 case SK_ArrayLoopInit:
John McCall31168b02011-06-15 23:02:42 +00007883 case SK_ArrayInit:
Richard Smith378b8c82016-12-14 03:22:16 +00007884 case SK_GNUArrayInit:
Richard Smithebeed412012-02-15 22:38:09 +00007885 case SK_ParenthesizedArrayInit:
John McCall31168b02011-06-15 23:02:42 +00007886 case SK_PassByIndirectCopyRestore:
7887 case SK_PassByIndirectRestore:
Sebastian Redlc1839b12012-01-17 22:49:42 +00007888 case SK_ProduceObjCObject:
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00007889 case SK_StdInitializerList:
Guy Benyei61054192013-02-07 10:55:47 +00007890 case SK_OCLSamplerInit:
Andrew Savonichevb555b762018-10-23 15:19:20 +00007891 case SK_OCLZeroOpaqueType: {
Douglas Gregore1314a62009-12-18 05:02:21 +00007892 assert(Args.size() == 1);
Benjamin Kramer62b95d82012-08-23 21:35:17 +00007893 CurInit = Args[0];
John Wiegley01296292011-04-08 18:41:53 +00007894 if (!CurInit.get()) return ExprError();
Douglas Gregore1314a62009-12-18 05:02:21 +00007895 break;
John McCall34376a62010-12-04 03:47:34 +00007896 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007897
Douglas Gregore1314a62009-12-18 05:02:21 +00007898 case SK_ConstructorInitialization:
Richard Smith53324112014-07-16 21:33:43 +00007899 case SK_ConstructorInitializationFromList:
Richard Smithf8adcdc2014-07-17 05:12:35 +00007900 case SK_StdInitializerListConstructorCall:
Douglas Gregore1314a62009-12-18 05:02:21 +00007901 case SK_ZeroInitialization:
7902 break;
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007903 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007904
Richard Smithd6a15082017-01-07 00:48:55 +00007905 // Promote from an unevaluated context to an unevaluated list context in
7906 // C++11 list-initialization; we need to instantiate entities usable in
7907 // constant expressions here in order to perform narrowing checks =(
7908 EnterExpressionEvaluationContext Evaluated(
7909 S, EnterExpressionEvaluationContext::InitList,
7910 CurInit.get() && isa<InitListExpr>(CurInit.get()));
7911
Richard Smith81f5ade2016-12-15 02:28:18 +00007912 // C++ [class.abstract]p2:
7913 // no objects of an abstract class can be created except as subobjects
7914 // of a class derived from it
7915 auto checkAbstractType = [&](QualType T) -> bool {
7916 if (Entity.getKind() == InitializedEntity::EK_Base ||
7917 Entity.getKind() == InitializedEntity::EK_Delegating)
7918 return false;
7919 return S.RequireNonAbstractType(Kind.getLocation(), T,
7920 diag::err_allocation_of_abstract_type);
7921 };
7922
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007923 // Walk through the computed steps for the initialization sequence,
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007924 // performing the specified conversions along the way.
Douglas Gregor4f4b1862009-12-16 18:50:27 +00007925 bool ConstructorInitRequiresZeroInit = false;
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007926 for (step_iterator Step = step_begin(), StepEnd = step_end();
7927 Step != StepEnd; ++Step) {
7928 if (CurInit.isInvalid())
John McCallfaf5fb42010-08-26 23:41:50 +00007929 return ExprError();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007930
John Wiegley01296292011-04-08 18:41:53 +00007931 QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007932
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007933 switch (Step->Kind) {
7934 case SK_ResolveAddressOfOverloadedFunction:
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007935 // Overload resolution determined which function invoke; update the
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007936 // initializer to reflect that choice.
John Wiegley01296292011-04-08 18:41:53 +00007937 S.CheckAddressOfMemberAccess(CurInit.get(), Step->Function.FoundDecl);
Richard Smith22262ab2013-05-04 06:44:46 +00007938 if (S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()))
7939 return ExprError();
Benjamin Kramer62b95d82012-08-23 21:35:17 +00007940 CurInit = S.FixOverloadedFunctionReference(CurInit,
John McCall16df1e52010-03-30 21:47:33 +00007941 Step->Function.FoundDecl,
John McCalla0296f72010-03-19 07:35:19 +00007942 Step->Function.Function);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007943 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007944
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007945 case SK_CastDerivedToBaseRValue:
Sebastian Redlc57d34b2010-07-20 04:20:21 +00007946 case SK_CastDerivedToBaseXValue:
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007947 case SK_CastDerivedToBaseLValue: {
7948 // We have a derived-to-base cast that produces either an rvalue or an
7949 // lvalue. Perform that cast.
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007950
John McCallcf142162010-08-07 06:22:56 +00007951 CXXCastPath BasePath;
Anders Carlssona70cff62010-04-24 19:06:50 +00007952
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007953 // Casts to inaccessible base classes are allowed with C-style casts.
7954 bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast();
Stephen Kellyf2ceec42018-08-09 21:08:08 +00007955 if (S.CheckDerivedToBaseConversion(
7956 SourceType, Step->Type, CurInit.get()->getBeginLoc(),
7957 CurInit.get()->getSourceRange(), &BasePath, IgnoreBaseAccess))
John McCallfaf5fb42010-08-26 23:41:50 +00007958 return ExprError();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007959
John McCall2536c6d2010-08-25 10:28:54 +00007960 ExprValueKind VK =
Sebastian Redlc57d34b2010-07-20 04:20:21 +00007961 Step->Kind == SK_CastDerivedToBaseLValue ?
John McCall2536c6d2010-08-25 10:28:54 +00007962 VK_LValue :
Sebastian Redlc57d34b2010-07-20 04:20:21 +00007963 (Step->Kind == SK_CastDerivedToBaseXValue ?
John McCall2536c6d2010-08-25 10:28:54 +00007964 VK_XValue :
7965 VK_RValue);
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00007966 CurInit =
7967 ImplicitCastExpr::Create(S.Context, Step->Type, CK_DerivedToBase,
7968 CurInit.get(), &BasePath, VK);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007969 break;
7970 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00007971
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007972 case SK_BindReference:
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007973 // Reference binding does not have any corresponding ASTs.
7974
7975 // Check exception specifications
John Wiegley01296292011-04-08 18:41:53 +00007976 if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
John McCallfaf5fb42010-08-26 23:41:50 +00007977 return ExprError();
Anders Carlssonab0ddb52010-01-31 18:34:51 +00007978
George Burgess IVcfd48d92017-04-13 23:47:08 +00007979 // We don't check for e.g. function pointers here, since address
7980 // availability checks should only occur when the function first decays
7981 // into a pointer or reference.
7982 if (CurInit.get()->getType()->isFunctionProtoType()) {
7983 if (auto *DRE = dyn_cast<DeclRefExpr>(CurInit.get()->IgnoreParens())) {
7984 if (auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
7985 if (!S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
Stephen Kellyf2ceec42018-08-09 21:08:08 +00007986 DRE->getBeginLoc()))
George Burgess IVcfd48d92017-04-13 23:47:08 +00007987 return ExprError();
7988 }
7989 }
7990 }
7991
Nick Lewycky2eeddfb2016-05-14 17:44:14 +00007992 CheckForNullPointerDereference(S, CurInit.get());
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007993 break;
Anders Carlssonab0ddb52010-01-31 18:34:51 +00007994
Richard Smithe6c01442013-06-05 00:46:14 +00007995 case SK_BindReferenceToTemporary: {
Jordan Roseb1312a52013-04-11 00:58:58 +00007996 // Make sure the "temporary" is actually an rvalue.
7997 assert(CurInit.get()->isRValue() && "not a temporary");
7998
Douglas Gregor3e1e5272009-12-09 23:02:17 +00007999 // Check exception specifications
John Wiegley01296292011-04-08 18:41:53 +00008000 if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
John McCallfaf5fb42010-08-26 23:41:50 +00008001 return ExprError();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008002
Douglas Gregorfe314812011-06-21 17:03:29 +00008003 // Materialize the temporary into memory.
Tim Shen4a05bb82016-06-21 20:29:17 +00008004 MaterializeTemporaryExpr *MTE = S.CreateMaterializeTemporaryExpr(
Richard Smithb8c0f552016-12-09 18:49:13 +00008005 Step->Type, CurInit.get(), Entity.getType()->isLValueReferenceType());
Richard Smithd87aab92018-07-17 22:24:09 +00008006 CurInit = MTE;
David Majnemerdaff3702014-05-01 17:50:17 +00008007
Brian Kelley762f9282017-03-29 18:16:38 +00008008 // If we're extending this temporary to automatic storage duration -- we
8009 // need to register its cleanup during the full-expression's cleanups.
8010 if (MTE->getStorageDuration() == SD_Automatic &&
8011 MTE->getType().isDestructedType())
Tim Shen4a05bb82016-06-21 20:29:17 +00008012 S.Cleanup.setExprNeedsCleanups(true);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008013 break;
Richard Smithe6c01442013-06-05 00:46:14 +00008014 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008015
Richard Smithb8c0f552016-12-09 18:49:13 +00008016 case SK_FinalCopy:
Richard Smith81f5ade2016-12-15 02:28:18 +00008017 if (checkAbstractType(Step->Type))
8018 return ExprError();
8019
Richard Smithb8c0f552016-12-09 18:49:13 +00008020 // If the overall initialization is initializing a temporary, we already
8021 // bound our argument if it was necessary to do so. If not (if we're
8022 // ultimately initializing a non-temporary), our argument needs to be
8023 // bound since it's initializing a function parameter.
8024 // FIXME: This is a mess. Rationalize temporary destruction.
8025 if (!shouldBindAsTemporary(Entity))
8026 CurInit = S.MaybeBindToTemporary(CurInit.get());
8027 CurInit = CopyObject(S, Step->Type, Entity, CurInit,
8028 /*IsExtraneousCopy=*/false);
8029 break;
8030
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00008031 case SK_ExtraneousCopyToTemporary:
Benjamin Kramer62b95d82012-08-23 21:35:17 +00008032 CurInit = CopyObject(S, Step->Type, Entity, CurInit,
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00008033 /*IsExtraneousCopy=*/true);
8034 break;
8035
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008036 case SK_UserConversion: {
8037 // We have a user-defined conversion that invokes either a constructor
8038 // or a conversion function.
John McCall8cb679e2010-11-15 09:13:47 +00008039 CastKind CastKind;
John McCalla0296f72010-03-19 07:35:19 +00008040 FunctionDecl *Fn = Step->Function.Function;
8041 DeclAccessPair FoundFn = Step->Function.FoundDecl;
Abramo Bagnara635ed24e2011-10-05 07:56:41 +00008042 bool HadMultipleCandidates = Step->Function.HadMultipleCandidates;
Douglas Gregor95562572010-04-24 23:45:46 +00008043 bool CreatedObject = false;
John McCall760af172010-02-01 03:16:54 +00008044 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008045 // Build a call to the selected constructor.
Benjamin Kramerf0623432012-08-23 22:51:59 +00008046 SmallVector<Expr*, 8> ConstructorArgs;
Stephen Kellyf2ceec42018-08-09 21:08:08 +00008047 SourceLocation Loc = CurInit.get()->getBeginLoc();
John McCall760af172010-02-01 03:16:54 +00008048
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008049 // Determine the arguments required to actually perform the constructor
8050 // call.
John Wiegley01296292011-04-08 18:41:53 +00008051 Expr *Arg = CurInit.get();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008052 if (S.CompleteConstructorCall(Constructor,
John Wiegley01296292011-04-08 18:41:53 +00008053 MultiExprArg(&Arg, 1),
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008054 Loc, ConstructorArgs))
John McCallfaf5fb42010-08-26 23:41:50 +00008055 return ExprError();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008056
Richard Smithb24f0672012-02-11 19:22:50 +00008057 // Build an expression that constructs a temporary.
Richard Smithc2bebe92016-05-11 20:37:46 +00008058 CurInit = S.BuildCXXConstructExpr(Loc, Step->Type,
8059 FoundFn, Constructor,
Benjamin Kramer62b95d82012-08-23 21:35:17 +00008060 ConstructorArgs,
Abramo Bagnara635ed24e2011-10-05 07:56:41 +00008061 HadMultipleCandidates,
Richard Smithd59b8322012-12-19 01:39:02 +00008062 /*ListInit*/ false,
Richard Smithf8adcdc2014-07-17 05:12:35 +00008063 /*StdInitListInit*/ false,
John McCallbfd822c2010-08-24 07:32:53 +00008064 /*ZeroInit*/ false,
Chandler Carruth01718152010-10-25 08:47:36 +00008065 CXXConstructExpr::CK_Complete,
8066 SourceRange());
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008067 if (CurInit.isInvalid())
John McCallfaf5fb42010-08-26 23:41:50 +00008068 return ExprError();
John McCall760af172010-02-01 03:16:54 +00008069
Richard Smith5179eb72016-06-28 19:03:57 +00008070 S.CheckConstructorAccess(Kind.getLocation(), Constructor, FoundFn,
8071 Entity);
Richard Smith22262ab2013-05-04 06:44:46 +00008072 if (S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()))
8073 return ExprError();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008074
John McCalle3027922010-08-25 11:45:40 +00008075 CastKind = CK_ConstructorConversion;
Douglas Gregor95562572010-04-24 23:45:46 +00008076 CreatedObject = true;
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008077 } else {
8078 // Build a call to the conversion function.
John McCall760af172010-02-01 03:16:54 +00008079 CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn);
Craig Topperc3ec1492014-05-26 06:22:03 +00008080 S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), nullptr,
John McCalla0296f72010-03-19 07:35:19 +00008081 FoundFn);
Richard Smith22262ab2013-05-04 06:44:46 +00008082 if (S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()))
8083 return ExprError();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008084
Abramo Bagnara635ed24e2011-10-05 07:56:41 +00008085 CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion,
8086 HadMultipleCandidates);
Richard Smithb8c0f552016-12-09 18:49:13 +00008087 if (CurInit.isInvalid())
John McCallfaf5fb42010-08-26 23:41:50 +00008088 return ExprError();
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008089
John McCalle3027922010-08-25 11:45:40 +00008090 CastKind = CK_UserDefinedConversion;
Alp Toker314cc812014-01-25 16:55:45 +00008091 CreatedObject = Conversion->getReturnType()->isRecordType();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008092 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008093
Richard Smith81f5ade2016-12-15 02:28:18 +00008094 if (CreatedObject && checkAbstractType(CurInit.get()->getType()))
8095 return ExprError();
8096
Richard Smithb8c0f552016-12-09 18:49:13 +00008097 CurInit = ImplicitCastExpr::Create(S.Context, CurInit.get()->getType(),
8098 CastKind, CurInit.get(), nullptr,
8099 CurInit.get()->getValueKind());
Abramo Bagnarab0cf2972011-11-16 22:46:05 +00008100
Richard Smithb8c0f552016-12-09 18:49:13 +00008101 if (shouldBindAsTemporary(Entity))
8102 // The overall entity is temporary, so this expression should be
8103 // destroyed at the end of its full-expression.
8104 CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
8105 else if (CreatedObject && shouldDestroyEntity(Entity)) {
8106 // The object outlasts the full-expression, but we need to prepare for
8107 // a destructor being run on it.
8108 // FIXME: It makes no sense to do this here. This should happen
8109 // regardless of how we initialized the entity.
John Wiegley01296292011-04-08 18:41:53 +00008110 QualType T = CurInit.get()->getType();
Douglas Gregor95562572010-04-24 23:45:46 +00008111 if (const RecordType *Record = T->getAs<RecordType>()) {
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008112 CXXDestructorDecl *Destructor
Douglas Gregore71edda2010-07-01 22:47:18 +00008113 = S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl()));
Stephen Kellyf2ceec42018-08-09 21:08:08 +00008114 S.CheckDestructorAccess(CurInit.get()->getBeginLoc(), Destructor,
Douglas Gregor95562572010-04-24 23:45:46 +00008115 S.PDiag(diag::err_access_dtor_temp) << T);
Stephen Kellyf2ceec42018-08-09 21:08:08 +00008116 S.MarkFunctionReferenced(CurInit.get()->getBeginLoc(), Destructor);
8117 if (S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getBeginLoc()))
Richard Smith22262ab2013-05-04 06:44:46 +00008118 return ExprError();
Douglas Gregor95562572010-04-24 23:45:46 +00008119 }
8120 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008121 break;
8122 }
Sebastian Redlc57d34b2010-07-20 04:20:21 +00008123
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008124 case SK_QualificationConversionLValue:
Sebastian Redlc57d34b2010-07-20 04:20:21 +00008125 case SK_QualificationConversionXValue:
8126 case SK_QualificationConversionRValue: {
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008127 // Perform a qualification conversion; these can never go wrong.
John McCall2536c6d2010-08-25 10:28:54 +00008128 ExprValueKind VK =
Anastasia Stulova04307942018-11-16 16:22:56 +00008129 Step->Kind == SK_QualificationConversionLValue
8130 ? VK_LValue
8131 : (Step->Kind == SK_QualificationConversionXValue ? VK_XValue
8132 : VK_RValue);
8133 CurInit = S.PerformQualificationConversion(CurInit.get(), Step->Type, VK);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008134 break;
Sebastian Redlc57d34b2010-07-20 04:20:21 +00008135 }
8136
Richard Smith77be48a2014-07-31 06:31:19 +00008137 case SK_AtomicConversion: {
8138 assert(CurInit.get()->isRValue() && "cannot convert glvalue to atomic");
8139 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8140 CK_NonAtomicToAtomic, VK_RValue);
8141 break;
8142 }
8143
Richard Smithaaa0ec42013-09-21 21:19:19 +00008144 case SK_ConversionSequence:
8145 case SK_ConversionSequenceNoNarrowing: {
Leonard Chanad7ac962018-12-06 01:05:54 +00008146 if (const auto *FromPtrType =
8147 CurInit.get()->getType()->getAs<PointerType>()) {
8148 if (const auto *ToPtrType = Step->Type->getAs<PointerType>()) {
8149 if (FromPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
8150 !ToPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
8151 S.Diag(CurInit.get()->getExprLoc(),
8152 diag::warn_noderef_to_dereferenceable_pointer)
8153 << CurInit.get()->getSourceRange();
8154 }
8155 }
8156 }
8157
Richard Smithaaa0ec42013-09-21 21:19:19 +00008158 Sema::CheckedConversionKind CCK
John McCall31168b02011-06-15 23:02:42 +00008159 = Kind.isCStyleCast()? Sema::CCK_CStyleCast
8160 : Kind.isFunctionalCast()? Sema::CCK_FunctionalCast
Richard Smith507840d2011-11-29 22:48:16 +00008161 : Kind.isExplicitCast()? Sema::CCK_OtherCast
John McCall31168b02011-06-15 23:02:42 +00008162 : Sema::CCK_ImplicitConversion;
John Wiegley01296292011-04-08 18:41:53 +00008163 ExprResult CurInitExprRes =
8164 S.PerformImplicitConversion(CurInit.get(), Step->Type, *Step->ICS,
John McCall31168b02011-06-15 23:02:42 +00008165 getAssignmentAction(Entity), CCK);
John Wiegley01296292011-04-08 18:41:53 +00008166 if (CurInitExprRes.isInvalid())
John McCallfaf5fb42010-08-26 23:41:50 +00008167 return ExprError();
Roger Ferrer Ibanez722a4db2016-08-12 08:04:13 +00008168
8169 S.DiscardMisalignedMemberAddress(Step->Type.getTypePtr(), CurInit.get());
8170
Benjamin Kramer62b95d82012-08-23 21:35:17 +00008171 CurInit = CurInitExprRes;
Richard Smithaaa0ec42013-09-21 21:19:19 +00008172
8173 if (Step->Kind == SK_ConversionSequenceNoNarrowing &&
Richard Smith52e624f2016-12-21 21:42:57 +00008174 S.getLangOpts().CPlusPlus)
Richard Smithaaa0ec42013-09-21 21:19:19 +00008175 DiagnoseNarrowingInInitList(S, *Step->ICS, SourceType, Entity.getType(),
8176 CurInit.get());
Roger Ferrer Ibanez722a4db2016-08-12 08:04:13 +00008177
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008178 break;
Douglas Gregor5c8ffab2010-04-16 19:30:02 +00008179 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008180
Douglas Gregor51e77d52009-12-10 17:56:55 +00008181 case SK_ListInitialization: {
Richard Smith81f5ade2016-12-15 02:28:18 +00008182 if (checkAbstractType(Step->Type))
8183 return ExprError();
8184
John Wiegley01296292011-04-08 18:41:53 +00008185 InitListExpr *InitList = cast<InitListExpr>(CurInit.get());
Richard Smithcc1b96d2013-06-12 22:31:48 +00008186 // If we're not initializing the top-level entity, we need to create an
8187 // InitializeTemporary entity for our target type.
8188 QualType Ty = Step->Type;
8189 bool IsTemporary = !S.Context.hasSameType(Entity.getType(), Ty);
Sebastian Redl29526f02011-11-27 16:50:07 +00008190 InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(Ty);
Richard Smithd712d0d2013-02-02 01:13:06 +00008191 InitializedEntity InitEntity = IsTemporary ? TempEntity : Entity;
8192 InitListChecker PerformInitList(S, InitEntity,
Manman Ren073db022016-03-10 18:53:19 +00008193 InitList, Ty, /*VerifyOnly=*/false,
8194 /*TreatUnavailableAsInvalid=*/false);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00008195 if (PerformInitList.HadError())
John McCallfaf5fb42010-08-26 23:41:50 +00008196 return ExprError();
Douglas Gregor51e77d52009-12-10 17:56:55 +00008197
Richard Smithcc1b96d2013-06-12 22:31:48 +00008198 // Hack: We must update *ResultType if available in order to set the
8199 // bounds of arrays, e.g. in 'int ar[] = {1, 2, 3};'.
8200 // Worst case: 'const int (&arref)[] = {1, 2, 3};'.
8201 if (ResultType &&
8202 ResultType->getNonReferenceType()->isIncompleteArrayType()) {
Sebastian Redl29526f02011-11-27 16:50:07 +00008203 if ((*ResultType)->isRValueReferenceType())
8204 Ty = S.Context.getRValueReferenceType(Ty);
8205 else if ((*ResultType)->isLValueReferenceType())
8206 Ty = S.Context.getLValueReferenceType(Ty,
8207 (*ResultType)->getAs<LValueReferenceType>()->isSpelledAsLValue());
8208 *ResultType = Ty;
8209 }
8210
8211 InitListExpr *StructuredInitList =
8212 PerformInitList.getFullyStructuredList();
Nikola Smiljanic01a75982014-05-29 10:55:11 +00008213 CurInit.get();
Richard Smithd712d0d2013-02-02 01:13:06 +00008214 CurInit = shouldBindAsTemporary(InitEntity)
8215 ? S.MaybeBindToTemporary(StructuredInitList)
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00008216 : StructuredInitList;
Douglas Gregor51e77d52009-12-10 17:56:55 +00008217 break;
8218 }
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00008219
Richard Smith53324112014-07-16 21:33:43 +00008220 case SK_ConstructorInitializationFromList: {
Richard Smith81f5ade2016-12-15 02:28:18 +00008221 if (checkAbstractType(Step->Type))
8222 return ExprError();
8223
Sebastian Redl5a41f682012-02-12 16:37:24 +00008224 // When an initializer list is passed for a parameter of type "reference
8225 // to object", we don't get an EK_Temporary entity, but instead an
8226 // EK_Parameter entity with reference type.
Sebastian Redl99f66162012-02-19 12:27:56 +00008227 // FIXME: This is a hack. What we really should do is create a user
8228 // conversion step for this case, but this makes it considerably more
8229 // complicated. For now, this will do.
Sebastian Redl5a41f682012-02-12 16:37:24 +00008230 InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(
8231 Entity.getType().getNonReferenceType());
8232 bool UseTemporary = Entity.getType()->isReferenceType();
Richard Smithd86812d2012-07-05 08:39:21 +00008233 assert(Args.size() == 1 && "expected a single argument for list init");
Benjamin Kramer62b95d82012-08-23 21:35:17 +00008234 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
Richard Smith2b349ae2012-04-19 06:58:00 +00008235 S.Diag(InitList->getExprLoc(), diag::warn_cxx98_compat_ctor_list_init)
8236 << InitList->getSourceRange();
Sebastian Redled2e5322011-12-22 14:44:04 +00008237 MultiExprArg Arg(InitList->getInits(), InitList->getNumInits());
Sebastian Redl5a41f682012-02-12 16:37:24 +00008238 CurInit = PerformConstructorInitialization(S, UseTemporary ? TempEntity :
8239 Entity,
Benjamin Kramer62b95d82012-08-23 21:35:17 +00008240 Kind, Arg, *Step,
Richard Smithd59b8322012-12-19 01:39:02 +00008241 ConstructorInitRequiresZeroInit,
Richard Smith53324112014-07-16 21:33:43 +00008242 /*IsListInitialization*/true,
Richard Smithf8adcdc2014-07-17 05:12:35 +00008243 /*IsStdInitListInit*/false,
Enea Zaffanella76e98fe2013-09-07 05:49:53 +00008244 InitList->getLBraceLoc(),
8245 InitList->getRBraceLoc());
Sebastian Redled2e5322011-12-22 14:44:04 +00008246 break;
8247 }
Sebastian Redl7de1fb42011-09-24 17:47:52 +00008248
Sebastian Redl29526f02011-11-27 16:50:07 +00008249 case SK_UnwrapInitList:
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00008250 CurInit = cast<InitListExpr>(CurInit.get())->getInit(0);
Sebastian Redl29526f02011-11-27 16:50:07 +00008251 break;
8252
8253 case SK_RewrapInitList: {
Nikola Smiljanic01a75982014-05-29 10:55:11 +00008254 Expr *E = CurInit.get();
Sebastian Redl29526f02011-11-27 16:50:07 +00008255 InitListExpr *Syntactic = Step->WrappingSyntacticList;
8256 InitListExpr *ILE = new (S.Context) InitListExpr(S.Context,
Benjamin Kramerc215e762012-08-24 11:54:20 +00008257 Syntactic->getLBraceLoc(), E, Syntactic->getRBraceLoc());
Sebastian Redl29526f02011-11-27 16:50:07 +00008258 ILE->setSyntacticForm(Syntactic);
8259 ILE->setType(E->getType());
8260 ILE->setValueKind(E->getValueKind());
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00008261 CurInit = ILE;
Sebastian Redl29526f02011-11-27 16:50:07 +00008262 break;
8263 }
8264
Richard Smith53324112014-07-16 21:33:43 +00008265 case SK_ConstructorInitialization:
Richard Smithf8adcdc2014-07-17 05:12:35 +00008266 case SK_StdInitializerListConstructorCall: {
Richard Smith81f5ade2016-12-15 02:28:18 +00008267 if (checkAbstractType(Step->Type))
8268 return ExprError();
8269
Sebastian Redl99f66162012-02-19 12:27:56 +00008270 // When an initializer list is passed for a parameter of type "reference
8271 // to object", we don't get an EK_Temporary entity, but instead an
8272 // EK_Parameter entity with reference type.
8273 // FIXME: This is a hack. What we really should do is create a user
8274 // conversion step for this case, but this makes it considerably more
8275 // complicated. For now, this will do.
8276 InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(
8277 Entity.getType().getNonReferenceType());
8278 bool UseTemporary = Entity.getType()->isReferenceType();
Richard Smithf8adcdc2014-07-17 05:12:35 +00008279 bool IsStdInitListInit =
8280 Step->Kind == SK_StdInitializerListConstructorCall;
Richard Smith410306b2016-12-12 02:53:20 +00008281 Expr *Source = CurInit.get();
Vedant Kumara14a1f92018-01-17 18:53:51 +00008282 SourceRange Range = Kind.hasParenOrBraceRange()
8283 ? Kind.getParenOrBraceRange()
8284 : SourceRange();
Richard Smith53324112014-07-16 21:33:43 +00008285 CurInit = PerformConstructorInitialization(
Richard Smith410306b2016-12-12 02:53:20 +00008286 S, UseTemporary ? TempEntity : Entity, Kind,
8287 Source ? MultiExprArg(Source) : Args, *Step,
Richard Smith53324112014-07-16 21:33:43 +00008288 ConstructorInitRequiresZeroInit,
Richard Smith410306b2016-12-12 02:53:20 +00008289 /*IsListInitialization*/ IsStdInitListInit,
8290 /*IsStdInitListInitialization*/ IsStdInitListInit,
Vedant Kumara14a1f92018-01-17 18:53:51 +00008291 /*LBraceLoc*/ Range.getBegin(),
8292 /*RBraceLoc*/ Range.getEnd());
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00008293 break;
Sebastian Redl99f66162012-02-19 12:27:56 +00008294 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008295
Douglas Gregor7dc42e52009-12-15 00:01:57 +00008296 case SK_ZeroInitialization: {
Douglas Gregor4f4b1862009-12-16 18:50:27 +00008297 step_iterator NextStep = Step;
8298 ++NextStep;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008299 if (NextStep != StepEnd &&
Richard Smithd86812d2012-07-05 08:39:21 +00008300 (NextStep->Kind == SK_ConstructorInitialization ||
Richard Smith53324112014-07-16 21:33:43 +00008301 NextStep->Kind == SK_ConstructorInitializationFromList)) {
Douglas Gregor4f4b1862009-12-16 18:50:27 +00008302 // The need for zero-initialization is recorded directly into
8303 // the call to the object's constructor within the next step.
8304 ConstructorInitRequiresZeroInit = true;
8305 } else if (Kind.getKind() == InitializationKind::IK_Value &&
David Blaikiebbafb8a2012-03-11 07:00:24 +00008306 S.getLangOpts().CPlusPlus &&
Douglas Gregor4f4b1862009-12-16 18:50:27 +00008307 !Kind.isImplicitValueInit()) {
Douglas Gregor2b88c112010-09-08 00:15:04 +00008308 TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
8309 if (!TSInfo)
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008310 TSInfo = S.Context.getTrivialTypeSourceInfo(Step->Type,
Douglas Gregor2b88c112010-09-08 00:15:04 +00008311 Kind.getRange().getBegin());
8312
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00008313 CurInit = new (S.Context) CXXScalarValueInitExpr(
Richard Smith60437622017-02-09 19:17:44 +00008314 Entity.getType().getNonLValueExprType(S.Context), TSInfo,
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00008315 Kind.getRange().getEnd());
Douglas Gregor4f4b1862009-12-16 18:50:27 +00008316 } else {
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00008317 CurInit = new (S.Context) ImplicitValueInitExpr(Step->Type);
Douglas Gregor4f4b1862009-12-16 18:50:27 +00008318 }
Douglas Gregor7dc42e52009-12-15 00:01:57 +00008319 break;
8320 }
Douglas Gregore1314a62009-12-18 05:02:21 +00008321
8322 case SK_CAssignment: {
John Wiegley01296292011-04-08 18:41:53 +00008323 QualType SourceType = CurInit.get()->getType();
Leonard Chanad7ac962018-12-06 01:05:54 +00008324
George Burgess IV5f21c712015-10-12 19:57:04 +00008325 // Save off the initial CurInit in case we need to emit a diagnostic
8326 ExprResult InitialCurInit = CurInit;
Benjamin Kramer62b95d82012-08-23 21:35:17 +00008327 ExprResult Result = CurInit;
Douglas Gregore1314a62009-12-18 05:02:21 +00008328 Sema::AssignConvertType ConvTy =
Fariborz Jahanian25eef192013-07-31 21:40:51 +00008329 S.CheckSingleAssignmentConstraints(Step->Type, Result, true,
8330 Entity.getKind() == InitializedEntity::EK_Parameter_CF_Audited);
John Wiegley01296292011-04-08 18:41:53 +00008331 if (Result.isInvalid())
8332 return ExprError();
Benjamin Kramer62b95d82012-08-23 21:35:17 +00008333 CurInit = Result;
Douglas Gregor96596c92009-12-22 07:24:36 +00008334
8335 // If this is a call, allow conversion to a transparent union.
Benjamin Kramer62b95d82012-08-23 21:35:17 +00008336 ExprResult CurInitExprRes = CurInit;
Douglas Gregor96596c92009-12-22 07:24:36 +00008337 if (ConvTy != Sema::Compatible &&
Fariborz Jahanian131996b2013-07-31 18:21:45 +00008338 Entity.isParameterKind() &&
John Wiegley01296292011-04-08 18:41:53 +00008339 S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExprRes)
Douglas Gregor96596c92009-12-22 07:24:36 +00008340 == Sema::Compatible)
8341 ConvTy = Sema::Compatible;
John Wiegley01296292011-04-08 18:41:53 +00008342 if (CurInitExprRes.isInvalid())
8343 return ExprError();
Benjamin Kramer62b95d82012-08-23 21:35:17 +00008344 CurInit = CurInitExprRes;
Douglas Gregor96596c92009-12-22 07:24:36 +00008345
Douglas Gregor4f4946a2010-04-22 00:20:18 +00008346 bool Complained;
Douglas Gregore1314a62009-12-18 05:02:21 +00008347 if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(),
8348 Step->Type, SourceType,
George Burgess IV5f21c712015-10-12 19:57:04 +00008349 InitialCurInit.get(),
Fariborz Jahanian3a25d0d2013-07-31 23:19:34 +00008350 getAssignmentAction(Entity, true),
Douglas Gregor4f4946a2010-04-22 00:20:18 +00008351 &Complained)) {
8352 PrintInitLocationNote(S, Entity);
John McCallfaf5fb42010-08-26 23:41:50 +00008353 return ExprError();
Douglas Gregor4f4946a2010-04-22 00:20:18 +00008354 } else if (Complained)
8355 PrintInitLocationNote(S, Entity);
Douglas Gregore1314a62009-12-18 05:02:21 +00008356 break;
8357 }
Eli Friedman78275202009-12-19 08:11:05 +00008358
8359 case SK_StringInit: {
8360 QualType Ty = Step->Type;
John Wiegley01296292011-04-08 18:41:53 +00008361 CheckStringInit(CurInit.get(), ResultType ? *ResultType : Ty,
John McCall5decec92011-02-21 07:57:55 +00008362 S.Context.getAsArrayType(Ty), S);
Eli Friedman78275202009-12-19 08:11:05 +00008363 break;
8364 }
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00008365
8366 case SK_ObjCObjectConversion:
Nikola Smiljanic01a75982014-05-29 10:55:11 +00008367 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
John McCalle3027922010-08-25 11:45:40 +00008368 CK_ObjCObjectLValueCast,
Eli Friedmanbe4b3632011-09-27 21:58:52 +00008369 CurInit.get()->getValueKind());
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00008370 break;
Douglas Gregore2f943b2011-02-22 18:29:51 +00008371
Richard Smith410306b2016-12-12 02:53:20 +00008372 case SK_ArrayLoopIndex: {
8373 Expr *Cur = CurInit.get();
8374 Expr *BaseExpr = new (S.Context)
8375 OpaqueValueExpr(Cur->getExprLoc(), Cur->getType(),
8376 Cur->getValueKind(), Cur->getObjectKind(), Cur);
8377 Expr *IndexExpr =
8378 new (S.Context) ArrayInitIndexExpr(S.Context.getSizeType());
8379 CurInit = S.CreateBuiltinArraySubscriptExpr(
8380 BaseExpr, Kind.getLocation(), IndexExpr, Kind.getLocation());
8381 ArrayLoopCommonExprs.push_back(BaseExpr);
8382 break;
8383 }
8384
8385 case SK_ArrayLoopInit: {
8386 assert(!ArrayLoopCommonExprs.empty() &&
8387 "mismatched SK_ArrayLoopIndex and SK_ArrayLoopInit");
8388 Expr *Common = ArrayLoopCommonExprs.pop_back_val();
8389 CurInit = new (S.Context) ArrayInitLoopExpr(Step->Type, Common,
8390 CurInit.get());
8391 break;
8392 }
8393
Richard Smith378b8c82016-12-14 03:22:16 +00008394 case SK_GNUArrayInit:
Douglas Gregore2f943b2011-02-22 18:29:51 +00008395 // Okay: we checked everything before creating this step. Note that
8396 // this is a GNU extension.
8397 S.Diag(Kind.getLocation(), diag::ext_array_init_copy)
John Wiegley01296292011-04-08 18:41:53 +00008398 << Step->Type << CurInit.get()->getType()
8399 << CurInit.get()->getSourceRange();
Eli Friedman88fccbd2019-02-11 22:54:27 +00008400 updateGNUCompoundLiteralRValue(CurInit.get());
Richard Smith378b8c82016-12-14 03:22:16 +00008401 LLVM_FALLTHROUGH;
8402 case SK_ArrayInit:
Douglas Gregore2f943b2011-02-22 18:29:51 +00008403 // If the destination type is an incomplete array type, update the
8404 // type accordingly.
8405 if (ResultType) {
8406 if (const IncompleteArrayType *IncompleteDest
8407 = S.Context.getAsIncompleteArrayType(Step->Type)) {
8408 if (const ConstantArrayType *ConstantSource
John Wiegley01296292011-04-08 18:41:53 +00008409 = S.Context.getAsConstantArrayType(CurInit.get()->getType())) {
Douglas Gregore2f943b2011-02-22 18:29:51 +00008410 *ResultType = S.Context.getConstantArrayType(
8411 IncompleteDest->getElementType(),
8412 ConstantSource->getSize(),
8413 ArrayType::Normal, 0);
8414 }
8415 }
8416 }
John McCall31168b02011-06-15 23:02:42 +00008417 break;
Douglas Gregore2f943b2011-02-22 18:29:51 +00008418
Richard Smithebeed412012-02-15 22:38:09 +00008419 case SK_ParenthesizedArrayInit:
8420 // Okay: we checked everything before creating this step. Note that
8421 // this is a GNU extension.
8422 S.Diag(Kind.getLocation(), diag::ext_array_init_parens)
8423 << CurInit.get()->getSourceRange();
8424 break;
8425
John McCall31168b02011-06-15 23:02:42 +00008426 case SK_PassByIndirectCopyRestore:
8427 case SK_PassByIndirectRestore:
8428 checkIndirectCopyRestoreSource(S, CurInit.get());
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00008429 CurInit = new (S.Context) ObjCIndirectCopyRestoreExpr(
8430 CurInit.get(), Step->Type,
8431 Step->Kind == SK_PassByIndirectCopyRestore);
John McCall31168b02011-06-15 23:02:42 +00008432 break;
8433
8434 case SK_ProduceObjCObject:
Nikola Smiljanic03ff2592014-05-29 14:05:12 +00008435 CurInit =
8436 ImplicitCastExpr::Create(S.Context, Step->Type, CK_ARCProduceObject,
8437 CurInit.get(), nullptr, VK_RValue);
Douglas Gregore2f943b2011-02-22 18:29:51 +00008438 break;
Sebastian Redlc1839b12012-01-17 22:49:42 +00008439
8440 case SK_StdInitializerList: {
Richard Smithcc1b96d2013-06-12 22:31:48 +00008441 S.Diag(CurInit.get()->getExprLoc(),
8442 diag::warn_cxx98_compat_initializer_list_init)
8443 << CurInit.get()->getSourceRange();
Sebastian Redl249dee52012-03-05 19:35:43 +00008444
Richard Smithcc1b96d2013-06-12 22:31:48 +00008445 // Materialize the temporary into memory.
Tim Shen4a05bb82016-06-21 20:29:17 +00008446 MaterializeTemporaryExpr *MTE = S.CreateMaterializeTemporaryExpr(
8447 CurInit.get()->getType(), CurInit.get(),
8448 /*BoundToLvalueReference=*/false);
David Majnemerdaff3702014-05-01 17:50:17 +00008449
Florian Hahn0aa117d2018-07-17 09:23:31 +00008450 // Wrap it in a construction of a std::initializer_list<T>.
8451 CurInit = new (S.Context) CXXStdInitializerListExpr(Step->Type, MTE);
Richard Smith0a9969b2018-07-17 00:11:41 +00008452
Richard Smithcc1b96d2013-06-12 22:31:48 +00008453 // Bind the result, in case the library has given initializer_list a
8454 // non-trivial destructor.
8455 if (shouldBindAsTemporary(Entity))
Nikola Smiljanic01a75982014-05-29 10:55:11 +00008456 CurInit = S.MaybeBindToTemporary(CurInit.get());
Sebastian Redlc1839b12012-01-17 22:49:42 +00008457 break;
8458 }
Richard Smithcc1b96d2013-06-12 22:31:48 +00008459
Guy Benyei61054192013-02-07 10:55:47 +00008460 case SK_OCLSamplerInit: {
Raphael Isemannb23ccec2018-12-10 12:37:46 +00008461 // Sampler initialization have 5 cases:
Yaxun Liu0bc4b2d2016-07-28 19:26:30 +00008462 // 1. function argument passing
8463 // 1a. argument is a file-scope variable
8464 // 1b. argument is a function-scope variable
8465 // 1c. argument is one of caller function's parameters
8466 // 2. variable initialization
8467 // 2a. initializing a file-scope variable
8468 // 2b. initializing a function-scope variable
8469 //
8470 // For file-scope variables, since they cannot be initialized by function
8471 // call of __translate_sampler_initializer in LLVM IR, their references
8472 // need to be replaced by a cast from their literal initializers to
8473 // sampler type. Since sampler variables can only be used in function
8474 // calls as arguments, we only need to replace them when handling the
8475 // argument passing.
8476 assert(Step->Type->isSamplerT() &&
Alp Tokerd4733632013-12-05 04:47:09 +00008477 "Sampler initialization on non-sampler type.");
Sven van Haastregt06385d02019-08-12 12:44:26 +00008478 Expr *Init = CurInit.get()->IgnoreParens();
Yaxun Liu0bc4b2d2016-07-28 19:26:30 +00008479 QualType SourceType = Init->getType();
8480 // Case 1
Fariborz Jahanian131996b2013-07-31 18:21:45 +00008481 if (Entity.isParameterKind()) {
Egor Churaeva8d24512017-04-05 09:02:56 +00008482 if (!SourceType->isSamplerT() && !SourceType->isIntegerType()) {
Guy Benyei61054192013-02-07 10:55:47 +00008483 S.Diag(Kind.getLocation(), diag::err_sampler_argument_required)
8484 << SourceType;
Yaxun Liu0bc4b2d2016-07-28 19:26:30 +00008485 break;
8486 } else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Init)) {
8487 auto Var = cast<VarDecl>(DRE->getDecl());
8488 // Case 1b and 1c
8489 // No cast from integer to sampler is needed.
8490 if (!Var->hasGlobalStorage()) {
8491 CurInit = ImplicitCastExpr::Create(S.Context, Step->Type,
8492 CK_LValueToRValue, Init,
8493 /*BasePath=*/nullptr, VK_RValue);
8494 break;
8495 }
8496 // Case 1a
8497 // For function call with a file-scope sampler variable as argument,
8498 // get the integer literal.
8499 // Do not diagnose if the file-scope variable does not have initializer
8500 // since this has already been diagnosed when parsing the variable
8501 // declaration.
8502 if (!Var->getInit() || !isa<ImplicitCastExpr>(Var->getInit()))
8503 break;
8504 Init = cast<ImplicitCastExpr>(const_cast<Expr*>(
8505 Var->getInit()))->getSubExpr();
8506 SourceType = Init->getType();
8507 }
8508 } else {
8509 // Case 2
8510 // Check initializer is 32 bit integer constant.
8511 // If the initializer is taken from global variable, do not diagnose since
8512 // this has already been done when parsing the variable declaration.
8513 if (!Init->isConstantInitializer(S.Context, false))
8514 break;
Fangrui Song6907ce22018-07-30 19:24:48 +00008515
Yaxun Liu0bc4b2d2016-07-28 19:26:30 +00008516 if (!SourceType->isIntegerType() ||
8517 32 != S.Context.getIntWidth(SourceType)) {
8518 S.Diag(Kind.getLocation(), diag::err_sampler_initializer_not_integer)
8519 << SourceType;
8520 break;
8521 }
8522
Fangrui Song407659a2018-11-30 23:41:18 +00008523 Expr::EvalResult EVResult;
8524 Init->EvaluateAsInt(EVResult, S.Context);
8525 llvm::APSInt Result = EVResult.Val.getInt();
Yaxun Liu0bc4b2d2016-07-28 19:26:30 +00008526 const uint64_t SamplerValue = Result.getLimitedValue();
8527 // 32-bit value of sampler's initializer is interpreted as
8528 // bit-field with the following structure:
8529 // |unspecified|Filter|Addressing Mode| Normalized Coords|
8530 // |31 6|5 4|3 1| 0|
8531 // This structure corresponds to enum values of sampler properties
8532 // defined in SPIR spec v1.2 and also opencl-c.h
8533 unsigned AddressingMode = (0x0E & SamplerValue) >> 1;
8534 unsigned FilterMode = (0x30 & SamplerValue) >> 4;
Andrew Savonichev3fee3512018-11-08 11:25:41 +00008535 if (FilterMode != 1 && FilterMode != 2 &&
8536 !S.getOpenCLOptions().isEnabled(
8537 "cl_intel_device_side_avc_motion_estimation"))
Yaxun Liu0bc4b2d2016-07-28 19:26:30 +00008538 S.Diag(Kind.getLocation(),
8539 diag::warn_sampler_initializer_invalid_bits)
8540 << "Filter Mode";
8541 if (AddressingMode > 4)
8542 S.Diag(Kind.getLocation(),
8543 diag::warn_sampler_initializer_invalid_bits)
8544 << "Addressing Mode";
Guy Benyei61054192013-02-07 10:55:47 +00008545 }
8546
Yaxun Liu0bc4b2d2016-07-28 19:26:30 +00008547 // Cases 1a, 2a and 2b
8548 // Insert cast from integer to sampler.
8549 CurInit = S.ImpCastExprToType(Init, S.Context.OCLSamplerTy,
8550 CK_IntToOCLSampler);
Guy Benyei61054192013-02-07 10:55:47 +00008551 break;
8552 }
Andrew Savonichevb555b762018-10-23 15:19:20 +00008553 case SK_OCLZeroOpaqueType: {
Andrew Savonichev3fee3512018-11-08 11:25:41 +00008554 assert((Step->Type->isEventT() || Step->Type->isQueueT() ||
8555 Step->Type->isOCLIntelSubgroupAVCType()) &&
Andrew Savonichevb555b762018-10-23 15:19:20 +00008556 "Wrong type for initialization of OpenCL opaque type.");
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00008557
Nikola Smiljanic01a75982014-05-29 10:55:11 +00008558 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
Andrew Savonichevb555b762018-10-23 15:19:20 +00008559 CK_ZeroToOCLOpaqueType,
Egor Churaev89831422016-12-23 14:55:49 +00008560 CurInit.get()->getValueKind());
8561 break;
8562 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008563 }
8564 }
John McCall1f425642010-11-11 03:21:53 +00008565
Richard Smithca975b22018-07-23 18:50:26 +00008566 // Check whether the initializer has a shorter lifetime than the initialized
8567 // entity, and if not, either lifetime-extend or warn as appropriate.
8568 if (auto *Init = CurInit.get())
8569 S.checkInitializerLifetime(Entity, Init);
8570
John McCall1f425642010-11-11 03:21:53 +00008571 // Diagnose non-fatal problems with the completed initialization.
8572 if (Entity.getKind() == InitializedEntity::EK_Member &&
8573 cast<FieldDecl>(Entity.getDecl())->isBitField())
8574 S.CheckBitFieldInitialization(Kind.getLocation(),
8575 cast<FieldDecl>(Entity.getDecl()),
8576 CurInit.get());
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008577
Richard Trieuac3eca52015-04-29 01:52:17 +00008578 // Check for std::move on construction.
8579 if (const Expr *E = CurInit.get()) {
8580 CheckMoveOnConstruction(S, E,
8581 Entity.getKind() == InitializedEntity::EK_Result);
8582 }
8583
Benjamin Kramer62b95d82012-08-23 21:35:17 +00008584 return CurInit;
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008585}
8586
Richard Smith593f9932012-12-08 02:01:17 +00008587/// Somewhere within T there is an uninitialized reference subobject.
8588/// Dig it out and diagnose it.
Benjamin Kramer3e350262013-02-15 12:30:38 +00008589static bool DiagnoseUninitializedReference(Sema &S, SourceLocation Loc,
8590 QualType T) {
Richard Smith593f9932012-12-08 02:01:17 +00008591 if (T->isReferenceType()) {
8592 S.Diag(Loc, diag::err_reference_without_init)
8593 << T.getNonReferenceType();
8594 return true;
8595 }
8596
8597 CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
8598 if (!RD || !RD->hasUninitializedReferenceMember())
8599 return false;
8600
Aaron Ballmane8a8bae2014-03-08 20:12:42 +00008601 for (const auto *FI : RD->fields()) {
Richard Smith593f9932012-12-08 02:01:17 +00008602 if (FI->isUnnamedBitfield())
8603 continue;
8604
8605 if (DiagnoseUninitializedReference(S, FI->getLocation(), FI->getType())) {
8606 S.Diag(Loc, diag::note_value_initialization_here) << RD;
8607 return true;
8608 }
8609 }
8610
Aaron Ballman574705e2014-03-13 15:41:46 +00008611 for (const auto &BI : RD->bases()) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00008612 if (DiagnoseUninitializedReference(S, BI.getBeginLoc(), BI.getType())) {
Richard Smith593f9932012-12-08 02:01:17 +00008613 S.Diag(Loc, diag::note_value_initialization_here) << RD;
8614 return true;
8615 }
8616 }
8617
8618 return false;
8619}
8620
8621
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008622//===----------------------------------------------------------------------===//
8623// Diagnose initialization failures
8624//===----------------------------------------------------------------------===//
John McCall5ec7e7d2013-03-19 07:04:25 +00008625
8626/// Emit notes associated with an initialization that failed due to a
8627/// "simple" conversion failure.
8628static void emitBadConversionNotes(Sema &S, const InitializedEntity &entity,
8629 Expr *op) {
8630 QualType destType = entity.getType();
8631 if (destType.getNonReferenceType()->isObjCObjectPointerType() &&
8632 op->getType()->isObjCObjectPointerType()) {
8633
8634 // Emit a possible note about the conversion failing because the
8635 // operand is a message send with a related result type.
8636 S.EmitRelatedResultTypeNote(op);
8637
8638 // Emit a possible note about a return failing because we're
8639 // expecting a related result type.
8640 if (entity.getKind() == InitializedEntity::EK_Result)
8641 S.EmitRelatedResultTypeNoteForReturn(destType);
8642 }
8643}
8644
Richard Smith0449aaf2013-11-21 23:30:57 +00008645static void diagnoseListInit(Sema &S, const InitializedEntity &Entity,
8646 InitListExpr *InitList) {
8647 QualType DestType = Entity.getType();
8648
8649 QualType E;
8650 if (S.getLangOpts().CPlusPlus11 && S.isStdInitializerList(DestType, &E)) {
8651 QualType ArrayType = S.Context.getConstantArrayType(
8652 E.withConst(),
8653 llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
8654 InitList->getNumInits()),
8655 clang::ArrayType::Normal, 0);
8656 InitializedEntity HiddenArray =
8657 InitializedEntity::InitializeTemporary(ArrayType);
8658 return diagnoseListInit(S, HiddenArray, InitList);
8659 }
8660
Richard Smith8d082d12014-09-04 22:13:39 +00008661 if (DestType->isReferenceType()) {
8662 // A list-initialization failure for a reference means that we tried to
8663 // create a temporary of the inner type (per [dcl.init.list]p3.6) and the
8664 // inner initialization failed.
8665 QualType T = DestType->getAs<ReferenceType>()->getPointeeType();
8666 diagnoseListInit(S, InitializedEntity::InitializeTemporary(T), InitList);
Stephen Kellyf2ceec42018-08-09 21:08:08 +00008667 SourceLocation Loc = InitList->getBeginLoc();
Richard Smith8d082d12014-09-04 22:13:39 +00008668 if (auto *D = Entity.getDecl())
8669 Loc = D->getLocation();
8670 S.Diag(Loc, diag::note_in_reference_temporary_list_initializer) << T;
8671 return;
8672 }
8673
Richard Smith0449aaf2013-11-21 23:30:57 +00008674 InitListChecker DiagnoseInitList(S, Entity, InitList, DestType,
Manman Ren073db022016-03-10 18:53:19 +00008675 /*VerifyOnly=*/false,
8676 /*TreatUnavailableAsInvalid=*/false);
Richard Smith0449aaf2013-11-21 23:30:57 +00008677 assert(DiagnoseInitList.HadError() &&
8678 "Inconsistent init list check result.");
8679}
8680
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008681bool InitializationSequence::Diagnose(Sema &S,
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008682 const InitializedEntity &Entity,
8683 const InitializationKind &Kind,
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00008684 ArrayRef<Expr *> Args) {
Sebastian Redl724bfe12011-06-05 13:59:05 +00008685 if (!Failed())
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008686 return false;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008687
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008688 // When we want to diagnose only one element of a braced-init-list,
8689 // we need to factor it out.
8690 Expr *OnlyArg;
8691 if (Args.size() == 1) {
8692 auto *List = dyn_cast<InitListExpr>(Args[0]);
8693 if (List && List->getNumInits() == 1)
8694 OnlyArg = List->getInit(0);
8695 else
8696 OnlyArg = Args[0];
8697 }
8698 else
8699 OnlyArg = nullptr;
8700
Douglas Gregor1b303932009-12-22 15:35:07 +00008701 QualType DestType = Entity.getType();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008702 switch (Failure) {
8703 case FK_TooManyInitsForReference:
Douglas Gregor7ae2d772010-01-31 09:12:51 +00008704 // FIXME: Customize for the initialized entity?
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00008705 if (Args.empty()) {
Richard Smith593f9932012-12-08 02:01:17 +00008706 // Dig out the reference subobject which is uninitialized and diagnose it.
8707 // If this is value-initialization, this could be nested some way within
8708 // the target type.
8709 assert(Kind.getKind() == InitializationKind::IK_Value ||
8710 DestType->isReferenceType());
8711 bool Diagnosed =
8712 DiagnoseUninitializedReference(S, Kind.getLocation(), DestType);
8713 assert(Diagnosed && "couldn't find uninitialized reference to diagnose");
8714 (void)Diagnosed;
8715 } else // FIXME: diagnostic below could be better!
Douglas Gregor7ae2d772010-01-31 09:12:51 +00008716 S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits)
Stephen Kelly1c301dc2018-08-09 21:09:38 +00008717 << SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008718 break;
Richard Smith49a6b6e2017-03-24 01:14:25 +00008719 case FK_ParenthesizedListInitForReference:
8720 S.Diag(Kind.getLocation(), diag::err_list_init_in_parens)
8721 << 1 << Entity.getType() << Args[0]->getSourceRange();
8722 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008723
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008724 case FK_ArrayNeedsInitList:
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00008725 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 0;
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008726 break;
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00008727 case FK_ArrayNeedsInitListOrStringLiteral:
8728 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 1;
8729 break;
8730 case FK_ArrayNeedsInitListOrWideStringLiteral:
8731 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 2;
8732 break;
8733 case FK_NarrowStringIntoWideCharArray:
8734 S.Diag(Kind.getLocation(), diag::err_array_init_narrow_string_into_wchar);
8735 break;
8736 case FK_WideStringIntoCharArray:
8737 S.Diag(Kind.getLocation(), diag::err_array_init_wide_string_into_char);
8738 break;
8739 case FK_IncompatWideStringIntoWideChar:
8740 S.Diag(Kind.getLocation(),
8741 diag::err_array_init_incompat_wide_string_into_wchar);
8742 break;
Richard Smith3a8244d2018-05-01 05:02:45 +00008743 case FK_PlainStringIntoUTF8Char:
8744 S.Diag(Kind.getLocation(),
8745 diag::err_array_init_plain_string_into_char8_t);
Stephen Kellyf2ceec42018-08-09 21:08:08 +00008746 S.Diag(Args.front()->getBeginLoc(),
Richard Smith3a8244d2018-05-01 05:02:45 +00008747 diag::note_array_init_plain_string_into_char8_t)
Stephen Kellyf2ceec42018-08-09 21:08:08 +00008748 << FixItHint::CreateInsertion(Args.front()->getBeginLoc(), "u8");
Richard Smith3a8244d2018-05-01 05:02:45 +00008749 break;
8750 case FK_UTF8StringIntoPlainChar:
8751 S.Diag(Kind.getLocation(),
Richard Smith28ddb912018-11-14 21:04:34 +00008752 diag::err_array_init_utf8_string_into_char)
8753 << S.getLangOpts().CPlusPlus2a;
Richard Smith3a8244d2018-05-01 05:02:45 +00008754 break;
Douglas Gregore2f943b2011-02-22 18:29:51 +00008755 case FK_ArrayTypeMismatch:
8756 case FK_NonConstantArrayInit:
Richard Smith0449aaf2013-11-21 23:30:57 +00008757 S.Diag(Kind.getLocation(),
Douglas Gregore2f943b2011-02-22 18:29:51 +00008758 (Failure == FK_ArrayTypeMismatch
8759 ? diag::err_array_init_different_type
8760 : diag::err_array_init_non_constant_array))
8761 << DestType.getNonReferenceType()
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008762 << OnlyArg->getType()
Douglas Gregore2f943b2011-02-22 18:29:51 +00008763 << Args[0]->getSourceRange();
8764 break;
8765
John McCalla59dc2f2012-01-05 00:13:19 +00008766 case FK_VariableLengthArrayHasInitializer:
8767 S.Diag(Kind.getLocation(), diag::err_variable_object_no_init)
8768 << Args[0]->getSourceRange();
8769 break;
8770
John McCall16df1e52010-03-30 21:47:33 +00008771 case FK_AddressOfOverloadFailed: {
8772 DeclAccessPair Found;
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008773 S.ResolveAddressOfOverloadedFunction(OnlyArg,
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008774 DestType.getNonReferenceType(),
John McCall16df1e52010-03-30 21:47:33 +00008775 true,
8776 Found);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008777 break;
John McCall16df1e52010-03-30 21:47:33 +00008778 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008779
George Burgess IV3e3bb95b2015-12-02 21:58:08 +00008780 case FK_AddressOfUnaddressableFunction: {
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008781 auto *FD = cast<FunctionDecl>(cast<DeclRefExpr>(OnlyArg)->getDecl());
George Burgess IV3e3bb95b2015-12-02 21:58:08 +00008782 S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
Stephen Kellyf2ceec42018-08-09 21:08:08 +00008783 OnlyArg->getBeginLoc());
George Burgess IV3e3bb95b2015-12-02 21:58:08 +00008784 break;
8785 }
8786
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008787 case FK_ReferenceInitOverloadFailed:
Douglas Gregor540c3b02009-12-14 17:27:33 +00008788 case FK_UserConversionOverloadFailed:
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008789 switch (FailedOverloadResult) {
8790 case OR_Ambiguous:
Douglas Gregore1314a62009-12-18 05:02:21 +00008791
David Blaikie5e328052019-05-03 00:44:50 +00008792 FailedCandidateSet.NoteCandidates(
8793 PartialDiagnosticAt(
8794 Kind.getLocation(),
8795 Failure == FK_UserConversionOverloadFailed
8796 ? (S.PDiag(diag::err_typecheck_ambiguous_condition)
8797 << OnlyArg->getType() << DestType
8798 << Args[0]->getSourceRange())
8799 : (S.PDiag(diag::err_ref_init_ambiguous)
8800 << DestType << OnlyArg->getType()
8801 << Args[0]->getSourceRange())),
8802 S, OCD_ViableCandidates, Args);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008803 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008804
David Blaikie5e328052019-05-03 00:44:50 +00008805 case OR_No_Viable_Function: {
8806 auto Cands = FailedCandidateSet.CompleteCandidates(S, OCD_AllCandidates, Args);
Larisse Voufo70bb43a2013-06-27 03:36:30 +00008807 if (!S.RequireCompleteType(Kind.getLocation(),
Larisse Voufo64cf3ef2013-06-27 01:50:25 +00008808 DestType.getNonReferenceType(),
8809 diag::err_typecheck_nonviable_condition_incomplete,
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008810 OnlyArg->getType(), Args[0]->getSourceRange()))
Larisse Voufo64cf3ef2013-06-27 01:50:25 +00008811 S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
Nick Lewycky08426e22015-08-25 22:18:46 +00008812 << (Entity.getKind() == InitializedEntity::EK_Result)
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008813 << OnlyArg->getType() << Args[0]->getSourceRange()
Larisse Voufo64cf3ef2013-06-27 01:50:25 +00008814 << DestType.getNonReferenceType();
8815
David Blaikie5e328052019-05-03 00:44:50 +00008816 FailedCandidateSet.NoteCandidates(S, Args, Cands);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008817 break;
David Blaikie5e328052019-05-03 00:44:50 +00008818 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008819 case OR_Deleted: {
8820 S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function)
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008821 << OnlyArg->getType() << DestType.getNonReferenceType()
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008822 << Args[0]->getSourceRange();
8823 OverloadCandidateSet::iterator Best;
John McCall5c32be02010-08-24 20:38:10 +00008824 OverloadingResult Ovl
Richard Smith67ef14f2017-09-26 18:37:55 +00008825 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008826 if (Ovl == OR_Deleted) {
Richard Smith852265f2012-03-30 20:53:28 +00008827 S.NoteDeletedFunction(Best->Function);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008828 } else {
Jeffrey Yasskin1615d452009-12-12 05:05:38 +00008829 llvm_unreachable("Inconsistent overload resolution?");
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008830 }
8831 break;
8832 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008833
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008834 case OR_Success:
Jeffrey Yasskin1615d452009-12-12 05:05:38 +00008835 llvm_unreachable("Conversion did not fail!");
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008836 }
8837 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008838
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008839 case FK_NonConstLValueReferenceBindingToTemporary:
Sebastian Redl29526f02011-11-27 16:50:07 +00008840 if (isa<InitListExpr>(Args[0])) {
8841 S.Diag(Kind.getLocation(),
8842 diag::err_lvalue_reference_bind_to_initlist)
8843 << DestType.getNonReferenceType().isVolatileQualified()
8844 << DestType.getNonReferenceType()
8845 << Args[0]->getSourceRange();
8846 break;
8847 }
Adrian Prantlf3b3ccd2017-12-19 22:06:11 +00008848 LLVM_FALLTHROUGH;
Sebastian Redl29526f02011-11-27 16:50:07 +00008849
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008850 case FK_NonConstLValueReferenceBindingToUnrelated:
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008851 S.Diag(Kind.getLocation(),
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008852 Failure == FK_NonConstLValueReferenceBindingToTemporary
8853 ? diag::err_lvalue_reference_bind_to_temporary
8854 : diag::err_lvalue_reference_bind_to_unrelated)
Douglas Gregord1e08642010-01-29 19:39:15 +00008855 << DestType.getNonReferenceType().isVolatileQualified()
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008856 << DestType.getNonReferenceType()
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008857 << OnlyArg->getType()
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008858 << Args[0]->getSourceRange();
8859 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008860
Richard Smithb8c0f552016-12-09 18:49:13 +00008861 case FK_NonConstLValueReferenceBindingToBitfield: {
8862 // We don't necessarily have an unambiguous source bit-field.
8863 FieldDecl *BitField = Args[0]->getSourceBitField();
8864 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield)
8865 << DestType.isVolatileQualified()
8866 << (BitField ? BitField->getDeclName() : DeclarationName())
8867 << (BitField != nullptr)
8868 << Args[0]->getSourceRange();
8869 if (BitField)
8870 S.Diag(BitField->getLocation(), diag::note_bitfield_decl);
8871 break;
8872 }
8873
8874 case FK_NonConstLValueReferenceBindingToVectorElement:
8875 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element)
8876 << DestType.isVolatileQualified()
8877 << Args[0]->getSourceRange();
8878 break;
8879
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008880 case FK_RValueReferenceBindingToLValue:
8881 S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref)
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008882 << DestType.getNonReferenceType() << OnlyArg->getType()
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008883 << Args[0]->getSourceRange();
8884 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008885
Anastasia Stulova5145b1e2019-06-05 14:03:34 +00008886 case FK_ReferenceAddrspaceMismatchTemporary:
8887 S.Diag(Kind.getLocation(), diag::err_reference_bind_temporary_addrspace)
8888 << DestType << Args[0]->getSourceRange();
8889 break;
8890
Richard Trieuf956a492015-05-16 01:27:03 +00008891 case FK_ReferenceInitDropsQualifiers: {
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008892 QualType SourceType = OnlyArg->getType();
Richard Trieuf956a492015-05-16 01:27:03 +00008893 QualType NonRefType = DestType.getNonReferenceType();
8894 Qualifiers DroppedQualifiers =
8895 SourceType.getQualifiers() - NonRefType.getQualifiers();
8896
Anastasia Stulova3562edb2019-06-21 11:36:15 +00008897 if (!NonRefType.getQualifiers().isAddressSpaceSupersetOf(
8898 SourceType.getQualifiers()))
8899 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8900 << NonRefType << SourceType << 1 /*addr space*/
8901 << Args[0]->getSourceRange();
8902 else
8903 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8904 << NonRefType << SourceType << 0 /*cv quals*/
8905 << Qualifiers::fromCVRMask(DroppedQualifiers.getCVRQualifiers())
8906 << DroppedQualifiers.getCVRQualifiers() << Args[0]->getSourceRange();
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008907 break;
Richard Trieuf956a492015-05-16 01:27:03 +00008908 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008909
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008910 case FK_ReferenceInitFailed:
8911 S.Diag(Kind.getLocation(), diag::err_reference_bind_failed)
8912 << DestType.getNonReferenceType()
Eric Fiselier1147f712019-02-01 22:06:02 +00008913 << DestType.getNonReferenceType()->isIncompleteType()
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008914 << OnlyArg->isLValue()
8915 << OnlyArg->getType()
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008916 << Args[0]->getSourceRange();
John McCall5ec7e7d2013-03-19 07:04:25 +00008917 emitBadConversionNotes(S, Entity, Args[0]);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008918 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008919
Douglas Gregorb491ed32011-02-19 21:32:49 +00008920 case FK_ConversionFailed: {
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008921 QualType FromType = OnlyArg->getType();
Richard Trieucaff2472011-11-23 22:32:32 +00008922 PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed)
Douglas Gregore1314a62009-12-18 05:02:21 +00008923 << (int)Entity.getKind()
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008924 << DestType
Nicolas Lesser8217a2a2018-07-12 17:43:49 +00008925 << OnlyArg->isLValue()
Douglas Gregorb491ed32011-02-19 21:32:49 +00008926 << FromType
Douglas Gregor3e1e5272009-12-09 23:02:17 +00008927 << Args[0]->getSourceRange();
Richard Trieucaff2472011-11-23 22:32:32 +00008928 S.HandleFunctionTypeMismatch(PDiag, FromType, DestType);
8929 S.Diag(Kind.getLocation(), PDiag);
John McCall5ec7e7d2013-03-19 07:04:25 +00008930 emitBadConversionNotes(S, Entity, Args[0]);
Douglas Gregor51e77d52009-12-10 17:56:55 +00008931 break;
Douglas Gregorb491ed32011-02-19 21:32:49 +00008932 }
John Wiegley01296292011-04-08 18:41:53 +00008933
8934 case FK_ConversionFromPropertyFailed:
8935 // No-op. This error has already been reported.
8936 break;
8937
Douglas Gregor51e77d52009-12-10 17:56:55 +00008938 case FK_TooManyInitsForScalar: {
Douglas Gregor85dabae2009-12-16 01:38:02 +00008939 SourceRange R;
8940
David Majnemerbd385442015-04-10 04:52:06 +00008941 auto *InitList = dyn_cast<InitListExpr>(Args[0]);
Benjamin Kramerc4284e32015-09-23 16:03:53 +00008942 if (InitList && InitList->getNumInits() >= 1) {
Stephen Kelly1c301dc2018-08-09 21:09:38 +00008943 R = SourceRange(InitList->getInit(0)->getEndLoc(), InitList->getEndLoc());
Benjamin Kramerc4284e32015-09-23 16:03:53 +00008944 } else {
8945 assert(Args.size() > 1 && "Expected multiple initializers!");
Stephen Kelly1c301dc2018-08-09 21:09:38 +00008946 R = SourceRange(Args.front()->getEndLoc(), Args.back()->getEndLoc());
Benjamin Kramerc4284e32015-09-23 16:03:53 +00008947 }
Douglas Gregor51e77d52009-12-10 17:56:55 +00008948
Alp Tokerb6cc5922014-05-03 03:45:55 +00008949 R.setBegin(S.getLocForEndOfToken(R.getBegin()));
Douglas Gregor8ec51732010-09-08 21:40:08 +00008950 if (Kind.isCStyleOrFunctionalCast())
8951 S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg)
8952 << R;
8953 else
8954 S.Diag(Kind.getLocation(), diag::err_excess_initializers)
8955 << /*scalar=*/2 << R;
Douglas Gregor51e77d52009-12-10 17:56:55 +00008956 break;
8957 }
8958
Richard Smith49a6b6e2017-03-24 01:14:25 +00008959 case FK_ParenthesizedListInitForScalar:
8960 S.Diag(Kind.getLocation(), diag::err_list_init_in_parens)
8961 << 0 << Entity.getType() << Args[0]->getSourceRange();
8962 break;
8963
Douglas Gregor51e77d52009-12-10 17:56:55 +00008964 case FK_ReferenceBindingToInitList:
8965 S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list)
8966 << DestType.getNonReferenceType() << Args[0]->getSourceRange();
8967 break;
8968
8969 case FK_InitListBadDestinationType:
8970 S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type)
8971 << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange();
8972 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008973
Sebastian Redl6901c0d2011-12-22 18:58:38 +00008974 case FK_ListConstructorOverloadFailed:
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00008975 case FK_ConstructorOverloadFailed: {
8976 SourceRange ArgsRange;
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00008977 if (Args.size())
Stephen Kellyf2ceec42018-08-09 21:08:08 +00008978 ArgsRange =
Stephen Kelly1c301dc2018-08-09 21:09:38 +00008979 SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008980
Sebastian Redl6901c0d2011-12-22 18:58:38 +00008981 if (Failure == FK_ListConstructorOverloadFailed) {
Nico Weber9709ebf2014-07-08 23:54:25 +00008982 assert(Args.size() == 1 &&
8983 "List construction from other than 1 argument.");
Sebastian Redl6901c0d2011-12-22 18:58:38 +00008984 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00008985 Args = MultiExprArg(InitList->getInits(), InitList->getNumInits());
Sebastian Redl6901c0d2011-12-22 18:58:38 +00008986 }
8987
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00008988 // FIXME: Using "DestType" for the entity we're printing is probably
8989 // bad.
8990 switch (FailedOverloadResult) {
8991 case OR_Ambiguous:
David Blaikie5e328052019-05-03 00:44:50 +00008992 FailedCandidateSet.NoteCandidates(
8993 PartialDiagnosticAt(Kind.getLocation(),
8994 S.PDiag(diag::err_ovl_ambiguous_init)
8995 << DestType << ArgsRange),
8996 S, OCD_ViableCandidates, Args);
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00008997 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00008998
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00008999 case OR_No_Viable_Function:
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009000 if (Kind.getKind() == InitializationKind::IK_Default &&
9001 (Entity.getKind() == InitializedEntity::EK_Base ||
9002 Entity.getKind() == InitializedEntity::EK_Member) &&
9003 isa<CXXConstructorDecl>(S.CurContext)) {
9004 // This is implicit default initialization of a member or
9005 // base within a constructor. If no viable function was
Nico Webera6916892016-06-10 18:53:04 +00009006 // found, notify the user that they need to explicitly
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009007 // initialize this base/member.
9008 CXXConstructorDecl *Constructor
9009 = cast<CXXConstructorDecl>(S.CurContext);
Richard Smith5179eb72016-06-28 19:03:57 +00009010 const CXXRecordDecl *InheritedFrom = nullptr;
9011 if (auto Inherited = Constructor->getInheritedConstructor())
9012 InheritedFrom = Inherited.getShadowDecl()->getNominatedBaseClass();
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009013 if (Entity.getKind() == InitializedEntity::EK_Base) {
9014 S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
Richard Smith5179eb72016-06-28 19:03:57 +00009015 << (InheritedFrom ? 2 : Constructor->isImplicit() ? 1 : 0)
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009016 << S.Context.getTypeDeclType(Constructor->getParent())
9017 << /*base=*/0
Richard Smith5179eb72016-06-28 19:03:57 +00009018 << Entity.getType()
9019 << InheritedFrom;
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009020
9021 RecordDecl *BaseDecl
9022 = Entity.getBaseSpecifier()->getType()->getAs<RecordType>()
9023 ->getDecl();
9024 S.Diag(BaseDecl->getLocation(), diag::note_previous_decl)
9025 << S.Context.getTagDeclType(BaseDecl);
9026 } else {
9027 S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
Richard Smith5179eb72016-06-28 19:03:57 +00009028 << (InheritedFrom ? 2 : Constructor->isImplicit() ? 1 : 0)
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009029 << S.Context.getTypeDeclType(Constructor->getParent())
9030 << /*member=*/1
Richard Smith5179eb72016-06-28 19:03:57 +00009031 << Entity.getName()
9032 << InheritedFrom;
Alp Toker2afa8782014-05-28 12:20:14 +00009033 S.Diag(Entity.getDecl()->getLocation(),
9034 diag::note_member_declared_at);
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009035
9036 if (const RecordType *Record
9037 = Entity.getType()->getAs<RecordType>())
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009038 S.Diag(Record->getDecl()->getLocation(),
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009039 diag::note_previous_decl)
9040 << S.Context.getTagDeclType(Record->getDecl());
9041 }
9042 break;
9043 }
9044
David Blaikie5e328052019-05-03 00:44:50 +00009045 FailedCandidateSet.NoteCandidates(
9046 PartialDiagnosticAt(
9047 Kind.getLocation(),
9048 S.PDiag(diag::err_ovl_no_viable_function_in_init)
9049 << DestType << ArgsRange),
9050 S, OCD_AllCandidates, Args);
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00009051 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009052
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00009053 case OR_Deleted: {
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00009054 OverloadCandidateSet::iterator Best;
John McCall5c32be02010-08-24 20:38:10 +00009055 OverloadingResult Ovl
9056 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
Douglas Gregor74f7d502012-02-15 19:33:52 +00009057 if (Ovl != OR_Deleted) {
9058 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
Erik Pilkington13ee62f2019-03-20 19:26:33 +00009059 << DestType << ArgsRange;
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00009060 llvm_unreachable("Inconsistent overload resolution?");
Douglas Gregor74f7d502012-02-15 19:33:52 +00009061 break;
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00009062 }
Fangrui Song6907ce22018-07-30 19:24:48 +00009063
Douglas Gregor74f7d502012-02-15 19:33:52 +00009064 // If this is a defaulted or implicitly-declared function, then
9065 // it was implicitly deleted. Make it clear that the deletion was
9066 // implicit.
Richard Smith852265f2012-03-30 20:53:28 +00009067 if (S.isImplicitlyDeleted(Best->Function))
Douglas Gregor74f7d502012-02-15 19:33:52 +00009068 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_special_init)
Richard Smith852265f2012-03-30 20:53:28 +00009069 << S.getSpecialMember(cast<CXXMethodDecl>(Best->Function))
Douglas Gregor74f7d502012-02-15 19:33:52 +00009070 << DestType << ArgsRange;
Richard Smith852265f2012-03-30 20:53:28 +00009071 else
9072 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
Erik Pilkington13ee62f2019-03-20 19:26:33 +00009073 << DestType << ArgsRange;
Richard Smith852265f2012-03-30 20:53:28 +00009074
9075 S.NoteDeletedFunction(Best->Function);
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00009076 break;
9077 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009078
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00009079 case OR_Success:
9080 llvm_unreachable("Conversion did not fail!");
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00009081 }
Douglas Gregor1e7ffa72009-12-14 20:49:26 +00009082 }
David Blaikie60deeee2012-01-17 08:24:58 +00009083 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009084
Douglas Gregor85dabae2009-12-16 01:38:02 +00009085 case FK_DefaultInitOfConst:
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009086 if (Entity.getKind() == InitializedEntity::EK_Member &&
9087 isa<CXXConstructorDecl>(S.CurContext)) {
9088 // This is implicit default-initialization of a const member in
9089 // a constructor. Complain that it needs to be explicitly
9090 // initialized.
9091 CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext);
9092 S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor)
Richard Smithc2bc61b2013-03-18 21:12:30 +00009093 << (Constructor->getInheritedConstructor() ? 2 :
9094 Constructor->isImplicit() ? 1 : 0)
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009095 << S.Context.getTypeDeclType(Constructor->getParent())
9096 << /*const=*/1
9097 << Entity.getName();
9098 S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl)
9099 << Entity.getName();
9100 } else {
9101 S.Diag(Kind.getLocation(), diag::err_default_init_const)
Nico Weber9386c822014-07-23 05:16:10 +00009102 << DestType << (bool)DestType->getAs<RecordType>();
Douglas Gregor7ae2d772010-01-31 09:12:51 +00009103 }
Douglas Gregor85dabae2009-12-16 01:38:02 +00009104 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009105
Sebastian Redl7de1fb42011-09-24 17:47:52 +00009106 case FK_Incomplete:
Douglas Gregor85f34232012-04-10 20:43:46 +00009107 S.RequireCompleteType(Kind.getLocation(), FailedIncompleteType,
Sebastian Redl7de1fb42011-09-24 17:47:52 +00009108 diag::err_init_incomplete_type);
9109 break;
9110
Sebastian Redlb49c46c2011-09-24 17:48:00 +00009111 case FK_ListInitializationFailed: {
9112 // Run the init list checker again to emit diagnostics.
Richard Smith0449aaf2013-11-21 23:30:57 +00009113 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9114 diagnoseListInit(S, Entity, InitList);
Sebastian Redlb49c46c2011-09-24 17:48:00 +00009115 break;
9116 }
John McCall4124c492011-10-17 18:40:02 +00009117
9118 case FK_PlaceholderType: {
9119 // FIXME: Already diagnosed!
9120 break;
9121 }
Sebastian Redlc1839b12012-01-17 22:49:42 +00009122
Sebastian Redl048a6d72012-04-01 19:54:59 +00009123 case FK_ExplicitConstructor: {
9124 S.Diag(Kind.getLocation(), diag::err_selected_explicit_constructor)
9125 << Args[0]->getSourceRange();
9126 OverloadCandidateSet::iterator Best;
9127 OverloadingResult Ovl
9128 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
Matt Beaumont-Gay5dcce092012-04-02 19:05:35 +00009129 (void)Ovl;
Sebastian Redl048a6d72012-04-01 19:54:59 +00009130 assert(Ovl == OR_Success && "Inconsistent overload resolution");
9131 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
Richard Smith60437622017-02-09 19:17:44 +00009132 S.Diag(CtorDecl->getLocation(),
9133 diag::note_explicit_ctor_deduction_guide_here) << false;
Sebastian Redl048a6d72012-04-01 19:54:59 +00009134 break;
9135 }
Douglas Gregor3e1e5272009-12-09 23:02:17 +00009136 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009137
Douglas Gregor4f4946a2010-04-22 00:20:18 +00009138 PrintInitLocationNote(S, Entity);
Douglas Gregor3e1e5272009-12-09 23:02:17 +00009139 return true;
9140}
Douglas Gregore1314a62009-12-18 05:02:21 +00009141
Chris Lattner0e62c1c2011-07-23 10:55:15 +00009142void InitializationSequence::dump(raw_ostream &OS) const {
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009143 switch (SequenceKind) {
9144 case FailedSequence: {
9145 OS << "Failed sequence: ";
9146 switch (Failure) {
9147 case FK_TooManyInitsForReference:
9148 OS << "too many initializers for reference";
9149 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009150
Richard Smith49a6b6e2017-03-24 01:14:25 +00009151 case FK_ParenthesizedListInitForReference:
9152 OS << "parenthesized list init for reference";
9153 break;
9154
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009155 case FK_ArrayNeedsInitList:
9156 OS << "array requires initializer list";
9157 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009158
George Burgess IV3e3bb95b2015-12-02 21:58:08 +00009159 case FK_AddressOfUnaddressableFunction:
9160 OS << "address of unaddressable function was taken";
9161 break;
9162
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009163 case FK_ArrayNeedsInitListOrStringLiteral:
9164 OS << "array requires initializer list or string literal";
9165 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009166
Hans Wennborg8f62c5c2013-05-15 11:03:04 +00009167 case FK_ArrayNeedsInitListOrWideStringLiteral:
9168 OS << "array requires initializer list or wide string literal";
9169 break;
9170
9171 case FK_NarrowStringIntoWideCharArray:
9172 OS << "narrow string into wide char array";
9173 break;
9174
9175 case FK_WideStringIntoCharArray:
9176 OS << "wide string into char array";
9177 break;
9178
9179 case FK_IncompatWideStringIntoWideChar:
9180 OS << "incompatible wide string into wide char array";
9181 break;
9182
Richard Smith3a8244d2018-05-01 05:02:45 +00009183 case FK_PlainStringIntoUTF8Char:
9184 OS << "plain string literal into char8_t array";
9185 break;
9186
9187 case FK_UTF8StringIntoPlainChar:
9188 OS << "u8 string literal into char array";
9189 break;
9190
Douglas Gregore2f943b2011-02-22 18:29:51 +00009191 case FK_ArrayTypeMismatch:
9192 OS << "array type mismatch";
9193 break;
9194
9195 case FK_NonConstantArrayInit:
9196 OS << "non-constant array initializer";
9197 break;
9198
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009199 case FK_AddressOfOverloadFailed:
9200 OS << "address of overloaded function failed";
9201 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009202
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009203 case FK_ReferenceInitOverloadFailed:
9204 OS << "overload resolution for reference initialization failed";
9205 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009206
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009207 case FK_NonConstLValueReferenceBindingToTemporary:
9208 OS << "non-const lvalue reference bound to temporary";
9209 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009210
Richard Smithb8c0f552016-12-09 18:49:13 +00009211 case FK_NonConstLValueReferenceBindingToBitfield:
9212 OS << "non-const lvalue reference bound to bit-field";
9213 break;
9214
9215 case FK_NonConstLValueReferenceBindingToVectorElement:
9216 OS << "non-const lvalue reference bound to vector element";
9217 break;
9218
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009219 case FK_NonConstLValueReferenceBindingToUnrelated:
9220 OS << "non-const lvalue reference bound to unrelated type";
9221 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009222
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009223 case FK_RValueReferenceBindingToLValue:
9224 OS << "rvalue reference bound to an lvalue";
9225 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009226
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009227 case FK_ReferenceInitDropsQualifiers:
9228 OS << "reference initialization drops qualifiers";
9229 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009230
Anastasia Stulova5145b1e2019-06-05 14:03:34 +00009231 case FK_ReferenceAddrspaceMismatchTemporary:
9232 OS << "reference with mismatching address space bound to temporary";
9233 break;
9234
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009235 case FK_ReferenceInitFailed:
9236 OS << "reference initialization failed";
9237 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009238
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009239 case FK_ConversionFailed:
9240 OS << "conversion failed";
9241 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009242
John Wiegley01296292011-04-08 18:41:53 +00009243 case FK_ConversionFromPropertyFailed:
9244 OS << "conversion from property failed";
9245 break;
9246
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009247 case FK_TooManyInitsForScalar:
9248 OS << "too many initializers for scalar";
9249 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009250
Richard Smith49a6b6e2017-03-24 01:14:25 +00009251 case FK_ParenthesizedListInitForScalar:
9252 OS << "parenthesized list init for reference";
9253 break;
9254
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009255 case FK_ReferenceBindingToInitList:
9256 OS << "referencing binding to initializer list";
9257 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009258
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009259 case FK_InitListBadDestinationType:
9260 OS << "initializer list for non-aggregate, non-scalar type";
9261 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009262
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009263 case FK_UserConversionOverloadFailed:
9264 OS << "overloading failed for user-defined conversion";
9265 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009266
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009267 case FK_ConstructorOverloadFailed:
9268 OS << "constructor overloading failed";
9269 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009270
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009271 case FK_DefaultInitOfConst:
9272 OS << "default initialization of a const variable";
9273 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009274
Douglas Gregor3f4f03a2010-05-20 22:12:02 +00009275 case FK_Incomplete:
9276 OS << "initialization of incomplete type";
9277 break;
Sebastian Redl7de1fb42011-09-24 17:47:52 +00009278
9279 case FK_ListInitializationFailed:
Sebastian Redlb49c46c2011-09-24 17:48:00 +00009280 OS << "list initialization checker failure";
John McCall4124c492011-10-17 18:40:02 +00009281 break;
9282
John McCalla59dc2f2012-01-05 00:13:19 +00009283 case FK_VariableLengthArrayHasInitializer:
9284 OS << "variable length array has an initializer";
9285 break;
9286
John McCall4124c492011-10-17 18:40:02 +00009287 case FK_PlaceholderType:
9288 OS << "initializer expression isn't contextually valid";
9289 break;
Nick Lewycky097f47c2011-12-22 20:21:32 +00009290
9291 case FK_ListConstructorOverloadFailed:
9292 OS << "list constructor overloading failed";
9293 break;
Sebastian Redlc1839b12012-01-17 22:49:42 +00009294
Sebastian Redl048a6d72012-04-01 19:54:59 +00009295 case FK_ExplicitConstructor:
9296 OS << "list copy initialization chose explicit constructor";
9297 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009298 }
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009299 OS << '\n';
9300 return;
9301 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009302
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009303 case DependentSequence:
Sebastian Redld201edf2011-06-05 13:59:11 +00009304 OS << "Dependent sequence\n";
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009305 return;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009306
Sebastian Redld201edf2011-06-05 13:59:11 +00009307 case NormalSequence:
9308 OS << "Normal sequence: ";
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009309 break;
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009310 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009311
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009312 for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) {
9313 if (S != step_begin()) {
9314 OS << " -> ";
9315 }
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009316
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009317 switch (S->Kind) {
9318 case SK_ResolveAddressOfOverloadedFunction:
9319 OS << "resolve address of overloaded function";
9320 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009321
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009322 case SK_CastDerivedToBaseRValue:
Richard Smithb8c0f552016-12-09 18:49:13 +00009323 OS << "derived-to-base (rvalue)";
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009324 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009325
Sebastian Redlc57d34b2010-07-20 04:20:21 +00009326 case SK_CastDerivedToBaseXValue:
Richard Smithb8c0f552016-12-09 18:49:13 +00009327 OS << "derived-to-base (xvalue)";
Sebastian Redlc57d34b2010-07-20 04:20:21 +00009328 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009329
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009330 case SK_CastDerivedToBaseLValue:
Richard Smithb8c0f552016-12-09 18:49:13 +00009331 OS << "derived-to-base (lvalue)";
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009332 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009333
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009334 case SK_BindReference:
9335 OS << "bind reference to lvalue";
9336 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009337
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009338 case SK_BindReferenceToTemporary:
9339 OS << "bind reference to a temporary";
9340 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009341
Richard Smithb8c0f552016-12-09 18:49:13 +00009342 case SK_FinalCopy:
9343 OS << "final copy in class direct-initialization";
9344 break;
9345
Douglas Gregorc9cd64e2010-04-18 07:40:54 +00009346 case SK_ExtraneousCopyToTemporary:
9347 OS << "extraneous C++03 copy to temporary";
9348 break;
9349
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009350 case SK_UserConversion:
Benjamin Kramerb89514a2011-10-14 18:45:37 +00009351 OS << "user-defined conversion via " << *S->Function.Function;
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009352 break;
Sebastian Redlc57d34b2010-07-20 04:20:21 +00009353
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009354 case SK_QualificationConversionRValue:
9355 OS << "qualification conversion (rvalue)";
Sebastian Redl29526f02011-11-27 16:50:07 +00009356 break;
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009357
Sebastian Redlc57d34b2010-07-20 04:20:21 +00009358 case SK_QualificationConversionXValue:
9359 OS << "qualification conversion (xvalue)";
Sebastian Redl29526f02011-11-27 16:50:07 +00009360 break;
Sebastian Redlc57d34b2010-07-20 04:20:21 +00009361
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009362 case SK_QualificationConversionLValue:
9363 OS << "qualification conversion (lvalue)";
9364 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009365
Richard Smith77be48a2014-07-31 06:31:19 +00009366 case SK_AtomicConversion:
9367 OS << "non-atomic-to-atomic conversion";
9368 break;
9369
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009370 case SK_ConversionSequence:
9371 OS << "implicit conversion sequence (";
Douglas Gregor9f2ed472013-11-08 02:16:10 +00009372 S->ICS->dump(); // FIXME: use OS
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009373 OS << ")";
9374 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009375
Richard Smithaaa0ec42013-09-21 21:19:19 +00009376 case SK_ConversionSequenceNoNarrowing:
9377 OS << "implicit conversion sequence with narrowing prohibited (";
Douglas Gregor9f2ed472013-11-08 02:16:10 +00009378 S->ICS->dump(); // FIXME: use OS
Richard Smithaaa0ec42013-09-21 21:19:19 +00009379 OS << ")";
9380 break;
9381
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009382 case SK_ListInitialization:
Sebastian Redl7de1fb42011-09-24 17:47:52 +00009383 OS << "list aggregate initialization";
9384 break;
9385
Sebastian Redl29526f02011-11-27 16:50:07 +00009386 case SK_UnwrapInitList:
9387 OS << "unwrap reference initializer list";
9388 break;
9389
9390 case SK_RewrapInitList:
9391 OS << "rewrap reference initializer list";
9392 break;
9393
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009394 case SK_ConstructorInitialization:
9395 OS << "constructor initialization";
9396 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009397
Richard Smith53324112014-07-16 21:33:43 +00009398 case SK_ConstructorInitializationFromList:
9399 OS << "list initialization via constructor";
9400 break;
9401
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009402 case SK_ZeroInitialization:
9403 OS << "zero initialization";
9404 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009405
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009406 case SK_CAssignment:
9407 OS << "C assignment";
9408 break;
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009409
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009410 case SK_StringInit:
9411 OS << "string initialization";
9412 break;
Douglas Gregor8b2d2fe2010-08-07 11:51:51 +00009413
9414 case SK_ObjCObjectConversion:
9415 OS << "Objective-C object conversion";
9416 break;
Douglas Gregore2f943b2011-02-22 18:29:51 +00009417
Richard Smith410306b2016-12-12 02:53:20 +00009418 case SK_ArrayLoopIndex:
9419 OS << "indexing for array initialization loop";
9420 break;
9421
9422 case SK_ArrayLoopInit:
9423 OS << "array initialization loop";
9424 break;
9425
Douglas Gregore2f943b2011-02-22 18:29:51 +00009426 case SK_ArrayInit:
9427 OS << "array initialization";
9428 break;
John McCall31168b02011-06-15 23:02:42 +00009429
Richard Smith378b8c82016-12-14 03:22:16 +00009430 case SK_GNUArrayInit:
9431 OS << "array initialization (GNU extension)";
9432 break;
9433
Richard Smithebeed412012-02-15 22:38:09 +00009434 case SK_ParenthesizedArrayInit:
9435 OS << "parenthesized array initialization";
9436 break;
9437
John McCall31168b02011-06-15 23:02:42 +00009438 case SK_PassByIndirectCopyRestore:
9439 OS << "pass by indirect copy and restore";
9440 break;
9441
9442 case SK_PassByIndirectRestore:
9443 OS << "pass by indirect restore";
9444 break;
9445
9446 case SK_ProduceObjCObject:
9447 OS << "Objective-C object retension";
9448 break;
Sebastian Redlc1839b12012-01-17 22:49:42 +00009449
9450 case SK_StdInitializerList:
9451 OS << "std::initializer_list from initializer list";
9452 break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00009453
Richard Smithf8adcdc2014-07-17 05:12:35 +00009454 case SK_StdInitializerListConstructorCall:
9455 OS << "list initialization from std::initializer_list";
9456 break;
9457
Guy Benyei61054192013-02-07 10:55:47 +00009458 case SK_OCLSamplerInit:
9459 OS << "OpenCL sampler_t from integer constant";
9460 break;
9461
Andrew Savonichevb555b762018-10-23 15:19:20 +00009462 case SK_OCLZeroOpaqueType:
9463 OS << "OpenCL opaque type from zero";
Egor Churaev89831422016-12-23 14:55:49 +00009464 break;
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009465 }
Richard Smith6b216962013-02-05 05:52:24 +00009466
9467 OS << " [" << S->Type.getAsString() << ']';
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009468 }
Richard Smith6b216962013-02-05 05:52:24 +00009469
9470 OS << '\n';
Douglas Gregor65eb86e2010-01-29 19:14:02 +00009471}
9472
9473void InitializationSequence::dump() const {
9474 dump(llvm::errs());
9475}
9476
Nico Weber3d7f00d2018-06-19 23:19:34 +00009477static bool NarrowingErrs(const LangOptions &L) {
9478 return L.CPlusPlus11 &&
9479 (!L.MicrosoftExt || L.isCompatibleWithMSVC(LangOptions::MSVC2015));
9480}
9481
Richard Smithaaa0ec42013-09-21 21:19:19 +00009482static void DiagnoseNarrowingInInitList(Sema &S,
9483 const ImplicitConversionSequence &ICS,
9484 QualType PreNarrowingType,
Richard Smith66e05fe2012-01-18 05:21:49 +00009485 QualType EntityType,
Richard Smith66e05fe2012-01-18 05:21:49 +00009486 const Expr *PostInit) {
Craig Topperc3ec1492014-05-26 06:22:03 +00009487 const StandardConversionSequence *SCS = nullptr;
Richard Smith66e05fe2012-01-18 05:21:49 +00009488 switch (ICS.getKind()) {
9489 case ImplicitConversionSequence::StandardConversion:
9490 SCS = &ICS.Standard;
9491 break;
9492 case ImplicitConversionSequence::UserDefinedConversion:
9493 SCS = &ICS.UserDefined.After;
9494 break;
9495 case ImplicitConversionSequence::AmbiguousConversion:
9496 case ImplicitConversionSequence::EllipsisConversion:
9497 case ImplicitConversionSequence::BadConversion:
9498 return;
9499 }
9500
Richard Smith66e05fe2012-01-18 05:21:49 +00009501 // C++11 [dcl.init.list]p7: Check whether this is a narrowing conversion.
9502 APValue ConstantValue;
Richard Smith5614ca72012-03-23 23:55:39 +00009503 QualType ConstantType;
9504 switch (SCS->getNarrowingKind(S.Context, PostInit, ConstantValue,
9505 ConstantType)) {
Richard Smith66e05fe2012-01-18 05:21:49 +00009506 case NK_Not_Narrowing:
Richard Smith52e624f2016-12-21 21:42:57 +00009507 case NK_Dependent_Narrowing:
Richard Smith66e05fe2012-01-18 05:21:49 +00009508 // No narrowing occurred.
9509 return;
9510
9511 case NK_Type_Narrowing:
9512 // This was a floating-to-integer conversion, which is always considered a
9513 // narrowing conversion even if the value is a constant and can be
9514 // represented exactly as an integer.
Stephen Kellyf2ceec42018-08-09 21:08:08 +00009515 S.Diag(PostInit->getBeginLoc(), NarrowingErrs(S.getLangOpts())
Nico Weber3d7f00d2018-06-19 23:19:34 +00009516 ? diag::ext_init_list_type_narrowing
9517 : diag::warn_init_list_type_narrowing)
9518 << PostInit->getSourceRange()
9519 << PreNarrowingType.getLocalUnqualifiedType()
9520 << EntityType.getLocalUnqualifiedType();
Richard Smith66e05fe2012-01-18 05:21:49 +00009521 break;
9522
9523 case NK_Constant_Narrowing:
9524 // A constant value was narrowed.
Stephen Kellyf2ceec42018-08-09 21:08:08 +00009525 S.Diag(PostInit->getBeginLoc(),
Nico Weber3d7f00d2018-06-19 23:19:34 +00009526 NarrowingErrs(S.getLangOpts())
9527 ? diag::ext_init_list_constant_narrowing
9528 : diag::warn_init_list_constant_narrowing)
9529 << PostInit->getSourceRange()
9530 << ConstantValue.getAsString(S.getASTContext(), ConstantType)
9531 << EntityType.getLocalUnqualifiedType();
Richard Smith66e05fe2012-01-18 05:21:49 +00009532 break;
9533
9534 case NK_Variable_Narrowing:
9535 // A variable's value may have been narrowed.
Stephen Kellyf2ceec42018-08-09 21:08:08 +00009536 S.Diag(PostInit->getBeginLoc(),
Nico Weber3d7f00d2018-06-19 23:19:34 +00009537 NarrowingErrs(S.getLangOpts())
9538 ? diag::ext_init_list_variable_narrowing
9539 : diag::warn_init_list_variable_narrowing)
9540 << PostInit->getSourceRange()
9541 << PreNarrowingType.getLocalUnqualifiedType()
9542 << EntityType.getLocalUnqualifiedType();
Richard Smith66e05fe2012-01-18 05:21:49 +00009543 break;
9544 }
Jeffrey Yasskina6667812011-07-26 23:20:30 +00009545
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00009546 SmallString<128> StaticCast;
Jeffrey Yasskina6667812011-07-26 23:20:30 +00009547 llvm::raw_svector_ostream OS(StaticCast);
9548 OS << "static_cast<";
9549 if (const TypedefType *TT = EntityType->getAs<TypedefType>()) {
9550 // It's important to use the typedef's name if there is one so that the
9551 // fixit doesn't break code using types like int64_t.
9552 //
9553 // FIXME: This will break if the typedef requires qualification. But
9554 // getQualifiedNameAsString() includes non-machine-parsable components.
Benjamin Kramerb89514a2011-10-14 18:45:37 +00009555 OS << *TT->getDecl();
Jeffrey Yasskina6667812011-07-26 23:20:30 +00009556 } else if (const BuiltinType *BT = EntityType->getAs<BuiltinType>())
David Blaikiebbafb8a2012-03-11 07:00:24 +00009557 OS << BT->getName(S.getLangOpts());
Jeffrey Yasskina6667812011-07-26 23:20:30 +00009558 else {
9559 // Oops, we didn't find the actual type of the variable. Don't emit a fixit
9560 // with a broken cast.
9561 return;
9562 }
9563 OS << ">(";
Stephen Kellyf2ceec42018-08-09 21:08:08 +00009564 S.Diag(PostInit->getBeginLoc(), diag::note_init_list_narrowing_silence)
Alp Tokerb6cc5922014-05-03 03:45:55 +00009565 << PostInit->getSourceRange()
Stephen Kellyf2ceec42018-08-09 21:08:08 +00009566 << FixItHint::CreateInsertion(PostInit->getBeginLoc(), OS.str())
Alp Tokerb6cc5922014-05-03 03:45:55 +00009567 << FixItHint::CreateInsertion(
Stephen Kelly1c301dc2018-08-09 21:09:38 +00009568 S.getLocForEndOfToken(PostInit->getEndLoc()), ")");
Jeffrey Yasskina6667812011-07-26 23:20:30 +00009569}
9570
Douglas Gregore1314a62009-12-18 05:02:21 +00009571//===----------------------------------------------------------------------===//
9572// Initialization helper functions
9573//===----------------------------------------------------------------------===//
Alexis Hunt1f69a022011-05-12 22:46:29 +00009574bool
9575Sema::CanPerformCopyInitialization(const InitializedEntity &Entity,
9576 ExprResult Init) {
9577 if (Init.isInvalid())
9578 return false;
9579
9580 Expr *InitE = Init.get();
9581 assert(InitE && "No initialization expression");
9582
Stephen Kellyf2ceec42018-08-09 21:08:08 +00009583 InitializationKind Kind =
9584 InitializationKind::CreateCopy(InitE->getBeginLoc(), SourceLocation());
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00009585 InitializationSequence Seq(*this, Entity, Kind, InitE);
Sebastian Redlc7ca5872011-06-05 12:23:28 +00009586 return !Seq.Failed();
Alexis Hunt1f69a022011-05-12 22:46:29 +00009587}
9588
NAKAMURA Takumif9cbcc42011-01-27 07:10:08 +00009589ExprResult
Douglas Gregore1314a62009-12-18 05:02:21 +00009590Sema::PerformCopyInitialization(const InitializedEntity &Entity,
9591 SourceLocation EqualLoc,
Jeffrey Yasskina6667812011-07-26 23:20:30 +00009592 ExprResult Init,
Douglas Gregor6073dca2012-02-24 23:56:31 +00009593 bool TopLevelOfInitList,
9594 bool AllowExplicit) {
Douglas Gregore1314a62009-12-18 05:02:21 +00009595 if (Init.isInvalid())
9596 return ExprError();
9597
John McCall1f425642010-11-11 03:21:53 +00009598 Expr *InitE = Init.get();
Douglas Gregore1314a62009-12-18 05:02:21 +00009599 assert(InitE && "No initialization expression?");
9600
9601 if (EqualLoc.isInvalid())
Stephen Kellyf2ceec42018-08-09 21:08:08 +00009602 EqualLoc = InitE->getBeginLoc();
Douglas Gregore1314a62009-12-18 05:02:21 +00009603
Stephen Kellyf2ceec42018-08-09 21:08:08 +00009604 InitializationKind Kind = InitializationKind::CreateCopy(
9605 InitE->getBeginLoc(), EqualLoc, AllowExplicit);
Richard Smithaaa0ec42013-09-21 21:19:19 +00009606 InitializationSequence Seq(*this, Entity, Kind, InitE, TopLevelOfInitList);
Jeffrey Yasskina6667812011-07-26 23:20:30 +00009607
Alex Lorenzde69ff92017-05-16 10:23:58 +00009608 // Prevent infinite recursion when performing parameter copy-initialization.
9609 const bool ShouldTrackCopy =
9610 Entity.isParameterKind() && Seq.isConstructorInitialization();
9611 if (ShouldTrackCopy) {
9612 if (llvm::find(CurrentParameterCopyTypes, Entity.getType()) !=
9613 CurrentParameterCopyTypes.end()) {
9614 Seq.SetOverloadFailure(
9615 InitializationSequence::FK_ConstructorOverloadFailed,
9616 OR_No_Viable_Function);
9617
9618 // Try to give a meaningful diagnostic note for the problematic
9619 // constructor.
9620 const auto LastStep = Seq.step_end() - 1;
9621 assert(LastStep->Kind ==
9622 InitializationSequence::SK_ConstructorInitialization);
9623 const FunctionDecl *Function = LastStep->Function.Function;
9624 auto Candidate =
9625 llvm::find_if(Seq.getFailedCandidateSet(),
9626 [Function](const OverloadCandidate &Candidate) -> bool {
9627 return Candidate.Viable &&
9628 Candidate.Function == Function &&
9629 Candidate.Conversions.size() > 0;
9630 });
9631 if (Candidate != Seq.getFailedCandidateSet().end() &&
9632 Function->getNumParams() > 0) {
9633 Candidate->Viable = false;
9634 Candidate->FailureKind = ovl_fail_bad_conversion;
9635 Candidate->Conversions[0].setBad(BadConversionSequence::no_conversion,
9636 InitE,
9637 Function->getParamDecl(0)->getType());
9638 }
9639 }
9640 CurrentParameterCopyTypes.push_back(Entity.getType());
9641 }
9642
Dmitri Gribenko8f8930f2013-05-03 15:05:50 +00009643 ExprResult Result = Seq.Perform(*this, Entity, Kind, InitE);
Richard Smith66e05fe2012-01-18 05:21:49 +00009644
Alex Lorenzde69ff92017-05-16 10:23:58 +00009645 if (ShouldTrackCopy)
9646 CurrentParameterCopyTypes.pop_back();
9647
Richard Smith66e05fe2012-01-18 05:21:49 +00009648 return Result;
Douglas Gregore1314a62009-12-18 05:02:21 +00009649}
Richard Smith60437622017-02-09 19:17:44 +00009650
Richard Smith1363e8f2017-09-07 07:22:36 +00009651/// Determine whether RD is, or is derived from, a specialization of CTD.
9652static bool isOrIsDerivedFromSpecializationOf(CXXRecordDecl *RD,
9653 ClassTemplateDecl *CTD) {
9654 auto NotSpecialization = [&] (const CXXRecordDecl *Candidate) {
9655 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Candidate);
9656 return !CTSD || !declaresSameEntity(CTSD->getSpecializedTemplate(), CTD);
9657 };
9658 return !(NotSpecialization(RD) && RD->forallBases(NotSpecialization));
9659}
9660
Richard Smith60437622017-02-09 19:17:44 +00009661QualType Sema::DeduceTemplateSpecializationFromInitializer(
9662 TypeSourceInfo *TSInfo, const InitializedEntity &Entity,
9663 const InitializationKind &Kind, MultiExprArg Inits) {
9664 auto *DeducedTST = dyn_cast<DeducedTemplateSpecializationType>(
9665 TSInfo->getType()->getContainedDeducedType());
9666 assert(DeducedTST && "not a deduced template specialization type");
9667
Richard Smith60437622017-02-09 19:17:44 +00009668 auto TemplateName = DeducedTST->getTemplateName();
Richard Smithcff42012018-09-28 03:18:53 +00009669 if (TemplateName.isDependent())
9670 return Context.DependentTy;
9671
9672 // We can only perform deduction for class templates.
Richard Smith60437622017-02-09 19:17:44 +00009673 auto *Template =
9674 dyn_cast_or_null<ClassTemplateDecl>(TemplateName.getAsTemplateDecl());
9675 if (!Template) {
9676 Diag(Kind.getLocation(),
9677 diag::err_deduced_non_class_template_specialization_type)
9678 << (int)getTemplateNameKindForDiagnostics(TemplateName) << TemplateName;
9679 if (auto *TD = TemplateName.getAsTemplateDecl())
9680 Diag(TD->getLocation(), diag::note_template_decl_here);
9681 return QualType();
9682 }
9683
Richard Smith32918772017-02-14 00:25:28 +00009684 // Can't deduce from dependent arguments.
Richard Smith8eeb16f2018-09-10 20:31:03 +00009685 if (Expr::hasAnyTypeDependentArguments(Inits)) {
9686 Diag(TSInfo->getTypeLoc().getBeginLoc(),
9687 diag::warn_cxx14_compat_class_template_argument_deduction)
9688 << TSInfo->getTypeLoc().getSourceRange() << 0;
Richard Smith32918772017-02-14 00:25:28 +00009689 return Context.DependentTy;
Richard Smith8eeb16f2018-09-10 20:31:03 +00009690 }
Richard Smith32918772017-02-14 00:25:28 +00009691
Richard Smith60437622017-02-09 19:17:44 +00009692 // FIXME: Perform "exact type" matching first, per CWG discussion?
9693 // Or implement this via an implied 'T(T) -> T' deduction guide?
9694
9695 // FIXME: Do we need/want a std::initializer_list<T> special case?
9696
Richard Smith32918772017-02-14 00:25:28 +00009697 // Look up deduction guides, including those synthesized from constructors.
9698 //
Richard Smith60437622017-02-09 19:17:44 +00009699 // C++1z [over.match.class.deduct]p1:
9700 // A set of functions and function templates is formed comprising:
Richard Smith32918772017-02-14 00:25:28 +00009701 // - For each constructor of the class template designated by the
9702 // template-name, a function template [...]
Richard Smith60437622017-02-09 19:17:44 +00009703 // - For each deduction-guide, a function or function template [...]
9704 DeclarationNameInfo NameInfo(
9705 Context.DeclarationNames.getCXXDeductionGuideName(Template),
9706 TSInfo->getTypeLoc().getEndLoc());
9707 LookupResult Guides(*this, NameInfo, LookupOrdinaryName);
9708 LookupQualifiedName(Guides, Template->getDeclContext());
Richard Smith60437622017-02-09 19:17:44 +00009709
9710 // FIXME: Do not diagnose inaccessible deduction guides. The standard isn't
9711 // clear on this, but they're not found by name so access does not apply.
9712 Guides.suppressDiagnostics();
9713
9714 // Figure out if this is list-initialization.
9715 InitListExpr *ListInit =
9716 (Inits.size() == 1 && Kind.getKind() != InitializationKind::IK_Direct)
9717 ? dyn_cast<InitListExpr>(Inits[0])
9718 : nullptr;
9719
9720 // C++1z [over.match.class.deduct]p1:
9721 // Initialization and overload resolution are performed as described in
9722 // [dcl.init] and [over.match.ctor], [over.match.copy], or [over.match.list]
9723 // (as appropriate for the type of initialization performed) for an object
9724 // of a hypothetical class type, where the selected functions and function
9725 // templates are considered to be the constructors of that class type
9726 //
9727 // Since we know we're initializing a class type of a type unrelated to that
9728 // of the initializer, this reduces to something fairly reasonable.
9729 OverloadCandidateSet Candidates(Kind.getLocation(),
9730 OverloadCandidateSet::CSK_Normal);
9731 OverloadCandidateSet::iterator Best;
Eric Fiselier73b51ae2019-01-17 21:44:24 +00009732
9733 bool HasAnyDeductionGuide = false;
Richard Smith76b90272019-05-09 03:59:21 +00009734 bool AllowExplicit = !Kind.isCopyInit() || ListInit;
Eric Fiselier73b51ae2019-01-17 21:44:24 +00009735
Richard Smith60437622017-02-09 19:17:44 +00009736 auto tryToResolveOverload =
9737 [&](bool OnlyListConstructors) -> OverloadingResult {
Richard Smith67ef14f2017-09-26 18:37:55 +00009738 Candidates.clear(OverloadCandidateSet::CSK_Normal);
Eric Fiselier73b51ae2019-01-17 21:44:24 +00009739 HasAnyDeductionGuide = false;
9740
Richard Smith32918772017-02-14 00:25:28 +00009741 for (auto I = Guides.begin(), E = Guides.end(); I != E; ++I) {
9742 NamedDecl *D = (*I)->getUnderlyingDecl();
Richard Smith60437622017-02-09 19:17:44 +00009743 if (D->isInvalidDecl())
9744 continue;
9745
Richard Smithbc491202017-02-17 20:05:37 +00009746 auto *TD = dyn_cast<FunctionTemplateDecl>(D);
9747 auto *GD = dyn_cast_or_null<CXXDeductionGuideDecl>(
9748 TD ? TD->getTemplatedDecl() : dyn_cast<FunctionDecl>(D));
9749 if (!GD)
Richard Smith60437622017-02-09 19:17:44 +00009750 continue;
9751
Eric Fiselier73b51ae2019-01-17 21:44:24 +00009752 if (!GD->isImplicit())
9753 HasAnyDeductionGuide = true;
9754
Richard Smith60437622017-02-09 19:17:44 +00009755 // C++ [over.match.ctor]p1: (non-list copy-initialization from non-class)
9756 // For copy-initialization, the candidate functions are all the
9757 // converting constructors (12.3.1) of that class.
9758 // C++ [over.match.copy]p1: (non-list copy-initialization from class)
9759 // The converting constructors of T are candidate functions.
Richard Smith76b90272019-05-09 03:59:21 +00009760 if (!AllowExplicit) {
Richard Smithafe4aa82017-02-10 02:19:05 +00009761 // Only consider converting constructors.
Richard Smithbc491202017-02-17 20:05:37 +00009762 if (GD->isExplicit())
Richard Smithafe4aa82017-02-10 02:19:05 +00009763 continue;
Richard Smith60437622017-02-09 19:17:44 +00009764
9765 // When looking for a converting constructor, deduction guides that
Richard Smithafe4aa82017-02-10 02:19:05 +00009766 // could never be called with one argument are not interesting to
9767 // check or note.
Richard Smithbc491202017-02-17 20:05:37 +00009768 if (GD->getMinRequiredArguments() > 1 ||
9769 (GD->getNumParams() == 0 && !GD->isVariadic()))
Richard Smith60437622017-02-09 19:17:44 +00009770 continue;
9771 }
9772
9773 // C++ [over.match.list]p1.1: (first phase list initialization)
9774 // Initially, the candidate functions are the initializer-list
9775 // constructors of the class T
Richard Smithbc491202017-02-17 20:05:37 +00009776 if (OnlyListConstructors && !isInitListConstructor(GD))
Richard Smith60437622017-02-09 19:17:44 +00009777 continue;
9778
9779 // C++ [over.match.list]p1.2: (second phase list initialization)
9780 // the candidate functions are all the constructors of the class T
9781 // C++ [over.match.ctor]p1: (all other cases)
9782 // the candidate functions are all the constructors of the class of
9783 // the object being initialized
9784
9785 // C++ [over.best.ics]p4:
9786 // When [...] the constructor [...] is a candidate by
9787 // - [over.match.copy] (in all cases)
9788 // FIXME: The "second phase of [over.match.list] case can also
9789 // theoretically happen here, but it's not clear whether we can
9790 // ever have a parameter of the right type.
9791 bool SuppressUserConversions = Kind.isCopyInit();
9792
Richard Smith60437622017-02-09 19:17:44 +00009793 if (TD)
Richard Smith32918772017-02-14 00:25:28 +00009794 AddTemplateOverloadCandidate(TD, I.getPair(), /*ExplicitArgs*/ nullptr,
Richard Smith76b90272019-05-09 03:59:21 +00009795 Inits, Candidates, SuppressUserConversions,
9796 /*PartialOverloading*/ false,
9797 AllowExplicit);
Richard Smith60437622017-02-09 19:17:44 +00009798 else
Richard Smithbc491202017-02-17 20:05:37 +00009799 AddOverloadCandidate(GD, I.getPair(), Inits, Candidates,
Richard Smith76b90272019-05-09 03:59:21 +00009800 SuppressUserConversions,
9801 /*PartialOverloading*/ false, AllowExplicit);
Richard Smith60437622017-02-09 19:17:44 +00009802 }
9803 return Candidates.BestViableFunction(*this, Kind.getLocation(), Best);
9804 };
9805
9806 OverloadingResult Result = OR_No_Viable_Function;
9807
9808 // C++11 [over.match.list]p1, per DR1467: for list-initialization, first
9809 // try initializer-list constructors.
9810 if (ListInit) {
Richard Smith32918772017-02-14 00:25:28 +00009811 bool TryListConstructors = true;
9812
9813 // Try list constructors unless the list is empty and the class has one or
9814 // more default constructors, in which case those constructors win.
9815 if (!ListInit->getNumInits()) {
9816 for (NamedDecl *D : Guides) {
9817 auto *FD = dyn_cast<FunctionDecl>(D->getUnderlyingDecl());
9818 if (FD && FD->getMinRequiredArguments() == 0) {
9819 TryListConstructors = false;
9820 break;
9821 }
9822 }
Richard Smith1363e8f2017-09-07 07:22:36 +00009823 } else if (ListInit->getNumInits() == 1) {
9824 // C++ [over.match.class.deduct]:
9825 // As an exception, the first phase in [over.match.list] (considering
9826 // initializer-list constructors) is omitted if the initializer list
9827 // consists of a single expression of type cv U, where U is a
9828 // specialization of C or a class derived from a specialization of C.
9829 Expr *E = ListInit->getInit(0);
9830 auto *RD = E->getType()->getAsCXXRecordDecl();
9831 if (!isa<InitListExpr>(E) && RD &&
Erik Pilkingtondd0b3442018-07-26 23:40:42 +00009832 isCompleteType(Kind.getLocation(), E->getType()) &&
Richard Smith1363e8f2017-09-07 07:22:36 +00009833 isOrIsDerivedFromSpecializationOf(RD, Template))
9834 TryListConstructors = false;
Richard Smith32918772017-02-14 00:25:28 +00009835 }
9836
9837 if (TryListConstructors)
Richard Smith60437622017-02-09 19:17:44 +00009838 Result = tryToResolveOverload(/*OnlyListConstructor*/true);
9839 // Then unwrap the initializer list and try again considering all
9840 // constructors.
9841 Inits = MultiExprArg(ListInit->getInits(), ListInit->getNumInits());
9842 }
9843
9844 // If list-initialization fails, or if we're doing any other kind of
9845 // initialization, we (eventually) consider constructors.
9846 if (Result == OR_No_Viable_Function)
9847 Result = tryToResolveOverload(/*OnlyListConstructor*/false);
9848
9849 switch (Result) {
9850 case OR_Ambiguous:
Richard Smith60437622017-02-09 19:17:44 +00009851 // FIXME: For list-initialization candidates, it'd usually be better to
9852 // list why they were not viable when given the initializer list itself as
9853 // an argument.
David Blaikie5e328052019-05-03 00:44:50 +00009854 Candidates.NoteCandidates(
9855 PartialDiagnosticAt(
9856 Kind.getLocation(),
9857 PDiag(diag::err_deduced_class_template_ctor_ambiguous)
9858 << TemplateName),
9859 *this, OCD_ViableCandidates, Inits);
Richard Smith60437622017-02-09 19:17:44 +00009860 return QualType();
9861
Richard Smith32918772017-02-14 00:25:28 +00009862 case OR_No_Viable_Function: {
9863 CXXRecordDecl *Primary =
9864 cast<ClassTemplateDecl>(Template)->getTemplatedDecl();
9865 bool Complete =
9866 isCompleteType(Kind.getLocation(), Context.getTypeDeclType(Primary));
David Blaikie5e328052019-05-03 00:44:50 +00009867 Candidates.NoteCandidates(
9868 PartialDiagnosticAt(
9869 Kind.getLocation(),
9870 PDiag(Complete ? diag::err_deduced_class_template_ctor_no_viable
9871 : diag::err_deduced_class_template_incomplete)
9872 << TemplateName << !Guides.empty()),
9873 *this, OCD_AllCandidates, Inits);
Richard Smith60437622017-02-09 19:17:44 +00009874 return QualType();
Richard Smith32918772017-02-14 00:25:28 +00009875 }
Richard Smith60437622017-02-09 19:17:44 +00009876
9877 case OR_Deleted: {
9878 Diag(Kind.getLocation(), diag::err_deduced_class_template_deleted)
9879 << TemplateName;
9880 NoteDeletedFunction(Best->Function);
9881 return QualType();
9882 }
9883
9884 case OR_Success:
9885 // C++ [over.match.list]p1:
9886 // In copy-list-initialization, if an explicit constructor is chosen, the
9887 // initialization is ill-formed.
Richard Smithbc491202017-02-17 20:05:37 +00009888 if (Kind.isCopyInit() && ListInit &&
9889 cast<CXXDeductionGuideDecl>(Best->Function)->isExplicit()) {
Richard Smith60437622017-02-09 19:17:44 +00009890 bool IsDeductionGuide = !Best->Function->isImplicit();
9891 Diag(Kind.getLocation(), diag::err_deduced_class_template_explicit)
9892 << TemplateName << IsDeductionGuide;
9893 Diag(Best->Function->getLocation(),
9894 diag::note_explicit_ctor_deduction_guide_here)
9895 << IsDeductionGuide;
9896 return QualType();
9897 }
9898
9899 // Make sure we didn't select an unusable deduction guide, and mark it
9900 // as referenced.
9901 DiagnoseUseOfDecl(Best->Function, Kind.getLocation());
9902 MarkFunctionReferenced(Kind.getLocation(), Best->Function);
9903 break;
9904 }
9905
9906 // C++ [dcl.type.class.deduct]p1:
9907 // The placeholder is replaced by the return type of the function selected
9908 // by overload resolution for class template deduction.
Richard Smith8eeb16f2018-09-10 20:31:03 +00009909 QualType DeducedType =
9910 SubstAutoType(TSInfo->getType(), Best->Function->getReturnType());
9911 Diag(TSInfo->getTypeLoc().getBeginLoc(),
9912 diag::warn_cxx14_compat_class_template_argument_deduction)
9913 << TSInfo->getTypeLoc().getSourceRange() << 1 << DeducedType;
Eric Fiselier73b51ae2019-01-17 21:44:24 +00009914
9915 // Warn if CTAD was used on a type that does not have any user-defined
9916 // deduction guides.
9917 if (!HasAnyDeductionGuide) {
9918 Diag(TSInfo->getTypeLoc().getBeginLoc(),
9919 diag::warn_ctad_maybe_unsupported)
9920 << TemplateName;
9921 Diag(Template->getLocation(), diag::note_suppress_ctad_maybe_unsupported);
9922 }
9923
Richard Smith8eeb16f2018-09-10 20:31:03 +00009924 return DeducedType;
Richard Smith60437622017-02-09 19:17:44 +00009925}