10cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===--- SemaInit.cpp - Semantic Analysis for Initializers ----------------===// 20cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 30cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// The LLVM Compiler Infrastructure 40cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 50cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// This file is distributed under the University of Illinois Open Source 60cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// License. See LICENSE.TXT for details. 70cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 80cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===----------------------------------------------------------------------===// 90cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 105d3d41d0873d51b405972baf38e1f3a7ef5b49e0Sebastian Redl// This file implements semantic analysis for initializers. 11dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// 120cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===----------------------------------------------------------------------===// 130cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 14e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Initialization.h" 150cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff#include "clang/AST/ASTContext.h" 167cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 172078bb9c9336da56ea521e98e718556b227541f6Anders Carlsson#include "clang/AST/ExprCXX.h" 1879e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner#include "clang/AST/ExprObjC.h" 19d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor#include "clang/AST/TypeLoc.h" 2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Preprocessor.h" 2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Designator.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Lookup.h" 2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/SemaInternal.h" 242b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl#include "llvm/ADT/APInt.h" 258fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h" 2620093b4bf698f292c664676987541d5103b65b15Douglas Gregor#include "llvm/Support/ErrorHandling.h" 27191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin#include "llvm/Support/raw_ostream.h" 28c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor#include <map> 2905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorusing namespace clang; 300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 31dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 32dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Sema Initialization Checking 33dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 34dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 35ce6c9b7da219c8640a0559f75770cfc6622de083John McCallstatic Expr *IsStringInit(Expr *Init, const ArrayType *AT, 36ce6c9b7da219c8640a0559f75770cfc6622de083John McCall ASTContext &Context) { 378718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT)) 388718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman return 0; 398718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman 408879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // See if this is a string literal or @encode. 418879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner Init = Init->IgnoreParens(); 421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 438879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Handle @encode, which is a narrow string. 448879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType()) 458879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 468879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 478879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Otherwise we can only handle string literals. 488879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner StringLiteral *SL = dyn_cast<StringLiteral>(Init); 49220b6369d7717bfe6894b46cef055d3e763827f2Chris Lattner if (SL == 0) return 0; 50bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman 51bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman QualType ElemTy = Context.getCanonicalType(AT->getElementType()); 525cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor 535cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor switch (SL->getKind()) { 545cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::Ascii: 555cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF8: 565cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // char array can be initialized with a narrow string. 575cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // Only allow char x[] = "foo"; not char x[] = L"foo"; 58bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman return ElemTy->isCharType() ? Init : 0; 595cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF16: 605cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return ElemTy->isChar16Type() ? Init : 0; 615cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF32: 625cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return ElemTy->isChar32Type() ? Init : 0; 635cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::Wide: 645cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // wchar_t array can be initialized with a wide string: C99 6.7.8p15 (with 655cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // correction from DR343): "An array with element type compatible with a 665cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // qualified or unqualified version of wchar_t may be initialized by a wide 675cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // string literal, optionally enclosed in braces." 685cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor if (Context.typesAreCompatible(Context.getWCharType(), 695cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor ElemTy.getUnqualifiedType())) 705cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return Init; 718879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 725cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return 0; 735cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor } 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 755cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor llvm_unreachable("missed a StringLiteral kind?"); 76dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 77dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 78ce6c9b7da219c8640a0559f75770cfc6622de083John McCallstatic Expr *IsStringInit(Expr *init, QualType declType, ASTContext &Context) { 79ce6c9b7da219c8640a0559f75770cfc6622de083John McCall const ArrayType *arrayType = Context.getAsArrayType(declType); 80ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (!arrayType) return 0; 81ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 82ce6c9b7da219c8640a0559f75770cfc6622de083John McCall return IsStringInit(init, arrayType, Context); 83ce6c9b7da219c8640a0559f75770cfc6622de083John McCall} 84ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 85fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCallstatic void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT, 86fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall Sema &S) { 8779e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner // Get the length of the string as parsed. 8879e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner uint64_t StrLength = 8979e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner cast<ConstantArrayType>(Str->getType())->getSize().getZExtValue(); 9079e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 92dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p14. We have an array of character type with unknown size 94dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // being initialized to a string literal. 9565263b4ec184212155c92740ab0bd363bb85c49eBenjamin Kramer llvm::APInt ConstVal(32, StrLength); 96dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // Return a new array type (C99 6.7.8p22). 9746a617a792bfab0d9b1e057371ea3b9540802226John McCall DeclT = S.Context.getConstantArrayType(IAT->getElementType(), 9846a617a792bfab0d9b1e057371ea3b9540802226John McCall ConstVal, 9946a617a792bfab0d9b1e057371ea3b9540802226John McCall ArrayType::Normal, 0); 10019da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner return; 101dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner } 1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1038718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman const ConstantArrayType *CAT = cast<ConstantArrayType>(AT); 1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 105bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // We have an array of character type with known size. However, 1068718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // the size may be smaller or larger than the string we are initializing. 1078718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // FIXME: Avoid truncation for 64-bit length strings. 1084e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus) { 109b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson if (StringLiteral *SL = dyn_cast<StringLiteral>(Str)) { 110b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // For Pascal strings it's OK to strip off the terminating null character, 111b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // so the example below is valid: 112b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // 113b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // unsigned char a[2] = "\pa"; 114b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson if (SL->isPascal()) 115b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson StrLength--; 116b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson } 117b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson 118bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // [dcl.init.string]p2 119bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (StrLength > CAT->getSize().getZExtValue()) 12096a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar S.Diag(Str->getLocStart(), 121bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman diag::err_initializer_string_for_char_array_too_long) 122bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman << Str->getSourceRange(); 123bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman } else { 124bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // C99 6.7.8p14. 125bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (StrLength-1 > CAT->getSize().getZExtValue()) 12696a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar S.Diag(Str->getLocStart(), 127bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman diag::warn_initializer_string_for_char_array_too_long) 128bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman << Str->getSourceRange(); 129bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman } 1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1318718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // Set the type to the actual size that we are initializing. If we have 1328718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // something like: 1338718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // char x[1] = "foo"; 1348718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // then this will set the string literal's type to char[1]. 1358718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman Str->setType(DeclT); 136dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 137dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 138dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 139dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Semantic checking for initializer lists. 140dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 141dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 1429e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// @brief Semantic checking for initializer lists. 1439e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1449e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// The InitListChecker class contains a set of routines that each 1459e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// handle the initialization of a certain kind of entity, e.g., 1469e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arrays, vectors, struct/union types, scalars, etc. The 1479e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// InitListChecker itself performs a recursive walk of the subobject 1489e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure of the type to be initialized, while stepping through 1499e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// the initializer list one element at a time. The IList and Index 1509e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// parameters to each of the Check* routines contain the active 1519e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// (syntactic) initializer list and the index into that initializer 1529e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list that represents the current initializer. Each routine is 1539e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// responsible for moving that Index forward as it consumes elements. 1549e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1559e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// Each Check* routine also has a StructuredList/StructuredIndex 15663e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// arguments, which contains the current "structured" (semantic) 1579e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initializer list and the index into that initializer list where we 1589e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// are copying initializers as we map them over to the semantic 1599e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. Once we have completed our recursive walk of the subobject 1609e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure, we will have constructed a full semantic initializer 1619e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. 1629e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1639e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// C99 designators cause changes in the initializer list traversal, 1649e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// because they make the initialization "jump" into a specific 1659e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// subobject and then continue the initialization from that 1669e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// point. CheckDesignatedInitializer() recursively steps into the 1679e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// designated subobject and manages backing out the recursion to 1689e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initialize the subobjects after the one designated. 1698b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattnernamespace { 170c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorclass InitListChecker { 1710820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner Sema &SemaRef; 172c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool hadError; 17314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool VerifyOnly; // no diagnostics, no structure building 174c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl bool AllowBraceElision; 175a789416a497b2e14e7c2fd721d03e541120bac8dBenjamin Kramer llvm::DenseMap<InitListExpr *, InitListExpr *> SyntacticToSemantic; 176c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *FullyStructuredList; 1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1788ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckImplicitInitList(const InitializedEntity &Entity, 179987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, QualType T, 1809e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 181629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman unsigned &StructuredIndex); 1828ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckExplicitInitList(const InitializedEntity &Entity, 18346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 1849e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 185eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 186eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1878ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckListElementTypes(const InitializedEntity &Entity, 18846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &DeclType, 1891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 190c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1919e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 192eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 193eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1948ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckSubElementType(const InitializedEntity &Entity, 19546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType ElemType, 196c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1979e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1989e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1990c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman void CheckComplexType(const InitializedEntity &Entity, 2000c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *IList, QualType DeclType, 2010c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &Index, 2020c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *StructuredList, 2030c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &StructuredIndex); 2048ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckScalarType(const InitializedEntity &Entity, 20546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 206c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 2079e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2089e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2098ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckReferenceType(const InitializedEntity &Entity, 2108ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 211930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 212930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 213930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex); 2148ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckVectorType(const InitializedEntity &Entity, 21546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, unsigned &Index, 2169e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2179e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2188ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckStructUnionTypes(const InitializedEntity &Entity, 2192bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, QualType DeclType, 2201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator Field, 221c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 2229e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 223eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 224eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 2258ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckArrayType(const InitializedEntity &Entity, 226784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 2271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::APSInt elementIndex, 228c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 2299e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2309e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2318ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson bool CheckDesignatedInitializer(const InitializedEntity &Entity, 2329a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, DesignatedInitExpr *DIE, 233711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &CurrentObjectType, 235c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor RecordDecl::field_iterator *NextField, 236c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor llvm::APSInt *NextElementIndex, 237c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 238c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 239c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &StructuredIndex, 240eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 241eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject); 242c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 243c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor QualType CurrentObjectType, 244c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 245c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned StructuredIndex, 246c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor SourceRange InitRange); 2479e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor void UpdateStructuredListElement(InitListExpr *StructuredList, 2489e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex, 249c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor Expr *expr); 250c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numArrayElements(QualType DeclType); 251c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numStructUnionElements(QualType DeclType); 252930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 253d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor void FillInValueInitForField(unsigned Init, FieldDecl *Field, 254d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 255d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 256cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor void FillInValueInitializations(const InitializedEntity &Entity, 257cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 258f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool CheckFlexibleArrayInit(const InitializedEntity &Entity, 259f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman Expr *InitExpr, FieldDecl *Field, 260f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool TopLevelObject); 2613ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl void CheckValueInitializable(const InitializedEntity &Entity); 2623ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 263c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorpublic: 264cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker(Sema &S, const InitializedEntity &Entity, 265c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl InitListExpr *IL, QualType &T, bool VerifyOnly, 266c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl bool AllowBraceElision); 267c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool HadError() { return hadError; } 268c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 269c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // @brief Retrieves the fully-structured initializer list used for 270c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // semantic analysis and code generation. 271c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } 272c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor}; 2738b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattner} // end anonymous namespace 27468355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 2753ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redlvoid InitListChecker::CheckValueInitializable(const InitializedEntity &Entity) { 2763ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl assert(VerifyOnly && 2773ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl "CheckValueInitializable is only inteded for verification mode."); 2783ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 2793ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl SourceLocation Loc; 2803ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 2813ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl true); 2823ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializationSequence InitSeq(SemaRef, Entity, Kind, 0, 0); 2833ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (InitSeq.Failed()) 2843ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl hadError = true; 2853ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl} 2863ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 287d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregorvoid InitListChecker::FillInValueInitForField(unsigned Init, FieldDecl *Field, 288d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 289dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitListExpr *ILE, 290d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor bool &RequiresSecondPass) { 29196a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SourceLocation Loc = ILE->getLocStart(); 292d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned NumInits = ILE->getNumInits(); 293dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity MemberEntity 294d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitializedEntity::InitializeMember(Field, &ParentEntity); 295d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 296d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // FIXME: We probably don't need to handle references 297d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // specially here, since value-initialization of references is 298d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // handled in InitializationSequence. 299d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->getType()->isReferenceType()) { 300d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // C++ [dcl.init.aggr]p9: 301d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // If an incomplete or empty initializer-list leaves a 302d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // member of reference type uninitialized, the program is 303d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // ill-formed. 304d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized) 305d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << Field->getType() 306d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << ILE->getSyntacticForm()->getSourceRange(); 307d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Field->getLocation(), 308d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor diag::note_uninit_reference_member); 309d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 310d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 311d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 312dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 313d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 314d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor true); 315d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationSequence InitSeq(SemaRef, MemberEntity, Kind, 0, 0); 316d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (!InitSeq) { 317d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitSeq.Diagnose(SemaRef, MemberEntity, Kind, 0, 0); 318d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 319d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 320d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 321dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 32260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult MemberInit 323f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall = InitSeq.Perform(SemaRef, MemberEntity, Kind, MultiExprArg()); 324d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (MemberInit.isInvalid()) { 325d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 326d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 327d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 328dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 329d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) { 330d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Do nothing 331d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (Init < NumInits) { 332d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->setInit(Init, MemberInit.takeAs<Expr>()); 3337491c499e826682e128a400038361ebcbde30eecSebastian Redl } else if (InitSeq.isConstructorInitialization()) { 334d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Value-initialization requires a constructor call, so 335d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // extend the initializer list to include the constructor 336d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // call and make a note that we'll need to take another pass 337d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // through the initializer list. 338709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek ILE->updateInit(SemaRef.Context, Init, MemberInit.takeAs<Expr>()); 339d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass = true; 340d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 341d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitListExpr *InnerILE 342d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 343dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FillInValueInitializations(MemberEntity, InnerILE, 344dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi RequiresSecondPass); 345d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor} 346d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 3474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Recursively replaces NULL values within the given initializer list 3484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// with expressions that perform value-initialization of the 3494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// appropriate type. 350dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 351cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::FillInValueInitializations(const InitializedEntity &Entity, 352cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, 353cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool &RequiresSecondPass) { 3541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((ILE->getType() != SemaRef.Context.VoidTy) && 355930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor "Should not have void type"); 35696a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SourceLocation Loc = ILE->getLocStart(); 35787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (ILE->getSyntacticForm()) 35896a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar Loc = ILE->getSyntacticForm()->getLocStart(); 3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3606217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) { 361d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion() && 362d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->getInitializedFieldInUnion()) 363d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(0, ILE->getInitializedFieldInUnion(), 364d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Entity, ILE, RequiresSecondPass); 365d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor else { 366d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned Init = 0; 367d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor for (RecordDecl::field_iterator 368d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field = RType->getDecl()->field_begin(), 369d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FieldEnd = RType->getDecl()->field_end(); 370d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field != FieldEnd; ++Field) { 371d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->isUnnamedBitfield()) 372d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor continue; 373d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 374d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 37587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 37687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 377581deb3da481053c4993c7600f97acf7768caac5David Blaikie FillInValueInitForField(Init, *Field, Entity, ILE, RequiresSecondPass); 378d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 379cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 380cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 381d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ++Init; 382d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 383d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Only look at the first initialization of a union. 384d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion()) 385d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor break; 386d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 3874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 3884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType ElementType; 3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 394cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializedEntity ElementEntity = Entity; 39587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumInits = ILE->getNumInits(); 39687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumElements = NumInits; 3970820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) { 3984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = AType->getElementType(); 39987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) 40087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = CAType->getSize().getZExtValue(); 401dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 402cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 403183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) { 4044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = VType->getElementType(); 40587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = VType->getNumElements(); 406dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 407cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 4081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else 4094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = ILE->getType(); 4101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 411dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 41287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor for (unsigned Init = 0; Init != NumElements; ++Init) { 41316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (hadError) 41416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return; 41516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 416d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement || 417d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson ElementEntity.getKind() == InitializedEntity::EK_VectorElement) 418cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity.setElementIndex(Init); 419cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 42021f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis Expr *InitExpr = (Init < NumInits ? ILE->getInit(Init) : 0); 42121f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis if (!InitExpr && !ILE->hasArrayFiller()) { 422cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 423cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor true); 424cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationSequence InitSeq(SemaRef, ElementEntity, Kind, 0, 0); 425cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!InitSeq) { 426cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitSeq.Diagnose(SemaRef, ElementEntity, Kind, 0, 0); 42787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor hadError = true; 42887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 42987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 43087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 43160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult ElementInit 432f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall = InitSeq.Perform(SemaRef, ElementEntity, Kind, MultiExprArg()); 433cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (ElementInit.isInvalid()) { 43416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor hadError = true; 435cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 436cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 437cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 438cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (hadError) { 439cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Do nothing 440cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (Init < NumInits) { 4413e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis // For arrays, just set the expression used for value-initialization 4423e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis // of the "holes" in the array. 4433e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) 4443e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis ILE->setArrayFiller(ElementInit.takeAs<Expr>()); 4453e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis else 4463e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis ILE->setInit(Init, ElementInit.takeAs<Expr>()); 4474423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } else { 4484423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // For arrays, just set the expression used for value-initialization 4494423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // of the rest of elements and exit. 4504423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) { 4514423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis ILE->setArrayFiller(ElementInit.takeAs<Expr>()); 4524423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis return; 4534423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 4544423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis 4557491c499e826682e128a400038361ebcbde30eecSebastian Redl if (InitSeq.isConstructorInitialization()) { 4564423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // Value-initialization requires a constructor call, so 4574423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // extend the initializer list to include the constructor 4584423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // call and make a note that we'll need to take another pass 4594423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // through the initializer list. 4604423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis ILE->updateInit(SemaRef.Context, Init, ElementInit.takeAs<Expr>()); 4614423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis RequiresSecondPass = true; 4624423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 463cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 464ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else if (InitListExpr *InnerILE 46521f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis = dyn_cast_or_null<InitListExpr>(InitExpr)) 466cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(ElementEntity, InnerILE, RequiresSecondPass); 4674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 4684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 4694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 47068355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 471cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity, 47214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr *IL, QualType &T, 473c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl bool VerifyOnly, bool AllowBraceElision) 474b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith : SemaRef(S), VerifyOnly(VerifyOnly), AllowBraceElision(AllowBraceElision) { 4750cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff hadError = false; 476c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 477b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman unsigned newIndex = 0; 4784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 4791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FullyStructuredList 480ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor = getStructuredSubobjectInit(IL, newIndex, T, 0, 0, IL->getSourceRange()); 481dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckExplicitInitList(Entity, IL, T, newIndex, 48246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson FullyStructuredList, newStructuredIndex, 483eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor /*TopLevelObject=*/true); 484c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 48514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!hadError && !VerifyOnly) { 486cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool RequiresSecondPass = false; 487cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, RequiresSecondPass); 48816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (RequiresSecondPass && !hadError) 489dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FillInValueInitializations(Entity, FullyStructuredList, 490cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass); 491cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 4920cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4930cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4940cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numArrayElements(QualType DeclType) { 495638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // FIXME: use a proper constant 496638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman int maxElements = 0x7FFFFFFF; 497c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = 4980820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 4990cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = static_cast<int>(CAT->getSize().getZExtValue()); 5000cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 5010cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return maxElements; 5020cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5030cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5040cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numStructUnionElements(QualType DeclType) { 5056217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl(); 5064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor int InitializableMembers = 0; 5071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (RecordDecl::field_iterator 50817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = structDecl->field_begin(), 50917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = structDecl->field_end(); 5104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Field != FieldEnd; ++Field) { 511d61db33331c264d6361283602b248a7423040597Douglas Gregor if (!Field->isUnnamedBitfield()) 5124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++InitializableMembers; 5134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 51439ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (structDecl->isUnion()) 515f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return std::min(InitializableMembers, 1); 516f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return InitializableMembers - structDecl->hasFlexibleArrayMember(); 5170cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5180cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5198ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity, 520987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, 5214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType T, unsigned &Index, 5224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 523629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman unsigned &StructuredIndex) { 5240cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff int maxElements = 0; 5251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5260cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (T->isArrayType()) 5270cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numArrayElements(T); 528fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor else if (T->isRecordType()) 5290cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numStructUnionElements(T); 530b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman else if (T->isVectorType()) 531183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall maxElements = T->getAs<VectorType>()->getNumElements(); 5320cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else 533b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("CheckImplicitInitList(): Illegal type"); 534b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 535402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman if (maxElements == 0) { 53614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 53714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(ParentIList->getInit(Index)->getLocStart(), 53814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_implicit_empty_initializer); 5394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 540402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman hadError = true; 541402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman return; 542402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman } 543402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman 5444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Build a structured initializer list corresponding to this subobject. 5454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredSubobjectInitList 5461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList, 5471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredIndex, 54896a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SourceRange(ParentIList->getInit(Index)->getLocStart(), 549ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor ParentIList->getSourceRange().getEnd())); 5504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredSubobjectInitIndex = 0; 5514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 5524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Check the element types and build the structural subobject. 55387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned StartIndex = Index; 554dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, ParentIList, T, 555987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 5561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredSubobjectInitList, 557629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman StructuredSubobjectInitIndex); 558c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl 559c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl if (VerifyOnly) { 560c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl if (!AllowBraceElision && (T->isArrayType() || T->isRecordType())) 561c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl hadError = true; 562c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl } else { 56314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->setType(T); 56414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 565c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1); 56614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Update the structured sub-object initializer so that it's ending 56714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // range corresponds with the end of the last initializer it used. 56814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (EndIndex < ParentIList->getNumInits()) { 56914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SourceLocation EndLoc 57014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl = ParentIList->getInit(EndIndex)->getSourceRange().getEnd(); 57114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->setRBraceLoc(EndLoc); 57214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 57314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 574c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl // Complain about missing braces. 57514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (T->isArrayType() || T->isRecordType()) { 57614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), 577c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl AllowBraceElision ? diag::warn_missing_braces : 578c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl diag::err_missing_braces) 57914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << StructuredSubobjectInitList->getSourceRange() 58014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << FixItHint::CreateInsertion( 58114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->getLocStart(), "{") 58214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << FixItHint::CreateInsertion( 58314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.PP.getLocForEndOfToken( 584dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi StructuredSubobjectInitList->getLocEnd()), 58514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl "}"); 586c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl if (!AllowBraceElision) 587c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl hadError = true; 58814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 5891e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner } 5900cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5910cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5928ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, 59346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 5944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 596eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 597eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 598c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman assert(IList->isExplicit() && "Illegal Implicit InitListExpr"); 59914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 60014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SyntacticToSemantic[IList] = StructuredList; 60114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setSyntacticForm(IList); 60214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 603dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true, 60446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson Index, StructuredList, StructuredIndex, TopLevelObject); 60514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 6065c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman QualType ExprTy = T; 6075c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman if (!ExprTy->isArrayType()) 6085c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman ExprTy = ExprTy.getNonLValueExprType(SemaRef.Context); 60914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->setType(ExprTy); 61014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setType(ExprTy); 61114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 612638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (hadError) 613638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 614c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 615638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (Index < IList->getNumInits()) { 616c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman // We have leftover initializers 61714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 6184e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus || 6194e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie (SemaRef.getLangOpts().OpenCL && 62014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->getType()->isVectorType())) { 62114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 62214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 62314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 62414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 62514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 626e540858b289b23653bcb23646f135729203635cbEli Friedman if (StructuredIndex == 1 && 627e540858b289b23653bcb23646f135729203635cbEli Friedman IsStringInit(StructuredList->getInit(0), T, SemaRef.Context)) { 6287c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers_in_char_array_initializer; 6294e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 6307c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor DK = diag::err_excess_initializers_in_char_array_initializer; 631e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 632e540858b289b23653bcb23646f135729203635cbEli Friedman } 633bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman // Special-case 6340820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 635dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getInit(Index)->getSourceRange(); 636d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman } else if (!T->isIncompleteType()) { 637b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // Don't complain for incomplete types, since we'll get an error 638b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // elsewhere 639eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType CurrentObjectType = StructuredList->getType(); 6401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int initKind = 641eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isArrayType()? 0 : 642eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isVectorType()? 1 : 643eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isScalarType()? 2 : 644eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isUnionType()? 3 : 645eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 4; 6467c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 6477c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers; 6484e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 649e540858b289b23653bcb23646f135729203635cbEli Friedman DK = diag::err_excess_initializers; 6500863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman hadError = true; 6510863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman } 6524e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().OpenCL && initKind == 1) { 6530863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman DK = diag::err_excess_initializers; 654e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 655e540858b289b23653bcb23646f135729203635cbEli Friedman } 6567c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 6570820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 658eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << initKind << IList->getInit(Index)->getSourceRange(); 659c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 660c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 661cda25a977e4b7fe4e080b87586410eaeab7b62f6Eli Friedman 66214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && T->isScalarType() && IList->getNumInits() == 1 && 66314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !TopLevelObject) 6640820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::warn_braces_around_scalar_init) 665a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor << IList->getSourceRange() 666849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocStart()) 667849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocEnd()); 6680cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6690cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6708ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckListElementTypes(const InitializedEntity &Entity, 67146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 6721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &DeclType, 67387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool SubobjectIsDesignatorContext, 6744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 6754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 676eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 677eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 6780c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman if (DeclType->isAnyComplexType() && SubobjectIsDesignatorContext) { 6790c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // Explicitly braced initializer for complex type can be real+imaginary 6800c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // parts. 6810c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman CheckComplexType(Entity, IList, DeclType, Index, 6820c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredList, StructuredIndex); 6830c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else if (DeclType->isScalarType()) { 68446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, DeclType, Index, 68546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 686c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (DeclType->isVectorType()) { 687dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckVectorType(Entity, IList, DeclType, Index, 68846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 68920599392a99956eaac4cf351a0935574090cb6c3Richard Smith } else if (DeclType->isRecordType()) { 69020599392a99956eaac4cf351a0935574090cb6c3Richard Smith assert(DeclType->isAggregateType() && 69120599392a99956eaac4cf351a0935574090cb6c3Richard Smith "non-aggregate records should be handed in CheckSubElementType"); 69220599392a99956eaac4cf351a0935574090cb6c3Richard Smith RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 69320599392a99956eaac4cf351a0935574090cb6c3Richard Smith CheckStructUnionTypes(Entity, IList, DeclType, RD->field_begin(), 69420599392a99956eaac4cf351a0935574090cb6c3Richard Smith SubobjectIsDesignatorContext, Index, 69520599392a99956eaac4cf351a0935574090cb6c3Richard Smith StructuredList, StructuredIndex, 69620599392a99956eaac4cf351a0935574090cb6c3Richard Smith TopLevelObject); 69720599392a99956eaac4cf351a0935574090cb6c3Richard Smith } else if (DeclType->isArrayType()) { 69820599392a99956eaac4cf351a0935574090cb6c3Richard Smith llvm::APSInt Zero( 69920599392a99956eaac4cf351a0935574090cb6c3Richard Smith SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()), 70020599392a99956eaac4cf351a0935574090cb6c3Richard Smith false); 70120599392a99956eaac4cf351a0935574090cb6c3Richard Smith CheckArrayType(Entity, IList, DeclType, Zero, 70220599392a99956eaac4cf351a0935574090cb6c3Richard Smith SubobjectIsDesignatorContext, Index, 70320599392a99956eaac4cf351a0935574090cb6c3Richard Smith StructuredList, StructuredIndex); 704613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff } else if (DeclType->isVoidType() || DeclType->isFunctionType()) { 705613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff // This type is invalid, issue a diagnostic. 7064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 70714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 70814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 70914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 710d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman hadError = true; 711930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isReferenceType()) { 7128ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, DeclType, Index, 7138ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 714c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall } else if (DeclType->isObjCObjectType()) { 71514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 71614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_init_objc_class) 71714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 7184d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 7190cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } else { 72014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 72114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 72214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 7234d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 7240cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 7250cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 7260cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 7278ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckSubElementType(const InitializedEntity &Entity, 72846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 7291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElemType, 7304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 7314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 7324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 7336fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 734c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) { 73520599392a99956eaac4cf351a0935574090cb6c3Richard Smith if (!ElemType->isRecordType() || ElemType->isAggregateType()) { 73620599392a99956eaac4cf351a0935574090cb6c3Richard Smith unsigned newIndex = 0; 73720599392a99956eaac4cf351a0935574090cb6c3Richard Smith unsigned newStructuredIndex = 0; 73820599392a99956eaac4cf351a0935574090cb6c3Richard Smith InitListExpr *newStructuredList 73920599392a99956eaac4cf351a0935574090cb6c3Richard Smith = getStructuredSubobjectInit(IList, Index, ElemType, 74020599392a99956eaac4cf351a0935574090cb6c3Richard Smith StructuredList, StructuredIndex, 74120599392a99956eaac4cf351a0935574090cb6c3Richard Smith SubInitList->getSourceRange()); 74220599392a99956eaac4cf351a0935574090cb6c3Richard Smith CheckExplicitInitList(Entity, SubInitList, ElemType, newIndex, 74320599392a99956eaac4cf351a0935574090cb6c3Richard Smith newStructuredList, newStructuredIndex); 74420599392a99956eaac4cf351a0935574090cb6c3Richard Smith ++StructuredIndex; 74520599392a99956eaac4cf351a0935574090cb6c3Richard Smith ++Index; 74620599392a99956eaac4cf351a0935574090cb6c3Richard Smith return; 74720599392a99956eaac4cf351a0935574090cb6c3Richard Smith } 74820599392a99956eaac4cf351a0935574090cb6c3Richard Smith assert(SemaRef.getLangOpts().CPlusPlus && 74920599392a99956eaac4cf351a0935574090cb6c3Richard Smith "non-aggregate records are only possible in C++"); 75020599392a99956eaac4cf351a0935574090cb6c3Richard Smith // C++ initialization is handled later. 75120599392a99956eaac4cf351a0935574090cb6c3Richard Smith } 75220599392a99956eaac4cf351a0935574090cb6c3Richard Smith 75320599392a99956eaac4cf351a0935574090cb6c3Richard Smith if (ElemType->isScalarType()) { 754fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return CheckScalarType(Entity, IList, ElemType, Index, 755fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredList, StructuredIndex); 756930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (ElemType->isReferenceType()) { 757fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return CheckReferenceType(Entity, IList, ElemType, Index, 758fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredList, StructuredIndex); 759fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 760930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 761fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (const ArrayType *arrayType = SemaRef.Context.getAsArrayType(ElemType)) { 762fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // arrayType can be incomplete if we're initializing a flexible 763fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // array member. There's nothing we can do with the completed 764fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // type here, though. 765930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 766fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (Expr *Str = IsStringInit(expr, arrayType, SemaRef.Context)) { 7678a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman if (!VerifyOnly) { 7688a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman CheckStringInit(Str, ElemType, arrayType, SemaRef); 7698a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 7708a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman } 771fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 772fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 773930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 774930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 775fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization. 776fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 7774e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie } else if (SemaRef.getLangOpts().CPlusPlus) { 778930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 779fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // All implicit type conversions (clause 4) are considered when 7805d3d41d0873d51b405972baf38e1f3a7ef5b49e0Sebastian Redl // initializing the aggregate member with an initializer from 781fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // an initializer-list. If the initializer can initialize a 782fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // member, the member is initialized. [...] 783fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 784fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // FIXME: Better EqualLoc? 785fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationKind Kind = 786fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationKind::CreateCopy(expr->getLocStart(), SourceLocation()); 787fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationSequence Seq(SemaRef, Entity, Kind, &expr, 1); 788fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 789fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (Seq) { 79014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 791b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith ExprResult Result = 792b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith Seq.Perform(SemaRef, Entity, Kind, MultiExprArg(&expr, 1)); 793b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith if (Result.isInvalid()) 794b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith hadError = true; 79514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 79614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, 797b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith Result.takeAs<Expr>()); 79814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 799fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 800fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 801fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 802fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 803fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization 804fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else { 805fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // C99 6.7.8p13: 8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 807fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // The initializer for a structure or union object that has 808fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // automatic storage duration shall be either an initializer 809fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // list as described below, or a single expression that has 810fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // compatible structure or union type. In the latter case, the 811fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // initial value of the object, including unnamed members, is 812fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // that of the expression. 813429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult ExprRes = SemaRef.Owned(expr); 814fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if ((ElemType->isRecordType() || ElemType->isVectorType()) && 81514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.CheckSingleAssignmentConstraints(ElemType, ExprRes, 81614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !VerifyOnly) 817fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall == Sema::Compatible) { 818429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (ExprRes.isInvalid()) 819429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley hadError = true; 820429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley else { 821429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes = SemaRef.DefaultFunctionArrayLvalueConversion(ExprRes.take()); 822429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (ExprRes.isInvalid()) 823429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley hadError = true; 824429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 825429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley UpdateStructuredListElement(StructuredList, StructuredIndex, 826429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes.takeAs<Expr>()); 827930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 828fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 829930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 830429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes.release(); 831fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization 832fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 833fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 834fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // C++ [dcl.init.aggr]p12: 835fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // 836fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // [...] Otherwise, if the member is itself a non-empty 837fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // subaggregate, brace elision is assumed and the initializer is 838fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // considered for the initialization of the first member of 839fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // the subaggregate. 8404e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().OpenCL && 84161b4bc80e943578ae855810918a1dc9697dbd15bTanya Lattner (ElemType->isAggregateType() || ElemType->isVectorType())) { 842fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList, 843fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredIndex); 844fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++StructuredIndex; 845fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else { 84614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 84714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // We cannot initialize this element, so let 84814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // PerformCopyInitialization produce the appropriate diagnostic. 84914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.PerformCopyInitialization(Entity, SourceLocation(), 85014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Owned(expr), 85114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl /*TopLevelOfInitList=*/true); 85214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 853fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall hadError = true; 854fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 855fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++StructuredIndex; 856930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 857b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman} 858b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 8590c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedmanvoid InitListChecker::CheckComplexType(const InitializedEntity &Entity, 8600c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *IList, QualType DeclType, 8610c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &Index, 8620c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *StructuredList, 8630c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &StructuredIndex) { 8640c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman assert(Index == 0 && "Index in explicit init list must be zero"); 8650c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8660c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // As an extension, clang supports complex initializers, which initialize 8670c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // a complex number component-wise. When an explicit initializer list for 8680c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // a complex number contains two two initializers, this extension kicks in: 8690c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // it exepcts the initializer list to contain two elements convertible to 8700c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // the element type of the complex type. The first element initializes 8710c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // the real part, and the second element intitializes the imaginary part. 8720c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8730c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman if (IList->getNumInits() != 2) 8740c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman return CheckScalarType(Entity, IList, DeclType, Index, StructuredList, 8750c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredIndex); 8760c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8770c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // This is an extension in C. (The builtin _Complex type does not exist 8780c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // in the C++ standard.) 8794e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().CPlusPlus && !VerifyOnly) 8800c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman SemaRef.Diag(IList->getLocStart(), diag::ext_complex_component_init) 8810c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman << IList->getSourceRange(); 8820c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8830c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // Initialize the complex number. 8840c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman QualType elementType = DeclType->getAs<ComplexType>()->getElementType(); 8850c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitializedEntity ElementEntity = 8860c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 8870c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8880c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman for (unsigned i = 0; i < 2; ++i) { 8890c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman ElementEntity.setElementIndex(Index); 8900c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman CheckSubElementType(ElementEntity, IList, elementType, Index, 8910c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredList, StructuredIndex); 8920c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } 8930c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman} 8940c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8950c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8968ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckScalarType(const InitializedEntity &Entity, 89746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 8986fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned &Index, 8994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 9004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 901b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Index >= IList->getNumInits()) { 9026b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith if (!VerifyOnly) 9036b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith SemaRef.Diag(IList->getLocStart(), 90480ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith SemaRef.getLangOpts().CPlusPlus11 ? 9056b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith diag::warn_cxx98_compat_empty_scalar_initializer : 9066b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith diag::err_empty_scalar_initializer) 9076b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith << IList->getSourceRange(); 90880ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith hadError = !SemaRef.getLangOpts().CPlusPlus11; 9094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 9104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 911bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 9120cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 913b934c2d77144471f35c5ebae9e925b056dac8112John McCall 914b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *expr = IList->getInit(Index); 915b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) { 91614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 91714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(SubIList->getLocStart(), 91814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::warn_many_braces_around_scalar_init) 91914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << SubIList->getSourceRange(); 920b934c2d77144471f35c5ebae9e925b056dac8112John McCall 921b934c2d77144471f35c5ebae9e925b056dac8112John McCall CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList, 922b934c2d77144471f35c5ebae9e925b056dac8112John McCall StructuredIndex); 923b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 924b934c2d77144471f35c5ebae9e925b056dac8112John McCall } else if (isa<DesignatedInitExpr>(expr)) { 92514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 92696a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(expr->getLocStart(), 92714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_designator_for_scalar_init) 92814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType << expr->getSourceRange(); 929b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; 930b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 931b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 932b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 933b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 934b934c2d77144471f35c5ebae9e925b056dac8112John McCall 93514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 93614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.CanPerformCopyInitialization(Entity, SemaRef.Owned(expr))) 93714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 93814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 93914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 94014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 94114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 942b934c2d77144471f35c5ebae9e925b056dac8112John McCall ExprResult Result = 943b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 944191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin SemaRef.Owned(expr), 945191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin /*TopLevelOfInitList=*/true); 946b934c2d77144471f35c5ebae9e925b056dac8112John McCall 947b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *ResultExpr = 0; 948b934c2d77144471f35c5ebae9e925b056dac8112John McCall 949b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Result.isInvalid()) 950b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; // types weren't compatible. 951b934c2d77144471f35c5ebae9e925b056dac8112John McCall else { 952b934c2d77144471f35c5ebae9e925b056dac8112John McCall ResultExpr = Result.takeAs<Expr>(); 953dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 954b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (ResultExpr != expr) { 955b934c2d77144471f35c5ebae9e925b056dac8112John McCall // The type was promoted, update initializer list. 956b934c2d77144471f35c5ebae9e925b056dac8112John McCall IList->setInit(Index, ResultExpr); 957b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 958b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 959b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (hadError) 960b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 961b934c2d77144471f35c5ebae9e925b056dac8112John McCall else 962b934c2d77144471f35c5ebae9e925b056dac8112John McCall UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 963b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 9640cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 9650cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 9668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckReferenceType(const InitializedEntity &Entity, 9678ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 968930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 969930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 970930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex) { 97114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (Index >= IList->getNumInits()) { 972390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: It would be wonderful if we could point at the actual member. In 973390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // general, it would be useful to pass location information down the stack, 974390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // so that we know the location (or decl) of the "current object" being 975390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // initialized. 97614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 97714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), 97814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_init_reference_member_uninitialized) 97914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType 98014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << IList->getSourceRange(); 981930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 982930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 983930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 984930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 985930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 98614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 98714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Expr *expr = IList->getInit(Index); 98880ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (isa<InitListExpr>(expr) && !SemaRef.getLangOpts().CPlusPlus11) { 98914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 99014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 99114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType << IList->getSourceRange(); 99214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 99314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 99414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++StructuredIndex; 99514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 99614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 99714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 99814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 99914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.CanPerformCopyInitialization(Entity, SemaRef.Owned(expr))) 100014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 100114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 100214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 100314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 100414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 100514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ExprResult Result = 100614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 100714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Owned(expr), 100814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl /*TopLevelOfInitList=*/true); 100914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 101014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (Result.isInvalid()) 101114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 101214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 101314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl expr = Result.takeAs<Expr>(); 101414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->setInit(Index, expr); 101514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 101614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (hadError) 101714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++StructuredIndex; 101814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 101914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 102014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 1021930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor} 1022930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 10238ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckVectorType(const InitializedEntity &Entity, 102446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 10254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 10264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 10274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 102820e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *VT = DeclType->getAs<VectorType>(); 102920e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned maxElements = VT->getNumElements(); 103020e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numEltsInit = 0; 103120e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType elementType = VT->getElementType(); 103220e047abc5f19dc948436c0fb891450d9cd40667John McCall 10333ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Index >= IList->getNumInits()) { 10343ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Make sure the element type can be value-initialized. 10353ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 10363ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable( 10373ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity)); 10383ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl return; 10393ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 10403ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 10414e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().OpenCL) { 104220e047abc5f19dc948436c0fb891450d9cd40667John McCall // If the initializing element is a vector, try to copy-initialize 104320e047abc5f19dc948436c0fb891450d9cd40667John McCall // instead of breaking it apart (which is doomed to failure anyway). 104420e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *Init = IList->getInit(Index); 104520e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) { 104614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 104714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.CanPerformCopyInitialization(Entity, SemaRef.Owned(Init))) 104814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 104914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 105014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 105114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 105214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 105320e047abc5f19dc948436c0fb891450d9cd40667John McCall ExprResult Result = 105420e047abc5f19dc948436c0fb891450d9cd40667John McCall SemaRef.PerformCopyInitialization(Entity, Init->getLocStart(), 1055191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin SemaRef.Owned(Init), 1056191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin /*TopLevelOfInitList=*/true); 105720e047abc5f19dc948436c0fb891450d9cd40667John McCall 105820e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *ResultExpr = 0; 105920e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Result.isInvalid()) 106020e047abc5f19dc948436c0fb891450d9cd40667John McCall hadError = true; // types weren't compatible. 106120e047abc5f19dc948436c0fb891450d9cd40667John McCall else { 106220e047abc5f19dc948436c0fb891450d9cd40667John McCall ResultExpr = Result.takeAs<Expr>(); 1063dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 106420e047abc5f19dc948436c0fb891450d9cd40667John McCall if (ResultExpr != Init) { 106520e047abc5f19dc948436c0fb891450d9cd40667John McCall // The type was promoted, update initializer list. 106620e047abc5f19dc948436c0fb891450d9cd40667John McCall IList->setInit(Index, ResultExpr); 10672ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 10682ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 106920e047abc5f19dc948436c0fb891450d9cd40667John McCall if (hadError) 107020e047abc5f19dc948436c0fb891450d9cd40667John McCall ++StructuredIndex; 107120e047abc5f19dc948436c0fb891450d9cd40667John McCall else 107214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, 107314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ResultExpr); 107420e047abc5f19dc948436c0fb891450d9cd40667John McCall ++Index; 107520e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 10760cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 107820e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 107920e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 1080dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 108120e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { 108220e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 10833ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Index >= IList->getNumInits()) { 10843ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 10853ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable(ElementEntity); 108620e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 10873ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 1088dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 108920e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 109020e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 109120e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 109220e047abc5f19dc948436c0fb891450d9cd40667John McCall } 109320e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 109420e047abc5f19dc948436c0fb891450d9cd40667John McCall } 109520e047abc5f19dc948436c0fb891450d9cd40667John McCall 109620e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 109720e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 1098dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 109920e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL initializers allows vectors to be constructed from vectors. 110020e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i) { 110120e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 110220e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Index >= IList->getNumInits()) 110320e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 1104dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 110520e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 110620e047abc5f19dc948436c0fb891450d9cd40667John McCall 110720e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType IType = IList->getInit(Index)->getType(); 110820e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!IType->isVectorType()) { 110920e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 111020e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 111120e047abc5f19dc948436c0fb891450d9cd40667John McCall ++numEltsInit; 111220e047abc5f19dc948436c0fb891450d9cd40667John McCall } else { 111320e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType VecType; 111420e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *IVT = IType->getAs<VectorType>(); 111520e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numIElts = IVT->getNumElements(); 1116dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 111720e047abc5f19dc948436c0fb891450d9cd40667John McCall if (IType->isExtVectorType()) 111820e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getExtVectorType(elementType, numIElts); 111920e047abc5f19dc948436c0fb891450d9cd40667John McCall else 112020e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getVectorType(elementType, numIElts, 1121e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson IVT->getVectorKind()); 112220e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, VecType, Index, 112320e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 112420e047abc5f19dc948436c0fb891450d9cd40667John McCall numEltsInit += numIElts; 112520e047abc5f19dc948436c0fb891450d9cd40667John McCall } 11260cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 112720e047abc5f19dc948436c0fb891450d9cd40667John McCall 112820e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL requires all elements to be initialized. 11293ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (numEltsInit != maxElements) { 11303ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!VerifyOnly) 113196a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(IList->getLocStart(), 11323ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl diag::err_vector_incorrect_num_initializers) 11333ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl << (numEltsInit < maxElements) << maxElements << numEltsInit; 11343ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl hadError = true; 11353ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 11360cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 11370cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 11388ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckArrayType(const InitializedEntity &Entity, 1139784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 114087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt elementIndex, 11411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 11424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 11434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 11444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 1145ce6c9b7da219c8640a0559f75770cfc6622de083John McCall const ArrayType *arrayType = SemaRef.Context.getAsArrayType(DeclType); 1146ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 11470cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // Check for the special-case of initializing an array with a string. 11480cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 1149ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (Expr *Str = IsStringInit(IList->getInit(Index), arrayType, 115079e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner SemaRef.Context)) { 11514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We place the string literal directly into the resulting 11524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initializer list. This is the only place where the structure 11534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // of the structured initializer list doesn't match exactly, 11544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // because doing so would involve allocating one character 11554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // constant for each string. 115614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 11578a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman CheckStringInit(Str, DeclType, arrayType, SemaRef); 115814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 115914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->resizeInits(SemaRef.Context, StructuredIndex); 116014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 11610cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 11620cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return; 11630cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 11640cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1165ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) { 1166638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // Check for VLAs; in standard C it would be possible to check this 1167638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // earlier, but I don't know where clang accepts VLAs (gcc accepts 1168638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // them in all sorts of strange places). 116914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 117014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(VAT->getSizeExpr()->getLocStart(), 117114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_variable_object_no_init) 117214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << VAT->getSizeExpr()->getSourceRange(); 1173638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman hadError = true; 11744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 11754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 1176638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 1177638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman } 1178638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman 117905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We might know the maximum number of elements in advance. 11804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor llvm::APSInt maxElements(elementIndex.getBitWidth(), 11814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor elementIndex.isUnsigned()); 118205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool maxElementsKnown = false; 1183ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(arrayType)) { 118405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = CAT->getSize(); 11859f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth()); 1186e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 118705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElementsKnown = true; 118805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 118905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1190ce6c9b7da219c8640a0559f75770cfc6622de083John McCall QualType elementType = arrayType->getElementType(); 119105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 119205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 119305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 119487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 119587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 119687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 119787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 119887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 119987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 120087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. elementIndex will be 120187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // updated to be the next array element we'll initialize. 12029a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 12034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, 0, &elementIndex, Index, 1204eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, true, 1205eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) { 120605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 120787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor continue; 120887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 120987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 1210f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor if (elementIndex.getBitWidth() > maxElements.getBitWidth()) 12119f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad maxElements = maxElements.extend(elementIndex.getBitWidth()); 1212f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor else if (elementIndex.getBitWidth() < maxElements.getBitWidth()) 12139f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extend(maxElements.getBitWidth()); 1214e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 1215f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor 121687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If the array is of incomplete type, keep track of the number of 121787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // elements in the initializer. 121887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 121987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor maxElements = elementIndex; 122005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 122105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 122205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 122305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 122405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we know the maximum number of elements, and we've already 122505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // hit it, stop consuming elements in the initializer list. 122605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElementsKnown && elementIndex == maxElements) 12270cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff break; 122805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 12298ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 1230dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex, 12318ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson Entity); 12328ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Check this element. 12338ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 12348ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 123505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++elementIndex; 123605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 123705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If the array is of incomplete type, keep track of the number of 123805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // elements in the initializer. 123905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 124005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = elementIndex; 12410cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 124214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!hadError && DeclType->isIncompleteArrayType() && !VerifyOnly) { 12430cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // If this is an incomplete array type, the actual type needs to 1244396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // be calculated here. 1245e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned()); 124605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElements == Zero) { 1247396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // Sizing an array implicitly to zero is not allowed by ISO C, 1248396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // but is supported by GNU. 12490820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 1250396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar diag::ext_typecheck_zero_array_size); 12510cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1252396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar 12531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements, 1254396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar ArrayType::Normal, 0); 12550cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 12563ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!hadError && VerifyOnly) { 12573ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Check if there are any members of the array that get value-initialized. 12583ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // If so, check if doing that is possible. 12593ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // FIXME: This needs to detect holes left by designated initializers too. 12603ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (maxElementsKnown && elementIndex < maxElements) 12613ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable(InitializedEntity::InitializeElement( 12623ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl SemaRef.Context, 0, Entity)); 12633ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 12640cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 12650cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1266f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedmanbool InitListChecker::CheckFlexibleArrayInit(const InitializedEntity &Entity, 1267f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman Expr *InitExpr, 1268f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FieldDecl *Field, 1269f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool TopLevelObject) { 1270f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Handle GNU flexible array initializers. 1271f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman unsigned FlexArrayDiag; 1272f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman if (isa<InitListExpr>(InitExpr) && 1273f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman cast<InitListExpr>(InitExpr)->getNumInits() == 0) { 1274f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Empty flexible array init always allowed as an extension 1275f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::ext_flexible_array_init; 12764e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie } else if (SemaRef.getLangOpts().CPlusPlus) { 1277f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init in C++; it is not required for gcc 1278f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // compatibility, and it needs work to IRGen correctly in general. 1279f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1280f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (!TopLevelObject) { 1281f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on non-top-level object 1282f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1283f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (Entity.getKind() != InitializedEntity::EK_Variable) { 1284f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on anything which is not a variable. 1285f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1286f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (cast<VarDecl>(Entity.getDecl())->hasLocalStorage()) { 1287f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on local variables. 1288f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1289f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else { 1290f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Allow other cases. 1291f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::ext_flexible_array_init; 1292f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } 129314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 129414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 129596a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(InitExpr->getLocStart(), 129614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl FlexArrayDiag) 129796a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar << InitExpr->getLocStart(); 129814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 129914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << Field; 130014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1301f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman 1302f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman return FlexArrayDiag != diag::ext_flexible_array_init; 1303f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman} 1304f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman 13058ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, 13062bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, 13071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType DeclType, 130887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator Field, 13091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 13104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 13114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 1312eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 1313eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 13146217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl* structDecl = DeclType->getAs<RecordType>()->getDecl(); 13151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1316b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // If the record is invalid, some of it's members are invalid. To avoid 1317b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // confusion, we forgo checking the intializer for the entire record. 1318b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman if (structDecl->isInvalidDecl()) { 131972ab27732ea7a42d756a1e79727f86fbe391b42bRichard Smith // Assume it was supposed to consume a single initializer. 132072ab27732ea7a42d756a1e79727f86fbe391b42bRichard Smith ++Index; 1321b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman hadError = true; 1322b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman return; 13231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 13243498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 13253498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (DeclType->isUnionType() && IList->getNumInits() == 0) { 13263ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Value-initialize the first named member of the union. 13273ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 13283ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl for (RecordDecl::field_iterator FieldEnd = RD->field_end(); 13293ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl Field != FieldEnd; ++Field) { 13303ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Field->getDeclName()) { 13313ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 13323ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable( 1333581deb3da481053c4993c7600f97acf7768caac5David Blaikie InitializedEntity::InitializeMember(*Field, &Entity)); 13343ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl else 1335581deb3da481053c4993c7600f97acf7768caac5David Blaikie StructuredList->setInitializedFieldInUnion(*Field); 13363ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl break; 13373498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 13383498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 13393498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return; 13403498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 13413498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 134205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If structDecl is a forward declaration, this loop won't do 134305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // anything except look at designated initializers; That's okay, 134405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // because an error should get printed out elsewhere. It might be 134505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // worthwhile to skip over the rest of the initializer, though. 13466217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 134717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RecordDecl::field_iterator FieldEnd = RD->field_end(); 1348dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor bool InitializedSomething = false; 134980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall bool CheckForMissingFields = true; 135005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 135105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 135205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 135305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 135487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 135587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 135687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 135787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 135887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 135987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 136087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. Field will be updated to 136187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the next field that we'll be initializing. 13629a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 13634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, &Field, 0, Index, 1364eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 1365eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, TopLevelObject)) 136605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 136705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1368dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 136980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 137080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Disable check for missing fields when designators are used. 137180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // This matches gcc behaviour. 137280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall CheckForMissingFields = false; 137305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 137405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 137505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 137605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field == FieldEnd) { 137705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We've run out of fields. We're done. 137844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor break; 137905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 138044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1381dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor // We've already initialized a member of a union. We're done. 1382dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor if (InitializedSomething && DeclType->isUnionType()) 1383dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor break; 1384dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor 138505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we've hit the flexible array member at the end, we're done. 138605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field->getType()->isIncompleteArrayType()) 1387b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman break; 138844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 13890bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (Field->isUnnamedBitfield()) { 13904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Don't initialize unnamed bitfields, e.g. "int : 20;" 139105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 1392b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman continue; 13930cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 139444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 139554001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor // Make sure we can use this declaration. 139614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool InvalidUse; 139714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 1398581deb3da481053c4993c7600f97acf7768caac5David Blaikie InvalidUse = !SemaRef.CanUseDecl(*Field); 139914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 1400581deb3da481053c4993c7600f97acf7768caac5David Blaikie InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, 140114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->getInit(Index)->getLocStart()); 140214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (InvalidUse) { 140354001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Index; 140454001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Field; 140554001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor hadError = true; 140654001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor continue; 140714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 140854001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor 14098ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 1410581deb3da481053c4993c7600f97acf7768caac5David Blaikie InitializedEntity::InitializeMember(*Field, &Entity); 14118ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 14128ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 1413dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 14140bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 141514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (DeclType->isUnionType() && !VerifyOnly) { 14160bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor // Initialize the first field within the union. 1417581deb3da481053c4993c7600f97acf7768caac5David Blaikie StructuredList->setInitializedFieldInUnion(*Field); 14180bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 141905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 142005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 14210cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 142244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 142380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Emit warnings for missing struct field initializers. 142414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && InitializedSomething && CheckForMissingFields && 142514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Field != FieldEnd && !Field->getType()->isIncompleteArrayType() && 142614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !DeclType->isUnionType()) { 142780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // It is possible we have one or more unnamed bitfields remaining. 142880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Find first (if any) named field and emit warning. 142980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall for (RecordDecl::field_iterator it = Field, end = RD->field_end(); 143080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall it != end; ++it) { 143180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall if (!it->isUnnamedBitfield()) { 143280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall SemaRef.Diag(IList->getSourceRange().getEnd(), 143380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall diag::warn_missing_field_initializers) << it->getName(); 143480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall break; 143580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 143680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 143780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 143880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 14393ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Check that any remaining fields can be value-initialized. 14403ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly && Field != FieldEnd && !DeclType->isUnionType() && 14413ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl !Field->getType()->isIncompleteArrayType()) { 14423ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // FIXME: Should check for holes left by designated initializers too. 14433ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl for (; Field != FieldEnd && !hadError; ++Field) { 14443ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!Field->isUnnamedBitfield()) 14453ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable( 1446581deb3da481053c4993c7600f97acf7768caac5David Blaikie InitializedEntity::InitializeMember(*Field, &Entity)); 14473ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 14483ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 14493ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 14501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() || 1451a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor Index >= IList->getNumInits()) 1452eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return; 1453eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1454581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (CheckFlexibleArrayInit(Entity, IList->getInit(Index), *Field, 1455f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman TopLevelObject)) { 1456eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor hadError = true; 1457a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor ++Index; 1458a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor return; 1459eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1460eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 14618ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 1462581deb3da481053c4993c7600f97acf7768caac5David Blaikie InitializedEntity::InitializeMember(*Field, &Entity); 1463dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 14648ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (isa<InitListExpr>(IList->getInit(Index))) 1465dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 14668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 14678ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson else 1468dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index, 1469987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson StructuredList, StructuredIndex); 14700cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 14710cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1472ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Expand a field designator that refers to a member of an 1473ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// anonymous struct or union into a series of field designators that 1474ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// refers to the field within the appropriate subobject. 1475ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// 1476ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorstatic void ExpandAnonymousFieldDesignator(Sema &SemaRef, 14771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 14781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned DesigIdx, 1479a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IndirectFieldDecl *IndirectField) { 1480ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor typedef DesignatedInitExpr::Designator Designator; 1481ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1482ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the replacement designators. 14835f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Designator, 4> Replacements; 1484a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(), 1485a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet PE = IndirectField->chain_end(); PI != PE; ++PI) { 1486a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (PI + 1 == PE) 14871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Replacements.push_back(Designator((IdentifierInfo *)0, 1488ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getDotLoc(), 1489ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getFieldLoc())); 1490ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor else 1491ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.push_back(Designator((IdentifierInfo *)0, SourceLocation(), 1492ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SourceLocation())); 1493a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(isa<FieldDecl>(*PI)); 1494a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Replacements.back().setField(cast<FieldDecl>(*PI)); 1495ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1496ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1497ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Expand the current designator into the set of replacement 1498ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // designators, so we have a full subobject path down to where the 1499ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // member of the anonymous struct/union is actually stored. 1500319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0], 1501ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor &Replacements[0] + Replacements.size()); 1502a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet} 15031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1504dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Given an implicit anonymous field, search the IndirectField that 1505a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet/// corresponds to FieldName. 1506a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichetstatic IndirectFieldDecl *FindIndirectFieldDesignator(FieldDecl *AnonField, 1507a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IdentifierInfo *FieldName) { 1508b22b0a53849dbb79da221fcc4671125ad49cb848Argyrios Kyrtzidis if (!FieldName) 1509b22b0a53849dbb79da221fcc4671125ad49cb848Argyrios Kyrtzidis return 0; 1510b22b0a53849dbb79da221fcc4671125ad49cb848Argyrios Kyrtzidis 1511a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(AnonField->isAnonymousStructOrUnion()); 1512a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Decl *NextDecl = AnonField->getNextDeclInContext(); 15133e78b19e51034dd27c6e0d811522148345e299e4Aaron Ballman while (IndirectFieldDecl *IF = 15143e78b19e51034dd27c6e0d811522148345e299e4Aaron Ballman dyn_cast_or_null<IndirectFieldDecl>(NextDecl)) { 1515b22b0a53849dbb79da221fcc4671125ad49cb848Argyrios Kyrtzidis if (FieldName == IF->getAnonField()->getIdentifier()) 1516a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet return IF; 1517a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet NextDecl = NextDecl->getNextDeclInContext(); 1518ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1519a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet return 0; 1520ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 1521ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 152214b0c194b356a1204d081765b3e6699687bed97cSebastian Redlstatic DesignatedInitExpr *CloneDesignatedInitExpr(Sema &SemaRef, 152314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr *DIE) { 152414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned NumIndexExprs = DIE->getNumSubExprs() - 1; 152514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SmallVector<Expr*, 4> IndexExprs(NumIndexExprs); 152614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl for (unsigned I = 0; I < NumIndexExprs; ++I) 152714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IndexExprs[I] = DIE->getSubExpr(I + 1); 152814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return DesignatedInitExpr::Create(SemaRef.Context, DIE->designators_begin(), 15293b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer DIE->size(), IndexExprs, 15303b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer DIE->getEqualOrColonLoc(), 153114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->usesGNUSyntax(), DIE->getInit()); 153214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl} 153314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 1534425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrainnamespace { 1535425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1536425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain// Callback to only accept typo corrections that are for field members of 1537425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain// the given struct or union. 1538425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrainclass FieldInitializerValidatorCCC : public CorrectionCandidateCallback { 1539425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain public: 1540425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain explicit FieldInitializerValidatorCCC(RecordDecl *RD) 1541425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain : Record(RD) {} 1542425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1543425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain virtual bool ValidateCandidate(const TypoCorrection &candidate) { 1544425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>(); 1545425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain return FD && FD->getDeclContext()->getRedeclContext()->Equals(Record); 1546425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain } 1547425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1548425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain private: 1549425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain RecordDecl *Record; 1550425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain}; 1551425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1552425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain} 1553425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 155405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Check the well-formedness of a C99 designated initializer. 155505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 155605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Determines whether the designated initializer @p DIE, which 155705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// resides at the given @p Index within the initializer list @p 155805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// IList, is well-formed for a current object of type @p DeclType 155905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// (C99 6.7.8). The actual subobject that this designator refers to 15601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// within the current subobject is returned in either 15614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @p NextField or @p NextElementIndex (whichever is appropriate). 156205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 156305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param IList The initializer list in which this designated 156405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// initializer occurs. 156505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 1566711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DIE The designated initializer expression. 1567711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// 1568711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DesigIdx The index of the current designator. 156905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 157070517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko/// @param CurrentObjectType The type of the "current object" (C99 6.7.8p17), 157105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// into which the designation in @p DIE should refer. 157205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 157387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextField If non-NULL and the first designator in @p DIE is 157487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// a field, this will be set to the field declaration corresponding 157587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// to the field named by the designator. 157605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 157787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextElementIndex If non-NULL and the first designator in @p 157887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// DIE is an array designator or GNU array-range designator, this 157987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// will be set to the last index initialized by this designator. 158005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 158105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param Index Index into @p IList where the designated initializer 158205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @p DIE occurs. 158305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 15844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @param StructuredList The initializer list expression that 15854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// describes all of the subobject initializers in the order they'll 15864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// actually be initialized. 15874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 158805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @returns true if there was an error, false otherwise. 15891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 15908ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders CarlssonInitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 15919a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, 159214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr *DIE, 159314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned DesigIdx, 159414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl QualType &CurrentObjectType, 159514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl RecordDecl::field_iterator *NextField, 159614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl llvm::APSInt *NextElementIndex, 159714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned &Index, 159814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr *StructuredList, 159914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned &StructuredIndex, 1600eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 1601eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 1602711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if (DesigIdx == DIE->size()) { 160387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the actual initialization for the designated object type. 160487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 16056fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 16066fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Temporarily remove the designator expression from the 16076fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // initializer list that the child calls see, so that we don't try 16086fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // to re-process the designator. 16096fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned OldIndex = Index; 16106fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE->getInit()); 16116fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 16129a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson CheckSubElementType(Entity, IList, CurrentObjectType, Index, 16134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 16146fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 16156fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Restore the designated initializer expression in the syntactic 16166fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // form of the initializer list. 16176fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor if (IList->getInit(OldIndex) != DIE->getInit()) 16186fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor DIE->setInit(IList->getInit(OldIndex)); 16196fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE); 16206fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 162187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 162287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 162305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1624711997184366d584c9c437102cae1e9d9927b986Douglas Gregor DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx); 162514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool IsFirstDesignator = (DesigIdx == 0); 162614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 162714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert((IsFirstDesignator || StructuredList) && 162814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl "Need a non-designated initializer list to start from"); 162914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 163014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Determine the structural initializer list that corresponds to the 163114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // current subobject. 1632a789416a497b2e14e7c2fd721d03e541120bac8dBenjamin Kramer StructuredList = IsFirstDesignator? SyntacticToSemantic.lookup(IList) 163314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl : getStructuredSubobjectInit(IList, Index, CurrentObjectType, 163414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList, StructuredIndex, 163565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceRange(D->getLocStart(), 163665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen DIE->getLocEnd())); 163714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert(StructuredList && "Expected a structured initializer list"); 163814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 16394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 164087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (D->isFieldDesignator()) { 164187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p7: 164287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 164387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 164487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 164587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // . identifier 164687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 164787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have 164887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // structure or union type and the identifier shall be the 16491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // name of a member of that type. 16506217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = CurrentObjectType->getAs<RecordType>(); 165187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!RT) { 165287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation Loc = D->getDotLoc(); 165387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (Loc.isInvalid()) 165487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Loc = D->getFieldLoc(); 165514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 165614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Loc, diag::err_field_designator_non_aggr) 16574e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie << SemaRef.getLangOpts().CPlusPlus << CurrentObjectType; 165887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 165987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 166087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 166187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 16624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Note: we perform a linear search of the fields here, despite 16634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the fact that we have a faster lookup method, because we always 16644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // need to compute the field's index. 1665ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *KnownField = D->getField(); 166687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IdentifierInfo *FieldName = D->getFieldName(); 16674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned FieldIndex = 0; 16681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator 166917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = RT->getDecl()->field_begin(), 167017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RT->getDecl()->field_end(); 16714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (; Field != FieldEnd; ++Field) { 16724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field->isUnnamedBitfield()) 16734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor continue; 1674dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1675a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet // If we find a field representing an anonymous field, look in the 1676a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet // IndirectFieldDecl that follow for the designated initializer. 1677a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (!KnownField && Field->isAnonymousStructOrUnion()) { 1678a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (IndirectFieldDecl *IF = 1679581deb3da481053c4993c7600f97acf7768caac5David Blaikie FindIndirectFieldDesignator(*Field, FieldName)) { 168014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // In verify mode, don't modify the original. 168114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 168214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE = CloneDesignatedInitExpr(SemaRef, DIE); 1683a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IF); 1684a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet D = DIE->getDesignator(DesigIdx); 1685a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet break; 1686a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1687a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1688581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (KnownField && KnownField == *Field) 1689022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor break; 1690022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor if (FieldName && FieldName == Field->getIdentifier()) 16914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor break; 16924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 16934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 169487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 169587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 16964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field == FieldEnd) { 1697a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer if (VerifyOnly) { 1698a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer ++Index; 169914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return true; // No typo correction when just trying this out. 1700a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer } 170114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 1702ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // There was no normal field in the struct with the designated 1703ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // name. Perform another lookup for this name, which may find 1704ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // something that we can't designate (e.g., a member function), 1705ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // may find nothing, or may find a member of an anonymous 17061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // struct/union. 170717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName); 1708c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldDecl *ReplacementField = 0; 17093bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie if (Lookup.empty()) { 1710c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Name lookup didn't find anything. Determine whether this 1711c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // was a typo for another field name. 1712425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain FieldInitializerValidatorCCC Validator(RT->getDecl()); 1713d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor TypoCorrection Corrected = SemaRef.CorrectTypo( 1714d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor DeclarationNameInfo(FieldName, D->getFieldLoc()), 171516e46dd0c284296cea819dfbf67942ecef02894dKaelyn Uhrain Sema::LookupMemberName, /*Scope=*/0, /*SS=*/0, Validator, 1716425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain RT->getDecl()); 1717425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain if (Corrected) { 1718d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor std::string CorrectedStr( 17194e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie Corrected.getAsString(SemaRef.getLangOpts())); 1720d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor std::string CorrectedQuotedStr( 17214e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie Corrected.getQuoted(SemaRef.getLangOpts())); 1722425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain ReplacementField = Corrected.getCorrectionDeclAs<FieldDecl>(); 1723dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.Diag(D->getFieldLoc(), 1724c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor diag::err_field_designator_unknown_suggest) 1725d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << FieldName << CurrentObjectType << CorrectedQuotedStr 1726d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << FixItHint::CreateReplacement(D->getFieldLoc(), CorrectedStr); 1727dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.Diag(ReplacementField->getLocation(), 1728d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor diag::note_previous_decl) << CorrectedQuotedStr; 1729a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer hadError = true; 1730c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else { 1731c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown) 1732c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType; 1733c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++Index; 1734c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor return true; 1735c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1736c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1737dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1738c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!ReplacementField) { 17394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Name lookup found something, but it wasn't a field. 17400820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield) 17414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << FieldName; 17423bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie SemaRef.Diag(Lookup.front()->getLocation(), 17434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_field_designator_found); 1744ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman ++Index; 1745ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman return true; 1746ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1747c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1748a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (!KnownField) { 1749c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // The replacement field comes from typo correction; find it 1750c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // in the list of fields. 1751c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldIndex = 0; 1752c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field = RT->getDecl()->field_begin(); 1753c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor for (; Field != FieldEnd; ++Field) { 1754c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (Field->isUnnamedBitfield()) 1755c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor continue; 1756c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1757581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (ReplacementField == *Field || 1758c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field->getIdentifier() == ReplacementField->getIdentifier()) 1759c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor break; 1760c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1761c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++FieldIndex; 1762c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1763c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 176487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 17654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // All of the fields of a union are located at the same place in 17674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the initializer list. 17680bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (RT->getDecl()->isUnion()) { 17694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor FieldIndex = 0; 177014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 1771581deb3da481053c4993c7600f97acf7768caac5David Blaikie StructuredList->setInitializedFieldInUnion(*Field); 17720bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 17734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 177454001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor // Make sure we can use this declaration. 177514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool InvalidUse; 177614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 1777581deb3da481053c4993c7600f97acf7768caac5David Blaikie InvalidUse = !SemaRef.CanUseDecl(*Field); 177814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 1779581deb3da481053c4993c7600f97acf7768caac5David Blaikie InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc()); 178014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (InvalidUse) { 178154001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Index; 178254001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor return true; 178314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 178454001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor 178514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 178614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Update the designator with the field declaration. 1787581deb3da481053c4993c7600f97acf7768caac5David Blaikie D->setField(*Field); 17881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 178914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Make sure that our non-designated initializer list has space 179014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // for a subobject corresponding to this field. 179114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (FieldIndex >= StructuredList->getNumInits()) 179214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1); 179314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 17944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1795eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // This designator names a flexible array member. 1796eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Field->getType()->isIncompleteArrayType()) { 1797eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool Invalid = false; 1798711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if ((DesigIdx + 1) != DIE->size()) { 1799eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // We can't designate an object within the flexible array 1800eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // member (because GCC doesn't allow it). 180114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 180214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr::Designator *NextD 180314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl = DIE->getDesignator(DesigIdx + 1); 180465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SemaRef.Diag(NextD->getLocStart(), 180514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_designator_into_flexible_array_member) 180665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen << SourceRange(NextD->getLocStart(), 180765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen DIE->getLocEnd()); 180814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1809581deb3da481053c4993c7600f97acf7768caac5David Blaikie << *Field; 181014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1811eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1812eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1813eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 18149046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner if (!hadError && !isa<InitListExpr>(DIE->getInit()) && 18159046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner !isa<StringLiteral>(DIE->getInit())) { 1816eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // The initializer is not an initializer list. 181714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 181896a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(DIE->getInit()->getLocStart(), 181914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_flexible_array_init_needs_braces) 182014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DIE->getInit()->getSourceRange(); 182114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1822581deb3da481053c4993c7600f97acf7768caac5David Blaikie << *Field; 182314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1824eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1825eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1826eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1827f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Check GNU flexible array initializer. 1828581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (!Invalid && CheckFlexibleArrayInit(Entity, DIE->getInit(), *Field, 1829f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman TopLevelObject)) 1830eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1831eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1832eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Invalid) { 1833eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Index; 1834eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1835eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1836eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1837eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Initialize the array. 1838eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool prevHadError = hadError; 1839eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1840eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned OldIndex = Index; 1841eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(Index, DIE->getInit()); 18428ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 18438ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 1844581deb3da481053c4993c7600f97acf7768caac5David Blaikie InitializedEntity::InitializeMember(*Field, &Entity); 18458ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 1846eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, newStructuredIndex); 18478ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 1848eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(OldIndex, DIE); 1849eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (hadError && !prevHadError) { 1850eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Field; 1851eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++FieldIndex; 1852eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (NextField) 1853eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor *NextField = Field; 1854eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredIndex = FieldIndex; 1855eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1856eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1857eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } else { 1858eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Recurse to check later designated subobjects. 1859262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie QualType FieldType = Field->getType(); 1860eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1861dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 18629a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity MemberEntity = 1863581deb3da481053c4993c7600f97acf7768caac5David Blaikie InitializedEntity::InitializeMember(*Field, &Entity); 1864dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1, 1865dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FieldType, 0, 0, Index, 18669a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, newStructuredIndex, 1867eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, false)) 1868eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1869eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 187087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 187187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Find the position of the next field to be initialized in this 187287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // subobject. 187387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Field; 18744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 187505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 187687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 187787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this struct/class/union subobject. 187887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 187987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextField) 188087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor *NextField = Field; 18814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = FieldIndex; 188287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 188387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 188405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 188534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 188634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 188734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1888ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // We've already initialized something in the union; we're done. 1889ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (RT->getDecl()->isUnion()) 1890ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return hadError; 1891ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 189287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining fields within this class/struct/union subobject. 189387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 1894dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 18958ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckStructUnionTypes(Entity, IList, CurrentObjectType, Field, false, Index, 18964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, FieldIndex); 189787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 189887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 189905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 190087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p6: 190187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 190287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 190387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 190487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ] 190587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 190687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have array 190787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // type and the expression shall be an integer constant 190887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // expression. If the array is of unknown size, any 190987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // nonnegative value is valid. 191087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 191187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Additionally, cope with the GNU extension that permits 191287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designators of the form 191387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 191487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ... constant-expression ] 19150820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType); 191687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!AT) { 191714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 191814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array) 191914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << CurrentObjectType; 192087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 192187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 192287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 192305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 192487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Expr *IndexExpr = 0; 192534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor llvm::APSInt DesignatedStartIndex, DesignatedEndIndex; 192634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (D->isArrayDesignator()) { 192787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayIndex(*D); 1928a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DesignatedStartIndex = IndexExpr->EvaluateKnownConstInt(SemaRef.Context); 192934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex = DesignatedStartIndex; 193034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 193187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(D->isArrayRangeDesignator() && "Need array-range designator"); 19323bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 19331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedStartIndex = 1934a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DIE->getArrayRangeStart(*D)->EvaluateKnownConstInt(SemaRef.Context); 19351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedEndIndex = 1936a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DIE->getArrayRangeEnd(*D)->EvaluateKnownConstInt(SemaRef.Context); 193787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayRangeEnd(*D); 193834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1939e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // Codegen can't handle evaluating array range designators that have side 1940e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // effects, because we replicate the AST value for each initialized element. 1941e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // As such, set the sawArrayRangeDesignator() bit if we initialize multiple 1942e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // elements with something that has a side effect, so codegen can emit an 1943e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // "error unsupported" error instead of miscompiling the app. 1944e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&& 194514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->getInit()->HasSideEffects(SemaRef.Context) && !VerifyOnly) 1946a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor FullyStructuredList->sawArrayRangeDesignator(); 194787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 194805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 194987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (isa<ConstantArrayType>(AT)) { 195087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false); 19519f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 19529f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth()); 195334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned()); 19549f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 19559f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth()); 195634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned()); 195734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex >= MaxElements) { 1958a4e20e1e43df39e39328035c84c46fdcbbf3a01eEli Friedman if (!VerifyOnly) 195996a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(IndexExpr->getLocStart(), 196014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_array_designator_too_large) 196114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DesignatedEndIndex.toString(10) << MaxElements.toString(10) 196214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << IndexExpr->getSourceRange(); 196387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 196487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 196505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 196634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 196734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Make sure the bit-widths and signedness match. 196834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedStartIndex.getBitWidth() > DesignatedEndIndex.getBitWidth()) 19699f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 19709f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extend(DesignatedStartIndex.getBitWidth()); 19713bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner else if (DesignatedStartIndex.getBitWidth() < 19723bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedEndIndex.getBitWidth()) 19739f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 19749f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extend(DesignatedEndIndex.getBitWidth()); 197534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(true); 197634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(true); 197705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 19781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 19804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this array element. 198114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && 198214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits()) 19831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredList->resizeInits(SemaRef.Context, 198434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.getZExtValue() + 1); 198534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 198634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Repeatedly perform subobject initializations in the range 198734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // [DesignatedStartIndex, DesignatedEndIndex]. 198834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 198934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next designator 199034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned ElementIndex = DesignatedStartIndex.getZExtValue(); 199134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned OldIndex = Index; 1992dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 19939a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity ElementEntity = 19948ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 19959a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 199634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor while (DesignatedStartIndex <= DesignatedEndIndex) { 199734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Recurse to check later designated subobjects. 199834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor QualType ElementType = AT->getElementType(); 199934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor Index = OldIndex; 2000dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 20019a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementEntity.setElementIndex(ElementIndex); 2002dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(ElementEntity, IList, DIE, DesigIdx + 1, 2003dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementType, 0, 0, Index, 20049a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, ElementIndex, 2005eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor (DesignatedStartIndex == DesignatedEndIndex), 2006eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) 200734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return true; 200887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 200934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next index in the array that we'll be initializing. 201034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ++DesignatedStartIndex; 201134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ElementIndex = DesignatedStartIndex.getZExtValue(); 201234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } 201387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 201487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 201587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this array subobject. 201687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 201787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextElementIndex) 201834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor *NextElementIndex = DesignatedStartIndex; 20194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = ElementIndex; 202087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 202187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 20221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 202334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 202434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 202534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 202687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining elements within this array subobject. 202705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool prevHadError = hadError; 2028dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex, 2029784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 20304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, ElementIndex); 20311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return hadError && !prevHadError; 203205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 203305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 20344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// Get the structured initializer list for a subobject of type 20354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// @p CurrentObjectType. 20364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListExpr * 20374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 20384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType CurrentObjectType, 20394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 20404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredIndex, 20414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange InitRange) { 204214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 204314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return 0; // No structured list in verification-only mode. 20444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *ExistingInit = 0; 20454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 2046a789416a497b2e14e7c2fd721d03e541120bac8dBenjamin Kramer ExistingInit = SyntacticToSemantic.lookup(IList); 20474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else if (StructuredIndex < StructuredList->getNumInits()) 20484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = StructuredList->getInit(StructuredIndex); 20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit)) 20514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 20524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 20534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (ExistingInit) { 20544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We are creating an initializer list that initializes the 20554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobjects of the current object, but there was already an 20564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initialization that completely initialized the current 20574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject, e.g., by a compound literal: 20581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 20594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X { int a, b; }; 20604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 }; 20611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 20624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Here, xs[0].a == 0 and xs[0].b == 3, since the second, 20634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // designated initializer re-initializes the whole 20644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject [0], overwriting previous initializers. 20651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(InitRange.getBegin(), 2066ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor diag::warn_subobject_initializer_overrides) 20674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << InitRange; 206896a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(ExistingInit->getLocStart(), 20694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 207054f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 20714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << ExistingInit->getSourceRange(); 20724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 20734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 20741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *Result 2075709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek = new (SemaRef.Context) InitListExpr(SemaRef.Context, 20763b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer InitRange.getBegin(), MultiExprArg(), 2077ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek InitRange.getEnd()); 2078ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor 20795c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman QualType ResultType = CurrentObjectType; 20805c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman if (!ResultType->isArrayType()) 20815c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman ResultType = ResultType.getNonLValueExprType(SemaRef.Context); 20825c89c399ba0a171e3312a74e008d61d174d961f3Eli Friedman Result->setType(ResultType); 20834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 2084fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Pre-allocate storage for the structured initializer list. 2085fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor unsigned NumElements = 0; 208608457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor unsigned NumInits = 0; 2087f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis bool GotNumInits = false; 2088f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (!StructuredList) { 208908457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = IList->getNumInits(); 2090f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis GotNumInits = true; 2091f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis } else if (Index < IList->getNumInits()) { 2092f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) { 209308457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = SubList->getNumInits(); 2094f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis GotNumInits = true; 2095f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis } 209608457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor } 209708457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor 20981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ArrayType *AType 2099fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor = SemaRef.Context.getAsArrayType(CurrentObjectType)) { 2100fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) { 2101fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = CAType->getSize().getZExtValue(); 2102fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Simple heuristic so that we don't allocate a very large 2103fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // initializer with many empty entries at the end. 2104f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (GotNumInits && NumElements > NumInits) 2105fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 0; 2106fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 2107183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) 2108fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = VType->getNumElements(); 21096217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const RecordType *RType = CurrentObjectType->getAs<RecordType>()) { 2110fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor RecordDecl *RDecl = RType->getDecl(); 2111fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (RDecl->isUnion()) 2112fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 1; 2113fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor else 21141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumElements = std::distance(RDecl->field_begin(), 211517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RDecl->field_end()); 2116fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 2117fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 2118709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Result->reserveInits(SemaRef.Context, NumElements); 2119fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 21204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Link this new initializer list into the structured initializer 21214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // lists. 21224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (StructuredList) 2123709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result); 21244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else { 21254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Result->setSyntacticForm(IList); 21264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = Result; 21274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 21284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 21294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 21304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 21314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 21324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Update the initializer at index @p StructuredIndex within the 21334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// structured initializer list to the value @p expr. 21344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregorvoid InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, 21354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex, 21364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *expr) { 21374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // No structured initializer list to update 21384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 21394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 21404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 2141709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, 2142709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredIndex, expr)) { 21434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // This initializer overwrites a previous initializer. Warn. 214496a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(expr->getLocStart(), 21454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::warn_initializer_overrides) 21464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << expr->getSourceRange(); 214796a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SemaRef.Diag(PrevInit->getLocStart(), 21484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 214954f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 21504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << PrevInit->getSourceRange(); 21514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 21521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 21544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 21554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 215605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Check that the given Index expression is a valid array designator 2157282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// value. This is essentially just a wrapper around 21583bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner/// VerifyIntegerConstantExpression that also checks for negative values 215905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// and produces a reasonable diagnostic if there is a 2160282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// failure. Returns the index expression, possibly with an implicit cast 2161282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// added, on success. If everything went okay, Value will receive the 2162282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// value of the constant expression. 2163282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smithstatic ExprResult 21643bf6893b77c30cb774100e0fa7ae029331675ec1Chris LattnerCheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) { 216596a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar SourceLocation Loc = Index->getLocStart(); 216605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 216705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Make sure this is an integer constant expression. 2168282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith ExprResult Result = S.VerifyIntegerConstantExpression(Index, &Value); 2169282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (Result.isInvalid()) 2170282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith return Result; 21713bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 21723bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (Value.isSigned() && Value.isNegative()) 21733bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return S.Diag(Loc, diag::err_array_designator_negative) 217405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << Value.toString(10) << Index->getSourceRange(); 217505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 217653d3d8e0662197f7245d8f5ff697a72a2b4b3f54Douglas Gregor Value.setIsUnsigned(true); 2177282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith return Result; 217805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 217905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 218060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, 21817663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky SourceLocation Loc, 21827663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky bool GNUSyntax, 21837663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky ExprResult Init) { 218405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef DesignatedInitExpr::Designator ASTDesignator; 218505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 218605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool Invalid = false; 21875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ASTDesignator, 32> Designators; 21885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Expr *, 32> InitExpressions; 218905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 219005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Build designators and check array designator expressions. 219105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) { 219205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor const Designator &D = Desig.getDesignator(Idx); 219305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor switch (D.getKind()) { 219405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::FieldDesignator: 21951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(), 219605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getFieldLoc())); 219705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 219805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 219905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayDesignator: { 220005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Index = static_cast<Expr *>(D.getArrayIndex()); 220105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt IndexValue; 2202282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!Index->isTypeDependent() && !Index->isValueDependent()) 2203282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith Index = CheckArrayDesignatorExpr(*this, Index, IndexValue).take(); 2204282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!Index) 220505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 220605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else { 220705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 22081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 220905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getRBracketLoc())); 221005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor InitExpressions.push_back(Index); 221105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 221205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 221305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 221405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 221505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayRangeDesignator: { 221605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart()); 221705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd()); 221805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt StartValue; 221905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt EndValue; 22209ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool StartDependent = StartIndex->isTypeDependent() || 22219ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor StartIndex->isValueDependent(); 22229ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool EndDependent = EndIndex->isTypeDependent() || 22239ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor EndIndex->isValueDependent(); 2224282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!StartDependent) 2225282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith StartIndex = 2226282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith CheckArrayDesignatorExpr(*this, StartIndex, StartValue).take(); 2227282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!EndDependent) 2228282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith EndIndex = CheckArrayDesignatorExpr(*this, EndIndex, EndValue).take(); 2229282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith 2230282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!StartIndex || !EndIndex) 223105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 2232d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else { 2233d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor // Make sure we're comparing values with the same bit width. 22349ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (StartDependent || EndDependent) { 22359ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Nothing to compute. 22369ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (StartValue.getBitWidth() > EndValue.getBitWidth()) 22379f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad EndValue = EndValue.extend(StartValue.getBitWidth()); 2238d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else if (StartValue.getBitWidth() < EndValue.getBitWidth()) 22399f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad StartValue = StartValue.extend(EndValue.getBitWidth()); 2240d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor 2241c4bb7bfe8328f79004517dd268f6146c8066c205Douglas Gregor if (!StartDependent && !EndDependent && EndValue < StartValue) { 2242d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range) 22431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << StartValue.toString(10) << EndValue.toString(10) 2244d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor << StartIndex->getSourceRange() << EndIndex->getSourceRange(); 2245d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Invalid = true; 2246d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } else { 2247d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 22481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 2249d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getEllipsisLoc(), 2250d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getRBracketLoc())); 2251d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(StartIndex); 2252d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(EndIndex); 2253d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } 225405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 225505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 225605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 225705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 225805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 225905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 226005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Invalid || Init.isInvalid()) 226105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return ExprError(); 226205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 226305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Clear out the expressions within the designation. 226405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Desig.ClearExprs(*this); 226505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 226605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor DesignatedInitExpr *DIE 2267beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad = DesignatedInitExpr::Create(Context, 2268beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Designators.data(), Designators.size(), 22693b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer InitExpressions, Loc, GNUSyntax, 22703b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer Init.takeAs<Expr>()); 2271dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 22724e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!getLangOpts().C99) 22732d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor Diag(DIE->getLocStart(), diag::ext_designated_init) 22742d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor << DIE->getSourceRange(); 2275dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 227605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return Owned(DIE); 227705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 2278c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 2279cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 2280cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor// Initialization entity 2281cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 228239da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor 2283dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index, 2284cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor const InitializedEntity &Parent) 2285dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi : Parent(&Parent), Index(Index) 2286cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor{ 2287d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) { 2288d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_ArrayElement; 2289d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = AT->getElementType(); 22900c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else if (const VectorType *VT = Parent.getType()->getAs<VectorType>()) { 2291d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_VectorElement; 22920c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Type = VT->getElementType(); 22930c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else { 22940c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman const ComplexType *CT = Parent.getType()->getAs<ComplexType>(); 22950c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman assert(CT && "Unexpected type"); 22960c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Kind = EK_ComplexElement; 22970c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Type = CT->getElementType(); 2298d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } 229920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 230020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2301dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity InitializedEntity::InitializeBase(ASTContext &Context, 2302711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson CXXBaseSpecifier *Base, 2303711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson bool IsInheritedVirtualBase) 230420093b4bf698f292c664676987541d5103b65b15Douglas Gregor{ 230520093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializedEntity Result; 230620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Kind = EK_Base; 2307711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base = reinterpret_cast<uintptr_t>(Base); 2308711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson if (IsInheritedVirtualBase) 2309711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base |= 0x01; 2310dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2311d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Result.Type = Base->getType(); 231220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 231320093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 231420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 231599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas GregorDeclarationName InitializedEntity::getName() const { 231699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (getKind()) { 2317f85e193739c953358c865005855253af4f68a497John McCall case EK_Parameter: { 2318f85e193739c953358c865005855253af4f68a497John McCall ParmVarDecl *D = reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1); 2319f85e193739c953358c865005855253af4f68a497John McCall return (D ? D->getDeclName() : DeclarationName()); 2320f85e193739c953358c865005855253af4f68a497John McCall } 2321a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor 2322a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor case EK_Variable: 232399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Member: 232499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return VariableOrMember->getDeclName(); 232599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 23264773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case EK_LambdaCapture: 23274773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor return Capture.Var->getDeclName(); 23284773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor 232999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Result: 233099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Exception: 233118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case EK_New: 233299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Temporary: 233399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Base: 2334059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 2335d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2336d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 23370c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2338310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 233999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 234099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 2341dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23427530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 234399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 234499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 23457abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas GregorDeclaratorDecl *InitializedEntity::getDecl() const { 23467abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor switch (getKind()) { 23477abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Variable: 23487abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Member: 23497abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return VariableOrMember; 23507abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 2351f85e193739c953358c865005855253af4f68a497John McCall case EK_Parameter: 2352f85e193739c953358c865005855253af4f68a497John McCall return reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1); 2353f85e193739c953358c865005855253af4f68a497John McCall 23547abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Result: 23557abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Exception: 23567abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_New: 23577abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Temporary: 23587abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Base: 2359059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 2360d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2361d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 23620c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2363310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 23644773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case EK_LambdaCapture: 23657abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 23667abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor } 2367dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23687530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 23697abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor} 23707abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 23713c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregorbool InitializedEntity::allowsNRVO() const { 23723c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor switch (getKind()) { 23733c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Result: 23743c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Exception: 23753c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return LocAndNRVO.NRVO; 2376dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23773c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Variable: 23783c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Parameter: 23793c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Member: 23803c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_New: 23813c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Temporary: 23823c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Base: 2383059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 23843c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_ArrayElement: 23853c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_VectorElement: 23860c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2387310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 23884773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case EK_LambdaCapture: 23893c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor break; 23903c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor } 23913c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 23923c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return false; 23933c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor} 23943c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 239520093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 239620093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Initialization sequence 239720093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 239820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 239920093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::Step::Destroy() { 240020093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Kind) { 240120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 240220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 2403906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 240420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: 240520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 240620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 2407523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 240820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: 240920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 2410906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 241120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 2412d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: 24138713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case SK_ListConstructorCall: 241413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 241513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 241651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: 241771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: 241818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 2419cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 2420569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 2421cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 24220f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith case SK_ParenthesizedArrayInit: 2423f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 2424f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 2425f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 24262b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_StdInitializerList: 242721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case SK_OCLSamplerInit: 2428e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case SK_OCLZeroEvent: 242920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 2430dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 243120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 243220093b4bf698f292c664676987541d5103b65b15Douglas Gregor delete ICS; 243320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 243420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 243520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2436b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isDirectReferenceBinding() const { 24373b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl return !Steps.empty() && Steps.back().Kind == SK_BindReference; 2438b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2439b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2440b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isAmbiguous() const { 2441d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (!Failed()) 2442b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2443dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2444b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor switch (getFailureKind()) { 2445b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForReference: 2446b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitList: 2447b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 2448b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_AddressOfOverloadFailed: // FIXME: Could do better 2449b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 2450b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 2451b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_RValueReferenceBindingToLValue: 2452b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitDropsQualifiers: 2453b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitFailed: 2454b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConversionFailed: 2455429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 2456b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForScalar: 2457b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceBindingToInitList: 2458b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_InitListBadDestinationType: 2459b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_DefaultInitOfConst: 246072a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 2461cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 2462cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 24638713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_ListInitializationFailed: 246473076431605556fdbf28d287d084a73a24a8b8d4John McCall case FK_VariableLengthArrayHasInitializer: 24655acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: 24662b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case FK_InitListElementCopyFailure: 246770e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl case FK_ExplicitConstructor: 2468b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2469dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2470b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitOverloadFailed: 2471b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_UserConversionOverloadFailed: 2472b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConstructorOverloadFailed: 2473cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl case FK_ListConstructorOverloadFailed: 2474b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return FailedOverloadResult == OR_Ambiguous; 2475b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor } 2476dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 24777530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 2478b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2479b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2480d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregorbool InitializationSequence::isConstructorInitialization() const { 2481d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization; 2482d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor} 2483d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor 248422c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnaravoid 248522c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence 248622c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara::AddAddressOverloadResolutionStep(FunctionDecl *Function, 248722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara DeclAccessPair Found, 248822c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates) { 248920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 249020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ResolveAddressOfOverloadedFunction; 249120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Function->getType(); 249222c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 24939aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 24946bb8017bb9e828d118e15e59d71c66bba323c364John McCall S.Function.FoundDecl = Found; 249520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 249620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 249720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2498dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType, 24995baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 250020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 25015baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 25025baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: S.Kind = SK_CastDerivedToBaseRValue; break; 25035baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break; 25045baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break; 2505906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 250620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = BaseType; 250720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 250820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 250920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2510dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddReferenceBindingStep(QualType T, 251120093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool BindingTemporary) { 251220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 251320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference; 251420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 251520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 251620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 251720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2518523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregorvoid InitializationSequence::AddExtraneousCopyToTemporary(QualType T) { 2519523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Step S; 2520523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Kind = SK_ExtraneousCopyToTemporary; 2521523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Type = T; 2522523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Steps.push_back(S); 2523523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor} 2524523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 252522c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnaravoid 252622c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence::AddUserConversionStep(FunctionDecl *Function, 252722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara DeclAccessPair FoundDecl, 252822c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara QualType T, 252922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates) { 253020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 253120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_UserConversion; 253203981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman S.Type = T; 253322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 25349aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 25359aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = FoundDecl; 253620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 253720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 253820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 253920093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddQualificationConversionStep(QualType Ty, 25405baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 254120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 254238a4ffe5244e6be46f1b1f8394342a77836be776John McCall S.Kind = SK_QualificationConversionRValue; // work around a gcc warning 25435baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 25445baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: 2545906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionRValue; 2546906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 25475baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: 2548906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionXValue; 2549906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 25505baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: 2551906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionLValue; 2552906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 2553906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 255420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Ty; 255520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 255620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 255720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 255820093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddConversionSequenceStep( 255920093b4bf698f292c664676987541d5103b65b15Douglas Gregor const ImplicitConversionSequence &ICS, 256020093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T) { 256120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 256220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ConversionSequence; 256320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 256420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ICS = new ImplicitConversionSequence(ICS); 256520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 256620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 256720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2568d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorvoid InitializationSequence::AddListInitializationStep(QualType T) { 2569d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Step S; 2570d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Kind = SK_ListInitialization; 2571d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Type = T; 2572d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Steps.push_back(S); 2573d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor} 2574d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2575dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 257622c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence 257722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara::AddConstructorInitializationStep(CXXConstructorDecl *Constructor, 257822c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara AccessSpecifier Access, 257922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara QualType T, 258010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl bool HadMultipleCandidates, 25816cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl bool FromInitList, bool AsInitList) { 258251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Step S; 25836cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl S.Kind = FromInitList && !AsInitList ? SK_ListConstructorCall 25846cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl : SK_ConstructorInitialization; 258551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Type = T; 258622c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 25879aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Constructor; 25889aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = DeclAccessPair::make(Constructor, Access); 258951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Steps.push_back(S); 259051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor} 259151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 259271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorvoid InitializationSequence::AddZeroInitializationStep(QualType T) { 259371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Step S; 259471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Kind = SK_ZeroInitialization; 259571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Type = T; 259671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Steps.push_back(S); 259771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 259871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 259918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorvoid InitializationSequence::AddCAssignmentStep(QualType T) { 260018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step S; 260118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Kind = SK_CAssignment; 260218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Type = T; 260318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Steps.push_back(S); 260418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 260518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 2606cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedmanvoid InitializationSequence::AddStringInitStep(QualType T) { 2607cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Step S; 2608cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Kind = SK_StringInit; 2609cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Type = T; 2610cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Steps.push_back(S); 2611cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman} 2612cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2613569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorvoid InitializationSequence::AddObjCObjectConversionStep(QualType T) { 2614569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Step S; 2615569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Kind = SK_ObjCObjectConversion; 2616569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Type = T; 2617569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Steps.push_back(S); 2618569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 2619569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 2620cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregorvoid InitializationSequence::AddArrayInitStep(QualType T) { 2621cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Step S; 2622cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Kind = SK_ArrayInit; 2623cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Type = T; 2624cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Steps.push_back(S); 2625cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor} 2626cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 26270f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smithvoid InitializationSequence::AddParenthesizedArrayInitStep(QualType T) { 26280f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith Step S; 26290f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith S.Kind = SK_ParenthesizedArrayInit; 26300f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith S.Type = T; 26310f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith Steps.push_back(S); 26320f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith} 26330f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith 2634f85e193739c953358c865005855253af4f68a497John McCallvoid InitializationSequence::AddPassByIndirectCopyRestoreStep(QualType type, 2635f85e193739c953358c865005855253af4f68a497John McCall bool shouldCopy) { 2636f85e193739c953358c865005855253af4f68a497John McCall Step s; 2637f85e193739c953358c865005855253af4f68a497John McCall s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore 2638f85e193739c953358c865005855253af4f68a497John McCall : SK_PassByIndirectRestore); 2639f85e193739c953358c865005855253af4f68a497John McCall s.Type = type; 2640f85e193739c953358c865005855253af4f68a497John McCall Steps.push_back(s); 2641f85e193739c953358c865005855253af4f68a497John McCall} 2642f85e193739c953358c865005855253af4f68a497John McCall 2643f85e193739c953358c865005855253af4f68a497John McCallvoid InitializationSequence::AddProduceObjCObjectStep(QualType T) { 2644f85e193739c953358c865005855253af4f68a497John McCall Step S; 2645f85e193739c953358c865005855253af4f68a497John McCall S.Kind = SK_ProduceObjCObject; 2646f85e193739c953358c865005855253af4f68a497John McCall S.Type = T; 2647f85e193739c953358c865005855253af4f68a497John McCall Steps.push_back(S); 2648f85e193739c953358c865005855253af4f68a497John McCall} 2649f85e193739c953358c865005855253af4f68a497John McCall 26502b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redlvoid InitializationSequence::AddStdInitializerListConstructionStep(QualType T) { 26512b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Step S; 26522b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Kind = SK_StdInitializerList; 26532b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Type = T; 26542b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Steps.push_back(S); 26552b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl} 26562b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 265721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyeivoid InitializationSequence::AddOCLSamplerInitStep(QualType T) { 265821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei Step S; 265921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei S.Kind = SK_OCLSamplerInit; 266021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei S.Type = T; 266121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei Steps.push_back(S); 266221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei} 266321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 2664e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyeivoid InitializationSequence::AddOCLZeroEventStep(QualType T) { 2665e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei Step S; 2666e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei S.Kind = SK_OCLZeroEvent; 2667e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei S.Type = T; 2668e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei Steps.push_back(S); 2669e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei} 2670e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 267113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlvoid InitializationSequence::RewrapReferenceInitList(QualType T, 267213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *Syntactic) { 267313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl assert(Syntactic->getNumInits() == 1 && 267413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl "Can only rewrap trivial init lists."); 267513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Step S; 267613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Kind = SK_UnwrapInitList; 267713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Type = Syntactic->getInit(0)->getType(); 267813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Steps.insert(Steps.begin(), S); 267913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 268013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Kind = SK_RewrapInitList; 268113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Type = T; 268213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.WrappingSyntacticList = Syntactic; 268313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Steps.push_back(S); 268413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 268513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 2686dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::SetOverloadFailure(FailureKind Failure, 268720093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Result) { 26887491c499e826682e128a400038361ebcbde30eecSebastian Redl setSequenceKind(FailedSequence); 268920093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->Failure = Failure; 269020093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->FailedOverloadResult = Result; 269120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 269220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 269320093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 269420093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Attempt initialization 269520093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 269620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2697f85e193739c953358c865005855253af4f68a497John McCallstatic void MaybeProduceObjCObject(Sema &S, 2698f85e193739c953358c865005855253af4f68a497John McCall InitializationSequence &Sequence, 2699f85e193739c953358c865005855253af4f68a497John McCall const InitializedEntity &Entity) { 27004e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!S.getLangOpts().ObjCAutoRefCount) return; 2701f85e193739c953358c865005855253af4f68a497John McCall 2702f85e193739c953358c865005855253af4f68a497John McCall /// When initializing a parameter, produce the value if it's marked 2703f85e193739c953358c865005855253af4f68a497John McCall /// __attribute__((ns_consumed)). 2704f85e193739c953358c865005855253af4f68a497John McCall if (Entity.getKind() == InitializedEntity::EK_Parameter) { 2705f85e193739c953358c865005855253af4f68a497John McCall if (!Entity.isParameterConsumed()) 2706f85e193739c953358c865005855253af4f68a497John McCall return; 2707f85e193739c953358c865005855253af4f68a497John McCall 2708f85e193739c953358c865005855253af4f68a497John McCall assert(Entity.getType()->isObjCRetainableType() && 2709f85e193739c953358c865005855253af4f68a497John McCall "consuming an object of unretainable type?"); 2710f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddProduceObjCObjectStep(Entity.getType()); 2711f85e193739c953358c865005855253af4f68a497John McCall 2712f85e193739c953358c865005855253af4f68a497John McCall /// When initializing a return value, if the return type is a 2713f85e193739c953358c865005855253af4f68a497John McCall /// retainable type, then returns need to immediately retain the 2714f85e193739c953358c865005855253af4f68a497John McCall /// object. If an autorelease is required, it will be done at the 2715f85e193739c953358c865005855253af4f68a497John McCall /// last instant. 2716f85e193739c953358c865005855253af4f68a497John McCall } else if (Entity.getKind() == InitializedEntity::EK_Result) { 2717f85e193739c953358c865005855253af4f68a497John McCall if (!Entity.getType()->isObjCRetainableType()) 2718f85e193739c953358c865005855253af4f68a497John McCall return; 2719f85e193739c953358c865005855253af4f68a497John McCall 2720f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddProduceObjCObjectStep(Entity.getType()); 2721f85e193739c953358c865005855253af4f68a497John McCall } 2722f85e193739c953358c865005855253af4f68a497John McCall} 2723f85e193739c953358c865005855253af4f68a497John McCall 2724f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith/// \brief When initializing from init list via constructor, handle 2725f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith/// initialization of an object of type std::initializer_list<T>. 272610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// 2727f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith/// \return true if we have handled initialization of an object of type 2728f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith/// std::initializer_list<T>, false otherwise. 2729f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smithstatic bool TryInitializerListConstruction(Sema &S, 2730f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitListExpr *List, 2731f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith QualType DestType, 2732f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitializationSequence &Sequence) { 2733f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith QualType E; 2734f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith if (!S.isStdInitializerList(DestType, &E)) 27351d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith return false; 27361d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith 2737f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // Check that each individual element can be copy-constructed. But since we 2738f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // have no place to store further information, we'll recalculate everything 2739f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // later. 2740f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitializedEntity HiddenArray = InitializedEntity::InitializeTemporary( 2741f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith S.Context.getConstantArrayType(E, 2742f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()), 2743f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith List->getNumInits()), 2744f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith ArrayType::Normal, 0)); 2745f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitializedEntity Element = InitializedEntity::InitializeElement(S.Context, 2746f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 0, HiddenArray); 2747f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith for (unsigned i = 0, n = List->getNumInits(); i < n; ++i) { 2748f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Element.setElementIndex(i); 2749f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith if (!S.CanPerformCopyInitialization(Element, List->getInit(i))) { 2750f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Sequence.SetFailed( 2751f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitializationSequence::FK_InitListElementCopyFailure); 275210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return true; 275310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 275410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 2755f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Sequence.AddStdInitializerListConstructionStep(DestType); 2756f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith return true; 275710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl} 275810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 275996715b288060c8e168cbca62f366c12e88c5483dSebastian Redlstatic OverloadingResult 276096715b288060c8e168cbca62f366c12e88c5483dSebastian RedlResolveConstructorOverload(Sema &S, SourceLocation DeclLoc, 276196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl Expr **Args, unsigned NumArgs, 276296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl OverloadCandidateSet &CandidateSet, 27638682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis ArrayRef<NamedDecl *> Ctors, 276496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl OverloadCandidateSet::iterator &Best, 276596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl bool CopyInitializing, bool AllowExplicit, 276651ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl bool OnlyListConstructors, bool InitListSyntax) { 276796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl CandidateSet.clear(); 276896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 27698682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis for (ArrayRef<NamedDecl *>::iterator 27708682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis Con = Ctors.begin(), ConEnd = Ctors.end(); Con != ConEnd; ++Con) { 277196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl NamedDecl *D = *Con; 277296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 277396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl bool SuppressUserConversions = false; 277496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 277596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Find the constructor (which may be a template). 277696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl CXXConstructorDecl *Constructor = 0; 277796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 277896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl if (ConstructorTmpl) 277996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl Constructor = cast<CXXConstructorDecl>( 278096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl ConstructorTmpl->getTemplatedDecl()); 278196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl else { 278296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl Constructor = cast<CXXConstructorDecl>(D); 278396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 278496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // If we're performing copy initialization using a copy constructor, we 278551ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl // suppress user-defined conversions on the arguments. We do the same for 278651ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl // move constructors. 278751ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl if ((CopyInitializing || (InitListSyntax && NumArgs == 1)) && 278851ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl Constructor->isCopyOrMoveConstructor()) 278996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl SuppressUserConversions = true; 279096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl } 279196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 279296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl if (!Constructor->isInvalidDecl() && 279396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl (AllowExplicit || !Constructor->isExplicit()) && 27946cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl (!OnlyListConstructors || S.isInitListConstructor(Constructor))) { 279596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl if (ConstructorTmpl) 279696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 279796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl /*ExplicitArgs*/ 0, 279851ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl llvm::makeArrayRef(Args, NumArgs), 279951ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl CandidateSet, SuppressUserConversions); 2800ed878af7914df535b32d64f555fa118413186672Douglas Gregor else { 2801ed878af7914df535b32d64f555fa118413186672Douglas Gregor // C++ [over.match.copy]p1: 2802ed878af7914df535b32d64f555fa118413186672Douglas Gregor // - When initializing a temporary to be bound to the first parameter 2803ed878af7914df535b32d64f555fa118413186672Douglas Gregor // of a constructor that takes a reference to possibly cv-qualified 2804ed878af7914df535b32d64f555fa118413186672Douglas Gregor // T as its first argument, called with a single argument in the 2805ed878af7914df535b32d64f555fa118413186672Douglas Gregor // context of direct-initialization, explicit conversion functions 2806ed878af7914df535b32d64f555fa118413186672Douglas Gregor // are also considered. 2807ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool AllowExplicitConv = AllowExplicit && !CopyInitializing && 2808ed878af7914df535b32d64f555fa118413186672Douglas Gregor NumArgs == 1 && 2809ed878af7914df535b32d64f555fa118413186672Douglas Gregor Constructor->isCopyOrMoveConstructor(); 281096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl S.AddOverloadCandidate(Constructor, FoundDecl, 281113a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles llvm::makeArrayRef(Args, NumArgs), CandidateSet, 2812ed878af7914df535b32d64f555fa118413186672Douglas Gregor SuppressUserConversions, 2813ed878af7914df535b32d64f555fa118413186672Douglas Gregor /*PartialOverloading=*/false, 2814ed878af7914df535b32d64f555fa118413186672Douglas Gregor /*AllowExplicit=*/AllowExplicitConv); 2815ed878af7914df535b32d64f555fa118413186672Douglas Gregor } 281696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl } 281796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl } 281896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 281996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Perform overload resolution and return the result. 282096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl return CandidateSet.BestViableFunction(S, DeclLoc, Best); 282196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl} 282296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 282310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// \brief Attempt initialization by constructor (C++ [dcl.init]), which 282410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// enumerates the constructors of the initialized entity and performs overload 282510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// resolution to select the best. 282608ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl/// If InitListSyntax is true, this is list-initialization of a non-aggregate 282710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// class type. 282810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlstatic void TryConstructorInitialization(Sema &S, 282910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializedEntity &Entity, 283010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializationKind &Kind, 283110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Expr **Args, unsigned NumArgs, 283210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl QualType DestType, 283310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl InitializationSequence &Sequence, 283408ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl bool InitListSyntax = false) { 283508ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl assert((!InitListSyntax || (NumArgs == 1 && isa<InitListExpr>(Args[0]))) && 283608ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl "InitListSyntax must come with a single initializer list argument."); 283708ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl 283810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // The type we're constructing needs to be complete. 283910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 284069a30b838c723cb1850de55cfa48a402cfeeb6e0Douglas Gregor Sequence.setIncompleteTypeFailure(DestType); 284196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl return; 284210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 284310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 284410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const RecordType *DestRecordType = DestType->getAs<RecordType>(); 284510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl assert(DestRecordType && "Constructor initialization requires record type"); 284610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXRecordDecl *DestRecordDecl 284710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl = cast<CXXRecordDecl>(DestRecordType->getDecl()); 284810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 284996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Build the candidate set directly in the initialization sequence 285096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // structure, so that it will persist if we fail. 285196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 285296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 285396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Determine whether we are allowed to call explicit constructors or 285496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // explicit conversion operators. 285570e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl bool AllowExplicit = Kind.AllowExplicit() || InitListSyntax; 28566cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl bool CopyInitialization = Kind.getKind() == InitializationKind::IK_Copy; 285708ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl 285810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // - Otherwise, if T is a class type, constructors are considered. The 285910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // applicable constructors are enumerated, and the best one is chosen 286010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // through overload resolution. 28613bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie DeclContext::lookup_result R = S.LookupConstructors(DestRecordDecl); 28628682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // The container holding the constructors can under certain conditions 28638682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // be changed while iterating (e.g. because of deserialization). 28648682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // To be safe we copy the lookup results to a new container. 28653bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie SmallVector<NamedDecl*, 16> Ctors(R.begin(), R.end()); 286610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 28676cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl OverloadingResult Result = OR_No_Viable_Function; 286810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl OverloadCandidateSet::iterator Best; 28696cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl bool AsInitializerList = false; 28706cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl 28716cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // C++11 [over.match.list]p1: 28726cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // When objects of non-aggregate type T are list-initialized, overload 28736cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // resolution selects the constructor in two phases: 28746cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // - Initially, the candidate functions are the initializer-list 28756cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // constructors of the class T and the argument list consists of the 28766cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // initializer list as a single argument. 28776cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl if (InitListSyntax) { 2878f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitListExpr *ILE = cast<InitListExpr>(Args[0]); 28796cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl AsInitializerList = true; 2880f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 2881f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // If the initializer list has no elements and T has a default constructor, 2882f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // the first phase is omitted. 2883e5411b7c9af683dab6b035825b71c284bfec364dRichard Smith if (ILE->getNumInits() != 0 || !DestRecordDecl->hasDefaultConstructor()) 2884f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Result = ResolveConstructorOverload(S, Kind.getLocation(), Args, NumArgs, 28858682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis CandidateSet, Ctors, Best, 2886f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith CopyInitialization, AllowExplicit, 2887f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith /*OnlyListConstructor=*/true, 2888f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitListSyntax); 28896cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl 28906cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // Time to unwrap the init list. 28916cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl Args = ILE->getInits(); 28926cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl NumArgs = ILE->getNumInits(); 28936cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl } 28946cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl 28956cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // C++11 [over.match.list]p1: 28966cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // - If no viable initializer-list constructor is found, overload resolution 28976cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // is performed again, where the candidate functions are all the 2898f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // constructors of the class T and the argument list consists of the 28996cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // elements of the initializer list. 29006cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl if (Result == OR_No_Viable_Function) { 29016cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl AsInitializerList = false; 29026cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl Result = ResolveConstructorOverload(S, Kind.getLocation(), Args, NumArgs, 29038682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis CandidateSet, Ctors, Best, 29046cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl CopyInitialization, AllowExplicit, 290551ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl /*OnlyListConstructors=*/false, 290651ad9cd0644c9acf442f049aed98b66f7b1041a2Sebastian Redl InitListSyntax); 29076cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl } 29086cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl if (Result) { 290908ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl Sequence.SetOverloadFailure(InitListSyntax ? 2910cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl InitializationSequence::FK_ListConstructorOverloadFailed : 2911cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl InitializationSequence::FK_ConstructorOverloadFailed, 291210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Result); 291310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return; 291410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 291510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 2916f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // C++11 [dcl.init]p6: 291710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // If a program calls for the default initialization of an object 291810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // of a const-qualified type T, T shall be a class type with a 291910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // user-provided default constructor. 292010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Kind.getKind() == InitializationKind::IK_Default && 292110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Entity.getType().isConstQualified() && 29225121781d756e7814168b4255a57545d5ca497ec3Aaron Ballman !cast<CXXConstructorDecl>(Best->Function)->isUserProvided()) { 292310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 292410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return; 292510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 292610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 292770e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl // C++11 [over.match.list]p1: 292870e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl // In copy-list-initialization, if an explicit constructor is chosen, the 292970e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl // initializer is ill-formed. 293070e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function); 293170e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl if (InitListSyntax && !Kind.AllowExplicit() && CtorDecl->isExplicit()) { 293270e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl Sequence.SetFailed(InitializationSequence::FK_ExplicitConstructor); 293370e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl return; 293470e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl } 293570e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl 293610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Add the constructor initialization step. Any cv-qualification conversion is 293710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // subsumed by the initialization. 293810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl bool HadMultipleCandidates = (CandidateSet.size() > 1); 293910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Sequence.AddConstructorInitializationStep(CtorDecl, 294010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Best->FoundDecl.getAccess(), 294110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl DestType, HadMultipleCandidates, 29426cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl InitListSyntax, AsInitializerList); 294310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl} 294410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 294513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic bool 294613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian RedlResolveOverloadedFunctionForReferenceBinding(Sema &S, 294713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 294813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType &SourceType, 294913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType &UnqualifiedSourceType, 295013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType UnqualifiedTargetType, 295113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) { 295213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (S.Context.getCanonicalType(UnqualifiedSourceType) == 295313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Context.OverloadTy) { 295413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl DeclAccessPair Found; 295513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl bool HadMultipleCandidates = false; 295613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (FunctionDecl *Fn 295713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl = S.ResolveAddressOfOverloadedFunction(Initializer, 295813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl UnqualifiedTargetType, 295913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl false, Found, 296013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl &HadMultipleCandidates)) { 296113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.AddAddressOverloadResolutionStep(Fn, Found, 296213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl HadMultipleCandidates); 296313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceType = Fn->getType(); 296413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl UnqualifiedSourceType = SourceType.getUnqualifiedType(); 296513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } else if (!UnqualifiedTargetType->isRecordType()) { 296613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 296713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return true; 296813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 296913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 297013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return false; 297113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 297213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 297313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceInitializationCore(Sema &S, 297413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 297513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 297613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 297713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1, QualType T1, 297813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals, 297913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2, QualType T2, 298013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals, 298113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence); 298213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 2983f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smithstatic void TryValueInitialization(Sema &S, 2984f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith const InitializedEntity &Entity, 2985f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith const InitializationKind &Kind, 2986f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitializationSequence &Sequence, 2987f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitListExpr *InitList = 0); 2988f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 298913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryListInitialization(Sema &S, 299013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 299113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 299213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *InitList, 299313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence); 299413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 299513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl/// \brief Attempt list initialization of a reference. 299613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceListInitialization(Sema &S, 299713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 299813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 299913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *InitList, 300013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) 300113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl{ 300213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // First, catch C++03 where this isn't possible. 300380ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (!S.getLangOpts().CPlusPlus11) { 300413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList); 300513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 300613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 300713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 300813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType DestType = Entity.getType(); 300913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 301013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals; 301113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 301213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 301313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Reference initialization via an initializer list works thus: 301413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // If the initializer list consists of a single element that is 301513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // reference-related to the referenced type, bind directly to that element 301613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // (possibly creating temporaries). 301713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Otherwise, initialize a temporary with the initializer list and 301813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // bind to that. 301913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (InitList->getNumInits() == 1) { 302013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer = InitList->getInit(0); 302113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2 = Initializer->getType(); 302213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals; 302313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 302413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 302513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // If this fails, creating a temporary wouldn't work either. 302613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2, 302713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1, Sequence)) 302813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 302913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 303013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceLocation DeclLoc = Initializer->getLocStart(); 303113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl bool dummy1, dummy2, dummy3; 303213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sema::ReferenceCompareResult RefRelationship 303313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, dummy1, 303413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl dummy2, dummy3); 303513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (RefRelationship >= Sema::Ref_Related) { 303613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Try to bind the reference here. 303713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1, 303813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1Quals, cv2T2, T2, T2Quals, Sequence); 303913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (Sequence) 304013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.RewrapReferenceInitList(cv1T1, InitList); 304113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 304213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 304302d65ee373feb1cb029185aa0de04d0c214eda3dRichard Smith 304402d65ee373feb1cb029185aa0de04d0c214eda3dRichard Smith // Update the initializer if we've resolved an overloaded function. 304502d65ee373feb1cb029185aa0de04d0c214eda3dRichard Smith if (Sequence.step_begin() != Sequence.step_end()) 304602d65ee373feb1cb029185aa0de04d0c214eda3dRichard Smith Sequence.RewrapReferenceInitList(cv1T1, InitList); 304713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 304813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 304913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Not reference-related. Create a temporary and bind to that. 305013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 305113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 305213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryListInitialization(S, TempEntity, Kind, InitList, Sequence); 305313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (Sequence) { 305413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (DestType->isRValueReferenceType() || 305513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl (T1Quals.hasConst() && !T1Quals.hasVolatile())) 305613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 305713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl else 305813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed( 305913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 306013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 306113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 306213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 306312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola/// \brief Attempt list initialization (C++0x [dcl.init.list]) 306412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindolastatic void TryListInitialization(Sema &S, 306512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola const InitializedEntity &Entity, 306612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola const InitializationKind &Kind, 306712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola InitListExpr *InitList, 306812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola InitializationSequence &Sequence) { 306912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola QualType DestType = Entity.getType(); 307012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 307114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // C++ doesn't allow scalar initialization with more than one argument. 307214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // But C99 complex numbers are scalars and it makes sense there. 30734e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus && DestType->isScalarType() && 307414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !DestType->isAnyComplexType() && InitList->getNumInits() > 1) { 307514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar); 307614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 307714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 307814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (DestType->isReferenceType()) { 307913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceListInitialization(S, Entity, Kind, InitList, Sequence); 308012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola return; 308114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 3082d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl if (DestType->isRecordType()) { 3083d10099e5c8238fa0327f03921cf2e3c8975c881eDouglas Gregor if (S.RequireCompleteType(InitList->getLocStart(), DestType, 0)) { 308469a30b838c723cb1850de55cfa48a402cfeeb6e0Douglas Gregor Sequence.setIncompleteTypeFailure(DestType); 3085d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl return; 3086d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl } 3087d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl 3088f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // C++11 [dcl.init.list]p3: 3089f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // - If T is an aggregate, aggregate initialization is performed. 3090d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl if (!DestType->isAggregateType()) { 309180ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (S.getLangOpts().CPlusPlus11) { 3092f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // - Otherwise, if the initializer list has no elements and T is a 3093f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // class type with a default constructor, the object is 3094f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // value-initialized. 3095f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith if (InitList->getNumInits() == 0) { 3096f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith CXXRecordDecl *RD = DestType->getAsCXXRecordDecl(); 3097e5411b7c9af683dab6b035825b71c284bfec364dRichard Smith if (RD->hasDefaultConstructor()) { 3098f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith TryValueInitialization(S, Entity, Kind, Sequence, InitList); 3099f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith return; 3100f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith } 3101f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith } 3102f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 3103f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // - Otherwise, if T is a specialization of std::initializer_list<E>, 3104f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // an initializer_list object constructed [...] 3105f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith if (TryInitializerListConstruction(S, InitList, DestType, Sequence)) 3106f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith return; 3107f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 3108f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // - Otherwise, if T is a class type, constructors are considered. 3109d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl Expr *Arg = InitList; 3110f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith TryConstructorInitialization(S, Entity, Kind, &Arg, 1, DestType, 3111f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Sequence, /*InitListSyntax*/true); 3112d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl } else 3113d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl Sequence.SetFailed( 3114d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl InitializationSequence::FK_InitListBadDestinationType); 3115d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl return; 3116d2231c9424d6cbbcecb6f89cc2de5b987327aeaaSebastian Redl } 311714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 311814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 311914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListChecker CheckInitList(S, Entity, InitList, 3120c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl DestType, /*VerifyOnly=*/true, 3121168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Kind.getKind() != InitializationKind::IK_DirectList || 312280ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith !S.getLangOpts().CPlusPlus11); 312314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (CheckInitList.HadError()) { 312414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Sequence.SetFailed(InitializationSequence::FK_ListInitializationFailed); 312514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 312612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola } 312712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 312814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Add the list initialization step with the built init list. 312912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Sequence.AddListInitializationStep(DestType); 313012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola} 313120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 313220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Try a reference initialization that involves calling a conversion 313320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// function. 313420093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic OverloadingResult TryRefInitWithConversionFunction(Sema &S, 313520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 313620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 3137ed878af7914df535b32d64f555fa118413186672Douglas Gregor Expr *Initializer, 3138ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool AllowRValues, 313920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3140d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 314120093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 314220093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T1 = cv1T1.getUnqualifiedType(); 314320093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 314420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T2 = cv2T2.getUnqualifiedType(); 314520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 314620093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase; 3147569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion; 3148f85e193739c953358c865005855253af4f68a497John McCall bool ObjCLifetimeConversion; 3149dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi assert(!S.CompareReferenceRelationship(Initializer->getLocStart(), 3150569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T1, T2, DerivedToBase, 3151f85e193739c953358c865005855253af4f68a497John McCall ObjCConversion, 3152f85e193739c953358c865005855253af4f68a497John McCall ObjCLifetimeConversion) && 315320093b4bf698f292c664676987541d5103b65b15Douglas Gregor "Must have incompatible references when binding via conversion"); 315460cfcecaf48e4310339dcfbdb0e3f0e6d2853855Chandler Carruth (void)DerivedToBase; 3155569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor (void)ObjCConversion; 3156f85e193739c953358c865005855253af4f68a497John McCall (void)ObjCLifetimeConversion; 3157f85e193739c953358c865005855253af4f68a497John McCall 315820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the candidate set directly in the initialization sequence 315920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // structure, so that it will persist if we fail. 316020093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 316120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CandidateSet.clear(); 316220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 316320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 316420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 3165168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool AllowExplicit = Kind.AllowExplicit(); 3166ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool AllowExplicitConvs = Kind.allowExplicitConversionFunctions(); 3167ed878af7914df535b32d64f555fa118413186672Douglas Gregor 316820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const RecordType *T1RecordType = 0; 31696b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) && 31706b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T1, 0)) { 317120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 317220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to see if there is a suitable conversion. 317320093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl()); 3174572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall 31753bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie DeclContext::lookup_result R = S.LookupConstructors(T1RecordDecl); 31768682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // The container holding the constructors can under certain conditions 31778682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // be changed while iterating (e.g. because of deserialization). 31788682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // To be safe we copy the lookup results to a new container. 31793bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie SmallVector<NamedDecl*, 16> Ctors(R.begin(), R.end()); 31808682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis for (SmallVector<NamedDecl*, 16>::iterator 31818682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis CI = Ctors.begin(), CE = Ctors.end(); CI != CE; ++CI) { 31828682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis NamedDecl *D = *CI; 31839aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 31849aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 318520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Find the constructor (which may be a template). 318620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConstructorDecl *Constructor = 0; 31879aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 318820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 318920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 319020093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 319120093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 31929aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 3193dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 319420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Constructor->isInvalidDecl() && 319520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 319620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 31979aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 319886820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 319913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Initializer, CandidateSet, 3200b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 320120093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 32029aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 320313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Initializer, CandidateSet, 3204b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 320520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3206dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 320720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3208572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl()) 3209572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 3210dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 32116b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor const RecordType *T2RecordType = 0; 32126b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if ((T2RecordType = T2->getAs<RecordType>()) && 32136b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T2, 0)) { 321420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting from is a class type, enumerate its conversion 321520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions. 321620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl()); 321720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 32189d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis std::pair<CXXRecordDecl::conversion_iterator, 32199d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis CXXRecordDecl::conversion_iterator> 32209d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis Conversions = T2RecordDecl->getVisibleConversionFunctions(); 32219d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis for (CXXRecordDecl::conversion_iterator 32229d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis I = Conversions.first, E = Conversions.second; I != E; ++I) { 322320093b4bf698f292c664676987541d5103b65b15Douglas Gregor NamedDecl *D = *I; 322420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 322520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<UsingShadowDecl>(D)) 322620093b4bf698f292c664676987541d5103b65b15Douglas Gregor D = cast<UsingShadowDecl>(D)->getTargetDecl(); 3227dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 322820093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 322920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConversionDecl *Conv; 323020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 323120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 323220093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 32334680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Conv = cast<CXXConversionDecl>(D); 3234dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 323520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the conversion function doesn't return a reference type, 323620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // it can't be considered for this conversion unless we're allowed to 323720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // consider rvalues. 3238dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Do we need to make sure that we only consider conversion 3239dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // candidates with reference-compatible results? That might be needed to 324020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // break recursion. 3241ed878af7914df535b32d64f555fa118413186672Douglas Gregor if ((AllowExplicitConvs || !Conv->isExplicit()) && 324220093b4bf698f292c664676987541d5103b65b15Douglas Gregor (AllowRValues || Conv->getConversionType()->isLValueReferenceType())){ 324320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 32449aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 324586820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, 3246564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor DestType, CandidateSet); 324720093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 32489aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 3249564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor Initializer, DestType, CandidateSet); 325020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 325120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 325220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3253572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl()) 3254572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 3255dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 325620093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 325720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3258dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 325920093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 3260dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (OverloadingResult Result 32618fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) 326220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 326303981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 326420093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function = Best->Function; 32653c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky // This is the overload that will be used for this initialization step if we 32663c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky // use this initialization. Mark it as referenced. 32673c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky Function->setReferenced(); 326825ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth 326903981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Compute the returned type of the conversion. 327020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<CXXConversionDecl>(Function)) 327120093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = Function->getResultType(); 327220093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 327320093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv1T1; 327403981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 327503981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Add the user-defined conversion step. 327622c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 32779aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, 327822c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara T2.getNonLValueExprType(S.Context), 327922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 328003981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 3281dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Determine whether we need to perform derived-to-base or 328203981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // cv-qualification adjustments. 32835baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = VK_RValue; 3284906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl if (T2->isLValueReferenceType()) 32855baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = VK_LValue; 3286906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl else if (const RValueReferenceType *RRef = T2->getAs<RValueReferenceType>()) 32875baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue; 3288906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 328920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool NewDerivedToBase = false; 3290569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool NewObjCConversion = false; 3291f85e193739c953358c865005855253af4f68a497John McCall bool NewObjCLifetimeConversion = false; 329220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult NewRefRelationship 3293dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi = S.CompareReferenceRelationship(DeclLoc, T1, 32946398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor T2.getNonLValueExprType(S.Context), 3295f85e193739c953358c865005855253af4f68a497John McCall NewDerivedToBase, NewObjCConversion, 3296f85e193739c953358c865005855253af4f68a497John McCall NewObjCLifetimeConversion); 3297a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor if (NewRefRelationship == Sema::Ref_Incompatible) { 3298a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // If the type we've converted to is not reference-related to the 3299a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // type we're looking for, then there is another conversion step 3300a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // we need to perform to produce a temporary of the right type 3301a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // that we'll be binding to. 3302a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ImplicitConversionSequence ICS; 3303a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.setStandard(); 3304a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.Standard = Best->FinalConversion; 3305a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor T2 = ICS.Standard.getToType(2); 3306a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor Sequence.AddConversionSequenceStep(ICS, T2); 3307a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor } else if (NewDerivedToBase) 330820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 330920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getQualifiedType(T1, 3310dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi T2.getNonReferenceType().getQualifiers()), 33115baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK); 3312569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (NewObjCConversion) 3313569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 3314569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, 3315569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T2.getNonReferenceType().getQualifiers())); 3316569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 331720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (cv1T1.getQualifiers() != T2.getNonReferenceType().getQualifiers()) 33185baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK); 3319dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 332020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, !T2->isReferenceType()); 332120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return OR_Success; 332220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 3323dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 332483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void CheckCXX98CompatAccessibleCopy(Sema &S, 332583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const InitializedEntity &Entity, 332683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr); 332783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 3328dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Attempt reference initialization (C++0x [dcl.init.ref]) 3329dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryReferenceInitialization(Sema &S, 333020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 333120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 333220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 333320093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3334d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 333520093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 33365535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T1Quals; 33375535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 333820093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 33395535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T2Quals; 33405535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 33414680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 334220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the initializer is the address of an overloaded function, try 334320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to resolve the overloaded function. If all goes well, T2 is the 334420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type of the resulting function. 334513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2, 334613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1, Sequence)) 334713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 334813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 334913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Delegate everything else to a subfunction. 335013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1, 335113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1Quals, cv2T2, T2, T2Quals, Sequence); 335213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 33534680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 335413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl/// \brief Reference initialization without resolving overloaded functions. 335513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceInitializationCore(Sema &S, 335613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 335713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 335813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 335913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1, QualType T1, 336013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals, 336113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2, QualType T2, 336213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals, 336313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) { 336413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType DestType = Entity.getType(); 336513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceLocation DeclLoc = Initializer->getLocStart(); 336620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Compute some basic properties of the types and the initializer. 336720093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isLValueRef = DestType->isLValueReferenceType(); 336820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isRValueRef = !isLValueRef; 336920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase = false; 3370569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion = false; 3371f85e193739c953358c865005855253af4f68a497John McCall bool ObjCLifetimeConversion = false; 33724680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Expr::Classification InitCategory = Initializer->Classify(S.Context); 337320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult RefRelationship 3374569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase, 3375f85e193739c953358c865005855253af4f68a497John McCall ObjCConversion, ObjCLifetimeConversion); 33764680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 337720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p5: 3378dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // A reference to type "cv1 T1" is initialized by an expression of type 337920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // "cv2 T2" as follows: 338020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 3381dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the reference is an lvalue reference and the initializer 338220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // expression 33834680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // Note the analogous bullet points for rvlaue refs to functions. Because 33844680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // there are no function rvalues in C++, rvalue refs to functions are treated 33854680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // like lvalue refs. 338620093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult ConvOvlResult = OR_Success; 33874680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl bool T1Function = T1->isFunctionType(); 33884680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (isLValueRef || T1Function) { 3389dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (InitCategory.isLValue() && 339014d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 3391dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 339214d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related))) { 3393dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - is an lvalue (but is not a bit-field), and "cv1 T1" is 339420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2," or 339520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 3396dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Per C++ [over.best.ics]p2, we don't diagnose whether the lvalue is a 339720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // bit-field when we're determining whether the reference initialization 3398de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // can occur. However, we do pay attention to whether it is a bit-field 3399de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // to decide whether we're actually binding to a temporary created from 3400de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // the bit-field. 340120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 340220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 3403dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Context.getQualifiedType(T1, T2Quals), 34045baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue); 3405569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (ObjCConversion) 3406569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 3407569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 3408569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 34095535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 34105baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK_LValue); 3411de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor bool BindingTemporary = T1Quals.hasConst() && !T1Quals.hasVolatile() && 3412093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson (Initializer->getBitField() || Initializer->refersToVectorElement()); 3413de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, BindingTemporary); 341420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 341520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3416dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3417dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 3418dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 3419dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible 3420dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // with "cv3 T3" (this conversion is selected by enumerating the 342120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // applicable conversion functions (13.3.1.6) and choosing the best 342220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // one through overload resolution (13.3)), 34234680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // If we have an rvalue ref to function type here, the rhs must be 34244680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // an rvalue. 34254680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() && 34264680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl (isLValueRef || InitCategory.isRValue())) { 3427dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, Kind, 342820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer, 34294680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl /*AllowRValues=*/isRValueRef, 343020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 343120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult == OR_Success) 343220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 34331d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ConvOvlResult != OR_No_Viable_Function) { 34341d31833450e6d2947a33cb0840d87661d92eec07John McCall Sequence.SetOverloadFailure( 34351d31833450e6d2947a33cb0840d87661d92eec07John McCall InitializationSequence::FK_ReferenceInitOverloadFailed, 34361d31833450e6d2947a33cb0840d87661d92eec07John McCall ConvOvlResult); 34371d31833450e6d2947a33cb0840d87661d92eec07John McCall } 343820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 343920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 34404680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 3441dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, the reference shall be an lvalue reference to a 344220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // non-volatile const type (i.e., cv1 shall be const), or the reference 344369d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor // shall be an rvalue reference. 3444b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile())) { 34453afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 34463afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 34473afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 344820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 344920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 345020093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 3451b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor else 34524680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Sequence.SetFailed(InitCategory.isLValue() 345320093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? (RefRelationship == Sema::Ref_Related 345420093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? InitializationSequence::FK_ReferenceInitDropsQualifiers 345520093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToUnrelated) 345620093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 34574680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 345820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 345920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 34604680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 3461c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - If the initializer expression 3462c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - is an xvalue, class prvalue, array prvalue, or function lvalue and 3463c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // "cv1 T1" is reference-compatible with "cv2 T2" 3464c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // Note: functions are handled below. 3465c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (!T1Function && 346614d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 3467dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 346814d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related)) && 3469c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isXValue() || 3470c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isRecordType()) || 3471c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isArrayType()))) { 3472c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ExprValueKind ValueKind = InitCategory.isXValue()? VK_XValue : VK_RValue; 3473c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (InitCategory.isPRValue() && T2->isRecordType()) { 3474523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the 3475523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // compiler the freedom to perform a copy here or bind to the 3476523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object, while C++0x requires that we bind directly to the 3477523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object. Hence, we always bind to the object without making an 3478523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // extra copy. However, in C++03 requires that we check for the 3479523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // presence of a suitable copy constructor: 3480523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // 3481523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The constructor that would be used to make the copy shall 3482523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // be callable whether or not the copy is actually done. 348380ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (!S.getLangOpts().CPlusPlus11 && !S.getLangOpts().MicrosoftExt) 3484523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Sequence.AddExtraneousCopyToTemporary(cv2T2); 348580ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith else if (S.getLangOpts().CPlusPlus11) 348683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CheckCXX98CompatAccessibleCopy(S, Entity, Initializer); 348720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3488dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3489c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (DerivedToBase) 3490c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddDerivedToBaseCastStep(S.Context.getQualifiedType(T1, T2Quals), 3491c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ValueKind); 3492c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor else if (ObjCConversion) 3493c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddObjCObjectConversionStep( 3494c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 3495dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3496c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T1Quals != T2Quals) 3497c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddQualificationConversionStep(cv1T1, ValueKind); 3498dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Sequence.AddReferenceBindingStep(cv1T1, 349965bfd682010f599a9a04fc7523e95e28c27508baPeter Collingbourne /*bindingTemporary=*/InitCategory.isPRValue()); 3500dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi return; 3501c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor } 3502dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3503dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 3504dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 3505c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // xvalue, class prvalue, or function lvalue of type "cv3 T3", 3506c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // where "cv1 T1" is reference-compatible with "cv3 T3", 3507c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T2->isRecordType()) { 350820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible) { 350920093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, 351020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind, Initializer, 351120093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowRValues=*/true, 351220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 351320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult) 351420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 351520093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 351620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 3517dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 351820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 351920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3520dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 352120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 352220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 352320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 35240099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi 35250099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi // - Otherwise, a temporary of type "cv1 T1" is created and initialized 352620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // from the initializer expression using the rules for a non-reference 3527dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy initialization (8.5). The reference is then bound to the 352820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // temporary. [...] 3529369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 353020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 353120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 3532168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool AllowExplicit = Kind.AllowExplicit(); 3533369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 3534369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 3535369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 3536f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS 3537f85e193739c953358c865005855253af4f68a497John McCall = S.TryImplicitConversion(Initializer, TempEntity.getType(), 3538369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*SuppressUserConversions*/ false, 3539369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall AllowExplicit, 354014d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*FIXME:InOverloadResolution=*/false, 3541f85e193739c953358c865005855253af4f68a497John McCall /*CStyle=*/Kind.isCStyleOrFunctionalCast(), 3542f85e193739c953358c865005855253af4f68a497John McCall /*AllowObjCWritebackConversion=*/false); 3543f85e193739c953358c865005855253af4f68a497John McCall 3544f85e193739c953358c865005855253af4f68a497John McCall if (ICS.isBad()) { 354520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Use the conversion function set stored in ICS to turn 354620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // this into an overloading ambiguity diagnostic. However, we need 354720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to keep that set as an OverloadCandidateSet rather than as some 354820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // other kind of set. 354918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 355018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetOverloadFailure( 355118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 355218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor ConvOvlResult); 35533afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 35543afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 355518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 355618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed); 355720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 3558f85e193739c953358c865005855253af4f68a497John McCall } else { 3559f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddConversionSequenceStep(ICS, TempEntity.getType()); 356020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 356120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 356220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // [...] If T1 is reference-related to T2, cv1 must be the 356320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // same cv-qualification as, or greater cv-qualification 356420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // than, cv2; otherwise, the program is ill-formed. 35655535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T1CVRQuals = T1Quals.getCVRQualifiers(); 35665535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T2CVRQuals = T2Quals.getCVRQualifiers(); 3567dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship == Sema::Ref_Related && 35685535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth (T1CVRQuals | T2CVRQuals) != T1CVRQuals) { 356920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 357020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 357120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 357220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3573dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // [...] If T1 is reference-related to T2 and the reference is an rvalue 3574b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor // reference, the initializer expression shall not be an lvalue. 3575dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship >= Sema::Ref_Related && !isLValueRef && 3576b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitCategory.isLValue()) { 3577b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor Sequence.SetFailed( 3578b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitializationSequence::FK_RValueReferenceBindingToLValue); 3579b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor return; 3580b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor } 3581dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 358220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 358320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 358420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 358520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 358620093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt character array initialization from a string literal 3587dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// (C++ [dcl.init.string], C99 6.7.8). 3588dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryStringLiteralInitialization(Sema &S, 358920093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 359020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 359120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 359220093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3593d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddStringInitStep(Entity.getType()); 359420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 359520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 359671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor/// \brief Attempt value initialization (C++ [dcl.init]p7). 3597dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryValueInitialization(Sema &S, 359871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializedEntity &Entity, 359971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializationKind &Kind, 3600f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitializationSequence &Sequence, 3601f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith InitListExpr *InitList) { 3602f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith assert((!InitList || InitList->getNumInits() == 0) && 3603f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith "Shouldn't use value-init for non-empty init lists"); 3604f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 36051d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // C++98 [dcl.init]p5, C++11 [dcl.init]p7: 360671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 360771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // To value-initialize an object of type T means: 3608d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType T = Entity.getType(); 3609dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 361071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is an array type, then each element is value-initialized; 36111d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith T = S.Context.getBaseElementType(T); 3612dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 361371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (const RecordType *RT = T->getAs<RecordType>()) { 361471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 3615f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith bool NeedZeroInitialization = true; 361680ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (!S.getLangOpts().CPlusPlus11) { 3617f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // C++98: 3618f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // -- if T is a class type (clause 9) with a user-declared constructor 3619f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // (12.1), then the default constructor for T is called (and the 3620f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // initialization is ill-formed if T has no accessible default 3621f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // constructor); 36221d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith if (ClassDecl->hasUserDeclaredConstructor()) 3623f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith NeedZeroInitialization = false; 36241d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith } else { 36251d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // C++11: 36261d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // -- if T is a class type (clause 9) with either no default constructor 36271d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // (12.1 [class.ctor]) or a default constructor that is user-provided 36281d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // or deleted, then the object is default-initialized; 36291d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith CXXConstructorDecl *CD = S.LookupDefaultConstructor(ClassDecl); 36301d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith if (!CD || !CD->getCanonicalDecl()->isDefaulted() || CD->isDeleted()) 3631f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith NeedZeroInitialization = false; 36321d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith } 3633dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 36341d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // -- if T is a (possibly cv-qualified) non-union class type without a 36351d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // user-provided or deleted default constructor, then the object is 36361d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // zero-initialized and, if T has a non-trivial default constructor, 36371d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // default-initialized; 36386678a05ba19c40d60ed68b37262942eb887be217Richard Smith // The 'non-union' here was removed by DR1502. The 'non-trivial default 36396678a05ba19c40d60ed68b37262942eb887be217Richard Smith // constructor' part was removed by DR1507. 3640f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith if (NeedZeroInitialization) 3641f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Sequence.AddZeroInitializationStep(Entity.getType()); 3642f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 3643d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // C++03: 3644d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // -- if T is a non-union class type without a user-declared constructor, 3645d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // then every non-static data member and base class component of T is 3646d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // value-initialized; 3647d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // [...] A program that calls for [...] value-initialization of an 3648d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // entity of reference type is ill-formed. 3649d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // 3650d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // C++11 doesn't need this handling, because value-initialization does not 3651d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // occur recursively there, and the implicit default constructor is 3652d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // defined as deleted in the problematic cases. 365380ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (!S.getLangOpts().CPlusPlus11 && 3654d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith ClassDecl->hasUninitializedReferenceMember()) { 3655d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForReference); 3656d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return; 3657d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 3658d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 3659f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // If this is list-value-initialization, pass the empty init list on when 3660f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // building the constructor call. This affects the semantics of a few 3661f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // things (such as whether an explicit default constructor can be called). 3662f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Expr *InitListAsExpr = InitList; 3663f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Expr **Args = InitList ? &InitListAsExpr : 0; 3664f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith unsigned NumArgs = InitList ? 1 : 0; 3665f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith bool InitListSyntax = InitList; 3666f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 3667f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith return TryConstructorInitialization(S, Entity, Kind, Args, NumArgs, T, 3668f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith Sequence, InitListSyntax); 366971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 367071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 367171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 3672d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 367371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 367471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 367599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor/// \brief Attempt default initialization (C++ [dcl.init]p6). 367699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregorstatic void TryDefaultInitialization(Sema &S, 367799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializedEntity &Entity, 367899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializationKind &Kind, 367999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitializationSequence &Sequence) { 368099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(Kind.getKind() == InitializationKind::IK_Default); 3681dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 368299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // C++ [dcl.init]p6: 368399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // To default-initialize an object of type T means: 368499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is an array type, each element is default-initialized; 3685f85e193739c953358c865005855253af4f68a497John McCall QualType DestType = S.Context.getBaseElementType(Entity.getType()); 3686f85e193739c953358c865005855253af4f68a497John McCall 368799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is a (possibly cv-qualified) class type (Clause 9), the default 368899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // constructor for T is called (and the initialization is ill-formed if 368999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // T has no accessible default constructor); 36904e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (DestType->isRecordType() && S.getLangOpts().CPlusPlus) { 36914e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth TryConstructorInitialization(S, Entity, Kind, 0, 0, DestType, Sequence); 36924e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth return; 369399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 3694dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 369599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - otherwise, no initialization is performed. 3696dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 369799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // If a program calls for the default initialization of an object of 3698dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // a const-qualified type T, T shall be a class type with a user-provided 369999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // default constructor. 37004e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (DestType.isConstQualified() && S.getLangOpts().CPlusPlus) { 370199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 3702f85e193739c953358c865005855253af4f68a497John McCall return; 3703f85e193739c953358c865005855253af4f68a497John McCall } 3704f85e193739c953358c865005855253af4f68a497John McCall 3705f85e193739c953358c865005855253af4f68a497John McCall // If the destination type has a lifetime property, zero-initialize it. 3706f85e193739c953358c865005855253af4f68a497John McCall if (DestType.getQualifiers().hasObjCLifetime()) { 3707f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddZeroInitializationStep(Entity.getType()); 3708f85e193739c953358c865005855253af4f68a497John McCall return; 3709f85e193739c953358c865005855253af4f68a497John McCall } 371099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 371199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 371220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]), 371320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// which enumerates all conversion functions and performs overload resolution 371420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// to select the best. 3715dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryUserDefinedConversion(Sema &S, 371620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 371720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 371820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 371920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3720d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 37214a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert(!DestType->isReferenceType() && "References are handled elsewhere"); 37224a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType SourceType = Initializer->getType(); 37234a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert((DestType->isRecordType() || SourceType->isRecordType()) && 37244a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor "Must have a class type to perform a user-defined conversion"); 3725dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37264a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Build the candidate set directly in the initialization sequence 37274a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // structure, so that it will persist if we fail. 37284a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 37294a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CandidateSet.clear(); 3730dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37314a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Determine whether we are allowed to call explicit constructors or 37324a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // explicit conversion operators. 3733168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool AllowExplicit = Kind.AllowExplicit(); 3734dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37354a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) { 37364a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting to is a class type. Enumerate its constructors 37374a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // to see if there is a suitable conversion. 37384a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXRecordDecl *DestRecordDecl 37394a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 3740dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3741087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Try to complete the type we're converting to. 3742dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (!S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 37433bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie DeclContext::lookup_result R = S.LookupConstructors(DestRecordDecl); 37443d5cf5e0483f538c27016ef3e064536058d5605eDavid Blaikie // The container holding the constructors can under certain conditions 37453d5cf5e0483f538c27016ef3e064536058d5605eDavid Blaikie // be changed while iterating. To be safe we copy the lookup results 37463d5cf5e0483f538c27016ef3e064536058d5605eDavid Blaikie // to a new container. 37473bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie SmallVector<NamedDecl*, 8> CopyOfCon(R.begin(), R.end()); 37483d5cf5e0483f538c27016ef3e064536058d5605eDavid Blaikie for (SmallVector<NamedDecl*, 8>::iterator 37493d5cf5e0483f538c27016ef3e064536058d5605eDavid Blaikie Con = CopyOfCon.begin(), ConEnd = CopyOfCon.end(); 3750087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Con != ConEnd; ++Con) { 3751087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor NamedDecl *D = *Con; 3752087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 3753dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3754087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Find the constructor (which may be a template). 3755087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor CXXConstructorDecl *Constructor = 0; 3756087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor FunctionTemplateDecl *ConstructorTmpl 3757087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor = dyn_cast<FunctionTemplateDecl>(D); 37584a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 3759087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>( 3760087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 37614712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor else 3762087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>(D); 3763dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3764087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (!Constructor->isInvalidDecl() && 3765087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 3766087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (ConstructorTmpl) 3767087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 3768087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor /*ExplicitArgs*/ 0, 376913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Initializer, CandidateSet, 37704712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 3771087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor else 3772087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddOverloadCandidate(Constructor, FoundDecl, 377313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Initializer, CandidateSet, 37744712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 3775087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 3776dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 3777087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 37784a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 3779cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3780cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman SourceLocation DeclLoc = Initializer->getLocStart(); 3781cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 37824a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) { 37834a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting from is a class type, enumerate its conversion 37844a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // functions. 3785cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 378633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // We can only enumerate the conversion functions for a complete type; if 378733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // the type isn't complete, simply skip this step. 378833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (!S.RequireCompleteType(DeclLoc, SourceType, 0)) { 378933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *SourceRecordDecl 379033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = cast<CXXRecordDecl>(SourceRecordType->getDecl()); 3791dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37929d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis std::pair<CXXRecordDecl::conversion_iterator, 37939d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis CXXRecordDecl::conversion_iterator> 37949d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis Conversions = SourceRecordDecl->getVisibleConversionFunctions(); 37959d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis for (CXXRecordDecl::conversion_iterator 37969d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis I = Conversions.first, E = Conversions.second; I != E; ++I) { 379733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman NamedDecl *D = *I; 379833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 379933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (isa<UsingShadowDecl>(D)) 380033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman D = cast<UsingShadowDecl>(D)->getTargetDecl(); 3801dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 380233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 380333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXConversionDecl *Conv; 38044a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConvTemplate) 380533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 38064a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 380732daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall Conv = cast<CXXConversionDecl>(D); 3808dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 380933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (AllowExplicit || !Conv->isExplicit()) { 381033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (ConvTemplate) 38119aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 381286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, DestType, 381333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CandidateSet); 381433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman else 38159aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 381686820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Initializer, DestType, CandidateSet); 381733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman } 38184a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 38194a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 38204a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 3821dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3822dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 38234a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet::iterator Best; 38241d31833450e6d2947a33cb0840d87661d92eec07John McCall if (OverloadingResult Result 38258fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) { 38264a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.SetOverloadFailure( 3827dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializationSequence::FK_UserConversionOverloadFailed, 38284a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Result); 38294a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 38304a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 38311d31833450e6d2947a33cb0840d87661d92eec07John McCall 38324a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionDecl *Function = Best->Function; 38333c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky Function->setReferenced(); 383422c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 3835dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 38364a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (isa<CXXConstructorDecl>(Function)) { 38374a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step. Any cv-qualification conversion is 3838f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // subsumed by the initialization. Per DR5, the created temporary is of the 3839f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // cv-unqualified type of the destination. 3840f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith Sequence.AddUserConversionStep(Function, Best->FoundDecl, 3841f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith DestType.getUnqualifiedType(), 384222c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 38434a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 38444a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 38454a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 38464a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step that calls the conversion function. 38475291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor QualType ConvType = Function->getCallResultType(); 38483fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor if (ConvType->getAs<RecordType>()) { 3849f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // If we're converting to a class type, there may be an copy of 38503fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // the resulting temporary object (possible to create an object of 38513fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // a base class type). That copy is not a separate conversion, so 38523fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // we just make a note of the actual destination type (possibly a 38533fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // base class of the type returned by the conversion function) and 38543fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // let the user-defined conversion step handle the conversion. 385522c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType, 385622c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 38573fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor return; 38583fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor } 38594a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 386022c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType, 386122c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 3862dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 38633fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If the conversion following the call to the conversion function 38643fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // is interesting, add it as a separate step. 38654a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (Best->FinalConversion.First || Best->FinalConversion.Second || 38664a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Best->FinalConversion.Third) { 38674a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ImplicitConversionSequence ICS; 38681d31833450e6d2947a33cb0840d87661d92eec07John McCall ICS.setStandard(); 38694a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ICS.Standard = Best->FinalConversion; 38704a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.AddConversionSequenceStep(ICS, DestType); 38714a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 387220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 387320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3874f85e193739c953358c865005855253af4f68a497John McCall/// The non-zero enum values here are indexes into diagnostic alternatives. 3875f85e193739c953358c865005855253af4f68a497John McCallenum InvalidICRKind { IIK_okay, IIK_nonlocal, IIK_nonscalar }; 3876f85e193739c953358c865005855253af4f68a497John McCall 3877f85e193739c953358c865005855253af4f68a497John McCall/// Determines whether this expression is an acceptable ICR source. 3878c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCallstatic InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e, 387982c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian bool isAddressOf, bool &isWeakAccess) { 3880f85e193739c953358c865005855253af4f68a497John McCall // Skip parens. 3881f85e193739c953358c865005855253af4f68a497John McCall e = e->IgnoreParens(); 3882f85e193739c953358c865005855253af4f68a497John McCall 3883f85e193739c953358c865005855253af4f68a497John McCall // Skip address-of nodes. 3884f85e193739c953358c865005855253af4f68a497John McCall if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) { 3885f85e193739c953358c865005855253af4f68a497John McCall if (op->getOpcode() == UO_AddrOf) 388682c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true, 388782c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian isWeakAccess); 3888f85e193739c953358c865005855253af4f68a497John McCall 3889f85e193739c953358c865005855253af4f68a497John McCall // Skip certain casts. 3890c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) { 3891c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall switch (ce->getCastKind()) { 3892f85e193739c953358c865005855253af4f68a497John McCall case CK_Dependent: 3893f85e193739c953358c865005855253af4f68a497John McCall case CK_BitCast: 3894f85e193739c953358c865005855253af4f68a497John McCall case CK_LValueBitCast: 3895f85e193739c953358c865005855253af4f68a497John McCall case CK_NoOp: 389682c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf, isWeakAccess); 3897f85e193739c953358c865005855253af4f68a497John McCall 3898f85e193739c953358c865005855253af4f68a497John McCall case CK_ArrayToPointerDecay: 3899f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonscalar; 3900f85e193739c953358c865005855253af4f68a497John McCall 3901f85e193739c953358c865005855253af4f68a497John McCall case CK_NullToPointer: 3902f85e193739c953358c865005855253af4f68a497John McCall return IIK_okay; 3903f85e193739c953358c865005855253af4f68a497John McCall 3904f85e193739c953358c865005855253af4f68a497John McCall default: 3905f85e193739c953358c865005855253af4f68a497John McCall break; 3906f85e193739c953358c865005855253af4f68a497John McCall } 3907f85e193739c953358c865005855253af4f68a497John McCall 3908f85e193739c953358c865005855253af4f68a497John McCall // If we have a declaration reference, it had better be a local variable. 3909f4b88a45902af1802a1cb42ba48b1c474474f228John McCall } else if (isa<DeclRefExpr>(e)) { 391082c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian // set isWeakAccess to true, to mean that there will be an implicit 391182c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian // load which requires a cleanup. 391282c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian if (e->getType().getObjCLifetime() == Qualifiers::OCL_Weak) 391382c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian isWeakAccess = true; 391482c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian 3915c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (!isAddressOf) return IIK_nonlocal; 3916c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall 3917f4b88a45902af1802a1cb42ba48b1c474474f228John McCall VarDecl *var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl()); 3918f4b88a45902af1802a1cb42ba48b1c474474f228John McCall if (!var) return IIK_nonlocal; 3919c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall 3920c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal); 3921f85e193739c953358c865005855253af4f68a497John McCall 3922f85e193739c953358c865005855253af4f68a497John McCall // If we have a conditional operator, check both sides. 3923f85e193739c953358c865005855253af4f68a497John McCall } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) { 392482c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf, 392582c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian isWeakAccess)) 3926f85e193739c953358c865005855253af4f68a497John McCall return iik; 3927f85e193739c953358c865005855253af4f68a497John McCall 392882c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian return isInvalidICRSource(C, cond->getRHS(), isAddressOf, isWeakAccess); 3929f85e193739c953358c865005855253af4f68a497John McCall 3930f85e193739c953358c865005855253af4f68a497John McCall // These are never scalar. 3931f85e193739c953358c865005855253af4f68a497John McCall } else if (isa<ArraySubscriptExpr>(e)) { 3932f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonscalar; 3933f85e193739c953358c865005855253af4f68a497John McCall 3934f85e193739c953358c865005855253af4f68a497John McCall // Otherwise, it needs to be a null pointer constant. 3935f85e193739c953358c865005855253af4f68a497John McCall } else { 3936f85e193739c953358c865005855253af4f68a497John McCall return (e->isNullPointerConstant(C, Expr::NPC_ValueDependentIsNull) 3937f85e193739c953358c865005855253af4f68a497John McCall ? IIK_okay : IIK_nonlocal); 3938f85e193739c953358c865005855253af4f68a497John McCall } 3939f85e193739c953358c865005855253af4f68a497John McCall 3940f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonlocal; 3941f85e193739c953358c865005855253af4f68a497John McCall} 3942f85e193739c953358c865005855253af4f68a497John McCall 3943f85e193739c953358c865005855253af4f68a497John McCall/// Check whether the given expression is a valid operand for an 3944f85e193739c953358c865005855253af4f68a497John McCall/// indirect copy/restore. 3945f85e193739c953358c865005855253af4f68a497John McCallstatic void checkIndirectCopyRestoreSource(Sema &S, Expr *src) { 3946f85e193739c953358c865005855253af4f68a497John McCall assert(src->isRValue()); 394782c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian bool isWeakAccess = false; 394882c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian InvalidICRKind iik = isInvalidICRSource(S.Context, src, false, isWeakAccess); 394982c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian // If isWeakAccess to true, there will be an implicit 395082c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian // load which requires a cleanup. 395182c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian if (S.getLangOpts().ObjCAutoRefCount && isWeakAccess) 395282c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian S.ExprNeedsCleanups = true; 395382c458ea76bf8f0981e3d1b5070c0b0e5878d784Fariborz Jahanian 3954f85e193739c953358c865005855253af4f68a497John McCall if (iik == IIK_okay) return; 3955f85e193739c953358c865005855253af4f68a497John McCall 3956f85e193739c953358c865005855253af4f68a497John McCall S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback) 3957f85e193739c953358c865005855253af4f68a497John McCall << ((unsigned) iik - 1) // shift index into diagnostic explanations 3958f85e193739c953358c865005855253af4f68a497John McCall << src->getSourceRange(); 3959f85e193739c953358c865005855253af4f68a497John McCall} 3960f85e193739c953358c865005855253af4f68a497John McCall 3961cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor/// \brief Determine whether we have compatible array types for the 3962cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor/// purposes of GNU by-copy array initialization. 3963cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregorstatic bool hasCompatibleArrayTypes(ASTContext &Context, 3964cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *Dest, 3965cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *Source) { 3966cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // If the source and destination array types are equivalent, we're 3967cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // done. 3968cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0))) 3969cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return true; 3970cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3971cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Make sure that the element types are the same. 3972cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!Context.hasSameType(Dest->getElementType(), Source->getElementType())) 3973cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return false; 3974cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3975cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // The only mismatch we allow is when the destination is an 3976cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // incomplete array type and the source is a constant array type. 3977cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return Source->isConstantArrayType() && Dest->isIncompleteArrayType(); 3978cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor} 3979cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3980f85e193739c953358c865005855253af4f68a497John McCallstatic bool tryObjCWritebackConversion(Sema &S, 3981f85e193739c953358c865005855253af4f68a497John McCall InitializationSequence &Sequence, 3982f85e193739c953358c865005855253af4f68a497John McCall const InitializedEntity &Entity, 3983f85e193739c953358c865005855253af4f68a497John McCall Expr *Initializer) { 3984f85e193739c953358c865005855253af4f68a497John McCall bool ArrayDecay = false; 3985f85e193739c953358c865005855253af4f68a497John McCall QualType ArgType = Initializer->getType(); 3986f85e193739c953358c865005855253af4f68a497John McCall QualType ArgPointee; 3987f85e193739c953358c865005855253af4f68a497John McCall if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) { 3988f85e193739c953358c865005855253af4f68a497John McCall ArrayDecay = true; 3989f85e193739c953358c865005855253af4f68a497John McCall ArgPointee = ArgArrayType->getElementType(); 3990f85e193739c953358c865005855253af4f68a497John McCall ArgType = S.Context.getPointerType(ArgPointee); 3991f85e193739c953358c865005855253af4f68a497John McCall } 3992f85e193739c953358c865005855253af4f68a497John McCall 3993f85e193739c953358c865005855253af4f68a497John McCall // Handle write-back conversion. 3994f85e193739c953358c865005855253af4f68a497John McCall QualType ConvertedArgType; 3995f85e193739c953358c865005855253af4f68a497John McCall if (!S.isObjCWritebackConversion(ArgType, Entity.getType(), 3996f85e193739c953358c865005855253af4f68a497John McCall ConvertedArgType)) 3997f85e193739c953358c865005855253af4f68a497John McCall return false; 3998f85e193739c953358c865005855253af4f68a497John McCall 3999f85e193739c953358c865005855253af4f68a497John McCall // We should copy unless we're passing to an argument explicitly 4000f85e193739c953358c865005855253af4f68a497John McCall // marked 'out'. 4001f85e193739c953358c865005855253af4f68a497John McCall bool ShouldCopy = true; 4002f85e193739c953358c865005855253af4f68a497John McCall if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl())) 4003f85e193739c953358c865005855253af4f68a497John McCall ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out); 4004f85e193739c953358c865005855253af4f68a497John McCall 4005f85e193739c953358c865005855253af4f68a497John McCall // Do we need an lvalue conversion? 4006f85e193739c953358c865005855253af4f68a497John McCall if (ArrayDecay || Initializer->isGLValue()) { 4007f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS; 4008f85e193739c953358c865005855253af4f68a497John McCall ICS.setStandard(); 4009f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.setAsIdentityConversion(); 4010f85e193739c953358c865005855253af4f68a497John McCall 4011f85e193739c953358c865005855253af4f68a497John McCall QualType ResultType; 4012f85e193739c953358c865005855253af4f68a497John McCall if (ArrayDecay) { 4013f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First = ICK_Array_To_Pointer; 4014f85e193739c953358c865005855253af4f68a497John McCall ResultType = S.Context.getPointerType(ArgPointee); 4015f85e193739c953358c865005855253af4f68a497John McCall } else { 4016f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First = ICK_Lvalue_To_Rvalue; 4017f85e193739c953358c865005855253af4f68a497John McCall ResultType = Initializer->getType().getNonLValueExprType(S.Context); 4018f85e193739c953358c865005855253af4f68a497John McCall } 4019f85e193739c953358c865005855253af4f68a497John McCall 4020f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddConversionSequenceStep(ICS, ResultType); 4021f85e193739c953358c865005855253af4f68a497John McCall } 4022f85e193739c953358c865005855253af4f68a497John McCall 4023f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy); 4024f85e193739c953358c865005855253af4f68a497John McCall return true; 4025f85e193739c953358c865005855253af4f68a497John McCall} 4026f85e193739c953358c865005855253af4f68a497John McCall 402721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyeistatic bool TryOCLSamplerInitialization(Sema &S, 402821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei InitializationSequence &Sequence, 402921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei QualType DestType, 403021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei Expr *Initializer) { 403121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei if (!S.getLangOpts().OpenCL || !DestType->isSamplerT() || 403221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei !Initializer->isIntegerConstantExpr(S.getASTContext())) 403321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei return false; 403421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 403521f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei Sequence.AddOCLSamplerInitStep(DestType); 403621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei return true; 403721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei} 403821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 4039e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// 4040e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// OpenCL 1.2 spec, s6.12.10 4041e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// 4042e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// The event argument can also be used to associate the 4043e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// async_work_group_copy with a previous async copy allowing 4044e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// an event to be shared by multiple async copies; otherwise 4045e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// event should be zero. 4046e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei// 4047e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyeistatic bool TryOCLZeroEventInitialization(Sema &S, 4048e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei InitializationSequence &Sequence, 4049e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei QualType DestType, 4050e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei Expr *Initializer) { 4051e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei if (!S.getLangOpts().OpenCL || !DestType->isEventT() || 4052e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei !Initializer->isIntegerConstantExpr(S.getASTContext()) || 4053e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei (Initializer->EvaluateKnownConstInt(S.getASTContext()) != 0)) 4054e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return false; 4055e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 4056e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei Sequence.AddOCLZeroEventStep(DestType); 4057e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return true; 4058e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei} 4059e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 406020093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::InitializationSequence(Sema &S, 406120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 406220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 406320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, 40645769d6195087229770d7ac90449443e026c47103John McCall unsigned NumArgs) 40655769d6195087229770d7ac90449443e026c47103John McCall : FailedCandidateSet(Kind.getLocation()) { 406612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola ASTContext &Context = S.Context; 4067dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 406820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init]p16: 4069dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // The semantics of initializers are as follows. The destination type is 4070dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // the type of the object or reference being initialized and the source 407120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type is the type of the initializer expression. The source type is not 4072dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // defined when the initializer is a braced-init-list or when it is a 407320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // parenthesized list of expressions. 407412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola QualType DestType = Entity.getType(); 407520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 407612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola if (DestType->isDependentType() || 407713a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Expr::hasAnyTypeDependentArguments(llvm::makeArrayRef(Args, NumArgs))) { 407820093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = DependentSequence; 407920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 408020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 408120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 40827491c499e826682e128a400038361ebcbde30eecSebastian Redl // Almost everything is a normal sequence. 40837491c499e826682e128a400038361ebcbde30eecSebastian Redl setSequenceKind(NormalSequence); 40847491c499e826682e128a400038361ebcbde30eecSebastian Redl 4085241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall for (unsigned I = 0; I != NumArgs; ++I) 408632509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall if (Args[I]->getType()->isNonOverloadPlaceholderType()) { 40875acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall // FIXME: should we be doing this here? 408832509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall ExprResult result = S.CheckPlaceholderExpr(Args[I]); 408932509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall if (result.isInvalid()) { 409032509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall SetFailed(FK_PlaceholderType); 409132509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall return; 40925acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall } 409332509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall Args[I] = result.take(); 4094429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 4095241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall 40965acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 409720093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType SourceType; 409820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer = 0; 409999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs == 1) { 410020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer = Args[0]; 410120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!isa<InitListExpr>(Initializer)) 410220093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceType = Initializer->getType(); 410320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4104dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 41053a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl // - If the initializer is a (non-parenthesized) braced-init-list, the 41063a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl // object is list-initialized (8.5.4). 41073a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl if (Kind.getKind() != InitializationKind::IK_Direct) { 41083a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) { 41093a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl TryListInitialization(S, Entity, Kind, InitList, *this); 41103a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl return; 41113a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl } 411220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4113dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 411420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a reference type, see 8.5.3. 411520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isReferenceType()) { 411620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p1: 411720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A variable declared to be a T& or T&&, that is, "reference to type T" 411820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (8.3.2), shall be initialized by an object, or function, of type T or 411920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // by an object that can be converted into a T. 412020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (Therefore, multiple arguments are not permitted.) 412120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (NumArgs != 1) 412212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_TooManyInitsForReference); 412320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 412412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryReferenceInitialization(S, Entity, Kind, Args[0], *this); 412520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 412620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4127dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 412820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is (), the object is value-initialized. 412999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Value || 413099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct && NumArgs == 0)) { 413112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryValueInitialization(S, Entity, Kind, *this); 413220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 413320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4134dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 413599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Handle default initialization. 41367663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky if (Kind.getKind() == InitializationKind::IK_Default) { 413712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryDefaultInitialization(S, Entity, Kind, *this); 413899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 413999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 414018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 4141ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // - If the destination type is an array of characters, an array of 4142ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // char16_t, an array of char32_t, or an array of wchar_t, and the 4143ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // initializer is a string literal, see 8.5.2. 4144dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the destination type is an array, the program is 414520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // ill-formed. 4146cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const ArrayType *DestAT = Context.getAsArrayType(DestType)) { 414773076431605556fdbf28d287d084a73a24a8b8d4John McCall if (Initializer && isa<VariableArrayType>(DestAT)) { 414873076431605556fdbf28d287d084a73a24a8b8d4John McCall SetFailed(FK_VariableLengthArrayHasInitializer); 414973076431605556fdbf28d287d084a73a24a8b8d4John McCall return; 415073076431605556fdbf28d287d084a73a24a8b8d4John McCall } 415173076431605556fdbf28d287d084a73a24a8b8d4John McCall 4152cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (Initializer && IsStringInit(Initializer, DestAT, Context)) { 415312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this); 4154ce6c9b7da219c8640a0559f75770cfc6622de083John McCall return; 4155ce6c9b7da219c8640a0559f75770cfc6622de083John McCall } 4156ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 4157cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Note: as an GNU C extension, we allow initialization of an 4158cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // array from a compound literal that creates an array of the same 4159cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // type, so long as the initializer has no side effects. 41604e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!S.getLangOpts().CPlusPlus && Initializer && 4161cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) && 4162cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Initializer->getType()->isArrayType()) { 4163cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *SourceAT 4164cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor = Context.getAsArrayType(Initializer->getType()); 4165cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT)) 416612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayTypeMismatch); 4167cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor else if (Initializer->HasSideEffects(S.Context)) 416812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_NonConstantArrayInit); 4169cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor else { 417012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddArrayInitStep(DestType); 4171cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 41720f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith } 4173f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // Note: as a GNU C++ extension, we allow list-initialization of a 4174f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // class member of array type from a parenthesized initializer list. 41754e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (S.getLangOpts().CPlusPlus && 41760f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith Entity.getKind() == InitializedEntity::EK_Member && 41770f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith Initializer && isa<InitListExpr>(Initializer)) { 41780f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith TryListInitialization(S, Entity, Kind, cast<InitListExpr>(Initializer), 41790f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith *this); 41800f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith AddParenthesizedArrayInitStep(DestType); 4181cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } else if (DestAT->getElementType()->isAnyCharacterType()) 418212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayNeedsInitListOrStringLiteral); 418320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 418412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayNeedsInitList); 4185dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 418620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 418720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4188cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 4189f85e193739c953358c865005855253af4f68a497John McCall // Determine whether we should consider writeback conversions for 4190f85e193739c953358c865005855253af4f68a497John McCall // Objective-C ARC. 41914e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie bool allowObjCWritebackConversion = S.getLangOpts().ObjCAutoRefCount && 4192f85e193739c953358c865005855253af4f68a497John McCall Entity.getKind() == InitializedEntity::EK_Parameter; 4193f85e193739c953358c865005855253af4f68a497John McCall 4194f85e193739c953358c865005855253af4f68a497John McCall // We're at the end of the line for C: it's either a write-back conversion 4195f85e193739c953358c865005855253af4f68a497John McCall // or it's a C assignment. There's no need to check anything else. 41964e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!S.getLangOpts().CPlusPlus) { 4197f85e193739c953358c865005855253af4f68a497John McCall // If allowed, check whether this is an Objective-C writeback conversion. 4198f85e193739c953358c865005855253af4f68a497John McCall if (allowObjCWritebackConversion && 419912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola tryObjCWritebackConversion(S, *this, Entity, Initializer)) { 4200f85e193739c953358c865005855253af4f68a497John McCall return; 4201f85e193739c953358c865005855253af4f68a497John McCall } 420221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 420321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei if (TryOCLSamplerInitialization(S, *this, DestType, Initializer)) 420421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei return; 4205e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 4206e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei if (TryOCLZeroEventInitialization(S, *this, DestType, Initializer)) 4207e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return; 4208e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 4209f85e193739c953358c865005855253af4f68a497John McCall // Handle initialization in C 421012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddCAssignmentStep(DestType); 421112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 4212cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman return; 4213cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 4214dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 42154e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie assert(S.getLangOpts().CPlusPlus); 4216f85e193739c953358c865005855253af4f68a497John McCall 421720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a (possibly cv-qualified) class type: 421820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isRecordType()) { 4219dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the initialization is direct-initialization, or if it is 4220dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy-initialization where the cv-unqualified version of the 4221dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // source type is the same class as, or a derived class of, the 422220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // class of the destination, constructors are considered. [...] 422320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Direct || 422420093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Kind.getKind() == InitializationKind::IK_Copy && 422520093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Context.hasSameUnqualifiedType(SourceType, DestType) || 422620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.IsDerivedFrom(SourceType, DestType)))) 4227dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TryConstructorInitialization(S, Entity, Kind, Args, NumArgs, 422812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Entity.getType(), *this); 4229dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise (i.e., for the remaining copy-initialization cases), 423020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // user-defined conversion sequences that can convert from the source 4231dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // type to the destination type or (when a conversion function is 423220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // used) to a derived class thereof are enumerated as described in 423320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 13.3.1.4, and the best one is chosen through overload resolution 423420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (13.3). 423520093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 423612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 423720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 423820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4239dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 424099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs > 1) { 424112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_TooManyInitsForScalar); 424299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 424399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 424499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(NumArgs == 1 && "Zero-argument case handled above"); 4245dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4246dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the source type is a (possibly cv-qualified) class 424720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type, conversion functions are considered. 424899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (!SourceType.isNull() && SourceType->isRecordType()) { 424912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 425012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 425120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 425220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4253dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 425420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the initial value of the object being initialized is the 42554a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // (possibly converted) value of the initializer expression. Standard 425620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversions (Clause 4) will be used, if necessary, to convert the 4257dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // initializer expression to the cv-unqualified version of the 425820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // destination type; no user-defined conversions are considered. 4259f85e193739c953358c865005855253af4f68a497John McCall 4260f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS 4261f85e193739c953358c865005855253af4f68a497John McCall = S.TryImplicitConversion(Initializer, Entity.getType(), 4262f85e193739c953358c865005855253af4f68a497John McCall /*SuppressUserConversions*/true, 4263369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*AllowExplicitConversions*/ false, 426414d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*InOverloadResolution*/ false, 4265f85e193739c953358c865005855253af4f68a497John McCall /*CStyle=*/Kind.isCStyleOrFunctionalCast(), 4266f85e193739c953358c865005855253af4f68a497John McCall allowObjCWritebackConversion); 4267f85e193739c953358c865005855253af4f68a497John McCall 4268f85e193739c953358c865005855253af4f68a497John McCall if (ICS.isStandard() && 4269f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.Second == ICK_Writeback_Conversion) { 4270f85e193739c953358c865005855253af4f68a497John McCall // Objective-C ARC writeback conversion. 4271f85e193739c953358c865005855253af4f68a497John McCall 4272f85e193739c953358c865005855253af4f68a497John McCall // We should copy unless we're passing to an argument explicitly 4273f85e193739c953358c865005855253af4f68a497John McCall // marked 'out'. 4274f85e193739c953358c865005855253af4f68a497John McCall bool ShouldCopy = true; 4275f85e193739c953358c865005855253af4f68a497John McCall if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl())) 4276f85e193739c953358c865005855253af4f68a497John McCall ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out); 4277f85e193739c953358c865005855253af4f68a497John McCall 4278f85e193739c953358c865005855253af4f68a497John McCall // If there was an lvalue adjustment, add it as a separate conversion. 4279f85e193739c953358c865005855253af4f68a497John McCall if (ICS.Standard.First == ICK_Array_To_Pointer || 4280f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First == ICK_Lvalue_To_Rvalue) { 4281f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence LvalueICS; 4282f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.setStandard(); 4283f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.setAsIdentityConversion(); 4284f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0)); 4285f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.First = ICS.Standard.First; 428612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0)); 4287f85e193739c953358c865005855253af4f68a497John McCall } 428812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 428912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy); 4290f85e193739c953358c865005855253af4f68a497John McCall } else if (ICS.isBad()) { 42911be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor DeclAccessPair dap; 42921be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor if (Initializer->getType() == Context.OverloadTy && 42931be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor !S.ResolveAddressOfOverloadedFunction(Initializer 42941be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor , DestType, false, dap)) 429512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 42968e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor else 429712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(InitializationSequence::FK_ConversionFailed); 4298f85e193739c953358c865005855253af4f68a497John McCall } else { 429912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddConversionSequenceStep(ICS, Entity.getType()); 4300856d3798af7c2f7251e4a295f3da7a09ce4c62abJohn McCall 430112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 43028e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor } 430320093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 430420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 430520093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::~InitializationSequence() { 43065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner for (SmallVectorImpl<Step>::iterator Step = Steps.begin(), 430720093b4bf698f292c664676987541d5103b65b15Douglas Gregor StepEnd = Steps.end(); 430820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) 430920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Destroy(); 431020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 431120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 431220093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 431320093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Perform initialization 431420093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 4315dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic Sema::AssignmentAction 431618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorgetAssignmentAction(const InitializedEntity &Entity) { 431718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch(Entity.getKind()) { 431818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 431918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 4320a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Exception: 4321a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Base: 4322059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 432318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 432418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 432518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 4326dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (Entity.getDecl() && 4327688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext())) 4328688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor return Sema::AA_Sending; 4329688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor 433018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Passing; 433118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 433218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 433318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Returning; 433418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 433518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 433618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell apart casting vs. converting? 433718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Casting; 4338dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 433918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Member: 4340d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_ArrayElement: 4341d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 43420c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4343310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 43444773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 434518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 434618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 434718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 43487530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 434918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 435018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 4351774d8b4679ce1317da0f18336c3d27bdb11e5f63Richard Smith/// \brief Whether we should bind a created object as a temporary when 43524154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// initializing the given entity. 43532f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregorstatic bool shouldBindAsTemporary(const InitializedEntity &Entity) { 435418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 43551b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 43561b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 43572f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor case InitializedEntity::EK_Result: 435818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 435918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 436018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 4361059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 4362d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 43630c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4364a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson case InitializedEntity::EK_Exception: 4365310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 43664773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 436718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return false; 4368dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 436918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 437018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 437118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return true; 437218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 4373dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 437418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("missed an InitializedEntity kind?"); 437518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 437618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 43774154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether the given entity, when initialized with an object 43784154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// created for that initialization, requires destruction. 43794154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregorstatic bool shouldDestroyTemporary(const InitializedEntity &Entity) { 43804154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor switch (Entity.getKind()) { 43814154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Result: 43824154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_New: 43834154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Base: 4384059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 43854154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_VectorElement: 43860c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4387310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 43884773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 43894154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return false; 4390dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4391774d8b4679ce1317da0f18336c3d27bdb11e5f63Richard Smith case InitializedEntity::EK_Member: 43924154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Variable: 43934154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Parameter: 43944154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Temporary: 43954154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_ArrayElement: 43964154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Exception: 43974154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return true; 43984154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 4399dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4400dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi llvm_unreachable("missed an InitializedEntity kind?"); 44014154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor} 44024154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 440383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Look for copy and move constructors and constructor templates, for 440483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// copying an object via direct-initialization (per C++11 [dcl.init]p16). 440583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void LookupCopyAndMoveConstructors(Sema &S, 440683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet &CandidateSet, 440783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CXXRecordDecl *Class, 440883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr) { 44093bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie DeclContext::lookup_result R = S.LookupConstructors(Class); 44108682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // The container holding the constructors can under certain conditions 44118682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // be changed while iterating (e.g. because of deserialization). 44128682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis // To be safe we copy the lookup results to a new container. 44133bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie SmallVector<NamedDecl*, 16> Ctors(R.begin(), R.end()); 44148682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis for (SmallVector<NamedDecl*, 16>::iterator 44158682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis CI = Ctors.begin(), CE = Ctors.end(); CI != CE; ++CI) { 44168682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis NamedDecl *D = *CI; 441783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CXXConstructorDecl *Constructor = 0; 441883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 44198682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis if ((Constructor = dyn_cast<CXXConstructorDecl>(D))) { 442083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Handle copy/moveconstructors, only. 442183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Constructor || Constructor->isInvalidDecl() || 442283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith !Constructor->isCopyOrMoveConstructor() || 442383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith !Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 442483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 442583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 442683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith DeclAccessPair FoundDecl 442783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith = DeclAccessPair::make(Constructor, Constructor->getAccess()); 442883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.AddOverloadCandidate(Constructor, FoundDecl, 442913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CurInitExpr, CandidateSet); 443083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 443183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 443283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 443383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Handle constructor templates. 44348682b93b3491facc9a42eb87b78bb9d8c18a0739Argyrios Kyrtzidis FunctionTemplateDecl *ConstructorTmpl = cast<FunctionTemplateDecl>(D); 443583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (ConstructorTmpl->isInvalidDecl()) 443683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 443783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 443883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Constructor = cast<CXXConstructorDecl>( 443983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith ConstructorTmpl->getTemplatedDecl()); 444083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 444183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 444283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 444383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // FIXME: Do we need to limit this to copy-constructor-like 444483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // candidates? 444583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith DeclAccessPair FoundDecl 444683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith = DeclAccessPair::make(ConstructorTmpl, ConstructorTmpl->getAccess()); 444783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 0, 444813a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CurInitExpr, CandidateSet, true); 444983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 445083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 445183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 445283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Get the location at which initialization diagnostics should appear. 445383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic SourceLocation getInitializationLoc(const InitializedEntity &Entity, 445483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *Initializer) { 445583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith switch (Entity.getKind()) { 445683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Result: 445783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getReturnLoc(); 445883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 445983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Exception: 446083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getThrowLoc(); 446183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 446283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Variable: 446383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getDecl()->getLocation(); 446483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 44654773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 44664773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor return Entity.getCaptureLoc(); 44674773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor 446883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_ArrayElement: 446983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Member: 447083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Parameter: 447183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Temporary: 447283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_New: 447383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Base: 447483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Delegating: 447583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_VectorElement: 447683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_ComplexElement: 447783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_BlockElement: 447883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Initializer->getLocStart(); 447983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 448083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith llvm_unreachable("missed an InitializedEntity kind?"); 448183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 448283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 4483523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \brief Make a (potentially elidable) temporary copy of the object 4484523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// provided by the given initializer by calling the appropriate copy 4485523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// constructor. 4486523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4487523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param S The Sema object used for type-checking. 4488523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 448963e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// \param T The type of the temporary object, which must either be 4490523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// the type of the initializer expression or a superclass thereof. 4491523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 44921dfbd92c83699820bfaa352e83083124e34fc9dcJames Dennett/// \param Entity The entity being initialized. 4493523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4494523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param CurInit The initializer expression. 4495523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4496523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param IsExtraneousCopy Whether this is an "extraneous" copy that 4497523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// is permitted in C++03 (but not C++0x) when binding a reference to 4498523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// an rvalue. 4499523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4500523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \returns An expression that copies the initializer expression into 4501523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// a temporary object, or an error expression if a copy could not be 4502523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// created. 450360d7b3a319d84d688752be3870615ac0f111fb16John McCallstatic ExprResult CopyObject(Sema &S, 45048fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor QualType T, 45058fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor const InitializedEntity &Entity, 45068fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor ExprResult CurInit, 45078fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor bool IsExtraneousCopy) { 45083fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine which class type we're copying to. 45091b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Expr *CurInitExpr = (Expr *)CurInit.get(); 4510dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXRecordDecl *Class = 0; 4511523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) 45122f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Class = cast<CXXRecordDecl>(Record->getDecl()); 45132f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (!Class) 45143fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 45152f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 4516f5d8f466c3eebaffc51468812bdcbe7f0fe4891aDouglas Gregor // C++0x [class.copy]p32: 45172f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // When certain criteria are met, an implementation is allowed to 45182f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // omit the copy/move construction of a class object, even if the 45192f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // copy/move constructor and/or destructor for the object have 45202f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // side effects. [...] 45212f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // - when a temporary class object that has not been bound to a 45222f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // reference (12.2) would be copied/moved to a class object 45232f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // with the same cv-unqualified type, the copy/move operation 45242f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // can be omitted by constructing the temporary object 45252f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // directly into the target of the omitted copy/move 4526dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // 45272f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // Note that the other three bullets are handled elsewhere. Copy 45283c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // elision for return statements and throw expressions are handled as part 4529dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // of constructor initialization, while copy elision for exception handlers 45303c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // is handled by the run-time. 4531558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall bool Elidable = CurInitExpr->isTemporaryObject(S.Context, Class); 453283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith SourceLocation Loc = getInitializationLoc(Entity, CurInit.get()); 4533f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 4534dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Make sure that the type we are copying is complete. 4535d10099e5c8238fa0327f03921cf2e3c8975c881eDouglas Gregor if (S.RequireCompleteType(Loc, T, diag::err_temp_copy_incomplete)) 45363fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 4537f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 4538cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Perform overload resolution using the class's copy/move constructors. 453983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Only consider constructors and constructor templates. Per 454083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // C++0x [dcl.init]p16, second bullet to class types, this initialization 454183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // is direct-initialization. 45425769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 454383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith LookupCopyAndMoveConstructors(S, CandidateSet, Class, CurInitExpr); 4544dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 45457cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 45467cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 454718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OverloadCandidateSet::iterator Best; 454825ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth switch (CandidateSet.BestViableFunction(S, Loc, Best)) { 454918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Success: 455018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 4551dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 455218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_No_Viable_Function: 455357d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin S.Diag(Loc, IsExtraneousCopy && !S.isSFINAEContext() 455457d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin ? diag::ext_rvalue_to_reference_temp_copy_no_viable 455557d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin : diag::err_temp_copy_no_viable) 45567abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 455718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 455813a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet.NoteCandidates(S, OCD_AllCandidates, CurInitExpr); 455957d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin if (!IsExtraneousCopy || S.isSFINAEContext()) 4560f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 45613fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 4562dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 456318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Ambiguous: 456418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_ambiguous) 45657abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 456618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 456713a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet.NoteCandidates(S, OCD_ViableCandidates, CurInitExpr); 4568f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4569dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 457018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Deleted: 457118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_deleted) 45727abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 457318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 45746c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith S.NoteDeletedFunction(Best->Function); 4575f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 457618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 457718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 45783fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function); 45794e28d9e2ba9ce237549b45cfd4136ec6536d1325Benjamin Kramer SmallVector<Expr*, 8> ConstructorArgs; 45803fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 4581523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 45829a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 458357d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin Best->FoundDecl.getAccess(), IsExtraneousCopy); 4584523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 4585523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (IsExtraneousCopy) { 4586523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // If this is a totally extraneous copy for C++03 reference 4587523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // binding purposes, just return the original initialization 45882559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // expression. We don't generate an (elided) copy operation here 45892559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // because doing so would require us to pass down a flag to avoid 45902559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // infinite recursion, where each step adds another extraneous, 45912559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // elidable copy. 45922559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 45932559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Instantiate the default arguments of any extra parameters in 45942559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // the selected copy constructor, as if we were going to create a 45952559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // proper call to the copy constructor. 45962559a7045a74679c80376305397a5953d038e1d0Douglas Gregor for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) { 45972559a7045a74679c80376305397a5953d038e1d0Douglas Gregor ParmVarDecl *Parm = Constructor->getParamDecl(I); 45982559a7045a74679c80376305397a5953d038e1d0Douglas Gregor if (S.RequireCompleteType(Loc, Parm->getType(), 4599d10099e5c8238fa0327f03921cf2e3c8975c881eDouglas Gregor diag::err_call_incomplete_argument)) 46002559a7045a74679c80376305397a5953d038e1d0Douglas Gregor break; 46012559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 46022559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Build the default argument expression; we don't actually care 46032559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if this succeeds or not, because this routine will complain 46042559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if there was a problem. 46052559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm); 46062559a7045a74679c80376305397a5953d038e1d0Douglas Gregor } 4607523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 4608523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor return S.Owned(CurInitExpr); 4609523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor } 4610dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 46113fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine the arguments required to actually perform the 4612523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // constructor call (we might have derived-to-base conversions, or 4613523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // the copy constructor may have default arguments). 4614f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (S.CompleteConstructorCall(Constructor, MultiExprArg(&CurInitExpr, 1), 46153fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Loc, ConstructorArgs)) 4616f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 46173fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 4618b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // Actually perform the constructor call. 4619b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, T, Constructor, Elidable, 46203fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ConstructorArgs, 46217cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 4622c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith /*ListInit*/ false, 46237a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 4624428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 4625428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 4626dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4627b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // If we're supposed to bind temporaries, do so. 4628b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity)) 4629b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 46303fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 463118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 463220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 463383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Check whether elidable copy construction for binding a reference to 463483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// a temporary would have succeeded if we were building in C++98 mode, for 463583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// -Wc++98-compat. 463683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void CheckCXX98CompatAccessibleCopy(Sema &S, 463783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const InitializedEntity &Entity, 463883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr) { 463980ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith assert(S.getLangOpts().CPlusPlus11); 464083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 464183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const RecordType *Record = CurInitExpr->getType()->getAs<RecordType>(); 464283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Record) 464383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return; 464483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 464583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith SourceLocation Loc = getInitializationLoc(Entity, CurInitExpr); 464683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (S.Diags.getDiagnosticLevel(diag::warn_cxx98_compat_temp_copy, Loc) 464783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith == DiagnosticsEngine::Ignored) 464883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return; 464983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 465083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Find constructors which would have been considered. 465183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet CandidateSet(Loc); 465283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith LookupCopyAndMoveConstructors( 465383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S, CandidateSet, cast<CXXRecordDecl>(Record->getDecl()), CurInitExpr); 465483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 465583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Perform overload resolution. 465683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet::iterator Best; 465783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadingResult OR = CandidateSet.BestViableFunction(S, Loc, Best); 465883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 465983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy) 466083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith << OR << (int)Entity.getKind() << CurInitExpr->getType() 466183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith << CurInitExpr->getSourceRange(); 466283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 466383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith switch (OR) { 466483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Success: 466583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.CheckConstructorAccess(Loc, cast<CXXConstructorDecl>(Best->Function), 4666b9abd87283ac6e929b7e12a577663bc99e61d020John McCall Entity, Best->FoundDecl.getAccess(), Diag); 466783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // FIXME: Check default arguments as far as that's possible. 466883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 466983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 467083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_No_Viable_Function: 467183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 467213a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet.NoteCandidates(S, OCD_AllCandidates, CurInitExpr); 467383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 467483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 467583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Ambiguous: 467683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 467713a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet.NoteCandidates(S, OCD_ViableCandidates, CurInitExpr); 467883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 467983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 468083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Deleted: 468183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 46826c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith S.NoteDeletedFunction(Best->Function); 468383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 468483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 468583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 468683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 4687a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregorvoid InitializationSequence::PrintInitLocationNote(Sema &S, 4688a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor const InitializedEntity &Entity) { 4689a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Parameter && Entity.getDecl()) { 4690a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getLocation().isInvalid()) 4691a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor return; 4692a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 4693a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getDeclName()) 4694a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here) 4695a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor << Entity.getDecl()->getDeclName(); 4696a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor else 4697a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here); 4698a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } 4699a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor} 4700a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 47013b80232b50c29b245e674f5aa02047b408e41018Sebastian Redlstatic bool isReferenceBinding(const InitializationSequence::Step &s) { 47023b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl return s.Kind == InitializationSequence::SK_BindReference || 47033b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl s.Kind == InitializationSequence::SK_BindReferenceToTemporary; 47043b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl} 47053b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl 470610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlstatic ExprResult 470710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian RedlPerformConstructorInitialization(Sema &S, 470810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializedEntity &Entity, 470910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializationKind &Kind, 471010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl MultiExprArg Args, 471110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializationSequence::Step& Step, 4712c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith bool &ConstructorInitRequiresZeroInit, 4713c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith bool IsListInitialization) { 471410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl unsigned NumArgs = Args.size(); 471510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructorDecl *Constructor 471610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl = cast<CXXConstructorDecl>(Step.Function.Function); 471710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl bool HadMultipleCandidates = Step.Function.HadMultipleCandidates; 471810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 471910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Build a call to the selected constructor. 47204e28d9e2ba9ce237549b45cfd4136ec6536d1325Benjamin Kramer SmallVector<Expr*, 8> ConstructorArgs; 472110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid()) 472210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ? Kind.getEqualLoc() 472310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl : Kind.getLocation(); 472410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 472510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Kind.getKind() == InitializationKind::IK_Default) { 472610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Force even a trivial, implicit default constructor to be 472710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // semantically checked. We do this explicitly because we don't build 472810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // the definition for completely trivial constructors. 472928e4702a1f978213ff945fe4369e3be7444bf320Matt Beaumont-Gay assert(Constructor->getParent() && "No parent class for constructor."); 473010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() && 47315d86f61b9c54429fc3f9149fc0f7009010a644a1Douglas Gregor Constructor->isTrivial() && !Constructor->isUsed(false)) 473210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.DefineImplicitDefaultConstructor(Loc, Constructor); 473310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 473410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 473510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ExprResult CurInit = S.Owned((Expr *)0); 473610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 4737ed878af7914df535b32d64f555fa118413186672Douglas Gregor // C++ [over.match.copy]p1: 4738ed878af7914df535b32d64f555fa118413186672Douglas Gregor // - When initializing a temporary to be bound to the first parameter 4739ed878af7914df535b32d64f555fa118413186672Douglas Gregor // of a constructor that takes a reference to possibly cv-qualified 4740ed878af7914df535b32d64f555fa118413186672Douglas Gregor // T as its first argument, called with a single argument in the 4741ed878af7914df535b32d64f555fa118413186672Douglas Gregor // context of direct-initialization, explicit conversion functions 4742ed878af7914df535b32d64f555fa118413186672Douglas Gregor // are also considered. 4743ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool AllowExplicitConv = Kind.AllowExplicit() && !Kind.isCopyInit() && 4744ed878af7914df535b32d64f555fa118413186672Douglas Gregor Args.size() == 1 && 4745ed878af7914df535b32d64f555fa118413186672Douglas Gregor Constructor->isCopyOrMoveConstructor(); 4746ed878af7914df535b32d64f555fa118413186672Douglas Gregor 474710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Determine the arguments required to actually perform the constructor 474810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // call. 47493fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer if (S.CompleteConstructorCall(Constructor, Args, 4750ed878af7914df535b32d64f555fa118413186672Douglas Gregor Loc, ConstructorArgs, 4751a4dc51b46861eb52626f89183da7610437baba93Richard Smith AllowExplicitConv, 4752a4dc51b46861eb52626f89183da7610437baba93Richard Smith IsListInitialization)) 475310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return ExprError(); 475410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 475510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 475610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Entity.getKind() == InitializedEntity::EK_Temporary && 4757188158db29f50443b6e412f2a40c800b2669c957Sebastian Redl (Kind.getKind() == InitializationKind::IK_DirectList || 4758188158db29f50443b6e412f2a40c800b2669c957Sebastian Redl (NumArgs != 1 && // FIXME: Hack to work around cast weirdness 4759188158db29f50443b6e412f2a40c800b2669c957Sebastian Redl (Kind.getKind() == InitializationKind::IK_Direct || 4760188158db29f50443b6e412f2a40c800b2669c957Sebastian Redl Kind.getKind() == InitializationKind::IK_Value)))) { 476110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // An explicitly-constructed temporary, e.g., X(1, 2). 47625f2987c11491edb186401d4e8eced275f0ea7c5eEli Friedman S.MarkFunctionReferenced(Loc, Constructor); 476310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.DiagnoseUseOfDecl(Constructor, Loc); 476410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 476510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 476610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (!TSInfo) 476710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc); 4768188158db29f50443b6e412f2a40c800b2669c957Sebastian Redl SourceRange ParenRange; 4769188158db29f50443b6e412f2a40c800b2669c957Sebastian Redl if (Kind.getKind() != InitializationKind::IK_DirectList) 4770188158db29f50443b6e412f2a40c800b2669c957Sebastian Redl ParenRange = Kind.getParenRange(); 477110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 4772c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith CurInit = S.Owned( 4773c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith new (S.Context) CXXTemporaryObjectExpr(S.Context, Constructor, 4774c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith TSInfo, ConstructorArgs, 4775c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith ParenRange, IsListInitialization, 4776c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith HadMultipleCandidates, 4777c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith ConstructorInitRequiresZeroInit)); 477810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } else { 477910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::ConstructionKind ConstructKind = 478010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::CK_Complete; 478110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 478210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Entity.getKind() == InitializedEntity::EK_Base) { 478310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind = Entity.getBaseSpecifier()->isVirtual() ? 478410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::CK_VirtualBase : 478510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::CK_NonVirtualBase; 478610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } else if (Entity.getKind() == InitializedEntity::EK_Delegating) { 478710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind = CXXConstructExpr::CK_Delegating; 478810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 478910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 479010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Only get the parenthesis range if it is a direct construction. 479110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl SourceRange parenRange = 479210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Kind.getKind() == InitializationKind::IK_Direct ? 479310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Kind.getParenRange() : SourceRange(); 479410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 479510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // If the entity allows NRVO, mark the construction as elidable 479610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // unconditionally. 479710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Entity.allowsNRVO()) 479810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 479910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Constructor, /*Elidable=*/true, 48003fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ConstructorArgs, 480110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl HadMultipleCandidates, 4802c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith IsListInitialization, 480310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructorInitRequiresZeroInit, 480410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind, 480510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl parenRange); 480610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl else 480710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 480810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Constructor, 48093fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ConstructorArgs, 481010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl HadMultipleCandidates, 4811c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith IsListInitialization, 481210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructorInitRequiresZeroInit, 481310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind, 481410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl parenRange); 481510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 481610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (CurInit.isInvalid()) 481710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return ExprError(); 481810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 481910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Only check access if all of that succeeded. 482010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.CheckConstructorAccess(Loc, Constructor, Entity, 482110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Step.Function.FoundDecl.getAccess()); 482210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc); 482310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 482410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (shouldBindAsTemporary(Entity)) 482510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 482610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 48273fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 482810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl} 482910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 483036d02af300a207242f0486b4255420d8be796b21Richard Smith/// Determine whether the specified InitializedEntity definitely has a lifetime 483136d02af300a207242f0486b4255420d8be796b21Richard Smith/// longer than the current full-expression. Conservatively returns false if 483236d02af300a207242f0486b4255420d8be796b21Richard Smith/// it's unclear. 483336d02af300a207242f0486b4255420d8be796b21Richard Smithstatic bool 483436d02af300a207242f0486b4255420d8be796b21Richard SmithInitializedEntityOutlivesFullExpression(const InitializedEntity &Entity) { 483536d02af300a207242f0486b4255420d8be796b21Richard Smith const InitializedEntity *Top = &Entity; 483636d02af300a207242f0486b4255420d8be796b21Richard Smith while (Top->getParent()) 483736d02af300a207242f0486b4255420d8be796b21Richard Smith Top = Top->getParent(); 483836d02af300a207242f0486b4255420d8be796b21Richard Smith 483936d02af300a207242f0486b4255420d8be796b21Richard Smith switch (Top->getKind()) { 484036d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Variable: 484136d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Result: 484236d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Exception: 484336d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Member: 484436d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_New: 484536d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Base: 484636d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Delegating: 484736d02af300a207242f0486b4255420d8be796b21Richard Smith return true; 484836d02af300a207242f0486b4255420d8be796b21Richard Smith 484936d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_ArrayElement: 485036d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_VectorElement: 485136d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_BlockElement: 485236d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_ComplexElement: 485336d02af300a207242f0486b4255420d8be796b21Richard Smith // Could not determine what the full initialization is. Assume it might not 485436d02af300a207242f0486b4255420d8be796b21Richard Smith // outlive the full-expression. 485536d02af300a207242f0486b4255420d8be796b21Richard Smith return false; 485636d02af300a207242f0486b4255420d8be796b21Richard Smith 485736d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Parameter: 485836d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_Temporary: 485936d02af300a207242f0486b4255420d8be796b21Richard Smith case InitializedEntity::EK_LambdaCapture: 486036d02af300a207242f0486b4255420d8be796b21Richard Smith // The entity being initialized might not outlive the full-expression. 486136d02af300a207242f0486b4255420d8be796b21Richard Smith return false; 486236d02af300a207242f0486b4255420d8be796b21Richard Smith } 486336d02af300a207242f0486b4255420d8be796b21Richard Smith 486436d02af300a207242f0486b4255420d8be796b21Richard Smith llvm_unreachable("unknown entity kind"); 486536d02af300a207242f0486b4255420d8be796b21Richard Smith} 486636d02af300a207242f0486b4255420d8be796b21Richard Smith 4867dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 486820093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::Perform(Sema &S, 486920093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 487020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 4871f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiExprArg Args, 4872d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType *ResultType) { 4873d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (Failed()) { 487420093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 48755354e77e60e82828c7c2361f5c688c2667ab59ccBenjamin Kramer Diagnose(S, Entity, Kind, Args.data(), NumArgs); 4876f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 487720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4878dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 48797491c499e826682e128a400038361ebcbde30eecSebastian Redl if (getKind() == DependentSequence) { 4880d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If the declaration is a non-dependent, incomplete array type 4881d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // that has an initializer, then its type will be completed once 4882d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // the initializer is instantiated. 4883d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (ResultType && !Entity.getType()->isDependentType() && 4884d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Args.size() == 1) { 4885d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DeclType = Entity.getType(); 4886d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (const IncompleteArrayType *ArrayT 4887d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getAsIncompleteArrayType(DeclType)) { 4888d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We don't currently have the ability to accurately 4889d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // compute the length of an initializer list without 4890d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // performing full type-checking of the initializer list 4891d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // (since we have to determine where braces are implicitly 4892d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // introduced and such). So, we fall back to making the array 4893d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // type a dependently-sized array type with no specified 4894d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // bound. 48953fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer if (isa<InitListExpr>((Expr *)Args[0])) { 4896d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor SourceRange Brackets; 4897d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor 4898d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Scavange the location of the brackets from the entity, if we can. 4899d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (DeclaratorDecl *DD = Entity.getDecl()) { 4900d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) { 4901d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor TypeLoc TL = TInfo->getTypeLoc(); 490239e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie if (IncompleteArrayTypeLoc ArrayLoc = 490339e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie TL.getAs<IncompleteArrayTypeLoc>()) 490439e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie Brackets = ArrayLoc.getBracketsRange(); 4905d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor } 4906d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4907d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4908d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor *ResultType 4909d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getDependentSizedArrayType(ArrayT->getElementType(), 4910d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor /*NumElts=*/0, 4911d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getSizeModifier(), 4912d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getIndexTypeCVRQualifiers(), 4913d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Brackets); 4914d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4915d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4916d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4917d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 49185b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (Kind.getKind() == InitializationKind::IK_Direct && 49195b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl !Kind.isExplicitCast()) { 49205b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl // Rebuild the ParenListExpr. 49215b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl SourceRange ParenRange = Kind.getParenRange(); 49225b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl return S.ActOnParenListExpr(ParenRange.getBegin(), ParenRange.getEnd(), 49233fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Args); 49245b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl } 49250d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek assert(Kind.getKind() == InitializationKind::IK_Copy || 4926a9b55a499a8b5ae0c4b373f751ef62af74ec494eDouglas Gregor Kind.isExplicitCast() || 4927a9b55a499a8b5ae0c4b373f751ef62af74ec494eDouglas Gregor Kind.getKind() == InitializationKind::IK_DirectList); 49283fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return ExprResult(Args[0]); 492920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 493020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 49317491c499e826682e128a400038361ebcbde30eecSebastian Redl // No steps means no initialization. 49327491c499e826682e128a400038361ebcbde30eecSebastian Redl if (Steps.empty()) 493399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return S.Owned((Expr *)0); 4934dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 493580ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (S.getLangOpts().CPlusPlus11 && Entity.getType()->isReferenceType() && 49363fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Args.size() == 1 && isa<InitListExpr>(Args[0]) && 493703544fccd1782418c1bf2528111683e18f43b913Richard Smith Entity.getKind() != InitializedEntity::EK_Parameter) { 493803544fccd1782418c1bf2528111683e18f43b913Richard Smith // Produce a C++98 compatibility warning if we are initializing a reference 493903544fccd1782418c1bf2528111683e18f43b913Richard Smith // from an initializer list. For parameters, we produce a better warning 494003544fccd1782418c1bf2528111683e18f43b913Richard Smith // elsewhere. 49413fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Expr *Init = Args[0]; 494203544fccd1782418c1bf2528111683e18f43b913Richard Smith S.Diag(Init->getLocStart(), diag::warn_cxx98_compat_reference_list_init) 494303544fccd1782418c1bf2528111683e18f43b913Richard Smith << Init->getSourceRange(); 494436d02af300a207242f0486b4255420d8be796b21Richard Smith } 494536d02af300a207242f0486b4255420d8be796b21Richard Smith 494636d02af300a207242f0486b4255420d8be796b21Richard Smith // Diagnose cases where we initialize a pointer to an array temporary, and the 494736d02af300a207242f0486b4255420d8be796b21Richard Smith // pointer obviously outlives the temporary. 49483fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer if (Args.size() == 1 && Args[0]->getType()->isArrayType() && 494936d02af300a207242f0486b4255420d8be796b21Richard Smith Entity.getType()->isPointerType() && 495036d02af300a207242f0486b4255420d8be796b21Richard Smith InitializedEntityOutlivesFullExpression(Entity)) { 49513fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Expr *Init = Args[0]; 495236d02af300a207242f0486b4255420d8be796b21Richard Smith Expr::LValueClassification Kind = Init->ClassifyLValue(S.Context); 495336d02af300a207242f0486b4255420d8be796b21Richard Smith if (Kind == Expr::LV_ClassTemporary || Kind == Expr::LV_ArrayTemporary) 495436d02af300a207242f0486b4255420d8be796b21Richard Smith S.Diag(Init->getLocStart(), diag::warn_temporary_array_to_pointer_decay) 495536d02af300a207242f0486b4255420d8be796b21Richard Smith << Init->getSourceRange(); 495603544fccd1782418c1bf2528111683e18f43b913Richard Smith } 495703544fccd1782418c1bf2528111683e18f43b913Richard Smith 4958d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType().getNonReferenceType(); 4959d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor // FIXME: Ugly hack around the fact that Entity.getType() is not 4960a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // the same as Entity.getDecl()->getType() in cases involving type merging, 4961a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // and we want latter when it makes sense. 4962d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (ResultType) 4963a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() : 4964d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(); 496520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 496660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult CurInit = S.Owned((Expr *)0); 4967dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4968dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // For initialization steps that start with a single initializer, 496999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // grab the only argument out the Args and place it into the "current" 497099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // initializer. 497199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (Steps.front().Kind) { 497218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ResolveAddressOfOverloadedFunction: 497318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseRValue: 4974906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 497518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseLValue: 497618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReference: 497718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReferenceToTemporary: 4978523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 497918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_UserConversion: 498018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionLValue: 4981906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 498218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionRValue: 498318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConversionSequence: 498418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ListInitialization: 498513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 498613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 498718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 4988cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 4989cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ObjCObjectConversion: 4990f85e193739c953358c865005855253af4f68a497John McCall case SK_ArrayInit: 49910f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith case SK_ParenthesizedArrayInit: 4992f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 4993f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 49942b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_ProduceObjCObject: 4995e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case SK_StdInitializerList: 499621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case SK_OCLSamplerInit: 4997e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case SK_OCLZeroEvent: { 499818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(Args.size() == 1); 49993fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = Args[0]; 5000429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (!CurInit.get()) return ExprError(); 500118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 5002f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 5003dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 500418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConstructorInitialization: 5005f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith case SK_ListConstructorCall: 500618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ZeroInitialization: 500718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 500820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5009dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5010dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Walk through the computed steps for the initialization sequence, 501120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // performing the specified conversions along the way. 501216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool ConstructorInitRequiresZeroInit = false; 501320093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (step_iterator Step = step_begin(), StepEnd = step_end(); 501420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) { 501520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 5016f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5017dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5018429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType(); 5019dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 502020093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Step->Kind) { 502120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 5022dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Overload resolution determined which function invoke; update the 502320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer to reflect that choice. 5024429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckAddressOfMemberAccess(CurInit.get(), Step->Function.FoundDecl); 5025b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()); 50263fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = S.FixOverloadedFunctionReference(CurInit, 50276bb8017bb9e828d118e15e59d71c66bba323c364John McCall Step->Function.FoundDecl, 50289aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.Function); 502920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5030dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 503120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 5032906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 503320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: { 503420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a derived-to-base cast that produces either an rvalue or an 503520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue. Perform that cast. 5036dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5037f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 50385cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 503920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Casts to inaccessible base classes are allowed with C-style casts. 504020093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast(); 504120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckDerivedToBaseConversion(SourceType, Step->Type, 5042429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getLocStart(), 5043429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getSourceRange(), 50445cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson &BasePath, IgnoreBaseAccess)) 5045f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5046dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 50476fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (S.BasePathInvolvesVirtualBase(BasePath)) { 50486fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor QualType T = SourceType; 50496fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) 50506fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor T = Pointer->getPointeeType(); 50516fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const RecordType *RecordTy = T->getAs<RecordType>()) 5052429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.MarkVTableUsed(CurInit.get()->getLocStart(), 50536fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor cast<CXXRecordDecl>(RecordTy->getDecl())); 50546fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor } 50556fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 50565baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 5057906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_CastDerivedToBaseLValue ? 50585baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 5059906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_CastDerivedToBaseXValue ? 50605baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 50615baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 5062f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 5063f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Step->Type, 50642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_DerivedToBase, 50655baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall CurInit.get(), 50665baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall &BasePath, VK)); 506720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 506820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5069dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 507020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 5071429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (FieldDecl *BitField = CurInit.get()->getBitField()) { 507220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // References cannot bind to bit fields (C++ [dcl.init.ref]p5). 507320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield) 5074d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor << Entity.getType().isVolatileQualified() 507520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << BitField->getDeclName() 5076429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 507720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(BitField->getLocation(), diag::note_bitfield_decl); 5078f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 507920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5080a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 5081429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInit.get()->refersToVectorElement()) { 508241593e3b7da967b52bc3c7f488b8752dee63f38eJohn McCall // References cannot bind to vector elements. 5083093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element) 5084093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << Entity.getType().isVolatileQualified() 5085429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 5086a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 5087f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5088093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson } 5089dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 509020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Reference binding does not have any corresponding ASTs. 509120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 509220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 5093429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType)) 5094f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 50953aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 509620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 50973aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 509820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 509920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 5100429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType)) 5101f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 510220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 510303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // Materialize the temporary into memory. 5104b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor CurInit = new (S.Context) MaterializeTemporaryExpr( 5105b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor Entity.getType().getNonReferenceType(), 5106b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor CurInit.get(), 510703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor Entity.getType()->isLValueReferenceType()); 5108d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor 5109d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor // If we're binding to an Objective-C object that has lifetime, we 5110d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor // need cleanups. 51114e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().ObjCAutoRefCount && 5112d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor CurInit.get()->getType()->isObjCLifetimeType()) 5113d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor S.ExprNeedsCleanups = true; 5114d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor 511520093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5116dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5117523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 51183fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = CopyObject(S, Step->Type, Entity, CurInit, 5119523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor /*IsExtraneousCopy=*/true); 5120523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 5121523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 512220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: { 512320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a user-defined conversion that invokes either a constructor 512420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // or a conversion function. 5125daa8e4e888758d55a7a759dd4a91b83921cef222John McCall CastKind CastKind; 512618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy = false; 51279aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionDecl *Fn = Step->Function.Function; 51289aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundFn = Step->Function.FoundDecl; 51297cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates = Step->Function.HadMultipleCandidates; 51304154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor bool CreatedObject = false; 5131b13b737a2450167c82e148590e8019b839ce6b98John McCall if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) { 513220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the selected constructor. 51334e28d9e2ba9ce237549b45cfd4136ec6536d1325Benjamin Kramer SmallVector<Expr*, 8> ConstructorArgs; 5134429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley SourceLocation Loc = CurInit.get()->getLocStart(); 513520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 5136b13b737a2450167c82e148590e8019b839ce6b98John McCall 513720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the arguments required to actually perform the constructor 513820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // call. 5139429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley Expr *Arg = CurInit.get(); 514020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CompleteConstructorCall(Constructor, 5141429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley MultiExprArg(&Arg, 1), 514220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Loc, ConstructorArgs)) 5143f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5144dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5145f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // Build an expression that constructs a temporary. 5146dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInit = S.BuildCXXConstructExpr(Loc, Step->Type, Constructor, 51473fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ConstructorArgs, 51487cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 5149c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith /*ListInit*/ false, 51507a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 5151428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 5152428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 515320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 5154f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5155b13b737a2450167c82e148590e8019b839ce6b98John McCall 51569a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Kind.getLocation(), Constructor, Entity, 51579aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn.getAccess()); 5158b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 5159dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 51602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_ConstructorConversion; 516118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType Class = S.Context.getTypeDeclType(Constructor->getParent()); 516218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.Context.hasSameUnqualifiedType(SourceType, Class) || 516318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.IsDerivedFrom(SourceType, Class)) 516418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor IsCopy = true; 5165dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 51664154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = true; 516720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 516820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the conversion function. 5169b13b737a2450167c82e148590e8019b839ce6b98John McCall CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn); 5170429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), 0, 51719aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn); 5172b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 5173dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5174dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Should we move this initialization into a separate 517520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // derived-to-base conversion? I believe the answer is "no", because 517620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // we don't want to turn off access control here for c-style casts. 5177429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = 5178429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.PerformObjectArgumentInitialization(CurInit.take(), /*Qualifier=*/0, 5179429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley FoundFn, Conversion); 5180429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if(CurInitExprRes.isInvalid()) 5181f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 51823fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = CurInitExprRes; 5183dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 518420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the actual call to the conversion function. 51857cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion, 51867cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates); 518720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid() || !CurInit.get()) 5188f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5189dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 51902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_UserDefinedConversion; 5191dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 51924154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = Conversion->getResultType()->isRecordType(); 519320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5194dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 51953b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl bool RequiresCopy = !IsCopy && !isReferenceBinding(Steps.back()); 5196960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara bool MaybeBindToTemp = RequiresCopy || shouldBindAsTemporary(Entity); 5197960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara 5198960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara if (!MaybeBindToTemp && CreatedObject && shouldDestroyTemporary(Entity)) { 5199429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType T = CurInit.get()->getType(); 52004154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) { 5201dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXDestructorDecl *Destructor 5202db89f289a22897f1031c92f3e49f7a9ba7bae61eDouglas Gregor = S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl())); 5203429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckDestructorAccess(CurInit.get()->getLocStart(), Destructor, 52044154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor S.PDiag(diag::err_access_dtor_temp) << T); 52055f2987c11491edb186401d4e8eced275f0ea7c5eEli Friedman S.MarkFunctionReferenced(CurInit.get()->getLocStart(), Destructor); 5206429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getLocStart()); 52074154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 52084154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 5209dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5210f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 5211429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getType(), 5212429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CastKind, CurInit.get(), 0, 5213104be6fc8de206c9b79b241b36ebaf9407b3be08Eli Friedman CurInit.get()->getValueKind())); 5214960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara if (MaybeBindToTemp) 5215960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 52162f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (RequiresCopy) 5217523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor CurInit = CopyObject(S, Entity.getType().getNonReferenceType(), Entity, 52183fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit, /*IsExtraneousCopy=*/false); 521920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 522020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5221906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 522220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 5223906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 5224906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionRValue: { 522520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform a qualification conversion; these can never go wrong. 52265baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 5227906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_QualificationConversionLValue ? 52285baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 5229906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_QualificationConversionXValue ? 52305baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 52315baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 5232429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = S.ImpCastExprToType(CurInit.take(), Step->Type, CK_NoOp, VK); 523320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5234906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 5235906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 5236f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor case SK_ConversionSequence: { 5237f85e193739c953358c865005855253af4f68a497John McCall Sema::CheckedConversionKind CCK 5238f85e193739c953358c865005855253af4f68a497John McCall = Kind.isCStyleCast()? Sema::CCK_CStyleCast 5239f85e193739c953358c865005855253af4f68a497John McCall : Kind.isFunctionalCast()? Sema::CCK_FunctionalCast 5240c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith : Kind.isExplicitCast()? Sema::CCK_OtherCast 5241f85e193739c953358c865005855253af4f68a497John McCall : Sema::CCK_ImplicitConversion; 5242429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = 5243429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.PerformImplicitConversion(CurInit.get(), Step->Type, *Step->ICS, 5244f85e193739c953358c865005855253af4f68a497John McCall getAssignmentAction(Entity), CCK); 5245429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInitExprRes.isInvalid()) 5246f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 52473fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = CurInitExprRes; 524820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5249f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor } 5250dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5251d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: { 5252429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley InitListExpr *InitList = cast<InitListExpr>(CurInit.get()); 525313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Hack: We must pass *ResultType if available in order to set the type 525413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // of arrays, e.g. in 'int ar[] = {1, 2, 3};'. 525513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // But in 'const X &x = {1, 2, 3};' we're supposed to initialize a 525613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // temporary, not a reference, so we should pass Ty. 525713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Worst case: 'const int (&arref)[] = {1, 2, 3};'. 525813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Since this step is never used for a reference directly, we explicitly 525913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // unwrap references here and rewrap them afterwards. 526013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // We also need to create a InitializeTemporary entity for this. 526113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType Ty = ResultType ? ResultType->getNonReferenceType() : Step->Type; 5262cbf82092cdb9e3a2e8528384c878f2084a14981cSebastian Redl bool IsTemporary = Entity.getType()->isReferenceType(); 526313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(Ty); 5264802e22682c17c4a9df3f747abd224db38e382e39Richard Smith InitializedEntity InitEntity = IsTemporary ? TempEntity : Entity; 5265802e22682c17c4a9df3f747abd224db38e382e39Richard Smith InitListChecker PerformInitList(S, InitEntity, 526613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitList, Ty, /*VerifyOnly=*/false, 5267168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Kind.getKind() != InitializationKind::IK_DirectList || 526880ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith !S.getLangOpts().CPlusPlus11); 526914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (PerformInitList.HadError()) 5270f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5271d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 527213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResultType) { 527313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if ((*ResultType)->isRValueReferenceType()) 527413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Ty = S.Context.getRValueReferenceType(Ty); 527513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl else if ((*ResultType)->isLValueReferenceType()) 527613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Ty = S.Context.getLValueReferenceType(Ty, 527713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl (*ResultType)->getAs<LValueReferenceType>()->isSpelledAsLValue()); 527813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl *ResultType = Ty; 527913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 528013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 528113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *StructuredInitList = 528213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl PerformInitList.getFullyStructuredList(); 5283d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit.release(); 5284802e22682c17c4a9df3f747abd224db38e382e39Richard Smith CurInit = shouldBindAsTemporary(InitEntity) 5285802e22682c17c4a9df3f747abd224db38e382e39Richard Smith ? S.MaybeBindToTemporary(StructuredInitList) 5286802e22682c17c4a9df3f747abd224db38e382e39Richard Smith : S.Owned(StructuredInitList); 5287d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5288d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 528951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 529010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl case SK_ListConstructorCall: { 5291168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // When an initializer list is passed for a parameter of type "reference 5292168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // to object", we don't get an EK_Temporary entity, but instead an 5293168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // EK_Parameter entity with reference type. 5294bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // FIXME: This is a hack. What we really should do is create a user 5295bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // conversion step for this case, but this makes it considerably more 5296bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // complicated. For now, this will do. 5297168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary( 5298168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Entity.getType().getNonReferenceType()); 5299168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool UseTemporary = Entity.getType()->isReferenceType(); 5300f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith assert(Args.size() == 1 && "expected a single argument for list init"); 53013fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer InitListExpr *InitList = cast<InitListExpr>(Args[0]); 530203544fccd1782418c1bf2528111683e18f43b913Richard Smith S.Diag(InitList->getExprLoc(), diag::warn_cxx98_compat_ctor_list_init) 530303544fccd1782418c1bf2528111683e18f43b913Richard Smith << InitList->getSourceRange(); 530410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl MultiExprArg Arg(InitList->getInits(), InitList->getNumInits()); 5305168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl CurInit = PerformConstructorInitialization(S, UseTemporary ? TempEntity : 5306168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Entity, 53073fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Kind, Arg, *Step, 5308c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith ConstructorInitRequiresZeroInit, 5309c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith /*IsListInitialization*/ true); 531010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl break; 531110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 53128713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 531313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 531413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl CurInit = S.Owned(cast<InitListExpr>(CurInit.take())->getInit(0)); 531513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 531613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 531713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: { 531813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *E = CurInit.take(); 531913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *Syntactic = Step->WrappingSyntacticList; 532013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *ILE = new (S.Context) InitListExpr(S.Context, 53213b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer Syntactic->getLBraceLoc(), E, Syntactic->getRBraceLoc()); 532213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setSyntacticForm(Syntactic); 532313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setType(E->getType()); 532413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setValueKind(E->getValueKind()); 532513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl CurInit = S.Owned(ILE); 532613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 532713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 532813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 5329bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl case SK_ConstructorInitialization: { 5330bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // When an initializer list is passed for a parameter of type "reference 5331bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // to object", we don't get an EK_Temporary entity, but instead an 5332bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // EK_Parameter entity with reference type. 5333bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // FIXME: This is a hack. What we really should do is create a user 5334bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // conversion step for this case, but this makes it considerably more 5335bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // complicated. For now, this will do. 5336bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary( 5337bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl Entity.getType().getNonReferenceType()); 5338bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl bool UseTemporary = Entity.getType()->isReferenceType(); 5339bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl CurInit = PerformConstructorInitialization(S, UseTemporary ? TempEntity 5340bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl : Entity, 53413fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer Kind, Args, *Step, 5342c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith ConstructorInitRequiresZeroInit, 5343c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith /*IsListInitialization*/ false); 534451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 5345bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl } 5346dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 534771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: { 534816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor step_iterator NextStep = Step; 534916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ++NextStep; 5350dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (NextStep != StepEnd && 5351f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith (NextStep->Kind == SK_ConstructorInitialization || 5352f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith NextStep->Kind == SK_ListConstructorCall)) { 535316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // The need for zero-initialization is recorded directly into 535416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // the call to the object's constructor within the next step. 535516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ConstructorInitRequiresZeroInit = true; 535616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else if (Kind.getKind() == InitializationKind::IK_Value && 53574e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie S.getLangOpts().CPlusPlus && 535816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !Kind.isImplicitValueInit()) { 5359ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 5360ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!TSInfo) 5361dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TSInfo = S.Context.getTrivialTypeSourceInfo(Step->Type, 5362ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Kind.getRange().getBegin()); 5363ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 5364ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CurInit = S.Owned(new (S.Context) CXXScalarValueInitExpr( 5365ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo->getType().getNonLValueExprType(S.Context), 5366ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo, 536771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getEnd())); 536816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else { 536971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitValueInitExpr(Step->Type)); 537016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 537171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor break; 537271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 537318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 537418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: { 5375429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType SourceType = CurInit.get()->getType(); 53763fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ExprResult Result = CurInit; 537718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::AssignConvertType ConvTy = 5378429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckSingleAssignmentConstraints(Step->Type, Result); 5379429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Result.isInvalid()) 5380429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 53813fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = Result; 5382aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 5383aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor // If this is a call, allow conversion to a transparent union. 53843fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer ExprResult CurInitExprRes = CurInit; 5385aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor if (ConvTy != Sema::Compatible && 5386aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor Entity.getKind() == InitializedEntity::EK_Parameter && 5387429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExprRes) 5388aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor == Sema::Compatible) 5389aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor ConvTy = Sema::Compatible; 5390429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInitExprRes.isInvalid()) 5391429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 53923fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer CurInit = CurInitExprRes; 5393aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 5394a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor bool Complained; 539518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(), 539618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step->Type, SourceType, 5397429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get(), 5398a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor getAssignmentAction(Entity), 5399a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor &Complained)) { 5400a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 5401f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5402a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } else if (Complained) 5403a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 540418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 540518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 5406cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 5407cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: { 5408cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman QualType Ty = Step->Type; 5409429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CheckStringInit(CurInit.get(), ResultType ? *ResultType : Ty, 5410fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall S.Context.getAsArrayType(Ty), S); 5411cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman break; 5412cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 5413569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 5414569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 5415429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = S.ImpCastExprToType(CurInit.take(), Step->Type, 54162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_ObjCObjectLValueCast, 5417c1c0dfb376b829b94d4c61e9f358ce23e6aa3169Eli Friedman CurInit.get()->getValueKind()); 5418569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 5419cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5420cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 5421cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Okay: we checked everything before creating this step. Note that 5422cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // this is a GNU extension. 5423cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Diag(Kind.getLocation(), diag::ext_array_init_copy) 5424429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << Step->Type << CurInit.get()->getType() 5425429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 5426cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5427cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // If the destination type is an incomplete array type, update the 5428cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // type accordingly. 5429cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (ResultType) { 5430cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const IncompleteArrayType *IncompleteDest 5431cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor = S.Context.getAsIncompleteArrayType(Step->Type)) { 5432cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const ConstantArrayType *ConstantSource 5433429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley = S.Context.getAsConstantArrayType(CurInit.get()->getType())) { 5434cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor *ResultType = S.Context.getConstantArrayType( 5435cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor IncompleteDest->getElementType(), 5436cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ConstantSource->getSize(), 5437cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ArrayType::Normal, 0); 5438cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 5439cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 5440cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 5441f85e193739c953358c865005855253af4f68a497John McCall break; 5442cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 54430f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith case SK_ParenthesizedArrayInit: 54440f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith // Okay: we checked everything before creating this step. Note that 54450f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith // this is a GNU extension. 54460f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith S.Diag(Kind.getLocation(), diag::ext_array_init_parens) 54470f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith << CurInit.get()->getSourceRange(); 54480f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith break; 54490f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith 5450f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 5451f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 5452f85e193739c953358c865005855253af4f68a497John McCall checkIndirectCopyRestoreSource(S, CurInit.get()); 5453f85e193739c953358c865005855253af4f68a497John McCall CurInit = S.Owned(new (S.Context) 5454f85e193739c953358c865005855253af4f68a497John McCall ObjCIndirectCopyRestoreExpr(CurInit.take(), Step->Type, 5455f85e193739c953358c865005855253af4f68a497John McCall Step->Kind == SK_PassByIndirectCopyRestore)); 5456f85e193739c953358c865005855253af4f68a497John McCall break; 5457f85e193739c953358c865005855253af4f68a497John McCall 5458f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 5459f85e193739c953358c865005855253af4f68a497John McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, Step->Type, 546033e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall CK_ARCProduceObject, 5461f85e193739c953358c865005855253af4f68a497John McCall CurInit.take(), 0, VK_RValue)); 5462cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 54632b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 54642b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_StdInitializerList: { 54652b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl QualType Dest = Step->Type; 54662b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl QualType E; 54672b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl bool Success = S.isStdInitializerList(Dest, &E); 54682b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl (void)Success; 54692b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl assert(Success && "Destination type changed?"); 54702835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 54712835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl // If the element type has a destructor, check it. 54722835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl if (CXXRecordDecl *RD = E->getAsCXXRecordDecl()) { 54732835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl if (!RD->hasIrrelevantDestructor()) { 54742835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl if (CXXDestructorDecl *Destructor = S.LookupDestructor(RD)) { 54752835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl S.MarkFunctionReferenced(Kind.getLocation(), Destructor); 54762835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl S.CheckDestructorAccess(Kind.getLocation(), Destructor, 54772835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl S.PDiag(diag::err_access_dtor_temp) << E); 54782835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl S.DiagnoseUseOfDecl(Destructor, Kind.getLocation()); 54792835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl } 54802835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl } 54812835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl } 54822835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 54832b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitListExpr *ILE = cast<InitListExpr>(CurInit.take()); 548403544fccd1782418c1bf2528111683e18f43b913Richard Smith S.Diag(ILE->getExprLoc(), diag::warn_cxx98_compat_initializer_list_init) 548503544fccd1782418c1bf2528111683e18f43b913Richard Smith << ILE->getSourceRange(); 54862b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl unsigned NumInits = ILE->getNumInits(); 54872b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl SmallVector<Expr*, 16> Converted(NumInits); 54882b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializedEntity HiddenArray = InitializedEntity::InitializeTemporary( 54892b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Context.getConstantArrayType(E, 54902b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()), 54912b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl NumInits), 54922b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ArrayType::Normal, 0)); 54932b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializedEntity Element =InitializedEntity::InitializeElement(S.Context, 54942b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 0, HiddenArray); 54952b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl for (unsigned i = 0; i < NumInits; ++i) { 54962b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Element.setElementIndex(i); 54972b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ExprResult Init = S.Owned(ILE->getInit(i)); 5498a4dc51b46861eb52626f89183da7610437baba93Richard Smith ExprResult Res = S.PerformCopyInitialization( 5499a4dc51b46861eb52626f89183da7610437baba93Richard Smith Element, Init.get()->getExprLoc(), Init, 5500a4dc51b46861eb52626f89183da7610437baba93Richard Smith /*TopLevelOfInitList=*/ true); 55012b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl assert(!Res.isInvalid() && "Result changed since try phase."); 55022b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Converted[i] = Res.take(); 55032b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 55042b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitListExpr *Semantic = new (S.Context) 55052b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitListExpr(S.Context, ILE->getLBraceLoc(), 55063b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer Converted, ILE->getRBraceLoc()); 55072b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Semantic->setSyntacticForm(ILE); 55082b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Semantic->setType(Dest); 550932cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl Semantic->setInitializesStdInitializerList(); 55102b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl CurInit = S.Owned(Semantic); 55112b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl break; 55122b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 551321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case SK_OCLSamplerInit: { 551421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei assert(Step->Type->isSamplerT() && 551521f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei "Sampler initialization on non sampler type."); 551621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 551721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei QualType SourceType = CurInit.get()->getType(); 551821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei InitializedEntity::EntityKind EntityKind = Entity.getKind(); 551921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 552021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei if (EntityKind == InitializedEntity::EK_Parameter) { 552121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei if (!SourceType->isSamplerT()) 552221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei S.Diag(Kind.getLocation(), diag::err_sampler_argument_required) 552321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei << SourceType; 552421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei } else if (EntityKind != InitializedEntity::EK_Variable) { 552521f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei llvm_unreachable("Invalid EntityKind!"); 552621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei } 552721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 552821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei break; 552921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei } 5530e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case SK_OCLZeroEvent: { 5531e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei assert(Step->Type->isEventT() && 5532e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei "Event initialization on non event type."); 5533e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 5534e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei CurInit = S.ImpCastExprToType(CurInit.take(), Step->Type, 5535e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei CK_ZeroToOCLEvent, 5536e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei CurInit.get()->getValueKind()); 5537e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei break; 5538e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei } 553920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 554020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 554115d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall 554215d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall // Diagnose non-fatal problems with the completed initialization. 554315d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall if (Entity.getKind() == InitializedEntity::EK_Member && 554415d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl())->isBitField()) 554515d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall S.CheckBitFieldInitialization(Kind.getLocation(), 554615d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl()), 554715d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall CurInit.get()); 5548dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 55493fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer return CurInit; 555020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 555120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 5552d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith/// Somewhere within T there is an uninitialized reference subobject. 5553d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith/// Dig it out and diagnose it. 5554a574c8909748fc0d2fd723a48334d6d2c72c8227Benjamin Kramerstatic bool DiagnoseUninitializedReference(Sema &S, SourceLocation Loc, 5555a574c8909748fc0d2fd723a48334d6d2c72c8227Benjamin Kramer QualType T) { 5556d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (T->isReferenceType()) { 5557d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith S.Diag(Loc, diag::err_reference_without_init) 5558d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith << T.getNonReferenceType(); 5559d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return true; 5560d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 5561d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 5562d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl(); 5563d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (!RD || !RD->hasUninitializedReferenceMember()) 5564d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return false; 5565d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 5566d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith for (CXXRecordDecl::field_iterator FI = RD->field_begin(), 5567d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith FE = RD->field_end(); FI != FE; ++FI) { 5568d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (FI->isUnnamedBitfield()) 5569d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith continue; 5570d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 5571d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (DiagnoseUninitializedReference(S, FI->getLocation(), FI->getType())) { 5572d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith S.Diag(Loc, diag::note_value_initialization_here) << RD; 5573d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return true; 5574d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 5575d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 5576d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 5577d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith for (CXXRecordDecl::base_class_iterator BI = RD->bases_begin(), 5578d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith BE = RD->bases_end(); 5579d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith BI != BE; ++BI) { 5580d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (DiagnoseUninitializedReference(S, BI->getLocStart(), BI->getType())) { 5581d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith S.Diag(Loc, diag::note_value_initialization_here) << RD; 5582d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return true; 5583d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 5584d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } 5585d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 5586d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith return false; 5587d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith} 5588d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 5589d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 559020093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 559120093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Diagnose initialization failures 559220093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 5593dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumibool InitializationSequence::Diagnose(Sema &S, 559420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 559520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 559620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs) { 5597d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (!Failed()) 559820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return false; 5599dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5600d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 560120093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Failure) { 560220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_TooManyInitsForReference: 56039db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // FIXME: Customize for the initialized entity? 5604d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (NumArgs == 0) { 5605d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // Dig out the reference subobject which is uninitialized and diagnose it. 5606d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // If this is value-initialization, this could be nested some way within 5607d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith // the target type. 5608d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith assert(Kind.getKind() == InitializationKind::IK_Value || 5609d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith DestType->isReferenceType()); 5610d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith bool Diagnosed = 5611d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith DiagnoseUninitializedReference(S, Kind.getLocation(), DestType); 5612d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith assert(Diagnosed && "couldn't find uninitialized reference to diagnose"); 5613d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith (void)Diagnosed; 5614d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith } else // FIXME: diagnostic below could be better! 56159db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits) 56169db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 561720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5618dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 561920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitList: 562020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 562120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) 562220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Failure == FK_ArrayNeedsInitListOrStringLiteral); 562320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5624dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5625cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 5626cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 5627cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Diag(Kind.getLocation(), 5628cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor (Failure == FK_ArrayTypeMismatch 5629cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ? diag::err_array_init_different_type 5630cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor : diag::err_array_init_non_constant_array)) 5631cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << DestType.getNonReferenceType() 5632cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << Args[0]->getType() 5633cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << Args[0]->getSourceRange(); 5634cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 5635cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 563673076431605556fdbf28d287d084a73a24a8b8d4John McCall case FK_VariableLengthArrayHasInitializer: 563773076431605556fdbf28d287d084a73a24a8b8d4John McCall S.Diag(Kind.getLocation(), diag::err_variable_object_no_init) 563873076431605556fdbf28d287d084a73a24a8b8d4John McCall << Args[0]->getSourceRange(); 563973076431605556fdbf28d287d084a73a24a8b8d4John McCall break; 564073076431605556fdbf28d287d084a73a24a8b8d4John McCall 56416bb8017bb9e828d118e15e59d71c66bba323c364John McCall case FK_AddressOfOverloadFailed: { 56426bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found; 5643dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.ResolveAddressOfOverloadedFunction(Args[0], 564420093b4bf698f292c664676987541d5103b65b15Douglas Gregor DestType.getNonReferenceType(), 56456bb8017bb9e828d118e15e59d71c66bba323c364John McCall true, 56466bb8017bb9e828d118e15e59d71c66bba323c364John McCall Found); 564720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 56486bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 5649dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 565020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitOverloadFailed: 56514a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor case FK_UserConversionOverloadFailed: 565220093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (FailedOverloadResult) { 565320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Ambiguous: 565418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Failure == FK_UserConversionOverloadFailed) 565518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_ambiguous_condition) 565618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getType() << DestType 565718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 565818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 565918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_ref_init_ambiguous) 566018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << DestType << Args[0]->getType() 566118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 566218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 566313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, 566413a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles llvm::makeArrayRef(Args, NumArgs)); 566520093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5666dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 566720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_No_Viable_Function: 566820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition) 566920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 567020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 567113a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, 567213a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles llvm::makeArrayRef(Args, NumArgs)); 567320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5674dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 567520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Deleted: { 567620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function) 567720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 567820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 567920093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 5680120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 56818fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best, 56828fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor true); 568320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Ovl == OR_Deleted) { 56846c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith S.NoteDeletedFunction(Best->Function); 568520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 56869f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Inconsistent overload resolution?"); 568720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 568820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 568920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5690dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 569120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Success: 56929f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Conversion did not fail!"); 569320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 569420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5695dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 569620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 569713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (isa<InitListExpr>(Args[0])) { 569813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Diag(Kind.getLocation(), 569913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl diag::err_lvalue_reference_bind_to_initlist) 570013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << DestType.getNonReferenceType().isVolatileQualified() 570113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << DestType.getNonReferenceType() 570213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << Args[0]->getSourceRange(); 570313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 570413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 570513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Intentional fallthrough 570613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 570720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 5708dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Kind.getLocation(), 570920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Failure == FK_NonConstLValueReferenceBindingToTemporary 571020093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? diag::err_lvalue_reference_bind_to_temporary 571120093b4bf698f292c664676987541d5103b65b15Douglas Gregor : diag::err_lvalue_reference_bind_to_unrelated) 5712ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor << DestType.getNonReferenceType().isVolatileQualified() 571320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 571420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 571520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 571620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5717dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 571820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_RValueReferenceBindingToLValue: 571920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref) 5720fb5d7efc279335bde2cdc0a73da525d6b28201e9Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getType() 572120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 572220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5723dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 572420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitDropsQualifiers: 572520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) 572620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 572720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 572820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 572920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5730dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 573120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitFailed: 573220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_failed) 573320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 57347eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 573520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 573620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 5737926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor if (DestType.getNonReferenceType()->isObjCObjectPointerType() && 5738926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor Args[0]->getType()->isObjCObjectPointerType()) 5739926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor S.EmitRelatedResultTypeNote(Args[0]); 574020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5741dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 57421be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor case FK_ConversionFailed: { 57431be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor QualType FromType = Args[0]->getType(); 57446efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed) 574518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << (int)Entity.getKind() 574620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType 57477eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 57481be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor << FromType 574920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 57506efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu S.HandleFunctionTypeMismatch(PDiag, FromType, DestType); 57516efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu S.Diag(Kind.getLocation(), PDiag); 5752926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor if (DestType.getNonReferenceType()->isObjCObjectPointerType() && 5753926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor Args[0]->getType()->isObjCObjectPointerType()) 5754926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor S.EmitRelatedResultTypeNote(Args[0]); 5755d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 57561be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor } 5757429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 5758429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 5759429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley // No-op. This error has already been reported. 5760429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley break; 5761429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 5762d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_TooManyInitsForScalar: { 576399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceRange R; 576499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 576599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (InitListExpr *InitList = dyn_cast<InitListExpr>(Args[0])) 576619311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R = SourceRange(InitList->getInit(0)->getLocEnd(), 576799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitList->getLocEnd()); 5768dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi else 576919311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R = SourceRange(Args[0]->getLocEnd(), Args[NumArgs - 1]->getLocEnd()); 5770d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 577119311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R.setBegin(S.PP.getLocForEndOfToken(R.getBegin())); 577219311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor if (Kind.isCStyleOrFunctionalCast()) 577319311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg) 577419311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << R; 577519311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor else 577619311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_excess_initializers) 577719311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << /*scalar=*/2 << R; 5778d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5779d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 5780d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 5781d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_ReferenceBindingToInitList: 5782d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list) 5783d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getSourceRange(); 5784d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5785d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 5786d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_InitListBadDestinationType: 5787d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type) 5788d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange(); 5789d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5790dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5791cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl case FK_ListConstructorOverloadFailed: 579251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case FK_ConstructorOverloadFailed: { 579351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceRange ArgsRange; 579451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (NumArgs) 5795dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ArgsRange = SourceRange(Args[0]->getLocStart(), 579651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Args[NumArgs - 1]->getLocEnd()); 5797dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5798cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl if (Failure == FK_ListConstructorOverloadFailed) { 5799cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl assert(NumArgs == 1 && "List construction from other than 1 argument."); 5800cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl InitListExpr *InitList = cast<InitListExpr>(Args[0]); 5801cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl Args = InitList->getInits(); 5802cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl NumArgs = InitList->getNumInits(); 5803cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl } 5804cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl 580551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // FIXME: Using "DestType" for the entity we're printing is probably 580651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // bad. 580751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor switch (FailedOverloadResult) { 580851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Ambiguous: 580951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_ambiguous_init) 581051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 5811120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, 581213a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles llvm::makeArrayRef(Args, NumArgs)); 581351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 5814dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 581551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_No_Viable_Function: 58169db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 58179db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor (Entity.getKind() == InitializedEntity::EK_Base || 58189db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Member) && 58199db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 58209db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default initialization of a member or 58219db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // base within a constructor. If no viable function was 58229db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // found, notify the user that she needs to explicitly 58239db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialize this base/member. 58249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor 58259db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = cast<CXXConstructorDecl>(S.CurContext); 58269db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Base) { 58279db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 582807b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith << (Constructor->getInheritedConstructor() ? 2 : 582907b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith Constructor->isImplicit() ? 1 : 0) 58309db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 58319db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*base=*/0 58329db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getType(); 58339db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 58349db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor RecordDecl *BaseDecl 58359db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getBaseSpecifier()->getType()->getAs<RecordType>() 58369db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ->getDecl(); 58379db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(BaseDecl->getLocation(), diag::note_previous_decl) 58389db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(BaseDecl); 58399db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 58409db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 584107b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith << (Constructor->getInheritedConstructor() ? 2 : 584207b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith Constructor->isImplicit() ? 1 : 0) 58439db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 58449db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*member=*/1 58459db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 58469db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_field_decl); 58479db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 58489db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (const RecordType *Record 58499db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getType()->getAs<RecordType>()) 5850dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Record->getDecl()->getLocation(), 58519db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor diag::note_previous_decl) 58529db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(Record->getDecl()); 58539db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 58549db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor break; 58559db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 58569db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 585751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init) 585851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 585913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, 586013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles llvm::makeArrayRef(Args, NumArgs)); 586151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 5862dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 586351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Deleted: { 586451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 5865120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 5866120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best); 5867e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor if (Ovl != OR_Deleted) { 5868e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 5869e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor << true << DestType << ArgsRange; 587051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Inconsistent overload resolution?"); 5871e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor break; 587251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 5873e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor 5874e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor // If this is a defaulted or implicitly-declared function, then 5875e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor // it was implicitly deleted. Make it clear that the deletion was 5876e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor // implicit. 58776c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith if (S.isImplicitlyDeleted(Best->Function)) 5878e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_special_init) 58796c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith << S.getSpecialMember(cast<CXXMethodDecl>(Best->Function)) 5880e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregor << DestType << ArgsRange; 58816c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith else 58826c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 58836c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith << true << DestType << ArgsRange; 58846c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith 58856c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith S.NoteDeletedFunction(Best->Function); 588651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 588751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 5888dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 588951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Success: 589051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Conversion did not fail!"); 589151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 589251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 58939fdefb338ead088dd7a5dd4ff3df807586b26d41David Blaikie break; 5894dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 589599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case FK_DefaultInitOfConst: 58969db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Member && 58979db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 58989db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default-initialization of a const member in 58999db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // a constructor. Complain that it needs to be explicitly 59009db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialized. 59019db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext); 59029db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor) 590307b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith << (Constructor->getInheritedConstructor() ? 2 : 590407b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith Constructor->isImplicit() ? 1 : 0) 59059db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 59069db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*const=*/1 59079db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 59089db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl) 59099db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 59109db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 59119db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_default_init_const) 59129db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType << (bool)DestType->getAs<RecordType>(); 59139db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 591499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor break; 5915dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 59168713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_Incomplete: 591769a30b838c723cb1850de55cfa48a402cfeeb6e0Douglas Gregor S.RequireCompleteType(Kind.getLocation(), FailedIncompleteType, 59188713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl diag::err_init_incomplete_type); 59198713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl break; 59208713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 592114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl case FK_ListInitializationFailed: { 592214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Run the init list checker again to emit diagnostics. 592314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr* InitList = cast<InitListExpr>(Args[0]); 592414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl QualType DestType = Entity.getType(); 592514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListChecker DiagnoseInitList(S, Entity, InitList, 5926c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl DestType, /*VerifyOnly=*/false, 5927168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Kind.getKind() != InitializationKind::IK_DirectList || 592880ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith !S.getLangOpts().CPlusPlus11); 592914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert(DiagnoseInitList.HadError() && 593014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl "Inconsistent init list check result."); 593114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl break; 593214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 59335acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 59345acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: { 59355acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall // FIXME: Already diagnosed! 59365acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 59375acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall } 59382b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 59392b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case FK_InitListElementCopyFailure: { 59402b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // Try to perform all copies again. 59412b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitListExpr* InitList = cast<InitListExpr>(Args[0]); 59422b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl unsigned NumInits = InitList->getNumInits(); 59432b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl QualType DestType = Entity.getType(); 59442b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl QualType E; 59452b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl bool Success = S.isStdInitializerList(DestType, &E); 59462b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl (void)Success; 59472b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl assert(Success && "Where did the std::initializer_list go?"); 59482b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializedEntity HiddenArray = InitializedEntity::InitializeTemporary( 59492b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Context.getConstantArrayType(E, 59502b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()), 59512b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl NumInits), 59522b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ArrayType::Normal, 0)); 59532b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializedEntity Element = InitializedEntity::InitializeElement(S.Context, 59542b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 0, HiddenArray); 59552b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // Show at most 3 errors. Otherwise, you'd get a lot of errors for errors 59562b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // where the init list type is wrong, e.g. 59572b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // std::initializer_list<void*> list = { 1, 2, 3, 4, 5, 6, 7, 8 }; 59582b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // FIXME: Emit a note if we hit the limit? 59592b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl int ErrorCount = 0; 59602b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl for (unsigned i = 0; i < NumInits && ErrorCount < 3; ++i) { 59612b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Element.setElementIndex(i); 59622b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ExprResult Init = S.Owned(InitList->getInit(i)); 59632b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl if (S.PerformCopyInitialization(Element, Init.get()->getExprLoc(), Init) 59642b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl .isInvalid()) 59652b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ++ErrorCount; 59662b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 59672b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl break; 59682b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 596970e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl 597070e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl case FK_ExplicitConstructor: { 597170e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl S.Diag(Kind.getLocation(), diag::err_selected_explicit_constructor) 597270e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl << Args[0]->getSourceRange(); 597370e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl OverloadCandidateSet::iterator Best; 597470e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl OverloadingResult Ovl 597570e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best); 5976e7d0bbfa101d0f0b955c04c417b5e3283497a7edMatt Beaumont-Gay (void)Ovl; 597770e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl assert(Ovl == OR_Success && "Inconsistent overload resolution"); 597870e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function); 597970e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl S.Diag(CtorDecl->getLocation(), diag::note_constructor_declared_here); 598070e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl break; 598170e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl } 598220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5983dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5984a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 598520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return true; 598620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 598718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 59885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid InitializationSequence::dump(raw_ostream &OS) const { 5989de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (SequenceKind) { 5990de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FailedSequence: { 5991de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Failed sequence: "; 5992de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (Failure) { 5993de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForReference: 5994de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for reference"; 5995de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5996dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5997de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitList: 5998de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list"; 5999de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6000dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6001de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 6002de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list or string literal"; 6003de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6004dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6005cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 6006cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "array type mismatch"; 6007cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 6008cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 6009cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 6010cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "non-constant array initializer"; 6011cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 6012cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 6013de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_AddressOfOverloadFailed: 6014de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "address of overloaded function failed"; 6015de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6016dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6017de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitOverloadFailed: 6018de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overload resolution for reference initialization failed"; 6019de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6020dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6021de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 6022de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to temporary"; 6023de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6024dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6025de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 6026de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to unrelated type"; 6027de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6028dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6029de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_RValueReferenceBindingToLValue: 6030de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "rvalue reference bound to an lvalue"; 6031de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6032dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6033de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitDropsQualifiers: 6034de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization drops qualifiers"; 6035de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6036dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6037de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitFailed: 6038de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization failed"; 6039de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6040dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6041de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConversionFailed: 6042de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "conversion failed"; 6043de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6044dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6045429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 6046429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley OS << "conversion from property failed"; 6047429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley break; 6048429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 6049de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForScalar: 6050de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for scalar"; 6051de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6052dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6053de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceBindingToInitList: 6054de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "referencing binding to initializer list"; 6055de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6056dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6057de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_InitListBadDestinationType: 6058de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "initializer list for non-aggregate, non-scalar type"; 6059de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6060dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6061de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_UserConversionOverloadFailed: 6062de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overloading failed for user-defined conversion"; 6063de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6064dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6065de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConstructorOverloadFailed: 6066de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor overloading failed"; 6067de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6068dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6069de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_DefaultInitOfConst: 6070de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "default initialization of a const variable"; 6071de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6072dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 607372a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 607472a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor OS << "initialization of incomplete type"; 607572a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor break; 60768713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 60778713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_ListInitializationFailed: 607814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl OS << "list initialization checker failure"; 60795acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 60805acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 608173076431605556fdbf28d287d084a73a24a8b8d4John McCall case FK_VariableLengthArrayHasInitializer: 608273076431605556fdbf28d287d084a73a24a8b8d4John McCall OS << "variable length array has an initializer"; 608373076431605556fdbf28d287d084a73a24a8b8d4John McCall break; 608473076431605556fdbf28d287d084a73a24a8b8d4John McCall 60855acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: 60865acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall OS << "initializer expression isn't contextually valid"; 60875acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 6088b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky 6089b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky case FK_ListConstructorOverloadFailed: 6090b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky OS << "list constructor overloading failed"; 6091b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky break; 60922b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 60932b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case FK_InitListElementCopyFailure: 60942b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl OS << "copy construction of initializer list element failed"; 60952b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl break; 609670e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl 609770e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl case FK_ExplicitConstructor: 609870e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl OS << "list copy initialization chose explicit constructor"; 609970e24fccc8ef4aa8be03a778e9655bfcfa79dd14Sebastian Redl break; 6100dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 6101de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << '\n'; 6102de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 6103de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 6104dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6105de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case DependentSequence: 61067491c499e826682e128a400038361ebcbde30eecSebastian Redl OS << "Dependent sequence\n"; 6107de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 6108dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 61097491c499e826682e128a400038361ebcbde30eecSebastian Redl case NormalSequence: 61107491c499e826682e128a400038361ebcbde30eecSebastian Redl OS << "Normal sequence: "; 6111de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6112de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 6113dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6114de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) { 6115de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor if (S != step_begin()) { 6116de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << " -> "; 6117de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 6118dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6119de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (S->Kind) { 6120de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 6121de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "resolve address of overloaded function"; 6122de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6123dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6124de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseRValue: 6125de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (rvalue" << S->Type.getAsString() << ")"; 6126de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6127dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6128906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 6129906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "derived-to-base case (xvalue" << S->Type.getAsString() << ")"; 6130906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 6131dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6132de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseLValue: 6133de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (lvalue" << S->Type.getAsString() << ")"; 6134de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6135dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6136de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReference: 6137de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to lvalue"; 6138de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6139dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6140de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReferenceToTemporary: 6141de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to a temporary"; 6142de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6143dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6144523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 6145523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor OS << "extraneous C++03 copy to temporary"; 6146523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 6147523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 6148de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_UserConversion: 6149b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << "user-defined conversion via " << *S->Function.Function; 6150de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6151906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 6152de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionRValue: 6153de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (rvalue)"; 615413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 6155de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 6156906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 6157906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "qualification conversion (xvalue)"; 615813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 6159906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 6160de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionLValue: 6161de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (lvalue)"; 6162de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6163dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6164de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConversionSequence: 6165de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "implicit conversion sequence ("; 6166de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor S->ICS->DebugPrint(); // FIXME: use OS 6167de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << ")"; 6168de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6169dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6170de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ListInitialization: 61718713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl OS << "list aggregate initialization"; 61728713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl break; 61738713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 61748713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case SK_ListConstructorCall: 61758713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl OS << "list initialization via constructor"; 6176de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6177dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 617813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 617913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl OS << "unwrap reference initializer list"; 618013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 618113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 618213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 618313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl OS << "rewrap reference initializer list"; 618413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 618513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 6186de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConstructorInitialization: 6187de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor initialization"; 6188de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6189dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6190de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ZeroInitialization: 6191de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "zero initialization"; 6192de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6193dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6194de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CAssignment: 6195de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment"; 6196de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6197dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6198de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_StringInit: 6199de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "string initialization"; 6200de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 6201569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 6202569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 6203569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor OS << "Objective-C object conversion"; 6204569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 6205cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 6206cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 6207cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "array initialization"; 6208cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 6209f85e193739c953358c865005855253af4f68a497John McCall 62100f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith case SK_ParenthesizedArrayInit: 62110f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith OS << "parenthesized array initialization"; 62120f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith break; 62130f163e964289bc18e9bc1ec37a6a01018ba62640Richard Smith 6214f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 6215f85e193739c953358c865005855253af4f68a497John McCall OS << "pass by indirect copy and restore"; 6216f85e193739c953358c865005855253af4f68a497John McCall break; 6217f85e193739c953358c865005855253af4f68a497John McCall 6218f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 6219f85e193739c953358c865005855253af4f68a497John McCall OS << "pass by indirect restore"; 6220f85e193739c953358c865005855253af4f68a497John McCall break; 6221f85e193739c953358c865005855253af4f68a497John McCall 6222f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 6223f85e193739c953358c865005855253af4f68a497John McCall OS << "Objective-C object retension"; 6224f85e193739c953358c865005855253af4f68a497John McCall break; 62252b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 62262b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_StdInitializerList: 62272b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl OS << "std::initializer_list from initializer list"; 62282b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl break; 6229e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei 623021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case SK_OCLSamplerInit: 623121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei OS << "OpenCL sampler_t from integer constant"; 623221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei break; 623321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei 6234e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case SK_OCLZeroEvent: 6235e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei OS << "OpenCL event_t from zero"; 6236e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei break; 6237de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 6238a4dc51b46861eb52626f89183da7610437baba93Richard Smith 6239a4dc51b46861eb52626f89183da7610437baba93Richard Smith OS << " [" << S->Type.getAsString() << ']'; 6240de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 6241a4dc51b46861eb52626f89183da7610437baba93Richard Smith 6242a4dc51b46861eb52626f89183da7610437baba93Richard Smith OS << '\n'; 6243de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 6244de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 6245de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump() const { 6246de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor dump(llvm::errs()); 6247de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 6248de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 62494c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smithstatic void DiagnoseNarrowingInInitList(Sema &S, InitializationSequence &Seq, 62504c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith QualType EntityType, 62514c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const Expr *PreInit, 62524c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const Expr *PostInit) { 62534c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith if (Seq.step_begin() == Seq.step_end() || PreInit->isValueDependent()) 62544c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return; 62554c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 62564c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // A narrowing conversion can only appear as the final implicit conversion in 62574c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // an initialization sequence. 62584c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const InitializationSequence::Step &LastStep = Seq.step_end()[-1]; 62594c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith if (LastStep.Kind != InitializationSequence::SK_ConversionSequence) 62604c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return; 62614c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 62624c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const ImplicitConversionSequence &ICS = *LastStep.ICS; 62634c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const StandardConversionSequence *SCS = 0; 62644c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith switch (ICS.getKind()) { 62654c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::StandardConversion: 62664c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith SCS = &ICS.Standard; 62674c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 62684c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::UserDefinedConversion: 62694c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith SCS = &ICS.UserDefined.After; 62704c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 62714c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::AmbiguousConversion: 62724c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::EllipsisConversion: 62734c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::BadConversion: 62744c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return; 62754c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith } 62764c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 62774c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // Determine the type prior to the narrowing conversion. If a conversion 62784c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // operator was used, this may be different from both the type of the entity 62794c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // and of the pre-initialization expression. 62804c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith QualType PreNarrowingType = PreInit->getType(); 62814c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith if (Seq.step_begin() + 1 != Seq.step_end()) 62824c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith PreNarrowingType = Seq.step_end()[-2].Type; 62834c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 62844c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // C++11 [dcl.init.list]p7: Check whether this is a narrowing conversion. 62854c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith APValue ConstantValue; 6286f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith QualType ConstantType; 6287f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith switch (SCS->getNarrowingKind(S.Context, PostInit, ConstantValue, 6288f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith ConstantType)) { 62894c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Not_Narrowing: 62904c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // No narrowing occurred. 62914c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return; 62924c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 62934c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Type_Narrowing: 62944c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // This was a floating-to-integer conversion, which is always considered a 62954c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // narrowing conversion even if the value is a constant and can be 62964c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // represented exactly as an integer. 62974c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), 629880ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith S.getLangOpts().MicrosoftExt || !S.getLangOpts().CPlusPlus11? 6299f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::warn_init_list_type_narrowing 6300f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : S.isSFINAEContext()? 6301f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::err_init_list_type_narrowing_sfinae 6302f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : diag::err_init_list_type_narrowing) 63034c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 63044c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PreNarrowingType.getLocalUnqualifiedType() 63054c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << EntityType.getLocalUnqualifiedType(); 63064c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 63074c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 63084c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Constant_Narrowing: 63094c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // A constant value was narrowed. 63104c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), 631180ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith S.getLangOpts().MicrosoftExt || !S.getLangOpts().CPlusPlus11? 6312f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::warn_init_list_constant_narrowing 6313f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : S.isSFINAEContext()? 6314f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::err_init_list_constant_narrowing_sfinae 6315f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : diag::err_init_list_constant_narrowing) 63164c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 6317f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith << ConstantValue.getAsString(S.getASTContext(), ConstantType) 63189906149972906e340f512a60f72a8676748f24d8Jeffrey Yasskin << EntityType.getLocalUnqualifiedType(); 63194c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 63204c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 63214c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Variable_Narrowing: 63224c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // A variable's value may have been narrowed. 63234c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), 632480ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith S.getLangOpts().MicrosoftExt || !S.getLangOpts().CPlusPlus11? 6325f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::warn_init_list_variable_narrowing 6326f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : S.isSFINAEContext()? 6327f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::err_init_list_variable_narrowing_sfinae 6328f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : diag::err_init_list_variable_narrowing) 63294c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 63304c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PreNarrowingType.getLocalUnqualifiedType() 63319906149972906e340f512a60f72a8676748f24d8Jeffrey Yasskin << EntityType.getLocalUnqualifiedType(); 63324c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 63334c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith } 6334191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 6335f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> StaticCast; 6336191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::raw_svector_ostream OS(StaticCast); 6337191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin OS << "static_cast<"; 6338191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (const TypedefType *TT = EntityType->getAs<TypedefType>()) { 6339191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // It's important to use the typedef's name if there is one so that the 6340191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // fixit doesn't break code using types like int64_t. 6341191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // 6342191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // FIXME: This will break if the typedef requires qualification. But 6343191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // getQualifiedNameAsString() includes non-machine-parsable components. 6344b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << *TT->getDecl(); 6345191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } else if (const BuiltinType *BT = EntityType->getAs<BuiltinType>()) 63464e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie OS << BT->getName(S.getLangOpts()); 6347191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin else { 6348191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Oops, we didn't find the actual type of the variable. Don't emit a fixit 6349191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // with a broken cast. 6350191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return; 6351191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 6352191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin OS << ">("; 63534c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), diag::note_init_list_narrowing_override) 63544c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 63554c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << FixItHint::CreateInsertion(PostInit->getLocStart(), OS.str()) 6356191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin << FixItHint::CreateInsertion( 63574c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.getPreprocessor().getLocForEndOfToken(PostInit->getLocEnd()), ")"); 6358191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin} 6359191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 636018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 636118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// Initialization helper functions 636218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 63632be7e90b81509204b99b7bbf9753ad17b894a12aSean Huntbool 63642be7e90b81509204b99b7bbf9753ad17b894a12aSean HuntSema::CanPerformCopyInitialization(const InitializedEntity &Entity, 63652be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt ExprResult Init) { 63662be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt if (Init.isInvalid()) 63672be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt return false; 63682be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 63692be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt Expr *InitE = Init.get(); 63702be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt assert(InitE && "No initialization expression"); 63712be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 63723c394c54511b27be0ff6968f159bba3521ab3c3eDouglas Gregor InitializationKind Kind 63733c394c54511b27be0ff6968f159bba3521ab3c3eDouglas Gregor = InitializationKind::CreateCopy(InitE->getLocStart(), SourceLocation()); 63742be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 6375383616cd2e61131a534afd9364ef53f643e1f834Sebastian Redl return !Seq.Failed(); 63762be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt} 63772be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 6378dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 637918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::PerformCopyInitialization(const InitializedEntity &Entity, 638018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation EqualLoc, 6381191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ExprResult Init, 6382ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool TopLevelOfInitList, 6383ed878af7914df535b32d64f555fa118413186672Douglas Gregor bool AllowExplicit) { 638418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Init.isInvalid()) 638518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return ExprError(); 638618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 638715d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall Expr *InitE = Init.get(); 638818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(InitE && "No initialization expression?"); 638918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 639018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (EqualLoc.isInvalid()) 639118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc = InitE->getLocStart(); 639218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 639318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationKind Kind = InitializationKind::CreateCopy(InitE->getLocStart(), 6394ed878af7914df535b32d64f555fa118413186672Douglas Gregor EqualLoc, 6395ed878af7914df535b32d64f555fa118413186672Douglas Gregor AllowExplicit); 639618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 639718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Init.release(); 6398191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 63994c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith ExprResult Result = Seq.Perform(*this, Entity, Kind, MultiExprArg(&InitE, 1)); 64004c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 64014c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith if (!Result.isInvalid() && TopLevelOfInitList) 64024c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith DiagnoseNarrowingInInitList(*this, Seq, Entity.getType(), 64034c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith InitE, Result.get()); 64044c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 64054c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return Result; 640618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 6407